diff --git a/.agents/skills/testing-sysml-repl/SKILL.md b/.agents/skills/testing-sysml-repl/SKILL.md index 019d918fc3..04a7139404 100644 --- a/.agents/skills/testing-sysml-repl/SKILL.md +++ b/.agents/skills/testing-sysml-repl/SKILL.md @@ -5043,8 +5043,9 @@ for reservation. Two consequences worth knowing before writing assertions: Incomplete input (`part def U { ref redefines x[4;`) puts the REPL into a `...>` continuation prompt, and *anything* typed there — including `%eval 1+1` — is swallowed as more model text. -Press **Ctrl-C** to abandon the continuation: the buffered text is then parsed, its diagnostics -print, and the `sysml>` prompt returns usable. Always follow a malformed submission with +Press **Ctrl-C** to abandon the continuation: the buffered text is discarded unparsed and the +`sysml>` prompt returns usable (a second Ctrl-C there exits the REPL). A blank line instead +submits the buffer, so its diagnostics print. Always follow a malformed submission with `%eval 1 + 1` (expect `= 2`) to prove the session survived. Never type shell words like `clear` at the prompt; it parses as a model line and produces `expected a namespace member`. @@ -6151,6 +6152,31 @@ gRPC `choice-point` diagnostic encoding on the CLI surface. exits 0; `-action Timed::pinger -advance 2` exits 2 and names the wait at t=5.0; `-action` alone runs to completion (exit 0); `-advance` with no behavior, or a negative one, exits 2. +## Dimension-one identity: `MeasurementReferences::one` in a unit product (PR #756) + +`one` is the identity of the unit product — `0.7 [one] * 800 [W]` is `560.0 [W]`, `2 [one] * 3 [one]` +is `6 [one]`, and `800 [W] * 120 [s] * 0.7 [one]` in a calc returning `EnergyValue` is +`67200.0 [SI::J]`, identical to the bare `0.7` spelling. `one*…` in the unit, or +`SI::'kg⋅m²⋅s⁻²'*one`, is the pre-fix signature. Traps when asserting this: + +- **Compare an untyped product against the no-`one` control, not against a named unit.** A bare + `800 [SI::W] * 120 [SI::s]` prints the coherent base spelling `SI::'kg⋅m²⋅s⁻²'` on `develop` + too (energy and torque share dimensions; only a declared quantity kind such as `EnergyValue` + selects `SI::J`). So `1 [one] * 800 [W] * 120 [s]`, `… * 1 [one]` and `(…) / 1 [one]` are correct + when they equal that control, and would be a spurious failure against `SI::J`. +- **A real reference, not display text.** The Python `Unit` equality includes spelling (`J` vs + `SI::J`), so evaluate `.mRef == SI::J` (must be `true`) and, on the wire, compare the + `unit_id` of `.mRef` with that of a directly evaluated `SI::J` — both are the declaration + ID `SI::joule`. `unit.same_reduction(target.unit)` proves scale/dimension only, not identity. +- **Meaningful dimension-one units stay.** `3 [rad] * 1 [one]` is `3 [rad]`, likewise `sr`, and a + model's percent (`attribute def PercentUnit :> DimensionOneUnit { attribute :>> unitConversion : + ConversionByConvention { :>> referenceUnit = one; :>> conversionFactor = 0.01; } }`) survives as a + factor: `50 [percent] * 800 [W]` spells `percent*W` while `== 400 [W]` is `true` and + `.mRef == W` is `false`. A fix that drops any dimension-one factor passes the `one` cases and + fails these. +- CLI `-e` result lines are indented before `=`; strip the whitespace before parsing the magnitude in + a throwaway harness. + ### Devin Secrets Needed None for these local REPL/gRPC checks. diff --git a/.circleci/config.yml b/.circleci/config.yml index bc5ae218af..1f063e513b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -480,6 +480,29 @@ jobs: - install-solvers - download-corpora + # The metamodel table is generated from the pilot's SysML.ecore at the pin; + # a pin bump without regenerating it fails here. + - restore_cache: + keys: + - pilot-metamodel-v1-{{ checksum "scripts/download-pilot-metamodel.sh" }}-{{ checksum "scripts/pilot-pin.sh" }} + + - run: + name: Download the pilot metamodel + command: ./scripts/download-pilot-metamodel.sh + + - save_cache: + key: pilot-metamodel-v1-{{ checksum "scripts/download-pilot-metamodel.sh" }}-{{ checksum "scripts/pilot-pin.sh" }} + paths: + - build/pilot-metamodel + + - run: + name: Check the metamodel table matches the pinned SysML.ecore + command: make ontology-table-check + + - run: + name: Check generated Python metaclasses are current + command: make python-metamodel-check + # The corpora gate alone, so its per-root verdict lines are legible in the # log and a skip cannot hide behind a green suite. - run: @@ -958,7 +981,7 @@ jobs: command: | make python-install # Pinned and wheel-only, as in .github/workflows/pr.yml. - pip install --only-binary :all: pytest==9.0.3 pytest-mock==3.15.1 psutil==7.2.2 pytest-cov==7.0.0 fmpy==0.3.32 + pip install --only-binary :all: pytest==9.0.3 pytest-mock==3.15.1 psutil==7.2.2 pytest-cov==7.0.0 fmpy==0.3.32 mypy==2.4.0 types-protobuf==7.35.1.20260906 'pyright[nodejs]==1.1.414' # The integration tests connect to a service on the standard port with # auto_start=False, which is the explicit opt-in to one the client does not @@ -992,7 +1015,7 @@ jobs: # service is provided here, so its absence is the bug, not a pass. - run: name: Run Python client tests - command: OPENSYSML_REQUIRE_SERVICE=1 OPENSYSML_REQUIRE_REFERENCE_FMUS=1 make python-coverage + command: OPENSYSML_REQUIRE_SERVICE=1 OPENSYSML_REQUIRE_REFERENCE_FMUS=1 OPENSYSML_REQUIRE_TYPECHECKERS=1 make python-coverage # The repository scripts the Go static checks run are Python too; running # them and their tests under coverage here credits what those checks execute. @@ -1383,6 +1406,10 @@ jobs: steps: - checkout - rehearsal-tag + # dist/grpc from build-release-binaries: the service binaries whose + # digests the distribution ships. + - attach_workspace: + at: . - run: name: Install build tooling @@ -1411,6 +1438,22 @@ jobs: echo "export RUST_VERSION=${RUST_VERSION}" >> "$BASH_ENV" echo "Building opensysml ${VERSION} (pre-release: ${PRE_RELEASE}, npm ${NPM_VERSION}, maven ${JAVA_VERSION}, crates ${RUST_VERSION})" + # The committed table pins the releases that existed when it was last + # back-filled, never the one being cut, so the wheel would otherwise rely + # on the signed manifest (and the sigstore package at runtime) to install + # its own release. Hashing the binaries build-release-binaries produced + # pins this release in the table the distribution ships; the checkout's + # copy is left for the release's commit to back-fill, as it is today. + - run: + name: Stamp this release's service digests into the distribution + command: | + ls -l dist/grpc + python client/python/scripts/pin_release_checksums.py \ + --version "${CIRCLE_TAG}" \ + --from-binaries dist/grpc \ + --table client/python/opensysml/release-digests.json + git diff --stat -- client/python/opensysml/release-digests.json + - run: name: Build the wheel and the sdist command: | @@ -1445,6 +1488,72 @@ jobs: print(f"opensysml {opensysml.__version__} imported from the built wheel") EOF + # The crate job's assertion, for the wheel and the sdist: a distribution + # whose table lacks any of the five service assets for the tag, or pins a + # digest other than the one its binary hashes to, fails the job here. The + # installed wheel is asked too, through the lookup connect() makes. + - run: + name: Verify the distribution embeds this release's service digests + command: | + /tmp/verify-wheel/bin/python - "${CIRCLE_TAG}" client/python/dist/opensysml-*-py3-none-any.whl client/python/dist/opensysml-[0-9]*.tar.gz \<<'EOF' + import hashlib + import json + import os + import sys + import tarfile + import zipfile + + from opensysml.binary import pinned_digest + + tag, wheel_path, sdist_path = sys.argv[1:] + required = { + "sysml-grpc-darwin-amd64", + "sysml-grpc-darwin-arm64", + "sysml-grpc-linux-amd64", + "sysml-grpc-linux-arm64", + "sysml-grpc-windows-amd64.exe", + } + built = {} + for asset in sorted(required): + with open(os.path.join("dist", "grpc", asset), "rb") as f: + built[asset] = hashlib.sha256(f.read()).hexdigest() + + def check(what, table): + digests = table.get("Open-MBEE/OpenSysML", {}).get(tag, {}) + missing = sorted(required - digests.keys()) + if missing: + raise SystemExit( + f"Error: {what} has no complete digest pin for {tag}: " + f"{', '.join(missing)}" + ) + wrong = sorted(a for a in required if digests[a] != built[a]) + if wrong: + raise SystemExit( + f"Error: {what} pins a digest for {tag} other than the one " + f"its binary hashes to: {', '.join(wrong)}" + ) + print(f"Verified {what} embeds all five service digests for {tag}.") + + with zipfile.ZipFile(wheel_path) as wheel: + with wheel.open("opensysml/release-digests.json") as member: + check("the wheel", json.load(member)) + with tarfile.open(sdist_path, "r:gz") as sdist: + name = next( + (n for n in sdist.getnames() if n.endswith("/opensysml/release-digests.json")), + None, + ) + if name is None: + raise SystemExit("Error: the sdist has no opensysml/release-digests.json.") + with sdist.extractfile(name) as member: + check("the sdist", json.load(member)) + unpinned = sorted(a for a in required if pinned_digest(tag, a) != built[a]) + if unpinned: + raise SystemExit( + f"Error: the installed wheel does not pin {tag} for: {', '.join(unpinned)}" + ) + print(f"Verified the installed wheel pins {tag} for every service asset.") + EOF + - store_artifacts: path: client/python/dist destination: opensysml-dist @@ -1454,6 +1563,62 @@ jobs: paths: - client/python/dist + # Runs the built wheel against the release published by the same workflow. + python-zero-config-smoke: + executor: python-executor + steps: + - checkout + - rehearsal-tag + - attach_workspace: + at: . + + - unless: + condition: << pipeline.parameters.release_rehearsal >> + steps: + - run: + name: Install the built wheel in a fresh virtualenv + command: | + python -m venv /tmp/verify-zero-config + /tmp/verify-zero-config/bin/python -m pip install --upgrade pip + /tmp/verify-zero-config/bin/python -m pip install client/python/dist/opensysml-*.whl + + - run: + name: Load and evaluate a model without binary configuration + command: | + set -eu + home="$(mktemp -d)" + trap 'rm -rf "$home"' EXIT + env -u OPENSYSML_BINARY -u OPENSYSML_GRPC_VERSION \ + HOME="$home" PATH="/tmp/verify-zero-config/bin:/usr/bin:/bin" \ + /tmp/verify-zero-config/bin/python - \<<'EOF' + import json + import os + from pathlib import Path + + import opensysml + + model_path = Path(os.environ["HOME"]) / "Demo.sysml" + model_path.write_text( + """package Demo { + part def Vehicle { attribute mass default = 1500.0; } + part sedan : Vehicle { attribute :>> mass = 1800.0; } + }""", + encoding="utf-8", + ) + model = opensysml.load(str(model_path), strict=True) + actual = model.eval("mass", subject="Demo::sedan") + assert actual == 1800.0, actual + print(actual) + + metadata = Path(os.environ["HOME"]) / ".opensysml" / "bin" / "sysml-grpc.json" + cached = json.loads(metadata.read_text()) + expected = os.environ["CIRCLE_TAG"] + assert cached["version"] == expected, (cached["version"], expected) + print(f"cached release: {cached['version']}") + EOF + - rehearsal-skip: + what: "the zero-config binary smoke test (the rehearsal publishes no GitHub release)" + # Uploads the distribution build-python-package made. PyPI has no OIDC publishing # for CircleCI (pypi/warehouse#13888), so a token from the `PyPI` context is used. publish-pypi: @@ -1650,15 +1815,14 @@ jobs: path: packaging/pypi-pysysml/dist destination: pysysml-placeholder-dist - # Builds every binary the release ships, plus the Python distribution from - # build-python-package, so one signed manifest covers all of them. - build-release: + # Builds every binary a release publishes, so build-python-package can stamp + # the service digests into the distribution before build-release writes and + # signs the manifest that lists both. + build-release-binaries: executor: go-executor steps: - checkout - rehearsal-tag - - attach_workspace: - at: . - go/load-cache - go/mod-download - go/save-cache @@ -1756,6 +1920,85 @@ jobs: (cd stage/windows-amd64 && zip -q ../../opensysml-windows-amd64.zip sysml.exe sysml-lsp.exe) rm -rf stage + # The checksum manifest and the per-file sidecars are + # build-release's, once the Python distribution exists to list. + ls -l . grpc + + # A Linux binary linked against this executor's glibc would not start on + # older distributions; the Makefile builds without cgo, and this proves it. + - run: + name: Verify the Linux binaries are statically linked + command: | + scripts/check-static-binaries.sh \ + dist/sysml-linux-amd64 dist/sysml-linux-arm64 \ + dist/sysml-lsp-linux-amd64 dist/sysml-lsp-linux-arm64 \ + dist/grpc/sysml-grpc-linux-amd64 dist/grpc/sysml-grpc-linux-arm64 + + # A binary whose version disagrees with its tag looks identical on the + # release page. The host-platform builds are asked what they report; the + # cross-compiled ones cannot run here, so they are checked for the version + # string the ldflags should have written into them. + - run: + name: Verify the built binaries report the tag + command: | + if [ -z "${CIRCLE_TAG}" ]; then + echo "Error: CIRCLE_TAG is empty; this job only runs on a tag" + exit 1 + fi + status=0 + fail() { + echo "Error: $1 does not carry the tag ${CIRCLE_TAG} it is being" + echo "released as: $2. The version ldflags (see the Makefile's" + echo "LDFLAGS) did not reach this build; nothing was published." + status=1 + } + for binary in dist/sysml-linux-amd64 dist/sysml-lsp-linux-amd64 \ + dist/grpc/sysml-grpc-linux-amd64; do + reported="$("$binary" --version 2>&1 | head -n 1)" + case " $reported " in + *" ${CIRCLE_TAG} "*) echo "ok: $binary reports ${CIRCLE_TAG}" ;; + *) fail "$binary" "it reports '${reported}'" ;; + esac + done + for binary in dist/sysml-* dist/grpc/sysml-grpc-*; do + case "$binary" in + *.tar.gz|*.zip|*.sha256) continue ;; + dist/sysml-linux-amd64|dist/sysml-lsp-linux-amd64) continue ;; + dist/grpc/sysml-grpc-linux-amd64) continue ;; + esac + if grep -qa -- "${CIRCLE_TAG}" "$binary"; then + echo "ok: $binary carries ${CIRCLE_TAG}" + else + fail "$binary" "the version string is absent from the binary" + fi + done + exit $status + + - persist_to_workspace: + root: . + paths: + - dist + + # Assembles the release from the binaries and the Python distribution the + # upstream jobs built, writes the one checksum manifest covering both, and + # signs it. Nothing is rebuilt here: the bytes hashed, signed and published + # are the bytes those jobs verified. + build-release: + executor: go-executor + steps: + - checkout + - rehearsal-tag + - attach_workspace: + at: . + - go/load-cache + - go/mod-download + - go/save-cache + + - run: + name: Assemble the release and write its checksum manifest + command: | + cd dist + # The opensysml wheel and sdist, released with the binaries they drive. cp ../client/python/dist/opensysml-*.whl ../client/python/dist/opensysml-*.tar.gz . @@ -1769,15 +2012,37 @@ jobs: (cd grpc && for f in sysml-grpc-*; do sha256sum "$f" > "$f.sha256"; done) cat SHA256SUMS.txt - # A Linux binary linked against this executor's glibc would not start on - # older distributions; the Makefile builds without cgo, and this proves it. - - run: - name: Verify the Linux binaries are statically linked - command: | - scripts/check-static-binaries.sh \ - dist/sysml-linux-amd64 dist/sysml-linux-arm64 \ - dist/sysml-lsp-linux-amd64 dist/sysml-lsp-linux-arm64 \ - dist/grpc/sysml-grpc-linux-amd64 dist/grpc/sysml-grpc-linux-arm64 + # The distribution was stamped from the binaries before the manifest + # existed; this proves the manifest about to be signed lists the digests + # it pins, so the wheel vouches for exactly the binaries released with it. + - run: + name: Verify the Python distribution pins the service digests the manifest lists + command: | + python3 - "${CIRCLE_TAG}" dist/SHA256SUMS.txt dist/opensysml-*-py3-none-any.whl \<<'EOF' + import json + import sys + import zipfile + + tag, manifest_path, wheel_path = sys.argv[1:] + listed = {} + with open(manifest_path, encoding="utf-8") as manifest: + for line in manifest: + fields = line.split() + if len(fields) != 2 or not fields[1].startswith("sysml-grpc-"): + continue + if not fields[1].endswith(".sha256"): + listed[fields[1]] = fields[0] + with zipfile.ZipFile(wheel_path) as wheel: + with wheel.open("opensysml/release-digests.json") as member: + pinned = json.load(member).get("Open-MBEE/OpenSysML", {}).get(tag, {}) + if len(listed) != 5 or pinned != listed: + raise SystemExit( + f"Error: the wheel pins {json.dumps(pinned, indent=2, sort_keys=True)} " + f"for {tag}, but the manifest lists " + f"{json.dumps(listed, indent=2, sort_keys=True)}; nothing was signed." + ) + print(f"Verified the wheel pins the five service digests the manifest lists for {tag}.") + EOF - unless: condition: << pipeline.parameters.release_rehearsal >> @@ -1861,12 +2126,8 @@ jobs: - rehearsal-skip: what: "cosign keyless signing and attestation (they write to the public Rekor log)" - # An artifact whose version disagrees with its tag looks identical on the - # release page. The host-platform builds are asked what they report; the - # cross-compiled ones cannot run here, so they are checked for the version - # string the ldflags should have written into them. - run: - name: Verify the built artifacts report the tag + name: Verify the release carries the tag's Python distribution command: | if [ -z "${CIRCLE_TAG}" ]; then echo "Error: CIRCLE_TAG is empty; this job only runs on a tag" @@ -1874,31 +2135,10 @@ jobs: fi status=0 fail() { - echo "Error: $1 does not carry the tag ${CIRCLE_TAG} it is being" - echo "released as: $2. The version ldflags (see the Makefile's" - echo "LDFLAGS) did not reach this build; nothing was published." + echo "Error: $1 is not the distribution for the tag ${CIRCLE_TAG} it is" + echo "being released as: $2. Nothing was published." status=1 } - for binary in dist/sysml-linux-amd64 dist/sysml-lsp-linux-amd64 \ - dist/grpc/sysml-grpc-linux-amd64; do - reported="$("$binary" --version 2>&1 | head -n 1)" - case " $reported " in - *" ${CIRCLE_TAG} "*) echo "ok: $binary reports ${CIRCLE_TAG}" ;; - *) fail "$binary" "it reports '${reported}'" ;; - esac - done - for binary in dist/sysml-* dist/grpc/sysml-grpc-*; do - case "$binary" in - *.tar.gz|*.zip|*.sha256) continue ;; - dist/sysml-linux-amd64|dist/sysml-lsp-linux-amd64) continue ;; - dist/grpc/sysml-grpc-linux-amd64) continue ;; - esac - if grep -qa -- "${CIRCLE_TAG}" "$binary"; then - echo "ok: $binary carries ${CIRCLE_TAG}" - else - fail "$binary" "the version string is absent from the binary" - fi - done # build-python-package named the Python distribution after the tag's # version (SemVer 'v0.9.0-rc1' is PEP 440 '0.9.0rc1'); one of each is due. # The sdist is the one opensysml-*.tar.gz whose name continues with a digit; @@ -1918,11 +2158,26 @@ jobs: - store_artifacts: path: dist/ destination: release-binaries - + + # Workspace layers are additive and a path persisted by two upstream jobs + # fails the downstream attach, so only what this job wrote is persisted: + # the binaries and archives stay in build-release-binaries' layer. - persist_to_workspace: root: . paths: - - dist + - dist/SHA256SUMS.txt + - dist/grpc/*.sha256 + - dist/opensysml-*-py3-none-any.whl + - dist/opensysml-[0-9]*.tar.gz + - unless: + condition: << pipeline.parameters.release_rehearsal >> + steps: + - persist_to_workspace: + root: . + paths: + - dist/SHA256SUMS.txt.bundle + - dist/provenance.intoto.json + - dist/provenance.intoto.json.bundle # Publishes @openmbee/opensysml and its five per-platform packages from the # core `v` tag, carrying the sysml-grpc binaries build-release @@ -2232,6 +2487,8 @@ jobs: executor: rust-executor steps: - checkout + - attach_workspace: + at: . - rehearsal-tag - run: @@ -2257,6 +2514,18 @@ jobs: echo "export RUST_VERSION=${version}" >> "$BASH_ENV" echo "Publishing opensysml ${version} to crates.io" + - run: + name: Stamp this release's service digests into the crate + command: | + if ! command -v python3 >/dev/null; then + sudo apt-get update -q && sudo apt-get install -yq python3 + fi + python3 client/python/scripts/pin_release_checksums.py \ + --version "${CIRCLE_TAG}" \ + --from-manifest dist/SHA256SUMS.txt \ + --table client/rust/opensysml/release-digests.json + git diff --stat + - run: name: Require the publishing credential command: | @@ -2287,7 +2556,45 @@ jobs: - run: name: Package the crate command: | - cargo package -p opensysml --manifest-path client/rust/Cargo.toml --locked + # The crate's embedded table is its only trust anchor. + cargo package -p opensysml --manifest-path client/rust/Cargo.toml --allow-dirty --locked + crate="client/rust/target/package/opensysml-${RUST_VERSION}.crate" + if [ ! -f "${crate}" ]; then + echo "Error: cargo package did not create ${crate}." + exit 1 + fi + python3 - "${crate}" "${CIRCLE_TAG}" <<'PY' + import json + import sys + import tarfile + + crate_path, tag = sys.argv[1:] + required = { + "sysml-grpc-darwin-amd64", + "sysml-grpc-darwin-arm64", + "sysml-grpc-linux-amd64", + "sysml-grpc-linux-arm64", + "sysml-grpc-windows-amd64.exe", + } + with tarfile.open(crate_path, "r:gz") as crate: + member_name = next( + (name for name in crate.getnames() if name.endswith("/release-digests.json")), + None, + ) + if member_name is None: + raise SystemExit("Error: packaged crate has no release-digests.json.") + with crate.extractfile(member_name) as member: + table = json.load(member) + + digests = table.get("Open-MBEE/OpenSysML", {}).get(tag, {}) + missing = sorted(required - digests.keys()) + if missing: + raise SystemExit( + f"Error: packaged crate has no complete digest pin for {tag}: " + f"{', '.join(missing)}" + ) + print(f"Verified the packaged crate embeds all five service digests for {tag}.") + PY - unless: condition: << pipeline.parameters.release_rehearsal >> @@ -2298,7 +2605,7 @@ jobs: name: Publish opensysml to crates.io command: | cargo publish -p opensysml --manifest-path client/rust/Cargo.toml \ - --locked --no-verify + --locked --no-verify --allow-dirty - when: condition: << pipeline.parameters.release_rehearsal >> steps: @@ -2519,20 +2826,25 @@ workflows: requires: *go-suite filters: *release-tags - # Fails the release before anything is built when the tag does not name - # the version client/python/opensysml/_version.py declares. + - build-release-binaries: + name: Build release binaries + requires: *go-suite + filters: *release-tags + + # Fails the release when the tag does not name the version + # client/python/opensysml/_version.py declares. Runs after the binaries + # so their digests can be stamped into the distribution it builds. - build-python-package: name: Build Python distribution - requires: *go-suite + requires: + - Build release binaries filters: *release-tags + # Writes and signs the one manifest over the binaries and the distribution. - build-release: name: Build release artifacts requires: - - Go static checks - - Go race tests - - Go coverage profile - - Go gates and binaries + - Build release binaries - Build Python distribution filters: *release-tags @@ -2546,6 +2858,13 @@ workflows: - Rust client tests filters: *release-tags + - python-zero-config-smoke: + name: Python zero-config release smoke + requires: + - Publish GitHub release + - Build Python distribution + filters: *release-tags + - publish-pypi: name: Publish opensysml to PyPI # Last of all: an upload cannot be undone, so it waits for the GitHub @@ -2558,6 +2877,7 @@ workflows: requires: - Publish GitHub release - Python client tests + - Python zero-config release smoke filters: *release-tags - publish-npm: diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 40a1ee1b3b..60f8c4def8 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -1136,7 +1136,7 @@ jobs: make python-install # Pinned and wheel-only: an unpinned resolve runs whatever was # published today, and a source distribution runs its own build code. - pip install --only-binary :all: pytest==9.0.3 pytest-mock==3.15.1 psutil==7.2.2 fmpy==0.3.32 + pip install --only-binary :all: pytest==9.0.3 pytest-mock==3.15.1 psutil==7.2.2 fmpy==0.3.32 mypy==2.4.0 types-protobuf==7.35.1.20260906 'pyright[nodejs]==1.1.414' # The FMI runner test's FMUs, same pin as the Go gate's. - name: Cache the Reference-FMUs @@ -1175,6 +1175,7 @@ jobs: - name: Run Python client tests env: OPENSYSML_REQUIRE_SERVICE: 1 + OPENSYSML_REQUIRE_TYPECHECKERS: 1 run: make python-test - name: Verify Python client import diff --git a/CHANGELOG.md b/CHANGELOG.md index ce24179aae..5290b91d50 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,75 @@ release is described in [docs/project/releasing.md](docs/project/releasing.md). ## Unreleased +## 0.9.2 — 2026-10-05 + +### Added + +- **The service's `Convert` takes the id form.** `ConvertRequest.id_form` spells derived element ids as `sysml -id` does when notation is written as a graph (`ttl`, `api-json`), from inline content, a file or a parsed model of several documents: `qualified` (the default) or `uuid`. A service client got only the qualified form before. Any other value, or one given for another direction, is `INVALID_ARGUMENT` (#732). + +- **A converted model names the standard library elements it references.** A reference to a library element is its normative id, a hash no reader can turn back into a name. Turtle, the API's JSON and `Convert` now state each referenced library element under that id, with its metaclass, `qualifiedName` and `declaredName`, marked `isLibraryElement` (KerML `Element::isLibraryElement`). Every `@id` an API JSON output references is then an element of it. The library itself is still not exported, and reading a graph back checks each name against the bundled library (#731). + +- **Add generated SysML metaclasses and a standalone JSON element reader to the Python client.** Read API and toolkit exports as a lazy typed graph without loading JSON into the engine. + +- **A query can report an element's `elementId`.** `select: ["elementId"]` (and `where` on it, and OSLC) reports the `elementId` `Convert` writes for the element: a declared id, a standard-library element's normative id, or the encoding of its qualified or positional name, from the writer's own identity tables. A query result then joins a converted graph, which the qualified name did not do for a library element or a declared id (#733). + +### Changed + +- **The metamodel table is generated from the OMG SysML v2 metamodel version 20250201, read from the pinned pilot implementation's `SysML.ecore`, and records each property's ordering, derivation, redefinitions, subsettings and opposite.** It was pinned to the 202407 rendering of `Open-MBEE/sysmlv2-rdf-ontology`, which has not moved since. The table now declares `FlowUsage`, `PayloadFeature`, `FlowEnd`, `TerminateActionUsage` and the other metaclasses added since, so a type owns them through a `sysml:FeatureMembership` and lists them in `sysml:ownedFeature`, as it owns any feature; `nonunique` is written `sysml:isUnique false`, since the metamodel no longer declares `isNonunique`. Graphs written by earlier releases still read. `ontology.Property` gains `Ordered`, `Derived`, `Redefines`, `Subsets` and `Opposite`, `ontology.Class` gains `Abstract`, and the ontology gate reports a subject typed by an abstract metaclass. CI fails when the table drifts from the pinned metamodel (`make ontology-table-check`). + +- **Stamp Rust release digests into each published crate.** The publish job adds the release tag's + service-asset digests from its checksum manifest, so a crates.io installation can verify and + download the binary it was built against by default. A Git-checkout build or a request for + another release still needs a matching pin or `$OPENSYSML_ALLOW_UNPINNED_DOWNLOAD`; Rust does not + verify the manifest's Sigstore signature itself. + +- **A download refused because `sigstore` is not installed says so.** When no pin covers a release and the `sigstore` package the signed manifest is verified with cannot be imported, `opensysml` raises `SigstoreUnavailableError` (an `UnpinnedReleaseError`) naming the package, the install (`python -m pip install 'sigstore>=4.5.0,<5'`), and that a release of `opensysml` pins its own core release, so this arises only for another release or an older client. The binary is still not downloaded unverified. + +### Fixed + +- **Clients use their built-against service release by default.** Python and Java download and + verify that release. A Rust crate published from a release tag also verifies its built-against + release: the publish job stamps its digests from the release checksum manifest. A Git-checkout + build or a request for another release still needs a pin or + `$OPENSYSML_ALLOW_UNPINNED_DOWNLOAD`; Rust does not verify the manifest's Sigstore signature. + +- A bare `assume c;`, `require c;` or `assert c;`, and one naming a feature chain (`require q.k;`), is now exported in the reference form the grammar gives it: the constraint usage owns a `ReferenceSubsetting` to the feature (or to the chain feature of `q.k`), as `require P::c;` already did, rather than an inline `sysx:condition` expression. The notation, and graphs that state a condition inline, read back as before. + +- **`first a then b;` owns its connector ends.** It was exported as a `SuccessionAsUsage` with only the derived `sourceFeature` and `targetFeature`, so a reader of the API's JSON found no ends. It now owns two `ConnectorEnd`s under `EndFeatureMembership`s, each with a `ReferenceSubsetting` to the feature it names, as the grammar's `SuccessionAsUsage` does; the derived properties are still written, and the notation reads back unchanged. A graph whose ends and derived properties name different features, or whose end declares a name or bounds, is refused rather than written without them (#760). + +- **The gRPC service reports the parser's warnings, and what the notation passes make of them, as the command line does.** `ParseFile` and `ParseSources` handed the analysis an empty parse-diagnostic list, so a reserved keyword written as a name (`part filter : X;`) loaded with no diagnostic where `sysml -validate` reports the `reserved-keyword-name` error, and strict conformance never escalated a parser `nonstandard-notation` warning. The service now hands the analysis the parse's errors and warnings the way the workspace does and reports each diagnostic once; the Python, Java, Julia and other clients see the same diagnostics for a document as the CLI. Edits validate their result under the same parse diagnostics. + +- **Uniqueness and constancy conformance hold of an implicit subsetting.** `action def A { action b[*] nonunique; }` was accepted, though `b` implicitly subsets the unique `Actions::Action::subactions`; only a written `:>`/`:>>` was checked. The feature the usage implicitly subsets is now checked as a written one is, and the finding is reported at the declaration, once (#726). + +- **The metamodel JSON reader unwraps standalone DataVersion envelopes, excludes namespaces with owner metadata from roots, rejects references to the wrong metaclass by default, and rejects non-finite real values.** This reports malformed exported values when read, lets callers opt out of range checking with `check_ranges=False`, and resolves custom metaclasses through `supertypes=`. + +- **Ecore upper bounds above one are multi-valued in the ontology table.** `MultiplicityRange::bound` and `Flow::flowEnd` (upper bound 2) were marked single-valued; they are now `Many`, so api-json writes them as arrays. + +- **A released `opensysml` wheel verifies the service it downloads against a digest it ships.** The release pipeline now builds the `sysml-grpc` binaries first, hashes them and stamps their digests under the release tag into the `release-digests.json` the wheel and sdist package (`pin_release_checksums.py --from-binaries`), and fails the release unless the built wheel and sdist pin all five service assets and the signed `SHA256SUMS.txt` lists the same digests. `pip install opensysml==X.Y.Z` followed by `opensysml.connect()` therefore installs its own core release with no environment variable and no `sigstore` at run time; the signed manifest is what the client verifies for another release, or one newer than itself. + +- **A query reports each element's own `elementId` where two identity scopes declare one qualified name.** The ids a conversion writes were recorded by qualified name, so of two elements named alike in two scopes the query reported the id written last for both. They are now recorded by declaration as well, so each reports the id `Convert` writes for it. + +- A transition now owns what the grammar gives it ahead of its trigger: the `FeatureChainMember` naming the source of a `first` transition (a `Membership` whose member is the state, or for `first a.b` an `OwningMembership` owning the chain), then an `EmptyParameterMember`, and a second one ahead of a trigger. A chained target (`then b.c`) is the feature chain its end's reference subsetting owns, rather than the feature it reaches. `first b.c` and `then b.c` read back as written, where they came back as `first c` and `then c`; a source member or chained end that disagrees with the transition's `sysml:source`/`sysml:target` is refused. A graph in the API element form that states the structure alone, without the collapsed source and target, or a chain only by its derived `chainingFeature` list, reads back the same (#803). + +- `variant x;` is now exported as the `VariantReference` the grammar gives it: a `ReferenceUsage` whose owned `ReferenceSubsetting` references the `x` visible outside the variation, rather than a new `PartUsage` declaring `x`. `variant P::x;` and `variant a.b;`, whose reference is a qualified name or a feature chain, now parse, and are exported the same way, with the chain feature owned for `a.b`. Reading back writes `variant x;` only when `x` reaches the referenced feature, and refuses it otherwise. An unresolved `variant x;` keeps `x` as a literal reference, an unrestricted name such as `'a::b'` staying one name. `variant ref x;` declares `x`, as the grammar reads it, and is written back as `variant ref x;` rather than `ref variant x;`. + +- **The Windows MSI jobs no longer check out the repository, so a tag whose tree Windows cannot check out can still get its installer.** The `msi` and `msi-signed` jobs consume `packaging/msi`, `scripts/build-msi.sh` and `LICENSE`, which the Linux build job uploads as a workflow artifact from the tagged commit; `git checkout` on Windows — which fails on any tracked path it forbids — is no longer on the installer's critical path. + +- **The Windows release workflow can be re-run against an existing tag, and the tree checks out on Windows again.** A document-renderer fixture whose name held `<`/`>` broke `git checkout` on the Windows runners, so no MSI was built; the fixture is renamed, a hygiene test now rejects tracked paths Windows cannot hold, and `release-windows.yml` accepts a `tag` dispatch input (`gh workflow run release-windows.yml --ref main -f tag=vX.Y.Z`) that builds the tagged commit and publishes only the MSI assets. + +- A factor written in `MeasurementReferences::one` is absorbed as the identity of the unit product when quantities multiply or divide (`0.7 [one] * 800 [W]` is `560.0 [W]`, `800 [W] / 0.5 [one]` is `1600.0 [W]`, `2 [one] * 3 [one]` is `6 [one]`), so `power * duration * efficiency` with `efficiency = 0.7 [one]` folds to `67200.0 [SI::J]` — a real reference to `SI::J`, admitted to an `EnergyValue` and comparable with `[SI::J]` literals — instead of `[SI::'kg⋅m²⋅s⁻²'*one]`; `sqrt(9.0 [one])` is `3.0 [one]`. Once every other unit cancels the identity is the unit again, however the operations were grouped (`(2 [one] * 3 [m]) / 3 [m]` and `2 [one] * (3 [m] / 3 [m])` are both `2.0 [one]`). The identity is recognised structurally (a plain `DimensionOneUnit` reducing to scale one), so `rad`, `sr` and a unit scaling `one` by convention (a percent) stay in the product. + +- **The messages-and-events demo validates clean.** `examples/parser_features_demo_messages_events.sysml` declared its two channel messages `nonunique`, which a message in a part cannot be (it implicitly subsets the unique `Parts::Part::ownedActions`); the modifier is dropped and the example is no longer a known failure (#758). + +- **The SysML v1 migrator no longer writes `nonunique` where v2 forbids it.** A v1 property with `isUnique="false"` (or a MagicDraw `[]`/`[n]` type modifier) that becomes a usage implicitly subsetting a unique library feature — a composite `part` or `item` in a part (`Items::Item::subparts`/`subitems`), an `action` in an action or a part (`subactions`/`ownedActions`), and the rest the implicit-subsetting rules name — or that redefines or subsets a feature written unique, is written without the modifier, and the report marks the entry approximated with the feature that forbade it. Attributes, references and parameters keep `nonunique`. The uniqueness is read from the bundled library through the same rules the checker applies, so the migrated notation validates clean. A slot repeating an instance on such a feature is unmapped as a slot conflict, as on any feature written unique. + +- **A SysML v1 initial pseudostate whose transition enters a sibling orthogonal region is written as that region's entry.** The migrator refused such a transition as lying in an orthogonal region and wrote its own region with no entry at all, so the runtime stopped the whole machine at initialization with `region … has no initial state`. The entry `entry; then s;` is now written in the region that owns the target — the sub-state of the `parallel` state or the body of a nested composite state — and the pseudostate and transition are reported as approximated, naming that region; a region owning several initials takes as its own the one entering it, so the stray one no longer displaces it. One coinciding with the target region's own entry into the same vertex is written once; one conflicting with an entry into another vertex is refused with both targets named, and the region's own entry is kept. An initial pseudostate no transition leaves is no entry either, so a donated one may enter its region; one entering a region of another, non-orthogonal state is refused. The owner's `entry; then regions;` default entry appears once every region has an entry. + +- **Ctrl-C at an empty REPL prompt exits the REPL.** Ctrl-C used to only clear the line, so it never ended a session. It still discards a partly typed line, and at a `...>` continuation prompt it now discards the buffered text instead of submitting it; a second Ctrl-C at the empty `sysml>` prompt then exits with the status `%quit` and Ctrl-D leave. + +- **Toolkit full-JSON imports preserve flows, transitions, and library references.** Flow ends owned through `EndFeatureMembership` are folded into the flow head; transitions read trigger, guard, and effect features by their membership kind rather than mistaking parameters for effects; and document-defined library packages remain declarations. Library stubs with stale ids can resolve by their stated qualified name or graph-stated name and owner chain, with a warning, while unmatched identities report both the id and name. Apollo API-JSON import avoids rescanning the whole graph for each owner. +- Reference-usage return parameters retain their metaclass on toolkit JSON round trips. Bulk API JSON decoding delays duplicate indexing until parsing is complete, and graph normalization reuses the imported graph's storage while releasing excess triple capacity. + ## 0.9.1 — 2026-09-26 ### Added diff --git a/Makefile b/Makefile index d6a5dd466f..b01bc02fca 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.PHONY: all build build-sysml build-lsp build-grpc build-wasm build-wasm-wasip1 build-wasm-js wasm-check static-check windows-versioninfo-check man man-check install-tree pgo-profile conformance conformance-pkg conformance-rust conformance-julia conformance-matlab test test-shard coverage lint clean install help fuml-expected python-test python-coverage scripts-coverage node-coverage python-install proto proto-buf python-proto proto-ts proto-rust proto-lint proto-breaking vscode-grammar vscode-build vscode-package docs docs-install docs-serve docs-counts docs-check changelog-check changelog-render self-model +.PHONY: all build build-sysml build-lsp build-grpc build-wasm build-wasm-wasip1 build-wasm-js wasm-check static-check windows-versioninfo-check man man-check install-tree pgo-profile conformance conformance-pkg conformance-rust conformance-julia conformance-matlab test test-shard coverage lint clean install help ontology-table ontology-table-check python-metamodel python-metamodel-check fuml-expected python-test python-coverage scripts-coverage node-coverage python-install proto proto-buf python-proto proto-ts proto-rust proto-lint proto-breaking vscode-grammar vscode-build vscode-package docs docs-install docs-serve docs-counts docs-check changelog-check changelog-render self-model # Version information # Only release tags describe a build; the moving `nightly` tag is not a version. @@ -268,6 +268,24 @@ stdlib-snapshot-check: ## Verify the committed library snapshot matches the bund go run -C $(TOOLS_DIR) ./gen/snapshot -check @echo "✓ stdlib.snapshot is current" +ontology-table: ## Regenerate the metamodel table from the pilot SysML.ecore that scripts/pilot-pin.sh pins + ./scripts/download-pilot-metamodel.sh + go run -C $(TOOLS_DIR) ./gen/ontology + @echo "✓ internal/translate/rdf/ontology/table.go regenerated" + +ontology-table-check: ## Verify the committed metamodel table matches the pinned pilot SysML.ecore, as CI does + ./scripts/download-pilot-metamodel.sh + go run -C $(TOOLS_DIR) ./gen/ontology -check + @echo "✓ internal/translate/rdf/ontology/table.go is current" + +python-metamodel: ## Regenerate Python metaclass classes from the ontology table + go run -C $(TOOLS_DIR) ./gen/pymetamodel + @echo "✓ Python metamodel generated" + +python-metamodel-check: ## Verify generated Python metaclass classes are current + go run -C $(TOOLS_DIR) ./gen/pymetamodel -check + @echo "✓ Python metamodel is current" + fuml-expected: ## Regenerate docs/project/fuml-referee-expected.json from the pinned fUML reference implementation (needs a JDK) ./scripts/fuml-expected.sh @echo "✓ fuml-referee-expected.json regenerated" diff --git a/api/proto/sysml.pb.go b/api/proto/sysml.pb.go index c697f82b75..605880f0fb 100644 --- a/api/proto/sysml.pb.go +++ b/api/proto/sysml.pb.go @@ -3918,8 +3918,15 @@ type ConvertRequest struct { // every other direction builds a graph, where unreadable declarations would // go missing silently. TolerateSyntaxErrors bool `protobuf:"varint,5,opt,name=tolerate_syntax_errors,json=tolerateSyntaxErrors,proto3" json:"tolerate_syntax_errors,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // How derived element ids are spelled when notation is written as a graph + // ("ttl" or "api-json"), as `sysml -id` does: "qualified" (the default, each + // derived from its qualified name) or "uuid" (name-based uuids under each root + // package, the library convention). Declared and normative ids are unchanged. + // Empty is "qualified"; any other value, or one given for another direction, + // is INVALID_ARGUMENT. + IdForm string `protobuf:"bytes,7,opt,name=id_form,json=idForm,proto3" json:"id_form,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ConvertRequest) Reset() { @@ -4007,6 +4014,13 @@ func (x *ConvertRequest) GetTolerateSyntaxErrors() bool { return false } +func (x *ConvertRequest) GetIdForm() string { + if x != nil { + return x.IdForm + } + return "" +} + type isConvertRequest_Source interface { isConvertRequest_Source() } @@ -10845,7 +10859,7 @@ const file_sysml_proto_rawDesc = "" + "final_time\x18\a \x01(\x01R\tfinalTime\x1aM\n" + "\x11FinalContextEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\"\n" + - "\x05value\x18\x02 \x01(\v2\f.sysml.ValueR\x05value:\x028\x01\"\xea\x01\n" + + "\x05value\x18\x02 \x01(\v2\f.sysml.ValueR\x05value:\x028\x01\"\x83\x02\n" + "\x0eConvertRequest\x12\x1d\n" + "\tfile_path\x18\x01 \x01(\tH\x00R\bfilePath\x12\x1a\n" + "\acontent\x18\x02 \x01(\tH\x00R\acontent\x12\x1f\n" + @@ -10854,7 +10868,8 @@ const file_sysml_proto_rawDesc = "" + "\vfrom_format\x18\x03 \x01(\tR\n" + "fromFormat\x12\x1b\n" + "\tto_format\x18\x04 \x01(\tR\btoFormat\x124\n" + - "\x16tolerate_syntax_errors\x18\x05 \x01(\bR\x14tolerateSyntaxErrorsB\b\n" + + "\x16tolerate_syntax_errors\x18\x05 \x01(\bR\x14tolerateSyntaxErrors\x12\x17\n" + + "\aid_form\x18\a \x01(\tR\x06idFormB\b\n" + "\x06source\"\x89\x02\n" + "\x0fConvertResponse\x12\x18\n" + "\acontent\x18\x01 \x01(\tR\acontent\x12\x1f\n" + diff --git a/api/proto/sysml.proto b/api/proto/sysml.proto index 7f153e66fa..e80e1221e1 100644 --- a/api/proto/sysml.proto +++ b/api/proto/sysml.proto @@ -828,6 +828,13 @@ message ConvertRequest { // every other direction builds a graph, where unreadable declarations would // go missing silently. bool tolerate_syntax_errors = 5; + // How derived element ids are spelled when notation is written as a graph + // ("ttl" or "api-json"), as `sysml -id` does: "qualified" (the default, each + // derived from its qualified name) or "uuid" (name-based uuids under each root + // package, the library convention). Declared and normative ids are unchanged. + // Empty is "qualified"; any other value, or one given for another direction, + // is INVALID_ARGUMENT. + string id_form = 7; } // ConvertResponse contains the converted model. diff --git a/changes/unreleased/windows-msi-no-checkout.fixed.md b/changes/unreleased/windows-msi-no-checkout.fixed.md deleted file mode 100644 index 60f8970c37..0000000000 --- a/changes/unreleased/windows-msi-no-checkout.fixed.md +++ /dev/null @@ -1 +0,0 @@ -- **The Windows MSI jobs no longer check out the repository, so a tag whose tree Windows cannot check out can still get its installer.** The `msi` and `msi-signed` jobs consume `packaging/msi`, `scripts/build-msi.sh` and `LICENSE`, which the Linux build job uploads as a workflow artifact from the tagged commit; `git checkout` on Windows — which fails on any tracked path it forbids — is no longer on the installer's critical path. diff --git a/changes/unreleased/windows-portable-paths.fixed.md b/changes/unreleased/windows-portable-paths.fixed.md deleted file mode 100644 index e21ef7b68d..0000000000 --- a/changes/unreleased/windows-portable-paths.fixed.md +++ /dev/null @@ -1 +0,0 @@ -- **The Windows release workflow can be re-run against an existing tag, and the tree checks out on Windows again.** A document-renderer fixture whose name held `<`/`>` broke `git checkout` on the Windows runners, so no MSI was built; the fixture is renamed, a hygiene test now rejects tracked paths Windows cannot hold, and `release-windows.yml` accepts a `tag` dispatch input (`gh workflow run release-windows.yml --ref main -f tag=vX.Y.Z`) that builds the tagged commit and publishes only the MSI assets. diff --git a/client/java/README.md b/client/java/README.md index bad2ad78a8..21344edc07 100644 --- a/client/java/README.md +++ b/client/java/README.md @@ -8,12 +8,12 @@ Eclipse-based tool, a Cameo plugin, a web service. org.openmbee opensysml - 0.9.1 + 0.9.2 ``` -The version is the core release's — `v0.9.1` publishes -`org.openmbee:opensysml:0.9.1` — once the first release is published. +The version is the core release's — `v0.9.2` publishes +`org.openmbee:opensysml:0.9.2` — once the first release is published. Until then, build and install it into the local repository from a checkout: ```bash diff --git a/client/java/opensysml-client/pom.xml b/client/java/opensysml-client/pom.xml index 6b7a2a92a9..69bd1cb56e 100644 --- a/client/java/opensysml-client/pom.xml +++ b/client/java/opensysml-client/pom.xml @@ -7,7 +7,7 @@ org.openmbee opensysml-parent - 0.9.1 + 0.9.2 opensysml diff --git a/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/proto/ConvertRequest.java b/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/proto/ConvertRequest.java index 863725dbe0..c88dd1b62d 100644 --- a/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/proto/ConvertRequest.java +++ b/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/proto/ConvertRequest.java @@ -36,6 +36,7 @@ private ConvertRequest(com.google.protobuf.GeneratedMessage.Builder builder) private ConvertRequest() { fromFormat_ = ""; toFormat_ = ""; + idForm_ = ""; } public static final com.google.protobuf.Descriptors.Descriptor @@ -373,6 +374,63 @@ public boolean getTolerateSyntaxErrors() { return tolerateSyntaxErrors_; } + public static final int ID_FORM_FIELD_NUMBER = 7; + @SuppressWarnings("serial") + private volatile java.lang.Object idForm_ = ""; + /** + *
+   * How derived element ids are spelled when notation is written as a graph
+   * ("ttl" or "api-json"), as `sysml -id` does: "qualified" (the default, each
+   * derived from its qualified name) or "uuid" (name-based uuids under each root
+   * package, the library convention). Declared and normative ids are unchanged.
+   * Empty is "qualified"; any other value, or one given for another direction,
+   * is INVALID_ARGUMENT.
+   * 
+ * + * string id_form = 7 [json_name = "idForm"]; + * @return The idForm. + */ + @java.lang.Override + public java.lang.String getIdForm() { + java.lang.Object ref = idForm_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + idForm_ = s; + return s; + } + } + /** + *
+   * How derived element ids are spelled when notation is written as a graph
+   * ("ttl" or "api-json"), as `sysml -id` does: "qualified" (the default, each
+   * derived from its qualified name) or "uuid" (name-based uuids under each root
+   * package, the library convention). Declared and normative ids are unchanged.
+   * Empty is "qualified"; any other value, or one given for another direction,
+   * is INVALID_ARGUMENT.
+   * 
+ * + * string id_form = 7 [json_name = "idForm"]; + * @return The bytes for idForm. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getIdFormBytes() { + java.lang.Object ref = idForm_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + idForm_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + private byte memoizedIsInitialized = -1; @java.lang.Override public final boolean isInitialized() { @@ -405,6 +463,9 @@ public void writeTo(com.google.protobuf.CodedOutputStream output) if (sourceCase_ == 6) { com.google.protobuf.GeneratedMessage.writeString(output, 6, source_); } + if (!com.google.protobuf.GeneratedMessage.isStringEmpty(idForm_)) { + com.google.protobuf.GeneratedMessage.writeString(output, 7, idForm_); + } getUnknownFields().writeTo(output); } @@ -433,6 +494,9 @@ public int getSerializedSize() { if (sourceCase_ == 6) { size += com.google.protobuf.GeneratedMessage.computeStringSize(6, source_); } + if (!com.google.protobuf.GeneratedMessage.isStringEmpty(idForm_)) { + size += com.google.protobuf.GeneratedMessage.computeStringSize(7, idForm_); + } size += getUnknownFields().getSerializedSize(); memoizedSize = size; return size; @@ -454,6 +518,8 @@ public boolean equals(final java.lang.Object obj) { .equals(other.getToFormat())) return false; if (getTolerateSyntaxErrors() != other.getTolerateSyntaxErrors()) return false; + if (!getIdForm() + .equals(other.getIdForm())) return false; if (!getSourceCase().equals(other.getSourceCase())) return false; switch (sourceCase_) { case 1: @@ -489,6 +555,8 @@ public int hashCode() { hash = (37 * hash) + TOLERATE_SYNTAX_ERRORS_FIELD_NUMBER; hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean( getTolerateSyntaxErrors()); + hash = (37 * hash) + ID_FORM_FIELD_NUMBER; + hash = (53 * hash) + getIdForm().hashCode(); switch (sourceCase_) { case 1: hash = (37 * hash) + FILE_PATH_FIELD_NUMBER; @@ -645,6 +713,7 @@ public Builder clear() { fromFormat_ = ""; toFormat_ = ""; tolerateSyntaxErrors_ = false; + idForm_ = ""; sourceCase_ = 0; source_ = null; return this; @@ -690,6 +759,9 @@ private void buildPartial0(org.openmbee.opensysml.proto.ConvertRequest result) { if (((from_bitField0_ & 0x00000020) != 0)) { result.tolerateSyntaxErrors_ = tolerateSyntaxErrors_; } + if (((from_bitField0_ & 0x00000040) != 0)) { + result.idForm_ = idForm_; + } } private void buildPartialOneofs(org.openmbee.opensysml.proto.ConvertRequest result) { @@ -722,6 +794,11 @@ public Builder mergeFrom(org.openmbee.opensysml.proto.ConvertRequest other) { if (other.getTolerateSyntaxErrors() != false) { setTolerateSyntaxErrors(other.getTolerateSyntaxErrors()); } + if (!other.getIdForm().isEmpty()) { + idForm_ = other.idForm_; + bitField0_ |= 0x00000040; + onChanged(); + } switch (other.getSourceCase()) { case FILE_PATH: { sourceCase_ = 1; @@ -804,6 +881,11 @@ public Builder mergeFrom( source_ = s; break; } // case 50 + case 58: { + idForm_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000040; + break; + } // case 58 default: { if (!super.parseUnknownField(input, extensionRegistry, tag)) { done = true; // was an endgroup tag @@ -1377,6 +1459,123 @@ public Builder clearTolerateSyntaxErrors() { return this; } + private java.lang.Object idForm_ = ""; + /** + *
+     * How derived element ids are spelled when notation is written as a graph
+     * ("ttl" or "api-json"), as `sysml -id` does: "qualified" (the default, each
+     * derived from its qualified name) or "uuid" (name-based uuids under each root
+     * package, the library convention). Declared and normative ids are unchanged.
+     * Empty is "qualified"; any other value, or one given for another direction,
+     * is INVALID_ARGUMENT.
+     * 
+ * + * string id_form = 7 [json_name = "idForm"]; + * @return The idForm. + */ + public java.lang.String getIdForm() { + java.lang.Object ref = idForm_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + idForm_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
+     * How derived element ids are spelled when notation is written as a graph
+     * ("ttl" or "api-json"), as `sysml -id` does: "qualified" (the default, each
+     * derived from its qualified name) or "uuid" (name-based uuids under each root
+     * package, the library convention). Declared and normative ids are unchanged.
+     * Empty is "qualified"; any other value, or one given for another direction,
+     * is INVALID_ARGUMENT.
+     * 
+ * + * string id_form = 7 [json_name = "idForm"]; + * @return The bytes for idForm. + */ + public com.google.protobuf.ByteString + getIdFormBytes() { + java.lang.Object ref = idForm_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + idForm_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
+     * How derived element ids are spelled when notation is written as a graph
+     * ("ttl" or "api-json"), as `sysml -id` does: "qualified" (the default, each
+     * derived from its qualified name) or "uuid" (name-based uuids under each root
+     * package, the library convention). Declared and normative ids are unchanged.
+     * Empty is "qualified"; any other value, or one given for another direction,
+     * is INVALID_ARGUMENT.
+     * 
+ * + * string id_form = 7 [json_name = "idForm"]; + * @param value The idForm to set. + * @return This builder for chaining. + */ + public Builder setIdForm( + java.lang.String value) { + if (value == null) { throw new NullPointerException(); } + idForm_ = value; + bitField0_ |= 0x00000040; + onChanged(); + return this; + } + /** + *
+     * How derived element ids are spelled when notation is written as a graph
+     * ("ttl" or "api-json"), as `sysml -id` does: "qualified" (the default, each
+     * derived from its qualified name) or "uuid" (name-based uuids under each root
+     * package, the library convention). Declared and normative ids are unchanged.
+     * Empty is "qualified"; any other value, or one given for another direction,
+     * is INVALID_ARGUMENT.
+     * 
+ * + * string id_form = 7 [json_name = "idForm"]; + * @return This builder for chaining. + */ + public Builder clearIdForm() { + idForm_ = getDefaultInstance().getIdForm(); + bitField0_ = (bitField0_ & ~0x00000040); + onChanged(); + return this; + } + /** + *
+     * How derived element ids are spelled when notation is written as a graph
+     * ("ttl" or "api-json"), as `sysml -id` does: "qualified" (the default, each
+     * derived from its qualified name) or "uuid" (name-based uuids under each root
+     * package, the library convention). Declared and normative ids are unchanged.
+     * Empty is "qualified"; any other value, or one given for another direction,
+     * is INVALID_ARGUMENT.
+     * 
+ * + * string id_form = 7 [json_name = "idForm"]; + * @param value The bytes for idForm to set. + * @return This builder for chaining. + */ + public Builder setIdFormBytes( + com.google.protobuf.ByteString value) { + if (value == null) { throw new NullPointerException(); } + checkByteStringIsUtf8(value); + idForm_ = value; + bitField0_ |= 0x00000040; + onChanged(); + return this; + } + // @@protoc_insertion_point(builder_scope:sysml.ConvertRequest) } diff --git a/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/proto/ConvertRequestOrBuilder.java b/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/proto/ConvertRequestOrBuilder.java index 52bad6d344..735fc1e1fa 100644 --- a/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/proto/ConvertRequestOrBuilder.java +++ b/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/proto/ConvertRequestOrBuilder.java @@ -124,5 +124,35 @@ public interface ConvertRequestOrBuilder extends */ boolean getTolerateSyntaxErrors(); + /** + *
+   * How derived element ids are spelled when notation is written as a graph
+   * ("ttl" or "api-json"), as `sysml -id` does: "qualified" (the default, each
+   * derived from its qualified name) or "uuid" (name-based uuids under each root
+   * package, the library convention). Declared and normative ids are unchanged.
+   * Empty is "qualified"; any other value, or one given for another direction,
+   * is INVALID_ARGUMENT.
+   * 
+ * + * string id_form = 7 [json_name = "idForm"]; + * @return The idForm. + */ + java.lang.String getIdForm(); + /** + *
+   * How derived element ids are spelled when notation is written as a graph
+   * ("ttl" or "api-json"), as `sysml -id` does: "qualified" (the default, each
+   * derived from its qualified name) or "uuid" (name-based uuids under each root
+   * package, the library convention). Declared and normative ids are unchanged.
+   * Empty is "qualified"; any other value, or one given for another direction,
+   * is INVALID_ARGUMENT.
+   * 
+ * + * string id_form = 7 [json_name = "idForm"]; + * @return The bytes for idForm. + */ + com.google.protobuf.ByteString + getIdFormBytes(); + org.openmbee.opensysml.proto.ConvertRequest.SourceCase getSourceCase(); } diff --git a/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/proto/Sysml.java b/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/proto/Sysml.java index e65c4648c2..85d9728e60 100644 --- a/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/proto/Sysml.java +++ b/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/proto/Sysml.java @@ -902,411 +902,412 @@ public static void registerAllExtensions( "sml.ExplorationStatusR\013exploration\022\035\n\nfi" + "nal_time\030\007 \001(\001R\tfinalTime\032M\n\021FinalContex" + "tEntry\022\020\n\003key\030\001 \001(\tR\003key\022\"\n\005value\030\002 \001(\0132" + - "\014.sysml.ValueR\005value:\0028\001\"\352\001\n\016ConvertRequ" + + "\014.sysml.ValueR\005value:\0028\001\"\203\002\n\016ConvertRequ" + "est\022\035\n\tfile_path\030\001 \001(\tH\000R\010filePath\022\032\n\007co" + "ntent\030\002 \001(\tH\000R\007content\022\037\n\nmodel_hash\030\006 \001" + "(\tH\000R\tmodelHash\022\037\n\013from_format\030\003 \001(\tR\nfr" + "omFormat\022\033\n\tto_format\030\004 \001(\tR\010toFormat\0224\n" + "\026tolerate_syntax_errors\030\005 \001(\010R\024tolerateS" + - "yntaxErrorsB\010\n\006source\"\211\002\n\017ConvertRespons" + - "e\022\030\n\007content\030\001 \001(\tR\007content\022\037\n\013from_form" + - "at\030\002 \001(\tR\nfromFormat\022\033\n\tto_format\030\003 \001(\tR" + - "\010toFormat\022\024\n\005error\030\004 \001(\tR\005error\0223\n\013diagn" + - "ostics\030\005 \003(\0132\021.sysml.DiagnosticR\013diagnos" + - "tics\022\"\n\014experimental\030\006 \001(\010R\014experimental" + - "\022/\n\023experimental_notice\030\007 \001(\tR\022experimen" + - "talNotice\"\257\001\n\021ApplyEditsRequest\022\035\n\nmodel" + - "_hash\030\001 \001(\tR\tmodelHash\0224\n\noperations\030\002 \003" + - "(\0132\024.sysml.EditOperationR\noperations\022\032\n\010" + - "document\030\003 \001(\tR\010document\022)\n\020accept_docum" + - "ents\030\004 \001(\010R\017acceptDocuments\"\234\010\n\rEditOper" + - "ation\0222\n\tset_value\030\001 \001(\0132\023.sysml.SetValu" + - "eEditH\000R\010setValue\022+\n\006rename\030\002 \001(\0132\021.sysm" + - "l.RenameEditH\000R\006rename\0225\n\nadd_member\030\003 \001" + - "(\0132\024.sysml.AddMemberEditH\000R\taddMember\022+\n" + - "\006delete\030\004 \001(\0132\021.sysml.DeleteEditH\000R\006dele" + - "te\022%\n\004move\030\005 \001(\0132\017.sysml.MoveEditH\000R\004mov" + - "e\022A\n\016add_connection\030\006 \001(\0132\030.sysml.AddCon" + - "nectionEditH\000R\raddConnection\0228\n\013add_sati" + - "sfy\030\007 \001(\0132\025.sysml.AddSatisfyEditH\000R\naddS" + - "atisfy\022c\n\032add_requirement_constraint\030\010 \001" + - "(\0132#.sysml.AddRequirementConstraintEditH" + - "\000R\030addRequirementConstraint\022A\n\016add_trans" + - "ition\030\t \001(\0132\030.sysml.AddTransitionEditH\000R" + - "\raddTransition\0225\n\nadd_import\030\n \001(\0132\024.sys" + - "ml.AddImportEditH\000R\taddImport\022J\n\021add_doc" + - "umentation\030\013 \001(\0132\033.sysml.AddDocumentatio" + - "nEditH\000R\020addDocumentation\0225\n\nadd_verify\030" + - "\014 \001(\0132\024.sysml.AddVerifyEditH\000R\taddVerify" + - "\022;\n\014add_metadata\030\r \001(\0132\026.sysml.AddMetada" + - "taEditH\000R\013addMetadata\022;\n\014add_sequence\030\016 " + - "\001(\0132\026.sysml.AddSequenceEditH\000R\013addSequen" + - "ce\022N\n\023add_metadata_prefix\030\017 \001(\0132\034.sysml." + - "AddMetadataPrefixEditH\000R\021addMetadataPref" + - "ix\0228\n\013add_comment\030\020 \001(\0132\025.sysml.AddComme" + - "ntEditH\000R\naddComment\022/\n\010add_note\030\022 \001(\0132\022" + - ".sysml.AddNoteEditH\000R\007addNoteB\013\n\toperati" + - "on\"\241\003\n\rAddMemberEdit\022\024\n\005owner\030\001 \001(\tR\005own" + - "er\022\022\n\004kind\030\002 \001(\tR\004kind\022\022\n\004name\030\003 \001(\tR\004na" + - "me\022\022\n\004type\030\004 \001(\tR\004type\022\"\n\014multiplicity\030\005" + - " \001(\tR\014multiplicity\022\024\n\005value\030\006 \001(\tR\005value" + - "\022 \n\013specializes\030\007 \003(\tR\013specializes\022\037\n\013is" + - "_abstract\030\010 \001(\010R\nisAbstract\022\034\n\tredefines" + - "\030\t \003(\tR\tredefines\022\035\n\nis_default\030\n \001(\010R\ti" + - "sDefault\022\034\n\tdirection\030\013 \001(\tR\tdirection\022+" + - "\n\021metadata_prefixes\030\016 \003(\tR\020metadataPrefi" + - "xes\022\020\n\003doc\030\014 \001(\tR\003doc\022\'\n\017body_expression" + - "\030\r \001(\tR\016bodyExpression\"\267\001\n\016AddSatisfyEdi" + - "t\022\024\n\005owner\030\001 \001(\tR\005owner\022 \n\013requirement\030\002" + - " \001(\tR\013requirement\022-\n\022satisfying_feature\030" + - "\003 \001(\tR\021satisfyingFeature\022\037\n\013is_asserted\030" + - "\004 \001(\010R\nisAsserted\022\035\n\nis_negated\030\005 \001(\010R\ti" + - "sNegated\"|\n\034AddRequirementConstraintEdit" + - "\022\024\n\005owner\030\001 \001(\tR\005owner\022\022\n\004kind\030\002 \001(\tR\004ki" + - "nd\022\036\n\nexpression\030\003 \001(\tR\nexpression\022\022\n\004na" + - "me\030\004 \001(\tR\004name\"\317\001\n\021AddTransitionEdit\022\024\n\005" + - "owner\030\001 \001(\tR\005owner\022\022\n\004name\030\002 \001(\tR\004name\022\026" + - "\n\006source\030\003 \001(\tR\006source\022\026\n\006target\030\004 \001(\tR\006" + - "target\022\030\n\007trigger\030\005 \001(\tR\007trigger\022\024\n\005guar" + - "d\030\006 \001(\tR\005guard\022\026\n\006effect\030\007 \001(\tR\006effect\022\030" + - "\n\007initial\030\010 \001(\010R\007initial\"G\n\rAddVerifyEdi" + - "t\022\024\n\005owner\030\001 \001(\tR\005owner\022 \n\013requirement\030\002" + - " \001(\tR\013requirement\"F\n\024MetadataFeatureValu" + - "e\022\030\n\007feature\030\001 \001(\tR\007feature\022\024\n\005value\030\002 \001" + - "(\tR\005value\"\311\001\n\017AddMetadataEdit\022\024\n\005owner\030\001" + - " \001(\tR\005owner\022#\n\rmetadata_type\030\002 \001(\tR\014meta" + - "dataType\022\022\n\004name\030\003 \001(\tR\004name\022\024\n\005about\030\004 " + - "\003(\tR\005about\0223\n\006values\030\005 \003(\0132\033.sysml.Metad" + - "ataFeatureValueR\006values\022\034\n\tshorthand\030\006 \001" + - "(\010R\tshorthand\"T\n\025AddMetadataPrefixEdit\022\026" + - "\n\006target\030\001 \001(\tR\006target\022#\n\rmetadata_type\030" + - "\002 \001(\tR\014metadataType\"\276\001\n\rAddImportEdit\022\024\n" + - "\005owner\030\001 \001(\tR\005owner\022\036\n\nvisibility\030\002 \001(\tR" + - "\nvisibility\022\026\n\006target\030\003 \001(\tR\006target\022!\n\014i" + - "s_recursive\030\004 \001(\010R\013isRecursive\022\"\n\ris_imp" + - "ort_all\030\005 \001(\010R\013isImportAll\022\030\n\007filters\030\006 " + - "\003(\tR\007filters\"\210\001\n\024AddDocumentationEdit\022\026\n" + - "\006target\030\001 \001(\tR\006target\022\022\n\004body\030\002 \001(\tR\004bod" + - "y\022\022\n\004name\030\003 \001(\tR\004name\022\026\n\006locale\030\004 \001(\tR\006l" + - "ocale\022\030\n\007replace\030\005 \001(\010R\007replace\"|\n\016AddCo" + - "mmentEdit\022\024\n\005owner\030\001 \001(\tR\005owner\022\022\n\004body\030" + - "\002 \001(\tR\004body\022\022\n\004name\030\003 \001(\tR\004name\022\024\n\005about" + - "\030\004 \003(\tR\005about\022\026\n\006locale\030\005 \001(\tR\006locale\"9\n" + - "\013AddNoteEdit\022\026\n\006target\030\001 \001(\tR\006target\022\022\n\004" + - "text\030\002 \001(\tR\004text\"\326\003\n\017AddSequenceEdit\022\024\n\005" + - "owner\030\001 \001(\tR\005owner\022\030\n\007keyword\030\002 \001(\tR\007key" + - "word\022\020\n\003ref\030\003 \001(\tR\003ref\022\037\n\013member_kind\030\004 " + - "\001(\tR\nmemberKind\022\037\n\013member_name\030\005 \001(\tR\nme" + - "mberName\022\022\n\004type\030\006 \001(\tR\004type\022\024\n\005after\030\007 " + - "\001(\tR\005after\022\034\n\tcondition\030\010 \001(\tR\tcondition" + - "\022\024\n\005value\030\t \001(\tR\005value\022\026\n\006target\030\n \001(\tR\006" + - "target\022\020\n\003via\030\013 \001(\tR\003via\022\024\n\005until\030\014 \001(\tR" + - "\005until\022*\n\004body\030\r \003(\0132\026.sysml.AddSequence" + - "EditR\004body\0223\n\telse_body\030\016 \003(\0132\026.sysml.Ad" + - "dSequenceEditR\010elseBody\022\"\n\014multiplicity\030" + - "\017 \001(\tR\014multiplicity\022\034\n\tparameter\030\020 \001(\tR\t" + - "parameter\"\227\001\n\021AddConnectionEdit\022\024\n\005owner" + - "\030\001 \001(\tR\005owner\022\022\n\004kind\030\002 \001(\tR\004kind\022\031\n\010fro" + - "m_end\030\003 \001(\tR\007fromEnd\022\025\n\006to_end\030\004 \001(\tR\005to" + - "End\022\022\n\004name\030\005 \001(\tR\004name\022\022\n\004type\030\006 \001(\tR\004t" + - "ype\">\n\nDeleteEdit\022\026\n\006target\030\001 \001(\tR\006targe" + - "t\022\030\n\007cascade\030\002 \001(\010R\007cascade\"8\n\010MoveEdit\022" + - "\026\n\006target\030\001 \001(\tR\006target\022\024\n\005owner\030\002 \001(\tR\005" + - "owner\"<\n\014SetValueEdit\022\026\n\006target\030\001 \001(\tR\006t" + - "arget\022\024\n\005value\030\002 \001(\tR\005value\"?\n\nRenameEdi" + - "t\022\026\n\006target\030\001 \001(\tR\006target\022\031\n\010new_name\030\002 " + - "\001(\tR\007newName\"\350\002\n\022ApplyEditsResponse\022\030\n\007c" + - "ontent\030\001 \001(\tR\007content\022,\n\007applied\030\002 \003(\0132\022" + - ".sysml.AppliedEditR\007applied\022\024\n\005error\030\003 \001" + - "(\tR\005error\022,\n\007failure\030\004 \001(\0162\022.sysml.EditF" + - "ailureR\007failure\0223\n\013diagnostics\030\005 \003(\0132\021.s" + - "ysml.DiagnosticR\013diagnostics\022-\n\022referrin" + - "g_elements\030\006 \003(\tR\021referringElements\0223\n\td" + - "ocuments\030\007 \003(\0132\025.sysml.EditedDocumentR\td" + - "ocuments\022-\n\treferrers\030\010 \003(\0132\017.sysml.Refe" + - "rrerR\treferrers\">\n\016EditedDocument\022\022\n\004nam" + - "e\030\001 \001(\tR\004name\022\030\n\007content\030\002 \001(\tR\007content\"" + - ":\n\010Referrer\022\022\n\004name\030\001 \001(\tR\004name\022\032\n\010docum" + - "ent\030\002 \001(\tR\010document\"\320\001\n\013AppliedEdit\022\'\n\017o" + - "peration_index\030\001 \001(\005R\016operationIndex\022\026\n\006" + - "target\030\002 \001(\tR\006target\022\026\n\006offset\030\003 \001(\005R\006of" + - "fset\022\026\n\006length\030\004 \001(\005R\006length\022\031\n\010old_text" + - "\030\005 \001(\tR\007oldText\022\031\n\010new_text\030\006 \001(\tR\007newTe" + - "xt\022\032\n\010document\030\007 \001(\tR\010document\"\375\003\n\nSymbo" + - "lInfo\022\016\n\002id\030\001 \001(\tR\002id\022\022\n\004name\030\002 \001(\tR\004nam" + - "e\022\022\n\004kind\030\003 \001(\tR\004kind\022;\n\010metadata\030\004 \003(\0132" + - "\037.sysml.SymbolInfo.MetadataEntryR\010metada" + - "ta\022\033\n\tchild_ids\030\005 \003(\tR\010childIds\0224\n\nattri" + - "butes\030\006 \003(\0132\024.sysml.AttributeInfoR\nattri" + - "butes\022,\n\ttype_info\030\007 \001(\0132\017.sysml.TypeInf" + - "oR\010typeInfo\022;\n\014multiplicity\030\010 \001(\0132\027.sysm" + - "l.MultiplicityInfoR\014multiplicity\022?\n\017spec" + - "ializations\030\t \003(\0132\025.sysml.Specialization" + - "R\017specializations\022>\n\033withheld_library_at" + - "tributes\030\n \001(\005R\031withheldLibraryAttribute" + - "s\032;\n\rMetadataEntry\022\020\n\003key\030\001 \001(\tR\003key\022\024\n\005" + - "value\030\002 \001(\tR\005value:\0028\001\"~\n\016Specialization" + - "\022\022\n\004kind\030\001 \001(\tR\004kind\022\032\n\010declared\030\002 \001(\tR\010" + - "declared\022\033\n\ttarget_id\030\003 \001(\tR\010targetId\022\037\n" + - "\013target_kind\030\004 \001(\tR\ntargetKind\"\345\001\n\010TypeI" + - "nfo\022\032\n\010declared\030\001 \001(\tR\010declared\022\037\n\013resol" + - "ved_id\030\002 \001(\tR\nresolvedId\022#\n\rresolved_kin" + - "d\030\003 \001(\tR\014resolvedKind\022\034\n\tprimitive\030\004 \001(\t" + - "R\tprimitive\022)\n\020primitive_source\030\005 \001(\tR\017p" + - "rimitiveSource\022\032\n\010quantity\030\006 \001(\010R\010quanti" + - "ty\022\022\n\004unit\030\007 \001(\tR\004unit\">\n\020MultiplicityIn" + - "fo\022\024\n\005lower\030\001 \001(\tR\005lower\022\024\n\005upper\030\002 \001(\tR" + - "\005upper\"o\n\rAttributeInfo\022\022\n\004name\030\001 \001(\tR\004n" + - "ame\022\022\n\004type\030\002 \001(\tR\004type\022\"\n\005value\030\003 \001(\0132\014" + - ".sysml.ValueR\005value\022\022\n\004unit\030\004 \001(\tR\004unit\"" + - "\245\007\n\005Value\022\035\n\tint_value\030\001 \001(\003H\000R\010intValue" + - "\022\037\n\nreal_value\030\002 \001(\001H\000R\trealValue\022\037\n\nboo" + - "l_value\030\003 \001(\010H\000R\tboolValue\022#\n\014string_val" + - "ue\030\004 \001(\tH\000R\013stringValue\022!\n\013instance_id\030\005" + - " \001(\003H\000R\ninstanceId\0222\n\010sequence\030\006 \001(\0132\024.s" + - "ysml.ValueSequenceH\000R\010sequence\022\024\n\004null\030\007" + - " \001(\tH\000R\004null\022-\n\010quantity\030\010 \001(\0132\017.sysml.Q" + - "uantityH\000R\010quantity\0227\n\014enum_literal\030\t \001(" + - "\0132\022.sysml.EnumLiteralH\000R\013enumLiteral\022\026\n\005" + - "unset\030\n \001(\010H\000R\005unset\022*\n\007complex\030\013 \001(\0132\016." + - "sysml.ComplexH\000R\007complex\022$\n\005array\030\014 \001(\0132", - "\014.sysml.ArrayH\000R\005array\022\'\n\006vector\030\r \001(\0132\r" + - ".sysml.VectorH\000R\006vector\022@\n\017vector_quanti" + - "ty\030\016 \001(\0132\025.sysml.VectorQuantityH\000R\016vecto" + - "rQuantity\022@\n\017measurement_ref\030\017 \001(\0132\025.sys" + - "ml.MeasurementRefH\000R\016measurementRef\022\034\n\010i" + - "nfinity\030\020 \001(\010H\000R\010infinity\022-\n\010function\030\021 " + - "\001(\0132\017.sysml.FunctionH\000R\010function\022#\n\003set\030" + - "\022 \001(\0132\017.sysml.ValueSetH\000R\003set\022@\n\017tensor_" + - "quantity\030\023 \001(\0132\025.sysml.TensorQuantityH\000R" + - "\016tensorQuantity\0223\n\nmetaobject\030\024 \001(\0132\021.sy" + - "sml.MetaobjectH\000R\nmetaobject\0229\n\014undeterm" + - "ined\030\025 \001(\0132\023.sysml.UndeterminedH\000R\014undet" + - "erminedB\006\n\004kind\"N\n\nMetaobject\022\035\n\nelement" + - "_id\030\001 \001(\tR\telementId\022!\n\014metaclass_id\030\002 \001" + - "(\tR\013metaclassId\"U\n\014Undetermined\022\026\n\006reaso" + - "n\030\001 \001(\tR\006reason\022-\n\005count\030\002 \001(\0132\027.sysml.M" + - "ultiplicityInfoR\005count\"<\n\010Function\022\027\n\007ca" + - "lc_id\030\001 \001(\tR\006calcId\022\027\n\007self_id\030\002 \001(\003R\006se" + - "lfId\"4\n\010ValueSet\022(\n\010elements\030\001 \003(\0132\014.sys" + - "ml.ValueR\010elements\"a\n\016TensorQuantity\022\036\n\n" + - "dimensions\030\001 \003(\003R\ndimensions\022/\n\ncomponen" + - "ts\030\002 \003(\0132\017.sysml.QuantityR\ncomponents\"Q\n" + - "\005Array\022\036\n\ndimensions\030\001 \003(\003R\ndimensions\022(" + - "\n\010elements\030\002 \003(\0132\014.sysml.ValueR\010elements" + - "\"6\n\006Vector\022,\n\ncomponents\030\001 \003(\0132\014.sysml.V" + - "alueR\ncomponents\"A\n\016VectorQuantity\022/\n\nco" + - "mponents\030\001 \003(\0132\017.sysml.QuantityR\ncompone" + - "nts\";\n\007Complex\022\022\n\004real\030\001 \001(\001R\004real\022\034\n\tim" + - "aginary\030\002 \001(\001R\timaginary\"\213\001\n\013EnumLiteral" + - "\022\035\n\nliteral_id\030\001 \001(\tR\tliteralId\022%\n\016enume" + - "ration_id\030\002 \001(\tR\renumerationId\022\022\n\004name\030\003" + - " \001(\tR\004name\022\"\n\005value\030\004 \001(\0132\014.sysml.ValueR" + - "\005value\"9\n\rValueSequence\022(\n\010elements\030\001 \003(" + - "\0132\014.sysml.ValueR\010elements\"\251\001\n\010Quantity\022%" + - "\n\rint_magnitude\030\001 \001(\003H\000R\014intMagnitude\022\'\n" + - "\016real_magnitude\030\002 \001(\001H\000R\rrealMagnitude\022\022" + - "\n\004unit\030\003 \001(\tR\004unit\022,\n\tunit_term\030\004 \001(\0132\017." + - "sysml.UnitTermR\010unitTermB\013\n\tmagnitude\"k\n" + - "\016MeasurementRef\022\022\n\004unit\030\001 \001(\tR\004unit\022,\n\tu" + - "nit_term\030\002 \001(\0132\017.sysml.UnitTermR\010unitTer" + - "m\022\027\n\007unit_id\030\003 \001(\tR\006unitId\"q\n\010UnitTerm\022\033" + - "\n\tscale_num\030\001 \001(\001R\010scaleNum\022\033\n\tscale_den" + - "\030\002 \001(\001R\010scaleDen\022+\n\007factors\030\003 \003(\0132\021.sysm" + - "l.UnitFactorR\007factors\"A\n\nUnitFactor\022\027\n\007u" + - "nit_id\030\001 \001(\tR\006unitId\022\032\n\010exponent\030\002 \001(\001R\010" + - "exponent\"w\n\nDiagnostic\022\032\n\010severity\030\001 \001(\t" + - "R\010severity\022\030\n\007message\030\002 \001(\tR\007message\022\037\n\004" + - "span\030\003 \001(\0132\013.sysml.SpanR\004span\022\022\n\004code\030\004 " + - "\001(\tR\004code\"\212\001\n\004Span\022\022\n\004file\030\001 \001(\tR\004file\022\035" + - "\n\nstart_line\030\002 \001(\005R\tstartLine\022\033\n\tstart_c" + - "ol\030\003 \001(\005R\010startCol\022\031\n\010end_line\030\004 \001(\005R\007en" + - "dLine\022\027\n\007end_col\030\005 \001(\005R\006endCol\"\023\n\021Server" + - "InfoRequest\"R\n\022ServerInfoResponse\022\030\n\007ver" + - "sion\030\001 \001(\tR\007version\022\"\n\014capabilities\030\002 \003(" + - "\tR\014capabilities\"p\n\014QueryRequest\022\035\n\nmodel" + - "_hash\030\001 \001(\tR\tmodelHash\022\"\n\005query\030\002 \001(\0132\014." + - "sysml.QueryR\005query\022\035\n\noslc_query\030\003 \001(\tR\t" + - "oslcQuery\"F\n\rQueryResponse\0225\n\010elements\030\001" + - " \003(\0132\031.sysml.QueryResultElementR\010element" + - "s\"^\n\005Query\022\024\n\005scope\030\001 \003(\tR\005scope\022\026\n\006sele" + - "ct\030\002 \003(\tR\006select\022\'\n\005where\030\003 \001(\0132\021.sysml." + - "ConstraintR\005where\"\222\001\n\nConstraint\022:\n\tprim" + - "itive\030\001 \001(\0132\032.sysml.PrimitiveConstraintH" + - "\000R\tprimitive\022:\n\tcomposite\030\002 \001(\0132\032.sysml." + - "CompositeConstraintH\000R\tcompositeB\014\n\ncons" + - "traint\"\227\001\n\023PrimitiveConstraint\022\030\n\007invers" + - "e\030\001 \001(\010R\007inverse\022\032\n\010property\030\002 \001(\tR\010prop" + - "erty\0224\n\010operator\030\003 \001(\0162\030.sysml.Primitive" + - "OperatorR\010operator\022\024\n\005value\030\004 \003(\tR\005value" + - "\"~\n\023CompositeConstraint\0224\n\010operator\030\001 \001(" + - "\0162\030.sysml.CompositeOperatorR\010operator\0221\n" + - "\nconstraint\030\002 \003(\0132\021.sysml.ConstraintR\nco" + - "nstraint\"\302\001\n\022QueryResultElement\022\016\n\002id\030\001 " + - "\001(\tR\002id\022\022\n\004type\030\002 \001(\tR\004type\022I\n\npropertie" + - "s\030\003 \003(\0132).sysml.QueryResultElement.Prope" + - "rtiesEntryR\nproperties\032=\n\017PropertiesEntr" + - "y\022\020\n\003key\030\001 \001(\tR\003key\022\024\n\005value\030\002 \001(\tR\005valu" + - "e:\0028\001\"\220\001\n\nSweepRange\022\034\n\tparameter\030\001 \001(\tR" + - "\tparameter\022\"\n\005start\030\002 \001(\0132\014.sysml.ValueR" + - "\005start\022\036\n\003end\030\003 \001(\0132\014.sysml.ValueR\003end\022 " + - "\n\004step\030\004 \001(\0132\014.sysml.ValueR\004step\"\274\003\n\017Run" + - "SweepRequest\022\035\n\nmodel_hash\030\001 \001(\tR\tmodelH" + - "ash\022\033\n\tsymbol_id\030\002 \001(\tR\010symbolId\022*\n\021subj" + - "ect_symbol_id\030\003 \001(\tR\017subjectSymbolId\022*\n\t" + - "arguments\030\004 \003(\0132\014.sysml.ValueR\targuments" + - "\022S\n\017named_arguments\030\005 \003(\0132*.sysml.RunSwe" + - "epRequest.NamedArgumentsEntryR\016namedArgu" + - "ments\022)\n\006ranges\030\006 \003(\0132\021.sysml.SweepRange" + - "R\006ranges\022\030\n\007samples\030\007 \001(\003R\007samples\022\022\n\004se" + - "ed\030\010 \001(\004R\004seed\022\026\n\006engine\030\t \001(\tR\006engine\032O" + - "\n\023NamedArgumentsEntry\022\020\n\003key\030\001 \001(\tR\003key\022" + - "\"\n\005value\030\002 \001(\0132\014.sysml.ValueR\005value:\0028\001\"" + - "\301\002\n\010SweepRow\022)\n\006inputs\030\001 \003(\0132\021.sysml.Cal" + - "cOutputR\006inputs\022+\n\007outputs\030\002 \003(\0132\021.sysml" + - ".CalcOutputR\007outputs\022*\n\010verdicts\030\003 \003(\0132\016" + - ".sysml.VerdictR\010verdicts\022%\n\016elapsed_micr" + - "os\030\004 \001(\003R\relapsedMicros\022\024\n\005error\030\005 \001(\tR\005" + - "error\022;\n\016failure_reason\030\006 \001(\0162\024.sysml.Fa" + - "ilureReasonR\rfailureReason\0227\n\013evaluation" + - "s\030\007 \003(\0132\025.sysml.CaseEvaluationR\013evaluati" + - "ons\"\226\003\n\020RunSweepResponse\022#\n\004rows\030\001 \003(\0132\017" + - ".sysml.SweepRowR\004rows\022\036\n\nparameters\030\002 \003(" + - "\tR\nparameters\022\030\n\007sampled\030\003 \001(\010R\007sampled\022" + - "\022\n\004seed\030\004 \001(\004R\004seed\022\024\n\005error\030\005 \001(\tR\005erro" + - "r\0223\n\013diagnostics\030\006 \003(\0132\021.sysml.Diagnosti" + - "cR\013diagnostics\022;\n\016failure_reason\030\007 \001(\0162\024" + - ".sysml.FailureReasonR\rfailureReason\022-\n\ti" + - "nstances\030\010 \003(\0132\017.sysml.InstanceR\tinstanc" + - "es\022\026\n\006engine\030\t \001(\tR\006engine\022\032\n\010strength\030\n" + - " \001(\tR\010strength\022$\n\006bounds\030\013 \003(\0132\014.sysml.B" + - "oundR\006bounds\"\214\001\n\027RunDocumentQueryRequest" + - "\022\035\n\nmodel_hash\030\001 \001(\tR\tmodelHash\022\031\n\010query" + - "_id\030\002 \001(\tR\007queryId\0227\n\010bindings\030\003 \003(\0132\033.s" + - "ysml.DocumentQueryBindingR\010bindings\"b\n\024D" + - "ocumentQueryBinding\022\034\n\tparameter\030\001 \001(\tR\t" + - "parameter\022,\n\006values\030\002 \003(\0132\024.sysml.Docume" + - "ntValueR\006values\"\357\003\n\rDocumentValue\022\037\n\nele" + - "ment_id\030\001 \001(\tH\000R\telementId\022#\n\014string_val" + - "ue\030\002 \001(\tH\000R\013stringValue\022\035\n\tint_value\030\003 \001" + - "(\003H\000R\010intValue\022\037\n\nreal_value\030\004 \001(\001H\000R\tre" + - "alValue\022\037\n\nbool_value\030\005 \001(\010H\000R\tboolValue" + - "\022\034\n\010infinity\030\006 \001(\010H\000R\010infinity\022-\n\010quanti" + - "ty\030\010 \001(\0132\017.sysml.QuantityH\000R\010quantity\0222\n" + - "\007verdict\030\t \001(\0132\026.sysml.DocumentVerdictH\000" + - "R\007verdict\022/\n\006object\030\n \001(\0132\025.sysml.Docume" + - "ntObjectH\000R\006object\022,\n\005state\030\013 \001(\0132\024.sysm" + - "l.DocumentStateH\000R\005state\022,\n\005event\030\014 \001(\0132" + - "\024.sysml.DocumentEventH\000R\005event\022!\n\014elemen" + - "t_type\030\007 \001(\tR\013elementTypeB\006\n\004kind\"u\n\016Doc" + - "umentObject\022\037\n\013instance_id\030\001 \001(\003R\ninstan" + - "ceId\022\022\n\004path\030\002 \001(\tR\004path\022.\n\007element\030\003 \001(" + - "\0132\024.sysml.DocumentValueR\007element\"\365\001\n\017Doc" + - "umentVerdict\0222\n\tassertion\030\001 \001(\0132\024.sysml." + - "DocumentValueR\tassertion\022\022\n\004kind\030\002 \001(\tR\004" + - "kind\022\022\n\004text\030\003 \001(\tR\004text\022\022\n\004path\030\004 \001(\tR\004" + - "path\022\030\n\007verdict\030\005 \001(\tR\007verdict\022\034\n\tcondit" + - "ion\030\006 \001(\tR\tcondition\022\026\n\006reason\030\007 \001(\tR\006re" + - "ason\022\"\n\014verification\030\010 \003(\tR\014verification" + - "\"\355\001\n\rDocumentState\022-\n\006object\030\001 \001(\0132\025.sys" + - "ml.DocumentObjectR\006object\022\030\n\007machine\030\002 \001" + - "(\tR\007machine\022\022\n\004name\030\003 \001(\tR\004name\022\035\n\nstate" + - "_path\030\004 \001(\tR\tstatePath\022*\n\005state\030\005 \001(\0132\024." + - "sysml.DocumentValueR\005state\022\026\n\006region\030\006 \001" + - "(\tR\006region\022\034\n\tenclosing\030\007 \003(\tR\tenclosing" + - "\"\375\002\n\rDocumentEvent\022\022\n\004kind\030\001 \001(\tR\004kind\022(" + - "\n\004time\030\002 \001(\0132\024.sysml.DocumentValueR\004time" + - "\022-\n\006object\030\003 \001(\0132\025.sysml.DocumentObjectR" + - "\006object\022\030\n\007machine\030\004 \001(\tR\007machine\022\024\n\005sta" + - "te\030\005 \001(\tR\005state\022\022\n\004from\030\006 \001(\tR\004from\022\016\n\002t" + - "o\030\007 \001(\tR\002to\022-\n\006target\030\010 \001(\0132\025.sysml.Docu" + - "mentObjectR\006target\022\024\n\005event\030\t \001(\tR\005event" + - "\022\030\n\007payload\030\n \003(\tR\007payload\022\"\n\014alternativ" + - "es\030\013 \003(\tR\014alternatives\022\024\n\005taken\030\014 \001(\tR\005t" + - "aken\022\022\n\004text\030\r \001(\tR\004text\")\n\023DocumentQuer" + - "yColumn\022\022\n\004name\030\001 \001(\tR\004name\"A\n\021DocumentQ" + - "ueryCell\022,\n\006values\030\001 \003(\0132\024.sysml.Documen" + - "tValueR\006values\"r\n\020DocumentQueryRow\022.\n\007el" + - "ement\030\001 \001(\0132\024.sysml.DocumentValueR\007eleme" + - "nt\022.\n\005cells\030\002 \003(\0132\030.sysml.DocumentQueryC" + - "ellR\005cells\"}\n\030RunDocumentQueryResponse\0224" + - "\n\007columns\030\001 \003(\0132\032.sysml.DocumentQueryCol" + - "umnR\007columns\022+\n\004rows\030\002 \003(\0132\027.sysml.Docum" + - "entQueryRowR\004rows\"k\n\025RenderDocumentReque" + - "st\022\035\n\nmodel_hash\030\001 \001(\tR\tmodelHash\022\037\n\013doc" + - "ument_id\030\002 \001(\tR\ndocumentId\022\022\n\004form\030\003 \001(\t" + - "R\004form\"H\n\026RenderDocumentResponse\022\032\n\010mark" + - "down\030\001 \001(\tR\010markdown\022\022\n\004html\030\002 \001(\tR\004html" + - "*\261\001\n\rFailureReason\022\036\n\032FAILURE_REASON_UNS" + - "PECIFIED\020\000\022\035\n\031FAILURE_REASON_EVALUATION\020" + - "\001\022\035\n\031FAILURE_REASON_WRONG_KIND\020\002\022$\n FAIL" + - "URE_REASON_AMBIGUOUS_SUBJECT\020\003\022\034\n\030FAILUR" + - "E_REASON_UNDECIDED\020\004*\214\005\n\013EditFailure\022\034\n\030" + - "EDIT_FAILURE_UNSPECIFIED\020\000\022\036\n\032EDIT_FAILU" + - "RE_NO_OPERATIONS\020\001\022\037\n\033EDIT_FAILURE_UNKNO" + - "WN_TARGET\020\002\022!\n\035EDIT_FAILURE_AMBIGUOUS_TA" + - "RGET\020\003\022\033\n\027EDIT_FAILURE_NOT_VALUED\020\004\022\036\n\032E" + - "DIT_FAILURE_INVALID_VALUE\020\005\022\035\n\031EDIT_FAIL" + - "URE_INVALID_NAME\020\006\022\032\n\026EDIT_FAILURE_NOT_N" + - "AMED\020\007\022\"\n\036EDIT_FAILURE_RENAME_REFERENCED" + - "\020\010\022\"\n\036EDIT_FAILURE_OVERLAPPING_EDITS\020\t\022\037" + - "\n\033EDIT_FAILURE_RESULT_INVALID\020\n\022\036\n\032EDIT_" + - "FAILURE_OWNER_UNKNOWN\020\013\022$\n EDIT_FAILURE_" + - "OWNER_NOT_NAMESPACE\020\014\022\035\n\031EDIT_FAILURE_IL" + - "LEGAL_KIND\020\r\022\"\n\036EDIT_FAILURE_MEMBER_NAME" + - "_TAKEN\020\016\022\"\n\036EDIT_FAILURE_DELETE_REFERENC" + - "ED\020\017\022$\n EDIT_FAILURE_OWNER_INSIDE_TARGET" + - "\020\020\022 \n\034EDIT_FAILURE_MOVE_REFERENCED\020\021\022%\n!" + - "EDIT_FAILURE_REFERENCED_ELSEWHERE\020\022*\222\001\n\021" + - "PrimitiveOperator\022\"\n\036PRIMITIVE_OPERATOR_" + - "UNSPECIFIED\020\000\022\034\n\030PRIMITIVE_OPERATOR_EQUA" + - "L\020\001\022\036\n\032PRIMITIVE_OPERATOR_GREATER\020\002\022\033\n\027P" + - "RIMITIVE_OPERATOR_LESS\020\003*n\n\021CompositeOpe" + - "rator\022\"\n\036COMPOSITE_OPERATOR_UNSPECIFIED\020" + - "\000\022\032\n\026COMPOSITE_OPERATOR_AND\020\001\022\031\n\025COMPOSI" + - "TE_OPERATOR_OR\020\0022\277\014\n\014SysMLService\022D\n\rGet" + - "ServerInfo\022\030.sysml.ServerInfoRequest\032\031.s" + - "ysml.ServerInfoResponse\022>\n\tParseFile\022\027.s" + - "ysml.ParseFileRequest\032\030.sysml.ParseFileR" + - "esponse\022G\n\014ParseSources\022\032.sysml.ParseSou" + - "rcesRequest\032\033.sysml.ParseSourcesResponse" + - "\022;\n\tGetSymbol\022\027.sysml.GetSymbolRequest\032\025" + - ".sysml.SymbolResponse\022G\n\016GetDiagnostics\022" + - "\031.sysml.DiagnosticsRequest\032\032.sysml.Diagn" + - "osticsResponse\022;\n\010Evaluate\022\026.sysml.Evalu" + - "ateRequest\032\027.sysml.EvaluateResponse\022D\n\013I" + - "nstantiate\022\031.sysml.InstantiateRequest\032\032." + - "sysml.InstantiateResponse\022J\n\rExecuteActi" + - "on\022\033.sysml.ExecuteActionRequest\032\034.sysml." + - "ExecuteActionResponse\022G\n\014ExecuteState\022\032." + - "sysml.ExecuteStateRequest\032\033.sysml.Execut" + - "eStateResponse\0228\n\007Convert\022\025.sysml.Conver" + - "tRequest\032\026.sysml.ConvertResponse\022A\n\nAppl" + - "yEdits\022\030.sysml.ApplyEditsRequest\032\031.sysml" + - ".ApplyEditsResponse\022S\n\020VerifyConstraint\022" + - "\036.sysml.VerifyConstraintRequest\032\037.sysml." + - "VerifyConstraintResponse\022V\n\021VerifyRequir" + - "ement\022\037.sysml.VerifyRequirementRequest\032 " + - ".sysml.VerifyRequirementResponse\022Y\n\022Veri" + - "fySatisfaction\022 .sysml.VerifySatisfactio" + - "nRequest\032!.sysml.VerifySatisfactionRespo" + - "nse\022S\n\020ValidateInstance\022\036.sysml.Validate" + - "InstanceRequest\032\037.sysml.ValidateInstance" + - "Response\022G\n\014EvaluateCalc\022\032.sysml.Evaluat" + - "eCalcRequest\032\033.sysml.EvaluateCalcRespons" + - "e\022D\n\013RunAnalysis\022\031.sysml.RunAnalysisRequ" + - "est\032\032.sysml.RunAnalysisResponse\022;\n\010RunSw" + - "eep\022\026.sysml.RunSweepRequest\032\027.sysml.RunS" + - "weepResponse\022D\n\013ListEngines\022\031.sysml.List" + - "EnginesRequest\032\032.sysml.ListEnginesRespon" + - "se\0222\n\005Query\022\023.sysml.QueryRequest\032\024.sysml" + - ".QueryResponse\022S\n\020RunDocumentQuery\022\036.sys" + - "ml.RunDocumentQueryRequest\032\037.sysml.RunDo" + - "cumentQueryResponse\022M\n\016RenderDocument\022\034." + - "sysml.RenderDocumentRequest\032\035.sysml.Rend" + - "erDocumentResponseBJ\n\034org.openmbee.opens" + - "ysml.protoP\001Z(github.com/Open-MBEE/OpenS" + - "ysML/api/protob\006proto3" + "yntaxErrors\022\027\n\007id_form\030\007 \001(\tR\006idFormB\010\n\006" + + "source\"\211\002\n\017ConvertResponse\022\030\n\007content\030\001 " + + "\001(\tR\007content\022\037\n\013from_format\030\002 \001(\tR\nfromF" + + "ormat\022\033\n\tto_format\030\003 \001(\tR\010toFormat\022\024\n\005er" + + "ror\030\004 \001(\tR\005error\0223\n\013diagnostics\030\005 \003(\0132\021." + + "sysml.DiagnosticR\013diagnostics\022\"\n\014experim" + + "ental\030\006 \001(\010R\014experimental\022/\n\023experimenta" + + "l_notice\030\007 \001(\tR\022experimentalNotice\"\257\001\n\021A" + + "pplyEditsRequest\022\035\n\nmodel_hash\030\001 \001(\tR\tmo" + + "delHash\0224\n\noperations\030\002 \003(\0132\024.sysml.Edit" + + "OperationR\noperations\022\032\n\010document\030\003 \001(\tR" + + "\010document\022)\n\020accept_documents\030\004 \001(\010R\017acc" + + "eptDocuments\"\234\010\n\rEditOperation\0222\n\tset_va" + + "lue\030\001 \001(\0132\023.sysml.SetValueEditH\000R\010setVal" + + "ue\022+\n\006rename\030\002 \001(\0132\021.sysml.RenameEditH\000R" + + "\006rename\0225\n\nadd_member\030\003 \001(\0132\024.sysml.AddM" + + "emberEditH\000R\taddMember\022+\n\006delete\030\004 \001(\0132\021" + + ".sysml.DeleteEditH\000R\006delete\022%\n\004move\030\005 \001(" + + "\0132\017.sysml.MoveEditH\000R\004move\022A\n\016add_connec" + + "tion\030\006 \001(\0132\030.sysml.AddConnectionEditH\000R\r" + + "addConnection\0228\n\013add_satisfy\030\007 \001(\0132\025.sys" + + "ml.AddSatisfyEditH\000R\naddSatisfy\022c\n\032add_r" + + "equirement_constraint\030\010 \001(\0132#.sysml.AddR" + + "equirementConstraintEditH\000R\030addRequireme" + + "ntConstraint\022A\n\016add_transition\030\t \001(\0132\030.s" + + "ysml.AddTransitionEditH\000R\raddTransition\022" + + "5\n\nadd_import\030\n \001(\0132\024.sysml.AddImportEdi" + + "tH\000R\taddImport\022J\n\021add_documentation\030\013 \001(" + + "\0132\033.sysml.AddDocumentationEditH\000R\020addDoc" + + "umentation\0225\n\nadd_verify\030\014 \001(\0132\024.sysml.A" + + "ddVerifyEditH\000R\taddVerify\022;\n\014add_metadat" + + "a\030\r \001(\0132\026.sysml.AddMetadataEditH\000R\013addMe" + + "tadata\022;\n\014add_sequence\030\016 \001(\0132\026.sysml.Add" + + "SequenceEditH\000R\013addSequence\022N\n\023add_metad" + + "ata_prefix\030\017 \001(\0132\034.sysml.AddMetadataPref" + + "ixEditH\000R\021addMetadataPrefix\0228\n\013add_comme" + + "nt\030\020 \001(\0132\025.sysml.AddCommentEditH\000R\naddCo" + + "mment\022/\n\010add_note\030\022 \001(\0132\022.sysml.AddNoteE" + + "ditH\000R\007addNoteB\013\n\toperation\"\241\003\n\rAddMembe" + + "rEdit\022\024\n\005owner\030\001 \001(\tR\005owner\022\022\n\004kind\030\002 \001(" + + "\tR\004kind\022\022\n\004name\030\003 \001(\tR\004name\022\022\n\004type\030\004 \001(" + + "\tR\004type\022\"\n\014multiplicity\030\005 \001(\tR\014multiplic" + + "ity\022\024\n\005value\030\006 \001(\tR\005value\022 \n\013specializes" + + "\030\007 \003(\tR\013specializes\022\037\n\013is_abstract\030\010 \001(\010" + + "R\nisAbstract\022\034\n\tredefines\030\t \003(\tR\tredefin" + + "es\022\035\n\nis_default\030\n \001(\010R\tisDefault\022\034\n\tdir" + + "ection\030\013 \001(\tR\tdirection\022+\n\021metadata_pref" + + "ixes\030\016 \003(\tR\020metadataPrefixes\022\020\n\003doc\030\014 \001(" + + "\tR\003doc\022\'\n\017body_expression\030\r \001(\tR\016bodyExp" + + "ression\"\267\001\n\016AddSatisfyEdit\022\024\n\005owner\030\001 \001(" + + "\tR\005owner\022 \n\013requirement\030\002 \001(\tR\013requireme" + + "nt\022-\n\022satisfying_feature\030\003 \001(\tR\021satisfyi" + + "ngFeature\022\037\n\013is_asserted\030\004 \001(\010R\nisAssert" + + "ed\022\035\n\nis_negated\030\005 \001(\010R\tisNegated\"|\n\034Add" + + "RequirementConstraintEdit\022\024\n\005owner\030\001 \001(\t" + + "R\005owner\022\022\n\004kind\030\002 \001(\tR\004kind\022\036\n\nexpressio" + + "n\030\003 \001(\tR\nexpression\022\022\n\004name\030\004 \001(\tR\004name\"" + + "\317\001\n\021AddTransitionEdit\022\024\n\005owner\030\001 \001(\tR\005ow" + + "ner\022\022\n\004name\030\002 \001(\tR\004name\022\026\n\006source\030\003 \001(\tR" + + "\006source\022\026\n\006target\030\004 \001(\tR\006target\022\030\n\007trigg" + + "er\030\005 \001(\tR\007trigger\022\024\n\005guard\030\006 \001(\tR\005guard\022" + + "\026\n\006effect\030\007 \001(\tR\006effect\022\030\n\007initial\030\010 \001(\010" + + "R\007initial\"G\n\rAddVerifyEdit\022\024\n\005owner\030\001 \001(" + + "\tR\005owner\022 \n\013requirement\030\002 \001(\tR\013requireme" + + "nt\"F\n\024MetadataFeatureValue\022\030\n\007feature\030\001 " + + "\001(\tR\007feature\022\024\n\005value\030\002 \001(\tR\005value\"\311\001\n\017A" + + "ddMetadataEdit\022\024\n\005owner\030\001 \001(\tR\005owner\022#\n\r" + + "metadata_type\030\002 \001(\tR\014metadataType\022\022\n\004nam" + + "e\030\003 \001(\tR\004name\022\024\n\005about\030\004 \003(\tR\005about\0223\n\006v" + + "alues\030\005 \003(\0132\033.sysml.MetadataFeatureValue" + + "R\006values\022\034\n\tshorthand\030\006 \001(\010R\tshorthand\"T" + + "\n\025AddMetadataPrefixEdit\022\026\n\006target\030\001 \001(\tR" + + "\006target\022#\n\rmetadata_type\030\002 \001(\tR\014metadata" + + "Type\"\276\001\n\rAddImportEdit\022\024\n\005owner\030\001 \001(\tR\005o" + + "wner\022\036\n\nvisibility\030\002 \001(\tR\nvisibility\022\026\n\006" + + "target\030\003 \001(\tR\006target\022!\n\014is_recursive\030\004 \001" + + "(\010R\013isRecursive\022\"\n\ris_import_all\030\005 \001(\010R\013" + + "isImportAll\022\030\n\007filters\030\006 \003(\tR\007filters\"\210\001" + + "\n\024AddDocumentationEdit\022\026\n\006target\030\001 \001(\tR\006" + + "target\022\022\n\004body\030\002 \001(\tR\004body\022\022\n\004name\030\003 \001(\t" + + "R\004name\022\026\n\006locale\030\004 \001(\tR\006locale\022\030\n\007replac" + + "e\030\005 \001(\010R\007replace\"|\n\016AddCommentEdit\022\024\n\005ow" + + "ner\030\001 \001(\tR\005owner\022\022\n\004body\030\002 \001(\tR\004body\022\022\n\004" + + "name\030\003 \001(\tR\004name\022\024\n\005about\030\004 \003(\tR\005about\022\026" + + "\n\006locale\030\005 \001(\tR\006locale\"9\n\013AddNoteEdit\022\026\n" + + "\006target\030\001 \001(\tR\006target\022\022\n\004text\030\002 \001(\tR\004tex" + + "t\"\326\003\n\017AddSequenceEdit\022\024\n\005owner\030\001 \001(\tR\005ow" + + "ner\022\030\n\007keyword\030\002 \001(\tR\007keyword\022\020\n\003ref\030\003 \001" + + "(\tR\003ref\022\037\n\013member_kind\030\004 \001(\tR\nmemberKind" + + "\022\037\n\013member_name\030\005 \001(\tR\nmemberName\022\022\n\004typ" + + "e\030\006 \001(\tR\004type\022\024\n\005after\030\007 \001(\tR\005after\022\034\n\tc" + + "ondition\030\010 \001(\tR\tcondition\022\024\n\005value\030\t \001(\t" + + "R\005value\022\026\n\006target\030\n \001(\tR\006target\022\020\n\003via\030\013" + + " \001(\tR\003via\022\024\n\005until\030\014 \001(\tR\005until\022*\n\004body\030" + + "\r \003(\0132\026.sysml.AddSequenceEditR\004body\0223\n\te" + + "lse_body\030\016 \003(\0132\026.sysml.AddSequenceEditR\010" + + "elseBody\022\"\n\014multiplicity\030\017 \001(\tR\014multipli" + + "city\022\034\n\tparameter\030\020 \001(\tR\tparameter\"\227\001\n\021A" + + "ddConnectionEdit\022\024\n\005owner\030\001 \001(\tR\005owner\022\022" + + "\n\004kind\030\002 \001(\tR\004kind\022\031\n\010from_end\030\003 \001(\tR\007fr" + + "omEnd\022\025\n\006to_end\030\004 \001(\tR\005toEnd\022\022\n\004name\030\005 \001" + + "(\tR\004name\022\022\n\004type\030\006 \001(\tR\004type\">\n\nDeleteEd" + + "it\022\026\n\006target\030\001 \001(\tR\006target\022\030\n\007cascade\030\002 " + + "\001(\010R\007cascade\"8\n\010MoveEdit\022\026\n\006target\030\001 \001(\t" + + "R\006target\022\024\n\005owner\030\002 \001(\tR\005owner\"<\n\014SetVal" + + "ueEdit\022\026\n\006target\030\001 \001(\tR\006target\022\024\n\005value\030" + + "\002 \001(\tR\005value\"?\n\nRenameEdit\022\026\n\006target\030\001 \001" + + "(\tR\006target\022\031\n\010new_name\030\002 \001(\tR\007newName\"\350\002" + + "\n\022ApplyEditsResponse\022\030\n\007content\030\001 \001(\tR\007c" + + "ontent\022,\n\007applied\030\002 \003(\0132\022.sysml.AppliedE" + + "ditR\007applied\022\024\n\005error\030\003 \001(\tR\005error\022,\n\007fa" + + "ilure\030\004 \001(\0162\022.sysml.EditFailureR\007failure" + + "\0223\n\013diagnostics\030\005 \003(\0132\021.sysml.Diagnostic" + + "R\013diagnostics\022-\n\022referring_elements\030\006 \003(" + + "\tR\021referringElements\0223\n\tdocuments\030\007 \003(\0132" + + "\025.sysml.EditedDocumentR\tdocuments\022-\n\tref" + + "errers\030\010 \003(\0132\017.sysml.ReferrerR\treferrers" + + "\">\n\016EditedDocument\022\022\n\004name\030\001 \001(\tR\004name\022\030" + + "\n\007content\030\002 \001(\tR\007content\":\n\010Referrer\022\022\n\004" + + "name\030\001 \001(\tR\004name\022\032\n\010document\030\002 \001(\tR\010docu" + + "ment\"\320\001\n\013AppliedEdit\022\'\n\017operation_index\030" + + "\001 \001(\005R\016operationIndex\022\026\n\006target\030\002 \001(\tR\006t" + + "arget\022\026\n\006offset\030\003 \001(\005R\006offset\022\026\n\006length\030" + + "\004 \001(\005R\006length\022\031\n\010old_text\030\005 \001(\tR\007oldText" + + "\022\031\n\010new_text\030\006 \001(\tR\007newText\022\032\n\010document\030" + + "\007 \001(\tR\010document\"\375\003\n\nSymbolInfo\022\016\n\002id\030\001 \001" + + "(\tR\002id\022\022\n\004name\030\002 \001(\tR\004name\022\022\n\004kind\030\003 \001(\t" + + "R\004kind\022;\n\010metadata\030\004 \003(\0132\037.sysml.SymbolI" + + "nfo.MetadataEntryR\010metadata\022\033\n\tchild_ids" + + "\030\005 \003(\tR\010childIds\0224\n\nattributes\030\006 \003(\0132\024.s" + + "ysml.AttributeInfoR\nattributes\022,\n\ttype_i" + + "nfo\030\007 \001(\0132\017.sysml.TypeInfoR\010typeInfo\022;\n\014" + + "multiplicity\030\010 \001(\0132\027.sysml.MultiplicityI" + + "nfoR\014multiplicity\022?\n\017specializations\030\t \003" + + "(\0132\025.sysml.SpecializationR\017specializatio" + + "ns\022>\n\033withheld_library_attributes\030\n \001(\005R" + + "\031withheldLibraryAttributes\032;\n\rMetadataEn" + + "try\022\020\n\003key\030\001 \001(\tR\003key\022\024\n\005value\030\002 \001(\tR\005va" + + "lue:\0028\001\"~\n\016Specialization\022\022\n\004kind\030\001 \001(\tR" + + "\004kind\022\032\n\010declared\030\002 \001(\tR\010declared\022\033\n\ttar" + + "get_id\030\003 \001(\tR\010targetId\022\037\n\013target_kind\030\004 " + + "\001(\tR\ntargetKind\"\345\001\n\010TypeInfo\022\032\n\010declared" + + "\030\001 \001(\tR\010declared\022\037\n\013resolved_id\030\002 \001(\tR\nr" + + "esolvedId\022#\n\rresolved_kind\030\003 \001(\tR\014resolv" + + "edKind\022\034\n\tprimitive\030\004 \001(\tR\tprimitive\022)\n\020" + + "primitive_source\030\005 \001(\tR\017primitiveSource\022" + + "\032\n\010quantity\030\006 \001(\010R\010quantity\022\022\n\004unit\030\007 \001(" + + "\tR\004unit\">\n\020MultiplicityInfo\022\024\n\005lower\030\001 \001" + + "(\tR\005lower\022\024\n\005upper\030\002 \001(\tR\005upper\"o\n\rAttri" + + "buteInfo\022\022\n\004name\030\001 \001(\tR\004name\022\022\n\004type\030\002 \001" + + "(\tR\004type\022\"\n\005value\030\003 \001(\0132\014.sysml.ValueR\005v" + + "alue\022\022\n\004unit\030\004 \001(\tR\004unit\"\245\007\n\005Value\022\035\n\tin" + + "t_value\030\001 \001(\003H\000R\010intValue\022\037\n\nreal_value\030" + + "\002 \001(\001H\000R\trealValue\022\037\n\nbool_value\030\003 \001(\010H\000" + + "R\tboolValue\022#\n\014string_value\030\004 \001(\tH\000R\013str" + + "ingValue\022!\n\013instance_id\030\005 \001(\003H\000R\ninstanc" + + "eId\0222\n\010sequence\030\006 \001(\0132\024.sysml.ValueSeque" + + "nceH\000R\010sequence\022\024\n\004null\030\007 \001(\tH\000R\004null\022-\n" + + "\010quantity\030\010 \001(\0132\017.sysml.QuantityH\000R\010quan" + + "tity\0227\n\014enum_literal\030\t \001(\0132\022.sysml.EnumL" + + "iteralH\000R\013enumLiteral\022\026\n\005unset\030\n \001(\010H\000R\005" + + "unset\022*\n\007complex\030\013 \001(\0132\016.sysml.ComplexH\000", + "R\007complex\022$\n\005array\030\014 \001(\0132\014.sysml.ArrayH\000" + + "R\005array\022\'\n\006vector\030\r \001(\0132\r.sysml.VectorH\000" + + "R\006vector\022@\n\017vector_quantity\030\016 \001(\0132\025.sysm" + + "l.VectorQuantityH\000R\016vectorQuantity\022@\n\017me" + + "asurement_ref\030\017 \001(\0132\025.sysml.MeasurementR" + + "efH\000R\016measurementRef\022\034\n\010infinity\030\020 \001(\010H\000" + + "R\010infinity\022-\n\010function\030\021 \001(\0132\017.sysml.Fun" + + "ctionH\000R\010function\022#\n\003set\030\022 \001(\0132\017.sysml.V" + + "alueSetH\000R\003set\022@\n\017tensor_quantity\030\023 \001(\0132" + + "\025.sysml.TensorQuantityH\000R\016tensorQuantity" + + "\0223\n\nmetaobject\030\024 \001(\0132\021.sysml.MetaobjectH" + + "\000R\nmetaobject\0229\n\014undetermined\030\025 \001(\0132\023.sy" + + "sml.UndeterminedH\000R\014undeterminedB\006\n\004kind" + + "\"N\n\nMetaobject\022\035\n\nelement_id\030\001 \001(\tR\telem" + + "entId\022!\n\014metaclass_id\030\002 \001(\tR\013metaclassId" + + "\"U\n\014Undetermined\022\026\n\006reason\030\001 \001(\tR\006reason" + + "\022-\n\005count\030\002 \001(\0132\027.sysml.MultiplicityInfo" + + "R\005count\"<\n\010Function\022\027\n\007calc_id\030\001 \001(\tR\006ca" + + "lcId\022\027\n\007self_id\030\002 \001(\003R\006selfId\"4\n\010ValueSe" + + "t\022(\n\010elements\030\001 \003(\0132\014.sysml.ValueR\010eleme" + + "nts\"a\n\016TensorQuantity\022\036\n\ndimensions\030\001 \003(" + + "\003R\ndimensions\022/\n\ncomponents\030\002 \003(\0132\017.sysm" + + "l.QuantityR\ncomponents\"Q\n\005Array\022\036\n\ndimen" + + "sions\030\001 \003(\003R\ndimensions\022(\n\010elements\030\002 \003(" + + "\0132\014.sysml.ValueR\010elements\"6\n\006Vector\022,\n\nc" + + "omponents\030\001 \003(\0132\014.sysml.ValueR\ncomponent" + + "s\"A\n\016VectorQuantity\022/\n\ncomponents\030\001 \003(\0132" + + "\017.sysml.QuantityR\ncomponents\";\n\007Complex\022" + + "\022\n\004real\030\001 \001(\001R\004real\022\034\n\timaginary\030\002 \001(\001R\t" + + "imaginary\"\213\001\n\013EnumLiteral\022\035\n\nliteral_id\030" + + "\001 \001(\tR\tliteralId\022%\n\016enumeration_id\030\002 \001(\t" + + "R\renumerationId\022\022\n\004name\030\003 \001(\tR\004name\022\"\n\005v" + + "alue\030\004 \001(\0132\014.sysml.ValueR\005value\"9\n\rValue" + + "Sequence\022(\n\010elements\030\001 \003(\0132\014.sysml.Value" + + "R\010elements\"\251\001\n\010Quantity\022%\n\rint_magnitude" + + "\030\001 \001(\003H\000R\014intMagnitude\022\'\n\016real_magnitude" + + "\030\002 \001(\001H\000R\rrealMagnitude\022\022\n\004unit\030\003 \001(\tR\004u" + + "nit\022,\n\tunit_term\030\004 \001(\0132\017.sysml.UnitTermR" + + "\010unitTermB\013\n\tmagnitude\"k\n\016MeasurementRef" + + "\022\022\n\004unit\030\001 \001(\tR\004unit\022,\n\tunit_term\030\002 \001(\0132" + + "\017.sysml.UnitTermR\010unitTerm\022\027\n\007unit_id\030\003 " + + "\001(\tR\006unitId\"q\n\010UnitTerm\022\033\n\tscale_num\030\001 \001" + + "(\001R\010scaleNum\022\033\n\tscale_den\030\002 \001(\001R\010scaleDe" + + "n\022+\n\007factors\030\003 \003(\0132\021.sysml.UnitFactorR\007f" + + "actors\"A\n\nUnitFactor\022\027\n\007unit_id\030\001 \001(\tR\006u" + + "nitId\022\032\n\010exponent\030\002 \001(\001R\010exponent\"w\n\nDia" + + "gnostic\022\032\n\010severity\030\001 \001(\tR\010severity\022\030\n\007m" + + "essage\030\002 \001(\tR\007message\022\037\n\004span\030\003 \001(\0132\013.sy" + + "sml.SpanR\004span\022\022\n\004code\030\004 \001(\tR\004code\"\212\001\n\004S" + + "pan\022\022\n\004file\030\001 \001(\tR\004file\022\035\n\nstart_line\030\002 " + + "\001(\005R\tstartLine\022\033\n\tstart_col\030\003 \001(\005R\010start" + + "Col\022\031\n\010end_line\030\004 \001(\005R\007endLine\022\027\n\007end_co" + + "l\030\005 \001(\005R\006endCol\"\023\n\021ServerInfoRequest\"R\n\022" + + "ServerInfoResponse\022\030\n\007version\030\001 \001(\tR\007ver" + + "sion\022\"\n\014capabilities\030\002 \003(\tR\014capabilities" + + "\"p\n\014QueryRequest\022\035\n\nmodel_hash\030\001 \001(\tR\tmo" + + "delHash\022\"\n\005query\030\002 \001(\0132\014.sysml.QueryR\005qu" + + "ery\022\035\n\noslc_query\030\003 \001(\tR\toslcQuery\"F\n\rQu" + + "eryResponse\0225\n\010elements\030\001 \003(\0132\031.sysml.Qu" + + "eryResultElementR\010elements\"^\n\005Query\022\024\n\005s" + + "cope\030\001 \003(\tR\005scope\022\026\n\006select\030\002 \003(\tR\006selec" + + "t\022\'\n\005where\030\003 \001(\0132\021.sysml.ConstraintR\005whe" + + "re\"\222\001\n\nConstraint\022:\n\tprimitive\030\001 \001(\0132\032.s" + + "ysml.PrimitiveConstraintH\000R\tprimitive\022:\n" + + "\tcomposite\030\002 \001(\0132\032.sysml.CompositeConstr" + + "aintH\000R\tcompositeB\014\n\nconstraint\"\227\001\n\023Prim" + + "itiveConstraint\022\030\n\007inverse\030\001 \001(\010R\007invers" + + "e\022\032\n\010property\030\002 \001(\tR\010property\0224\n\010operato" + + "r\030\003 \001(\0162\030.sysml.PrimitiveOperatorR\010opera" + + "tor\022\024\n\005value\030\004 \003(\tR\005value\"~\n\023CompositeCo" + + "nstraint\0224\n\010operator\030\001 \001(\0162\030.sysml.Compo" + + "siteOperatorR\010operator\0221\n\nconstraint\030\002 \003" + + "(\0132\021.sysml.ConstraintR\nconstraint\"\302\001\n\022Qu" + + "eryResultElement\022\016\n\002id\030\001 \001(\tR\002id\022\022\n\004type" + + "\030\002 \001(\tR\004type\022I\n\nproperties\030\003 \003(\0132).sysml" + + ".QueryResultElement.PropertiesEntryR\npro" + + "perties\032=\n\017PropertiesEntry\022\020\n\003key\030\001 \001(\tR" + + "\003key\022\024\n\005value\030\002 \001(\tR\005value:\0028\001\"\220\001\n\nSweep" + + "Range\022\034\n\tparameter\030\001 \001(\tR\tparameter\022\"\n\005s" + + "tart\030\002 \001(\0132\014.sysml.ValueR\005start\022\036\n\003end\030\003" + + " \001(\0132\014.sysml.ValueR\003end\022 \n\004step\030\004 \001(\0132\014." + + "sysml.ValueR\004step\"\274\003\n\017RunSweepRequest\022\035\n" + + "\nmodel_hash\030\001 \001(\tR\tmodelHash\022\033\n\tsymbol_i" + + "d\030\002 \001(\tR\010symbolId\022*\n\021subject_symbol_id\030\003" + + " \001(\tR\017subjectSymbolId\022*\n\targuments\030\004 \003(\013" + + "2\014.sysml.ValueR\targuments\022S\n\017named_argum" + + "ents\030\005 \003(\0132*.sysml.RunSweepRequest.Named" + + "ArgumentsEntryR\016namedArguments\022)\n\006ranges" + + "\030\006 \003(\0132\021.sysml.SweepRangeR\006ranges\022\030\n\007sam" + + "ples\030\007 \001(\003R\007samples\022\022\n\004seed\030\010 \001(\004R\004seed\022" + + "\026\n\006engine\030\t \001(\tR\006engine\032O\n\023NamedArgument" + + "sEntry\022\020\n\003key\030\001 \001(\tR\003key\022\"\n\005value\030\002 \001(\0132" + + "\014.sysml.ValueR\005value:\0028\001\"\301\002\n\010SweepRow\022)\n" + + "\006inputs\030\001 \003(\0132\021.sysml.CalcOutputR\006inputs" + + "\022+\n\007outputs\030\002 \003(\0132\021.sysml.CalcOutputR\007ou" + + "tputs\022*\n\010verdicts\030\003 \003(\0132\016.sysml.VerdictR" + + "\010verdicts\022%\n\016elapsed_micros\030\004 \001(\003R\relaps" + + "edMicros\022\024\n\005error\030\005 \001(\tR\005error\022;\n\016failur" + + "e_reason\030\006 \001(\0162\024.sysml.FailureReasonR\rfa" + + "ilureReason\0227\n\013evaluations\030\007 \003(\0132\025.sysml" + + ".CaseEvaluationR\013evaluations\"\226\003\n\020RunSwee" + + "pResponse\022#\n\004rows\030\001 \003(\0132\017.sysml.SweepRow" + + "R\004rows\022\036\n\nparameters\030\002 \003(\tR\nparameters\022\030" + + "\n\007sampled\030\003 \001(\010R\007sampled\022\022\n\004seed\030\004 \001(\004R\004" + + "seed\022\024\n\005error\030\005 \001(\tR\005error\0223\n\013diagnostic" + + "s\030\006 \003(\0132\021.sysml.DiagnosticR\013diagnostics\022" + + ";\n\016failure_reason\030\007 \001(\0162\024.sysml.FailureR" + + "easonR\rfailureReason\022-\n\tinstances\030\010 \003(\0132" + + "\017.sysml.InstanceR\tinstances\022\026\n\006engine\030\t " + + "\001(\tR\006engine\022\032\n\010strength\030\n \001(\tR\010strength\022" + + "$\n\006bounds\030\013 \003(\0132\014.sysml.BoundR\006bounds\"\214\001" + + "\n\027RunDocumentQueryRequest\022\035\n\nmodel_hash\030" + + "\001 \001(\tR\tmodelHash\022\031\n\010query_id\030\002 \001(\tR\007quer" + + "yId\0227\n\010bindings\030\003 \003(\0132\033.sysml.DocumentQu" + + "eryBindingR\010bindings\"b\n\024DocumentQueryBin" + + "ding\022\034\n\tparameter\030\001 \001(\tR\tparameter\022,\n\006va" + + "lues\030\002 \003(\0132\024.sysml.DocumentValueR\006values" + + "\"\357\003\n\rDocumentValue\022\037\n\nelement_id\030\001 \001(\tH\000" + + "R\telementId\022#\n\014string_value\030\002 \001(\tH\000R\013str" + + "ingValue\022\035\n\tint_value\030\003 \001(\003H\000R\010intValue\022" + + "\037\n\nreal_value\030\004 \001(\001H\000R\trealValue\022\037\n\nbool" + + "_value\030\005 \001(\010H\000R\tboolValue\022\034\n\010infinity\030\006 " + + "\001(\010H\000R\010infinity\022-\n\010quantity\030\010 \001(\0132\017.sysm" + + "l.QuantityH\000R\010quantity\0222\n\007verdict\030\t \001(\0132" + + "\026.sysml.DocumentVerdictH\000R\007verdict\022/\n\006ob" + + "ject\030\n \001(\0132\025.sysml.DocumentObjectH\000R\006obj" + + "ect\022,\n\005state\030\013 \001(\0132\024.sysml.DocumentState" + + "H\000R\005state\022,\n\005event\030\014 \001(\0132\024.sysml.Documen" + + "tEventH\000R\005event\022!\n\014element_type\030\007 \001(\tR\013e" + + "lementTypeB\006\n\004kind\"u\n\016DocumentObject\022\037\n\013" + + "instance_id\030\001 \001(\003R\ninstanceId\022\022\n\004path\030\002 " + + "\001(\tR\004path\022.\n\007element\030\003 \001(\0132\024.sysml.Docum" + + "entValueR\007element\"\365\001\n\017DocumentVerdict\0222\n" + + "\tassertion\030\001 \001(\0132\024.sysml.DocumentValueR\t" + + "assertion\022\022\n\004kind\030\002 \001(\tR\004kind\022\022\n\004text\030\003 " + + "\001(\tR\004text\022\022\n\004path\030\004 \001(\tR\004path\022\030\n\007verdict" + + "\030\005 \001(\tR\007verdict\022\034\n\tcondition\030\006 \001(\tR\tcond" + + "ition\022\026\n\006reason\030\007 \001(\tR\006reason\022\"\n\014verific" + + "ation\030\010 \003(\tR\014verification\"\355\001\n\rDocumentSt" + + "ate\022-\n\006object\030\001 \001(\0132\025.sysml.DocumentObje" + + "ctR\006object\022\030\n\007machine\030\002 \001(\tR\007machine\022\022\n\004" + + "name\030\003 \001(\tR\004name\022\035\n\nstate_path\030\004 \001(\tR\tst" + + "atePath\022*\n\005state\030\005 \001(\0132\024.sysml.DocumentV" + + "alueR\005state\022\026\n\006region\030\006 \001(\tR\006region\022\034\n\te" + + "nclosing\030\007 \003(\tR\tenclosing\"\375\002\n\rDocumentEv" + + "ent\022\022\n\004kind\030\001 \001(\tR\004kind\022(\n\004time\030\002 \001(\0132\024." + + "sysml.DocumentValueR\004time\022-\n\006object\030\003 \001(" + + "\0132\025.sysml.DocumentObjectR\006object\022\030\n\007mach" + + "ine\030\004 \001(\tR\007machine\022\024\n\005state\030\005 \001(\tR\005state" + + "\022\022\n\004from\030\006 \001(\tR\004from\022\016\n\002to\030\007 \001(\tR\002to\022-\n\006" + + "target\030\010 \001(\0132\025.sysml.DocumentObjectR\006tar" + + "get\022\024\n\005event\030\t \001(\tR\005event\022\030\n\007payload\030\n \003" + + "(\tR\007payload\022\"\n\014alternatives\030\013 \003(\tR\014alter" + + "natives\022\024\n\005taken\030\014 \001(\tR\005taken\022\022\n\004text\030\r " + + "\001(\tR\004text\")\n\023DocumentQueryColumn\022\022\n\004name" + + "\030\001 \001(\tR\004name\"A\n\021DocumentQueryCell\022,\n\006val" + + "ues\030\001 \003(\0132\024.sysml.DocumentValueR\006values\"" + + "r\n\020DocumentQueryRow\022.\n\007element\030\001 \001(\0132\024.s" + + "ysml.DocumentValueR\007element\022.\n\005cells\030\002 \003" + + "(\0132\030.sysml.DocumentQueryCellR\005cells\"}\n\030R" + + "unDocumentQueryResponse\0224\n\007columns\030\001 \003(\013" + + "2\032.sysml.DocumentQueryColumnR\007columns\022+\n" + + "\004rows\030\002 \003(\0132\027.sysml.DocumentQueryRowR\004ro" + + "ws\"k\n\025RenderDocumentRequest\022\035\n\nmodel_has" + + "h\030\001 \001(\tR\tmodelHash\022\037\n\013document_id\030\002 \001(\tR" + + "\ndocumentId\022\022\n\004form\030\003 \001(\tR\004form\"H\n\026Rende" + + "rDocumentResponse\022\032\n\010markdown\030\001 \001(\tR\010mar" + + "kdown\022\022\n\004html\030\002 \001(\tR\004html*\261\001\n\rFailureRea" + + "son\022\036\n\032FAILURE_REASON_UNSPECIFIED\020\000\022\035\n\031F" + + "AILURE_REASON_EVALUATION\020\001\022\035\n\031FAILURE_RE" + + "ASON_WRONG_KIND\020\002\022$\n FAILURE_REASON_AMBI" + + "GUOUS_SUBJECT\020\003\022\034\n\030FAILURE_REASON_UNDECI" + + "DED\020\004*\214\005\n\013EditFailure\022\034\n\030EDIT_FAILURE_UN" + + "SPECIFIED\020\000\022\036\n\032EDIT_FAILURE_NO_OPERATION" + + "S\020\001\022\037\n\033EDIT_FAILURE_UNKNOWN_TARGET\020\002\022!\n\035" + + "EDIT_FAILURE_AMBIGUOUS_TARGET\020\003\022\033\n\027EDIT_" + + "FAILURE_NOT_VALUED\020\004\022\036\n\032EDIT_FAILURE_INV" + + "ALID_VALUE\020\005\022\035\n\031EDIT_FAILURE_INVALID_NAM" + + "E\020\006\022\032\n\026EDIT_FAILURE_NOT_NAMED\020\007\022\"\n\036EDIT_" + + "FAILURE_RENAME_REFERENCED\020\010\022\"\n\036EDIT_FAIL" + + "URE_OVERLAPPING_EDITS\020\t\022\037\n\033EDIT_FAILURE_" + + "RESULT_INVALID\020\n\022\036\n\032EDIT_FAILURE_OWNER_U" + + "NKNOWN\020\013\022$\n EDIT_FAILURE_OWNER_NOT_NAMES" + + "PACE\020\014\022\035\n\031EDIT_FAILURE_ILLEGAL_KIND\020\r\022\"\n" + + "\036EDIT_FAILURE_MEMBER_NAME_TAKEN\020\016\022\"\n\036EDI" + + "T_FAILURE_DELETE_REFERENCED\020\017\022$\n EDIT_FA" + + "ILURE_OWNER_INSIDE_TARGET\020\020\022 \n\034EDIT_FAIL" + + "URE_MOVE_REFERENCED\020\021\022%\n!EDIT_FAILURE_RE" + + "FERENCED_ELSEWHERE\020\022*\222\001\n\021PrimitiveOperat" + + "or\022\"\n\036PRIMITIVE_OPERATOR_UNSPECIFIED\020\000\022\034" + + "\n\030PRIMITIVE_OPERATOR_EQUAL\020\001\022\036\n\032PRIMITIV" + + "E_OPERATOR_GREATER\020\002\022\033\n\027PRIMITIVE_OPERAT" + + "OR_LESS\020\003*n\n\021CompositeOperator\022\"\n\036COMPOS" + + "ITE_OPERATOR_UNSPECIFIED\020\000\022\032\n\026COMPOSITE_" + + "OPERATOR_AND\020\001\022\031\n\025COMPOSITE_OPERATOR_OR\020" + + "\0022\277\014\n\014SysMLService\022D\n\rGetServerInfo\022\030.sy" + + "sml.ServerInfoRequest\032\031.sysml.ServerInfo" + + "Response\022>\n\tParseFile\022\027.sysml.ParseFileR" + + "equest\032\030.sysml.ParseFileResponse\022G\n\014Pars" + + "eSources\022\032.sysml.ParseSourcesRequest\032\033.s" + + "ysml.ParseSourcesResponse\022;\n\tGetSymbol\022\027" + + ".sysml.GetSymbolRequest\032\025.sysml.SymbolRe" + + "sponse\022G\n\016GetDiagnostics\022\031.sysml.Diagnos" + + "ticsRequest\032\032.sysml.DiagnosticsResponse\022" + + ";\n\010Evaluate\022\026.sysml.EvaluateRequest\032\027.sy" + + "sml.EvaluateResponse\022D\n\013Instantiate\022\031.sy" + + "sml.InstantiateRequest\032\032.sysml.Instantia" + + "teResponse\022J\n\rExecuteAction\022\033.sysml.Exec" + + "uteActionRequest\032\034.sysml.ExecuteActionRe" + + "sponse\022G\n\014ExecuteState\022\032.sysml.ExecuteSt" + + "ateRequest\032\033.sysml.ExecuteStateResponse\022" + + "8\n\007Convert\022\025.sysml.ConvertRequest\032\026.sysm" + + "l.ConvertResponse\022A\n\nApplyEdits\022\030.sysml." + + "ApplyEditsRequest\032\031.sysml.ApplyEditsResp" + + "onse\022S\n\020VerifyConstraint\022\036.sysml.VerifyC" + + "onstraintRequest\032\037.sysml.VerifyConstrain" + + "tResponse\022V\n\021VerifyRequirement\022\037.sysml.V" + + "erifyRequirementRequest\032 .sysml.VerifyRe" + + "quirementResponse\022Y\n\022VerifySatisfaction\022" + + " .sysml.VerifySatisfactionRequest\032!.sysm" + + "l.VerifySatisfactionResponse\022S\n\020Validate" + + "Instance\022\036.sysml.ValidateInstanceRequest" + + "\032\037.sysml.ValidateInstanceResponse\022G\n\014Eva" + + "luateCalc\022\032.sysml.EvaluateCalcRequest\032\033." + + "sysml.EvaluateCalcResponse\022D\n\013RunAnalysi" + + "s\022\031.sysml.RunAnalysisRequest\032\032.sysml.Run" + + "AnalysisResponse\022;\n\010RunSweep\022\026.sysml.Run" + + "SweepRequest\032\027.sysml.RunSweepResponse\022D\n" + + "\013ListEngines\022\031.sysml.ListEnginesRequest\032" + + "\032.sysml.ListEnginesResponse\0222\n\005Query\022\023.s" + + "ysml.QueryRequest\032\024.sysml.QueryResponse\022" + + "S\n\020RunDocumentQuery\022\036.sysml.RunDocumentQ" + + "ueryRequest\032\037.sysml.RunDocumentQueryResp" + + "onse\022M\n\016RenderDocument\022\034.sysml.RenderDoc" + + "umentRequest\032\035.sysml.RenderDocumentRespo" + + "nseBJ\n\034org.openmbee.opensysml.protoP\001Z(g" + + "ithub.com/Open-MBEE/OpenSysML/api/protob" + + "\006proto3" }; descriptor = com.google.protobuf.Descriptors.FileDescriptor .internalBuildGeneratedFileFrom(descriptorData, @@ -1611,7 +1612,7 @@ public static void registerAllExtensions( internal_static_sysml_ConvertRequest_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_sysml_ConvertRequest_descriptor, - new java.lang.String[] { "FilePath", "Content", "ModelHash", "FromFormat", "ToFormat", "TolerateSyntaxErrors", "Source", }); + new java.lang.String[] { "FilePath", "Content", "ModelHash", "FromFormat", "ToFormat", "TolerateSyntaxErrors", "IdForm", "Source", }); internal_static_sysml_ConvertResponse_descriptor = getDescriptor().getMessageType(43); internal_static_sysml_ConvertResponse_fieldAccessorTable = new diff --git a/client/java/opensysml-client/src/main/resources/opensysml-version.properties b/client/java/opensysml-client/src/main/resources/opensysml-version.properties new file mode 100644 index 0000000000..defbd48204 --- /dev/null +++ b/client/java/opensysml-client/src/main/resources/opensysml-version.properties @@ -0,0 +1 @@ +version=${project.version} diff --git a/client/java/opensysml-conformance/pom.xml b/client/java/opensysml-conformance/pom.xml index 59a3bd8a41..698511257a 100644 --- a/client/java/opensysml-conformance/pom.xml +++ b/client/java/opensysml-conformance/pom.xml @@ -7,7 +7,7 @@ org.openmbee opensysml-parent - 0.9.1 + 0.9.2 opensysml-conformance diff --git a/client/java/pom.xml b/client/java/pom.xml index 48a654d415..0bdfaa254d 100644 --- a/client/java/pom.xml +++ b/client/java/pom.xml @@ -6,7 +6,7 @@ org.openmbee opensysml-parent - 0.9.1 + 0.9.2 pom OpenSysML Java clients diff --git a/client/node/package-lock.json b/client/node/package-lock.json index a5da2b8755..045513ae9e 100644 --- a/client/node/package-lock.json +++ b/client/node/package-lock.json @@ -1,12 +1,12 @@ { "name": "@openmbee/opensysml", - "version": "0.9.1", + "version": "0.9.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@openmbee/opensysml", - "version": "0.9.1", + "version": "0.9.2", "license": "Apache-2.0", "dependencies": { "@bufbuild/protobuf": "2.14.0", @@ -27,11 +27,11 @@ "node": ">=20.11" }, "optionalDependencies": { - "@openmbee/opensysml-sysml-grpc-darwin-arm64": "0.9.1", - "@openmbee/opensysml-sysml-grpc-darwin-x64": "0.9.1", - "@openmbee/opensysml-sysml-grpc-linux-arm64": "0.9.1", - "@openmbee/opensysml-sysml-grpc-linux-x64": "0.9.1", - "@openmbee/opensysml-sysml-grpc-win32-x64": "0.9.1", + "@openmbee/opensysml-sysml-grpc-darwin-arm64": "0.9.2", + "@openmbee/opensysml-sysml-grpc-darwin-x64": "0.9.2", + "@openmbee/opensysml-sysml-grpc-linux-arm64": "0.9.2", + "@openmbee/opensysml-sysml-grpc-linux-x64": "0.9.2", + "@openmbee/opensysml-sysml-grpc-win32-x64": "0.9.2", "@sigstore/bundle": "4.0.0", "@sigstore/protobuf-specs": "0.5.1", "@sigstore/tuf": "4.0.2", @@ -435,71 +435,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@openmbee/opensysml-sysml-grpc-darwin-arm64": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@openmbee/opensysml-sysml-grpc-darwin-arm64/-/opensysml-sysml-grpc-darwin-arm64-0.9.1.tgz", - "integrity": "sha512-4OQwnZFHUOt9351kV2LLwJZdHpikwgN5iTpQXp+x4Q/bDSNQm/Lj+bQRrtrTrXbE7b0YQufWBG9ROd8jNbTheA==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@openmbee/opensysml-sysml-grpc-darwin-x64": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@openmbee/opensysml-sysml-grpc-darwin-x64/-/opensysml-sysml-grpc-darwin-x64-0.9.1.tgz", - "integrity": "sha512-cQFn9z/pSF5QSn8/TO7XH+HPTWKuH0/wXXouCLAOHaVt6oAzb8s+O2VD3+fOfm/I2TPPCvkdMFHCmWy+ok6BVQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@openmbee/opensysml-sysml-grpc-linux-arm64": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@openmbee/opensysml-sysml-grpc-linux-arm64/-/opensysml-sysml-grpc-linux-arm64-0.9.1.tgz", - "integrity": "sha512-63nDsCKlgtTTGx6LLRdaSdNTGPxanLiC8xyTjDZZTncndFIgdxjCaPmqJ5y5J2dD4BpqUjHlhP/SKlIZKfUjTw==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@openmbee/opensysml-sysml-grpc-linux-x64": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@openmbee/opensysml-sysml-grpc-linux-x64/-/opensysml-sysml-grpc-linux-x64-0.9.1.tgz", - "integrity": "sha512-JZ6p9jopDbsd2WpY38IBUExufOF/Kb+CGY+6xqxKGVa2td3Zkho3xUN5M0PZ9EGQ97qy5uCFRKilrKyP57DTOw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@openmbee/opensysml-sysml-grpc-win32-x64": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@openmbee/opensysml-sysml-grpc-win32-x64/-/opensysml-sysml-grpc-win32-x64-0.9.1.tgz", - "integrity": "sha512-3mXq30PykN4u0g4pzVdmOPZpyxvIlItkyGp18gE01iA4+WMBXuAlupNV7JvzXaOF1qWHj4DBA3ucI3maEAbzSQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@sigstore/bundle": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-4.0.0.tgz", diff --git a/client/node/package.json b/client/node/package.json index 0bdfba3d02..a9162c1b9e 100644 --- a/client/node/package.json +++ b/client/node/package.json @@ -1,6 +1,6 @@ { "name": "@openmbee/opensysml", - "version": "0.9.1", + "version": "0.9.2", "description": "OpenSysML client: parse, evaluate and instantiate SysML v2 models over the sysml-grpc Connect API", "license": "Apache-2.0", "repository": { @@ -55,11 +55,11 @@ "@connectrpc/connect-web": "2.1.2" }, "optionalDependencies": { - "@openmbee/opensysml-sysml-grpc-darwin-arm64": "0.9.1", - "@openmbee/opensysml-sysml-grpc-darwin-x64": "0.9.1", - "@openmbee/opensysml-sysml-grpc-linux-arm64": "0.9.1", - "@openmbee/opensysml-sysml-grpc-linux-x64": "0.9.1", - "@openmbee/opensysml-sysml-grpc-win32-x64": "0.9.1", + "@openmbee/opensysml-sysml-grpc-darwin-arm64": "0.9.2", + "@openmbee/opensysml-sysml-grpc-darwin-x64": "0.9.2", + "@openmbee/opensysml-sysml-grpc-linux-arm64": "0.9.2", + "@openmbee/opensysml-sysml-grpc-linux-x64": "0.9.2", + "@openmbee/opensysml-sysml-grpc-win32-x64": "0.9.2", "@sigstore/bundle": "4.0.0", "@sigstore/protobuf-specs": "0.5.1", "@sigstore/tuf": "4.0.2", diff --git a/client/node/src/generated/sysml_pb.ts b/client/node/src/generated/sysml_pb.ts index 8b72d18580..67f0e6a57a 100644 --- a/client/node/src/generated/sysml_pb.ts +++ b/client/node/src/generated/sysml_pb.ts @@ -10,7 +10,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file sysml.proto. */ export const file_sysml: GenFile = /*@__PURE__*/ - fileDesc("CgtzeXNtbC5wcm90bxIFc3lzbWwihgMKB1ZlcmRpY3QSDAoEa2luZBgBIAEoCRISCgplbGVtZW50X2lkGAIgASgJEg8KB2VsZW1lbnQYAyABKAkSDQoFaG9sZHMYBCABKAgSEQoJY29uZGl0aW9uGAUgASgJEhMKC2luc3RhbmNlX2lkGAYgASgDEhgKEGluc3RhbmNlX3R5cGVfaWQYByABKAkSDQoFZXJyb3IYCCABKAkSLAoOZmFpbHVyZV9yZWFzb24YCSABKA4yFC5zeXNtbC5GYWlsdXJlUmVhc29uEhYKDnJlcXVpcmVtZW50X2lkGAogASgJEg4KBmVuZ2luZRgLIAEoCRIQCghzdHJlbmd0aBgMIAEoCRIcCgZib3VuZHMYDSADKAsyDC5zeXNtbC5Cb3VuZBIVCg1pbnN0YW5jZV9wYXRoGA4gASgJEhAKCHF1ZXN0aW9uGA8gASgJEg4KBnN0YXR1cxgQIAEoCRIpCgd3aXRuZXNzGBEgAygLMhguc3lzbWwuV2l0bmVzc0Fzc2lnbm1lbnQiXgoRV2l0bmVzc0Fzc2lnbm1lbnQSDwoHZmVhdHVyZRgBIAEoCRIbCgV2YWx1ZRgCIAEoCzIMLnN5c21sLlZhbHVlEgwKBHVuaXQYAyABKAkSDQoFZXhhY3QYBCABKAkiNQoFQm91bmQSDAoEbmFtZRgBIAEoCRINCgVsaW1pdBgCIAEoAxIPCgdyZWFjaGVkGAMgASgIIn0KF1ZlcmlmeUNvbnN0cmFpbnRSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSEQoJc3ltYm9sX2lkGAIgASgJEhkKEXN1YmplY3Rfc3ltYm9sX2lkGAMgASgJEg4KBmVuZ2luZRgEIAEoCRIQCghxdWVzdGlvbhgFIAEoCSKWAQoYVmVyaWZ5Q29uc3RyYWludFJlc3BvbnNlEh8KB3ZlcmRpY3QYASABKAsyDi5zeXNtbC5WZXJkaWN0EiIKCWluc3RhbmNlcxgCIAMoCzIPLnN5c21sLkluc3RhbmNlEg0KBWVycm9yGAMgASgJEiYKC2RpYWdub3N0aWNzGAQgAygLMhEuc3lzbWwuRGlhZ25vc3RpYyJ+ChhWZXJpZnlSZXF1aXJlbWVudFJlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRIRCglzeW1ib2xfaWQYAiABKAkSGQoRc3ViamVjdF9zeW1ib2xfaWQYAyABKAkSDgoGZW5naW5lGAQgASgJEhAKCHF1ZXN0aW9uGAUgASgJIm0KE1ZlcmlmaWNhdGlvblZlcmRpY3QSDwoHY2FzZV9pZBgBIAEoCRIMCgRraW5kGAIgASgJEg4KBmRldGFpbBgDIAEoCRIPCgdzdWJjYXNlGAQgASgIEhYKDnJlcXVpcmVtZW50X2lkGAUgASgJItIBChlWZXJpZnlSZXF1aXJlbWVudFJlc3BvbnNlEh8KB3ZlcmRpY3QYASABKAsyDi5zeXNtbC5WZXJkaWN0EiIKCWluc3RhbmNlcxgCIAMoCzIPLnN5c21sLkluc3RhbmNlEg0KBWVycm9yGAMgASgJEiYKC2RpYWdub3N0aWNzGAQgAygLMhEuc3lzbWwuRGlhZ25vc3RpYxI5ChV2ZXJpZmljYXRpb25fdmVyZGljdHMYBSADKAsyGi5zeXNtbC5WZXJpZmljYXRpb25WZXJkaWN0ImQKGVZlcmlmeVNhdGlzZmFjdGlvblJlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRIRCglzeW1ib2xfaWQYAiABKAkSDgoGZW5naW5lGAMgASgJEhAKCHF1ZXN0aW9uGAQgASgJIoICChpWZXJpZnlTYXRpc2ZhY3Rpb25SZXNwb25zZRIgCgh2ZXJkaWN0cxgBIAMoCzIOLnN5c21sLlZlcmRpY3QSIgoJaW5zdGFuY2VzGAIgAygLMg8uc3lzbWwuSW5zdGFuY2USDQoFZXJyb3IYAyABKAkSJgoLZGlhZ25vc3RpY3MYBCADKAsyES5zeXNtbC5EaWFnbm9zdGljEiwKDmZhaWx1cmVfcmVhc29uGAUgASgOMhQuc3lzbWwuRmFpbHVyZVJlYXNvbhI5ChV2ZXJpZmljYXRpb25fdmVyZGljdHMYBiADKAsyGi5zeXNtbC5WZXJpZmljYXRpb25WZXJkaWN0IlAKF1ZhbGlkYXRlSW5zdGFuY2VSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSEQoJc3ltYm9sX2lkGAIgASgJEg4KBmVuZ2luZRgDIAEoCSKyAgoYVmFsaWRhdGVJbnN0YW5jZVJlc3BvbnNlEiAKCHZlcmRpY3RzGAEgAygLMg4uc3lzbWwuVmVyZGljdBIfCgdzdW1tYXJ5GAIgASgLMg4uc3lzbWwuVmVyZGljdBIiCglpbnN0YW5jZXMYAyADKAsyDy5zeXNtbC5JbnN0YW5jZRINCgVlcnJvchgEIAEoCRImCgtkaWFnbm9zdGljcxgFIAMoCzIRLnN5c21sLkRpYWdub3N0aWMSLAoOZmFpbHVyZV9yZWFzb24YBiABKA4yFC5zeXNtbC5GYWlsdXJlUmVhc29uEjkKFXZlcmlmaWNhdGlvbl92ZXJkaWN0cxgHIAMoCzIaLnN5c21sLlZlcmlmaWNhdGlvblZlcmRpY3QSDwoHYm91bmRlZBgIIAEoCCJtChNFdmFsdWF0ZUNhbGNSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSEQoJc3ltYm9sX2lkGAIgASgJEh8KCWFyZ3VtZW50cxgDIAMoCzIMLnN5c21sLlZhbHVlEg4KBmVuZ2luZRgEIAEoCSL9AQoURXZhbHVhdGVDYWxjUmVzcG9uc2USHAoGcmVzdWx0GAEgASgLMgwuc3lzbWwuVmFsdWUSIgoHb3V0cHV0cxgCIAMoCzIRLnN5c21sLkNhbGNPdXRwdXQSDQoFZXJyb3IYAyABKAkSJgoLZGlhZ25vc3RpY3MYBCADKAsyES5zeXNtbC5EaWFnbm9zdGljEiwKDmZhaWx1cmVfcmVhc29uGAUgASgOMhQuc3lzbWwuRmFpbHVyZVJlYXNvbhIOCgZlbmdpbmUYBiABKAkSEAoIc3RyZW5ndGgYByABKAkSHAoGYm91bmRzGAggAygLMgwuc3lzbWwuQm91bmQiNwoKQ2FsY091dHB1dBIMCgRuYW1lGAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWUikwEKDkNhc2VFdmFsdWF0aW9uEhMKC2Z1bmN0aW9uX2lkGAEgASgJEh8KCWFyZ3VtZW50cxgCIAMoCzIMLnN5c21sLlZhbHVlEhwKBnJlc3VsdBgDIAEoCzIMLnN5c21sLlZhbHVlEg0KBWVycm9yGAQgASgJEhAKCHNlbGVjdGVkGAUgASgIEgwKBHRpZWQYBiABKAgipgIKElJ1bkFuYWx5c2lzUmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEhEKCXN5bWJvbF9pZBgCIAEoCRIZChFzdWJqZWN0X3N5bWJvbF9pZBgDIAEoCRIfCglhcmd1bWVudHMYBCADKAsyDC5zeXNtbC5WYWx1ZRJGCg9uYW1lZF9hcmd1bWVudHMYBSADKAsyLS5zeXNtbC5SdW5BbmFseXNpc1JlcXVlc3QuTmFtZWRBcmd1bWVudHNFbnRyeRIQCghzY2hlZHVsZRgGIAEoCRIOCgZlbmdpbmUYByABKAkaQwoTTmFtZWRBcmd1bWVudHNFbnRyeRILCgNrZXkYASABKAkSGwoFdmFsdWUYAiABKAsyDC5zeXNtbC5WYWx1ZToCOAEi3AMKE1J1bkFuYWx5c2lzUmVzcG9uc2USIgoHb3V0cHV0cxgBIAMoCzIRLnN5c21sLkNhbGNPdXRwdXQSIAoIdmVyZGljdHMYAiADKAsyDi5zeXNtbC5WZXJkaWN0EiIKCWluc3RhbmNlcxgDIAMoCzIPLnN5c21sLkluc3RhbmNlEg0KBWVycm9yGAQgASgJEiYKC2RpYWdub3N0aWNzGAUgAygLMhEuc3lzbWwuRGlhZ25vc3RpYxIsCg5mYWlsdXJlX3JlYXNvbhgGIAEoDjIULnN5c21sLkZhaWx1cmVSZWFzb24SOQoVdmVyaWZpY2F0aW9uX3ZlcmRpY3RzGAcgAygLMhouc3lzbWwuVmVyaWZpY2F0aW9uVmVyZGljdBIgCghvdXRjb21lcxgIIAMoCzIOLnN5c21sLk91dGNvbWUSLQoLZXhwbG9yYXRpb24YCSABKAsyGC5zeXNtbC5FeHBsb3JhdGlvblN0YXR1cxIqCgtldmFsdWF0aW9ucxgKIAMoCzIVLnN5c21sLkNhc2VFdmFsdWF0aW9uEg4KBmVuZ2luZRgLIAEoCRIQCghzdHJlbmd0aBgMIAEoCRIcCgZib3VuZHMYDSADKAsyDC5zeXNtbC5Cb3VuZCKXAgoHT3V0Y29tZRIsCgdvdXRwdXRzGAEgAygLMhsuc3lzbWwuT3V0Y29tZS5PdXRwdXRzRW50cnkSEwoLZmluYWxfc3RhdGUYAiABKAkSFgoOc3RhdGVzX3Zpc2l0ZWQYAyADKAkSDQoFZXJyb3IYBCABKAkSFgoObGluZWFyaXphdGlvbnMYBSABKAUSDwoHd2l0bmVzcxgGIAMoCRImCgtkaWFnbm9zdGljcxgHIAMoCzIRLnN5c21sLkRpYWdub3N0aWMSEwoLcHJvYmFiaWxpdHkYCCABKAEaPAoMT3V0cHV0c0VudHJ5EgsKA2tleRgBIAEoCRIbCgV2YWx1ZRgCIAEoCzIMLnN5c21sLlZhbHVlOgI4ASKWAQoRRXhwbG9yYXRpb25TdGF0dXMSEAoIY29tcGxldGUYASABKAgSDAoEcnVucxgCIAEoBRITCgtidWRnZXRzX2hpdBgDIAMoCRITCgtydW5zX2J1ZGdldBgEIAEoBRIUCgxkZXB0aF9idWRnZXQYBSABKAUSIQoZcHJvYmFiaWxpdGllc19sb3dlcl9ib3VuZBgGIAEoCCIUChJMaXN0RW5naW5lc1JlcXVlc3Qi/AEKCkVuZ2luZUluZm8SDAoEbmFtZRgBIAEoCRIRCglhdXRob3JpdHkYAiABKAkSDwoHYW5zd2VycxgDIAMoCRIOCgZib3VuZHMYBCADKAkSDwoHcHJvY2VzcxgFIAEoCRIVCg1wcm9jZXNzX2ZvdW5kGAYgASgJEg0KBXJlYWR5GAcgASgIEhMKC3VuYXZhaWxhYmxlGAggASgJEgwKBGtpbmQYCSABKAkSEAoIcHJvdG9jb2wYCiABKAkSDgoGc291cmNlGAsgASgJEg8KB2NvbW1hbmQYDCABKAkSDwoHdmVyc2lvbhgNIAEoCRIOCgZzZXJ2ZWQYDiABKAgiOQoTTGlzdEVuZ2luZXNSZXNwb25zZRIiCgdlbmdpbmVzGAEgAygLMhEuc3lzbWwuRW5naW5lSW5mbyKMAQoQUGFyc2VGaWxlUmVxdWVzdBITCglmaWxlX3BhdGgYASABKAlIABIRCgdjb250ZW50GAIgASgJSAASGAoMY29udGVudF9oYXNoGAMgASgJQgIYARIQCghsYW5ndWFnZRgEIAEoCRIaChJzdHJpY3RfY29uZm9ybWFuY2UYBSABKAhCCAoGc291cmNlImIKDlNvdXJjZURvY3VtZW50EhMKCWZpbGVfcGF0aBgBIAEoCUgAEhEKB2NvbnRlbnQYAiABKAlIABIQCghsYW5ndWFnZRgDIAEoCRIMCgRuYW1lGAQgASgJQggKBnNvdXJjZSJbChNQYXJzZVNvdXJjZXNSZXF1ZXN0EigKCWRvY3VtZW50cxgBIAMoCzIVLnN5c21sLlNvdXJjZURvY3VtZW50EhoKEnN0cmljdF9jb25mb3JtYW5jZRgCIAEoCCKDAQoUUGFyc2VTb3VyY2VzUmVzcG9uc2USEgoKbW9kZWxfaGFzaBgBIAEoCRIgCgVyb290cxgCIAMoCzIRLnN5c21sLlN5bWJvbEluZm8SJgoLZGlhZ25vc3RpY3MYAyADKAsyES5zeXNtbC5EaWFnbm9zdGljEg0KBWVycm9yGAQgASgJIn8KEVBhcnNlRmlsZVJlc3BvbnNlEhIKCm1vZGVsX2hhc2gYASABKAkSHwoEcm9vdBgCIAEoCzIRLnN5c21sLlN5bWJvbEluZm8SJgoLZGlhZ25vc3RpY3MYAyADKAsyES5zeXNtbC5EaWFnbm9zdGljEg0KBWVycm9yGAQgASgJIjkKEEdldFN5bWJvbFJlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRIRCglzeW1ib2xfaWQYAiABKAkiQgoOU3ltYm9sUmVzcG9uc2USIQoGc3ltYm9sGAEgASgLMhEuc3lzbWwuU3ltYm9sSW5mbxINCgVlcnJvchgCIAEoCSIoChJEaWFnbm9zdGljc1JlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCSJMChNEaWFnbm9zdGljc1Jlc3BvbnNlEiYKC2RpYWdub3N0aWNzGAEgAygLMhEuc3lzbWwuRGlhZ25vc3RpYxINCgVlcnJvchgCIAEoCSJvCg9FdmFsdWF0ZVJlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRISCgpleHByZXNzaW9uGAIgASgJEhkKEWNvbnRleHRfc3ltYm9sX2lkGAMgASgJEhkKEXN1YmplY3Rfc3ltYm9sX2lkGAQgASgJImcKEEV2YWx1YXRlUmVzcG9uc2USHAoGcmVzdWx0GAEgASgLMgwuc3lzbWwuVmFsdWUSDQoFZXJyb3IYAiABKAkSJgoLZGlhZ25vc3RpY3MYAyADKAsyES5zeXNtbC5EaWFnbm9zdGljIsIBCghJbnN0YW5jZRIKCgJpZBgBIAEoAxIWCg50eXBlX3N5bWJvbF9pZBgCIAEoCRI6Cg5mZWF0dXJlX3ZhbHVlcxgEIAMoCzIiLnN5c21sLkluc3RhbmNlLkZlYXR1cmVWYWx1ZXNFbnRyeRpJChJGZWF0dXJlVmFsdWVzRW50cnkSCwoDa2V5GAEgASgJEiIKBXZhbHVlGAIgASgLMhMuc3lzbWwuRmVhdHVyZVZhbHVlOgI4AUoECAMQBFIFc2xvdHMihAEKDEZlYXR1cmVWYWx1ZRIUCgxmZWF0dXJlX25hbWUYASABKAkSGwoFdmFsdWUYAiABKAsyDC5zeXNtbC5WYWx1ZRIcCgZ2YWx1ZXMYAyADKAsyDC5zeXNtbC5WYWx1ZRIUCgxtYXRlcmlhbGl6ZWQYBCABKAgSDQoFZXJyb3IYBSABKAkiOwoSSW5zdGFudGlhdGVSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSEQoJc3ltYm9sX2lkGAIgASgJIpMBChNJbnN0YW50aWF0ZVJlc3BvbnNlEiEKCGluc3RhbmNlGAEgASgLMg8uc3lzbWwuSW5zdGFuY2USDQoFZXJyb3IYAiABKAkSJgoLZGlhZ25vc3RpY3MYAyADKAsyES5zeXNtbC5EaWFnbm9zdGljEiIKCWluc3RhbmNlcxgEIAMoCzIPLnN5c21sLkluc3RhbmNlIukBChRFeGVjdXRlQWN0aW9uUmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEhgKEGFjdGlvbl9zeW1ib2xfaWQYAiABKAkSNwoGaW5wdXRzGAMgAygLMicuc3lzbWwuRXhlY3V0ZUFjdGlvblJlcXVlc3QuSW5wdXRzRW50cnkSEAoIc2NoZWR1bGUYBCABKAkSGwoTcGVyZm9ybWVyX3N5bWJvbF9pZBgFIAEoCRo7CgtJbnB1dHNFbnRyeRILCgNrZXkYASABKAkSGwoFdmFsdWUYAiABKAsyDC5zeXNtbC5WYWx1ZToCOAEizAMKFUV4ZWN1dGVBY3Rpb25SZXNwb25zZRI6CgdvdXRwdXRzGAEgAygLMikuc3lzbWwuRXhlY3V0ZUFjdGlvblJlc3BvbnNlLk91dHB1dHNFbnRyeRINCgVlcnJvchgCIAEoCRImCgtkaWFnbm9zdGljcxgDIAMoCzIRLnN5c21sLkRpYWdub3N0aWMSIAoIb3V0Y29tZXMYBCADKAsyDi5zeXNtbC5PdXRjb21lEi0KC2V4cGxvcmF0aW9uGAUgASgLMhguc3lzbWwuRXhwbG9yYXRpb25TdGF0dXMSEgoKZmluYWxfdGltZRgGIAEoARJTChRwZXJmb3JtZXJfYXR0cmlidXRlcxgHIAMoCzI1LnN5c21sLkV4ZWN1dGVBY3Rpb25SZXNwb25zZS5QZXJmb3JtZXJBdHRyaWJ1dGVzRW50cnkaPAoMT3V0cHV0c0VudHJ5EgsKA2tleRgBIAEoCRIbCgV2YWx1ZRgCIAEoCzIMLnN5c21sLlZhbHVlOgI4ARpIChhQZXJmb3JtZXJBdHRyaWJ1dGVzRW50cnkSCwoDa2V5GAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWU6AjgBIokBChNFeGVjdXRlU3RhdGVSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSHwoXc3RhdGVfbWFjaGluZV9zeW1ib2xfaWQYAiABKAkSDgoGZXZlbnRzGAMgAygJEhAKCHNjaGVkdWxlGAQgASgJEhsKE3BlcmZvcm1lcl9zeW1ib2xfaWQYBSABKAki0wIKFEV4ZWN1dGVTdGF0ZVJlc3BvbnNlEhYKDnN0YXRlc192aXNpdGVkGAEgAygJEkQKDWZpbmFsX2NvbnRleHQYAiADKAsyLS5zeXNtbC5FeGVjdXRlU3RhdGVSZXNwb25zZS5GaW5hbENvbnRleHRFbnRyeRINCgVlcnJvchgDIAEoCRImCgtkaWFnbm9zdGljcxgEIAMoCzIRLnN5c21sLkRpYWdub3N0aWMSIAoIb3V0Y29tZXMYBSADKAsyDi5zeXNtbC5PdXRjb21lEi0KC2V4cGxvcmF0aW9uGAYgASgLMhguc3lzbWwuRXhwbG9yYXRpb25TdGF0dXMSEgoKZmluYWxfdGltZRgHIAEoARpBChFGaW5hbENvbnRleHRFbnRyeRILCgNrZXkYASABKAkSGwoFdmFsdWUYAiABKAsyDC5zeXNtbC5WYWx1ZToCOAEioAEKDkNvbnZlcnRSZXF1ZXN0EhMKCWZpbGVfcGF0aBgBIAEoCUgAEhEKB2NvbnRlbnQYAiABKAlIABIUCgptb2RlbF9oYXNoGAYgASgJSAASEwoLZnJvbV9mb3JtYXQYAyABKAkSEQoJdG9fZm9ybWF0GAQgASgJEh4KFnRvbGVyYXRlX3N5bnRheF9lcnJvcnMYBSABKAhCCAoGc291cmNlIrQBCg9Db252ZXJ0UmVzcG9uc2USDwoHY29udGVudBgBIAEoCRITCgtmcm9tX2Zvcm1hdBgCIAEoCRIRCgl0b19mb3JtYXQYAyABKAkSDQoFZXJyb3IYBCABKAkSJgoLZGlhZ25vc3RpY3MYBSADKAsyES5zeXNtbC5EaWFnbm9zdGljEhQKDGV4cGVyaW1lbnRhbBgGIAEoCBIbChNleHBlcmltZW50YWxfbm90aWNlGAcgASgJIn0KEUFwcGx5RWRpdHNSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSKAoKb3BlcmF0aW9ucxgCIAMoCzIULnN5c21sLkVkaXRPcGVyYXRpb24SEAoIZG9jdW1lbnQYAyABKAkSGAoQYWNjZXB0X2RvY3VtZW50cxgEIAEoCCLDBgoNRWRpdE9wZXJhdGlvbhIoCglzZXRfdmFsdWUYASABKAsyEy5zeXNtbC5TZXRWYWx1ZUVkaXRIABIjCgZyZW5hbWUYAiABKAsyES5zeXNtbC5SZW5hbWVFZGl0SAASKgoKYWRkX21lbWJlchgDIAEoCzIULnN5c21sLkFkZE1lbWJlckVkaXRIABIjCgZkZWxldGUYBCABKAsyES5zeXNtbC5EZWxldGVFZGl0SAASHwoEbW92ZRgFIAEoCzIPLnN5c21sLk1vdmVFZGl0SAASMgoOYWRkX2Nvbm5lY3Rpb24YBiABKAsyGC5zeXNtbC5BZGRDb25uZWN0aW9uRWRpdEgAEiwKC2FkZF9zYXRpc2Z5GAcgASgLMhUuc3lzbWwuQWRkU2F0aXNmeUVkaXRIABJJChphZGRfcmVxdWlyZW1lbnRfY29uc3RyYWludBgIIAEoCzIjLnN5c21sLkFkZFJlcXVpcmVtZW50Q29uc3RyYWludEVkaXRIABIyCg5hZGRfdHJhbnNpdGlvbhgJIAEoCzIYLnN5c21sLkFkZFRyYW5zaXRpb25FZGl0SAASKgoKYWRkX2ltcG9ydBgKIAEoCzIULnN5c21sLkFkZEltcG9ydEVkaXRIABI4ChFhZGRfZG9jdW1lbnRhdGlvbhgLIAEoCzIbLnN5c21sLkFkZERvY3VtZW50YXRpb25FZGl0SAASKgoKYWRkX3ZlcmlmeRgMIAEoCzIULnN5c21sLkFkZFZlcmlmeUVkaXRIABIuCgxhZGRfbWV0YWRhdGEYDSABKAsyFi5zeXNtbC5BZGRNZXRhZGF0YUVkaXRIABIuCgxhZGRfc2VxdWVuY2UYDiABKAsyFi5zeXNtbC5BZGRTZXF1ZW5jZUVkaXRIABI7ChNhZGRfbWV0YWRhdGFfcHJlZml4GA8gASgLMhwuc3lzbWwuQWRkTWV0YWRhdGFQcmVmaXhFZGl0SAASLAoLYWRkX2NvbW1lbnQYECABKAsyFS5zeXNtbC5BZGRDb21tZW50RWRpdEgAEiYKCGFkZF9ub3RlGBIgASgLMhIuc3lzbWwuQWRkTm90ZUVkaXRIAEILCglvcGVyYXRpb24ikgIKDUFkZE1lbWJlckVkaXQSDQoFb3duZXIYASABKAkSDAoEa2luZBgCIAEoCRIMCgRuYW1lGAMgASgJEgwKBHR5cGUYBCABKAkSFAoMbXVsdGlwbGljaXR5GAUgASgJEg0KBXZhbHVlGAYgASgJEhMKC3NwZWNpYWxpemVzGAcgAygJEhMKC2lzX2Fic3RyYWN0GAggASgIEhEKCXJlZGVmaW5lcxgJIAMoCRISCgppc19kZWZhdWx0GAogASgIEhEKCWRpcmVjdGlvbhgLIAEoCRIZChFtZXRhZGF0YV9wcmVmaXhlcxgOIAMoCRILCgNkb2MYDCABKAkSFwoPYm9keV9leHByZXNzaW9uGA0gASgJInkKDkFkZFNhdGlzZnlFZGl0Eg0KBW93bmVyGAEgASgJEhMKC3JlcXVpcmVtZW50GAIgASgJEhoKEnNhdGlzZnlpbmdfZmVhdHVyZRgDIAEoCRITCgtpc19hc3NlcnRlZBgEIAEoCBISCgppc19uZWdhdGVkGAUgASgIIl0KHEFkZFJlcXVpcmVtZW50Q29uc3RyYWludEVkaXQSDQoFb3duZXIYASABKAkSDAoEa2luZBgCIAEoCRISCgpleHByZXNzaW9uGAMgASgJEgwKBG5hbWUYBCABKAkikQEKEUFkZFRyYW5zaXRpb25FZGl0Eg0KBW93bmVyGAEgASgJEgwKBG5hbWUYAiABKAkSDgoGc291cmNlGAMgASgJEg4KBnRhcmdldBgEIAEoCRIPCgd0cmlnZ2VyGAUgASgJEg0KBWd1YXJkGAYgASgJEg4KBmVmZmVjdBgHIAEoCRIPCgdpbml0aWFsGAggASgIIjMKDUFkZFZlcmlmeUVkaXQSDQoFb3duZXIYASABKAkSEwoLcmVxdWlyZW1lbnQYAiABKAkiNgoUTWV0YWRhdGFGZWF0dXJlVmFsdWUSDwoHZmVhdHVyZRgBIAEoCRINCgV2YWx1ZRgCIAEoCSKUAQoPQWRkTWV0YWRhdGFFZGl0Eg0KBW93bmVyGAEgASgJEhUKDW1ldGFkYXRhX3R5cGUYAiABKAkSDAoEbmFtZRgDIAEoCRINCgVhYm91dBgEIAMoCRIrCgZ2YWx1ZXMYBSADKAsyGy5zeXNtbC5NZXRhZGF0YUZlYXR1cmVWYWx1ZRIRCglzaG9ydGhhbmQYBiABKAgiPgoVQWRkTWV0YWRhdGFQcmVmaXhFZGl0Eg4KBnRhcmdldBgBIAEoCRIVCg1tZXRhZGF0YV90eXBlGAIgASgJIoABCg1BZGRJbXBvcnRFZGl0Eg0KBW93bmVyGAEgASgJEhIKCnZpc2liaWxpdHkYAiABKAkSDgoGdGFyZ2V0GAMgASgJEhQKDGlzX3JlY3Vyc2l2ZRgEIAEoCBIVCg1pc19pbXBvcnRfYWxsGAUgASgIEg8KB2ZpbHRlcnMYBiADKAkiYwoUQWRkRG9jdW1lbnRhdGlvbkVkaXQSDgoGdGFyZ2V0GAEgASgJEgwKBGJvZHkYAiABKAkSDAoEbmFtZRgDIAEoCRIOCgZsb2NhbGUYBCABKAkSDwoHcmVwbGFjZRgFIAEoCCJaCg5BZGRDb21tZW50RWRpdBINCgVvd25lchgBIAEoCRIMCgRib2R5GAIgASgJEgwKBG5hbWUYAyABKAkSDQoFYWJvdXQYBCADKAkSDgoGbG9jYWxlGAUgASgJIisKC0FkZE5vdGVFZGl0Eg4KBnRhcmdldBgBIAEoCRIMCgR0ZXh0GAIgASgJIs0CCg9BZGRTZXF1ZW5jZUVkaXQSDQoFb3duZXIYASABKAkSDwoHa2V5d29yZBgCIAEoCRILCgNyZWYYAyABKAkSEwoLbWVtYmVyX2tpbmQYBCABKAkSEwoLbWVtYmVyX25hbWUYBSABKAkSDAoEdHlwZRgGIAEoCRINCgVhZnRlchgHIAEoCRIRCgljb25kaXRpb24YCCABKAkSDQoFdmFsdWUYCSABKAkSDgoGdGFyZ2V0GAogASgJEgsKA3ZpYRgLIAEoCRINCgV1bnRpbBgMIAEoCRIkCgRib2R5GA0gAygLMhYuc3lzbWwuQWRkU2VxdWVuY2VFZGl0EikKCWVsc2VfYm9keRgOIAMoCzIWLnN5c21sLkFkZFNlcXVlbmNlRWRpdBIUCgxtdWx0aXBsaWNpdHkYDyABKAkSEQoJcGFyYW1ldGVyGBAgASgJIm4KEUFkZENvbm5lY3Rpb25FZGl0Eg0KBW93bmVyGAEgASgJEgwKBGtpbmQYAiABKAkSEAoIZnJvbV9lbmQYAyABKAkSDgoGdG9fZW5kGAQgASgJEgwKBG5hbWUYBSABKAkSDAoEdHlwZRgGIAEoCSItCgpEZWxldGVFZGl0Eg4KBnRhcmdldBgBIAEoCRIPCgdjYXNjYWRlGAIgASgIIikKCE1vdmVFZGl0Eg4KBnRhcmdldBgBIAEoCRINCgVvd25lchgCIAEoCSItCgxTZXRWYWx1ZUVkaXQSDgoGdGFyZ2V0GAEgASgJEg0KBXZhbHVlGAIgASgJIi4KClJlbmFtZUVkaXQSDgoGdGFyZ2V0GAEgASgJEhAKCG5ld19uYW1lGAIgASgJIpACChJBcHBseUVkaXRzUmVzcG9uc2USDwoHY29udGVudBgBIAEoCRIjCgdhcHBsaWVkGAIgAygLMhIuc3lzbWwuQXBwbGllZEVkaXQSDQoFZXJyb3IYAyABKAkSIwoHZmFpbHVyZRgEIAEoDjISLnN5c21sLkVkaXRGYWlsdXJlEiYKC2RpYWdub3N0aWNzGAUgAygLMhEuc3lzbWwuRGlhZ25vc3RpYxIaChJyZWZlcnJpbmdfZWxlbWVudHMYBiADKAkSKAoJZG9jdW1lbnRzGAcgAygLMhUuc3lzbWwuRWRpdGVkRG9jdW1lbnQSIgoJcmVmZXJyZXJzGAggAygLMg8uc3lzbWwuUmVmZXJyZXIiLwoORWRpdGVkRG9jdW1lbnQSDAoEbmFtZRgBIAEoCRIPCgdjb250ZW50GAIgASgJIioKCFJlZmVycmVyEgwKBG5hbWUYASABKAkSEAoIZG9jdW1lbnQYAiABKAkijAEKC0FwcGxpZWRFZGl0EhcKD29wZXJhdGlvbl9pbmRleBgBIAEoBRIOCgZ0YXJnZXQYAiABKAkSDgoGb2Zmc2V0GAMgASgFEg4KBmxlbmd0aBgEIAEoBRIQCghvbGRfdGV4dBgFIAEoCRIQCghuZXdfdGV4dBgGIAEoCRIQCghkb2N1bWVudBgHIAEoCSL9AgoKU3ltYm9sSW5mbxIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEgwKBGtpbmQYAyABKAkSMQoIbWV0YWRhdGEYBCADKAsyHy5zeXNtbC5TeW1ib2xJbmZvLk1ldGFkYXRhRW50cnkSEQoJY2hpbGRfaWRzGAUgAygJEigKCmF0dHJpYnV0ZXMYBiADKAsyFC5zeXNtbC5BdHRyaWJ1dGVJbmZvEiIKCXR5cGVfaW5mbxgHIAEoCzIPLnN5c21sLlR5cGVJbmZvEi0KDG11bHRpcGxpY2l0eRgIIAEoCzIXLnN5c21sLk11bHRpcGxpY2l0eUluZm8SLgoPc3BlY2lhbGl6YXRpb25zGAkgAygLMhUuc3lzbWwuU3BlY2lhbGl6YXRpb24SIwobd2l0aGhlbGRfbGlicmFyeV9hdHRyaWJ1dGVzGAogASgFGi8KDU1ldGFkYXRhRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASJYCg5TcGVjaWFsaXphdGlvbhIMCgRraW5kGAEgASgJEhAKCGRlY2xhcmVkGAIgASgJEhEKCXRhcmdldF9pZBgDIAEoCRITCgt0YXJnZXRfa2luZBgEIAEoCSKVAQoIVHlwZUluZm8SEAoIZGVjbGFyZWQYASABKAkSEwoLcmVzb2x2ZWRfaWQYAiABKAkSFQoNcmVzb2x2ZWRfa2luZBgDIAEoCRIRCglwcmltaXRpdmUYBCABKAkSGAoQcHJpbWl0aXZlX3NvdXJjZRgFIAEoCRIQCghxdWFudGl0eRgGIAEoCBIMCgR1bml0GAcgASgJIjAKEE11bHRpcGxpY2l0eUluZm8SDQoFbG93ZXIYASABKAkSDQoFdXBwZXIYAiABKAkiVgoNQXR0cmlidXRlSW5mbxIMCgRuYW1lGAEgASgJEgwKBHR5cGUYAiABKAkSGwoFdmFsdWUYAyABKAsyDC5zeXNtbC5WYWx1ZRIMCgR1bml0GAQgASgJIsMFCgVWYWx1ZRITCglpbnRfdmFsdWUYASABKANIABIUCgpyZWFsX3ZhbHVlGAIgASgBSAASFAoKYm9vbF92YWx1ZRgDIAEoCEgAEhYKDHN0cmluZ192YWx1ZRgEIAEoCUgAEhUKC2luc3RhbmNlX2lkGAUgASgDSAASKAoIc2VxdWVuY2UYBiABKAsyFC5zeXNtbC5WYWx1ZVNlcXVlbmNlSAASDgoEbnVsbBgHIAEoCUgAEiMKCHF1YW50aXR5GAggASgLMg8uc3lzbWwuUXVhbnRpdHlIABIqCgxlbnVtX2xpdGVyYWwYCSABKAsyEi5zeXNtbC5FbnVtTGl0ZXJhbEgAEg8KBXVuc2V0GAogASgISAASIQoHY29tcGxleBgLIAEoCzIOLnN5c21sLkNvbXBsZXhIABIdCgVhcnJheRgMIAEoCzIMLnN5c21sLkFycmF5SAASHwoGdmVjdG9yGA0gASgLMg0uc3lzbWwuVmVjdG9ySAASMAoPdmVjdG9yX3F1YW50aXR5GA4gASgLMhUuc3lzbWwuVmVjdG9yUXVhbnRpdHlIABIwCg9tZWFzdXJlbWVudF9yZWYYDyABKAsyFS5zeXNtbC5NZWFzdXJlbWVudFJlZkgAEhIKCGluZmluaXR5GBAgASgISAASIwoIZnVuY3Rpb24YESABKAsyDy5zeXNtbC5GdW5jdGlvbkgAEh4KA3NldBgSIAEoCzIPLnN5c21sLlZhbHVlU2V0SAASMAoPdGVuc29yX3F1YW50aXR5GBMgASgLMhUuc3lzbWwuVGVuc29yUXVhbnRpdHlIABInCgptZXRhb2JqZWN0GBQgASgLMhEuc3lzbWwuTWV0YW9iamVjdEgAEisKDHVuZGV0ZXJtaW5lZBgVIAEoCzITLnN5c21sLlVuZGV0ZXJtaW5lZEgAQgYKBGtpbmQiNgoKTWV0YW9iamVjdBISCgplbGVtZW50X2lkGAEgASgJEhQKDG1ldGFjbGFzc19pZBgCIAEoCSJGCgxVbmRldGVybWluZWQSDgoGcmVhc29uGAEgASgJEiYKBWNvdW50GAIgASgLMhcuc3lzbWwuTXVsdGlwbGljaXR5SW5mbyIsCghGdW5jdGlvbhIPCgdjYWxjX2lkGAEgASgJEg8KB3NlbGZfaWQYAiABKAMiKgoIVmFsdWVTZXQSHgoIZWxlbWVudHMYASADKAsyDC5zeXNtbC5WYWx1ZSJJCg5UZW5zb3JRdWFudGl0eRISCgpkaW1lbnNpb25zGAEgAygDEiMKCmNvbXBvbmVudHMYAiADKAsyDy5zeXNtbC5RdWFudGl0eSI7CgVBcnJheRISCgpkaW1lbnNpb25zGAEgAygDEh4KCGVsZW1lbnRzGAIgAygLMgwuc3lzbWwuVmFsdWUiKgoGVmVjdG9yEiAKCmNvbXBvbmVudHMYASADKAsyDC5zeXNtbC5WYWx1ZSI1Cg5WZWN0b3JRdWFudGl0eRIjCgpjb21wb25lbnRzGAEgAygLMg8uc3lzbWwuUXVhbnRpdHkiKgoHQ29tcGxleBIMCgRyZWFsGAEgASgBEhEKCWltYWdpbmFyeRgCIAEoASJkCgtFbnVtTGl0ZXJhbBISCgpsaXRlcmFsX2lkGAEgASgJEhYKDmVudW1lcmF0aW9uX2lkGAIgASgJEgwKBG5hbWUYAyABKAkSGwoFdmFsdWUYBCABKAsyDC5zeXNtbC5WYWx1ZSIvCg1WYWx1ZVNlcXVlbmNlEh4KCGVsZW1lbnRzGAEgAygLMgwuc3lzbWwuVmFsdWUifAoIUXVhbnRpdHkSFwoNaW50X21hZ25pdHVkZRgBIAEoA0gAEhgKDnJlYWxfbWFnbml0dWRlGAIgASgBSAASDAoEdW5pdBgDIAEoCRIiCgl1bml0X3Rlcm0YBCABKAsyDy5zeXNtbC5Vbml0VGVybUILCgltYWduaXR1ZGUiUwoOTWVhc3VyZW1lbnRSZWYSDAoEdW5pdBgBIAEoCRIiCgl1bml0X3Rlcm0YAiABKAsyDy5zeXNtbC5Vbml0VGVybRIPCgd1bml0X2lkGAMgASgJIlQKCFVuaXRUZXJtEhEKCXNjYWxlX251bRgBIAEoARIRCglzY2FsZV9kZW4YAiABKAESIgoHZmFjdG9ycxgDIAMoCzIRLnN5c21sLlVuaXRGYWN0b3IiLwoKVW5pdEZhY3RvchIPCgd1bml0X2lkGAEgASgJEhAKCGV4cG9uZW50GAIgASgBIlgKCkRpYWdub3N0aWMSEAoIc2V2ZXJpdHkYASABKAkSDwoHbWVzc2FnZRgCIAEoCRIZCgRzcGFuGAMgASgLMgsuc3lzbWwuU3BhbhIMCgRjb2RlGAQgASgJIl4KBFNwYW4SDAoEZmlsZRgBIAEoCRISCgpzdGFydF9saW5lGAIgASgFEhEKCXN0YXJ0X2NvbBgDIAEoBRIQCghlbmRfbGluZRgEIAEoBRIPCgdlbmRfY29sGAUgASgFIhMKEVNlcnZlckluZm9SZXF1ZXN0IjsKElNlcnZlckluZm9SZXNwb25zZRIPCgd2ZXJzaW9uGAEgASgJEhQKDGNhcGFiaWxpdGllcxgCIAMoCSJTCgxRdWVyeVJlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRIbCgVxdWVyeRgCIAEoCzIMLnN5c21sLlF1ZXJ5EhIKCm9zbGNfcXVlcnkYAyABKAkiPAoNUXVlcnlSZXNwb25zZRIrCghlbGVtZW50cxgBIAMoCzIZLnN5c21sLlF1ZXJ5UmVzdWx0RWxlbWVudCJICgVRdWVyeRINCgVzY29wZRgBIAMoCRIOCgZzZWxlY3QYAiADKAkSIAoFd2hlcmUYAyABKAsyES5zeXNtbC5Db25zdHJhaW50InwKCkNvbnN0cmFpbnQSLwoJcHJpbWl0aXZlGAEgASgLMhouc3lzbWwuUHJpbWl0aXZlQ29uc3RyYWludEgAEi8KCWNvbXBvc2l0ZRgCIAEoCzIaLnN5c21sLkNvbXBvc2l0ZUNvbnN0cmFpbnRIAEIMCgpjb25zdHJhaW50InMKE1ByaW1pdGl2ZUNvbnN0cmFpbnQSDwoHaW52ZXJzZRgBIAEoCBIQCghwcm9wZXJ0eRgCIAEoCRIqCghvcGVyYXRvchgDIAEoDjIYLnN5c21sLlByaW1pdGl2ZU9wZXJhdG9yEg0KBXZhbHVlGAQgAygJImgKE0NvbXBvc2l0ZUNvbnN0cmFpbnQSKgoIb3BlcmF0b3IYASABKA4yGC5zeXNtbC5Db21wb3NpdGVPcGVyYXRvchIlCgpjb25zdHJhaW50GAIgAygLMhEuc3lzbWwuQ29uc3RyYWludCKgAQoSUXVlcnlSZXN1bHRFbGVtZW50EgoKAmlkGAEgASgJEgwKBHR5cGUYAiABKAkSPQoKcHJvcGVydGllcxgDIAMoCzIpLnN5c21sLlF1ZXJ5UmVzdWx0RWxlbWVudC5Qcm9wZXJ0aWVzRW50cnkaMQoPUHJvcGVydGllc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEicwoKU3dlZXBSYW5nZRIRCglwYXJhbWV0ZXIYASABKAkSGwoFc3RhcnQYAiABKAsyDC5zeXNtbC5WYWx1ZRIZCgNlbmQYAyABKAsyDC5zeXNtbC5WYWx1ZRIaCgRzdGVwGAQgASgLMgwuc3lzbWwuVmFsdWUi0AIKD1J1blN3ZWVwUmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEhEKCXN5bWJvbF9pZBgCIAEoCRIZChFzdWJqZWN0X3N5bWJvbF9pZBgDIAEoCRIfCglhcmd1bWVudHMYBCADKAsyDC5zeXNtbC5WYWx1ZRJDCg9uYW1lZF9hcmd1bWVudHMYBSADKAsyKi5zeXNtbC5SdW5Td2VlcFJlcXVlc3QuTmFtZWRBcmd1bWVudHNFbnRyeRIhCgZyYW5nZXMYBiADKAsyES5zeXNtbC5Td2VlcFJhbmdlEg8KB3NhbXBsZXMYByABKAMSDAoEc2VlZBgIIAEoBBIOCgZlbmdpbmUYCSABKAkaQwoTTmFtZWRBcmd1bWVudHNFbnRyeRILCgNrZXkYASABKAkSGwoFdmFsdWUYAiABKAsyDC5zeXNtbC5WYWx1ZToCOAEi9AEKCFN3ZWVwUm93EiEKBmlucHV0cxgBIAMoCzIRLnN5c21sLkNhbGNPdXRwdXQSIgoHb3V0cHV0cxgCIAMoCzIRLnN5c21sLkNhbGNPdXRwdXQSIAoIdmVyZGljdHMYAyADKAsyDi5zeXNtbC5WZXJkaWN0EhYKDmVsYXBzZWRfbWljcm9zGAQgASgDEg0KBWVycm9yGAUgASgJEiwKDmZhaWx1cmVfcmVhc29uGAYgASgOMhQuc3lzbWwuRmFpbHVyZVJlYXNvbhIqCgtldmFsdWF0aW9ucxgHIAMoCzIVLnN5c21sLkNhc2VFdmFsdWF0aW9uIq0CChBSdW5Td2VlcFJlc3BvbnNlEh0KBHJvd3MYASADKAsyDy5zeXNtbC5Td2VlcFJvdxISCgpwYXJhbWV0ZXJzGAIgAygJEg8KB3NhbXBsZWQYAyABKAgSDAoEc2VlZBgEIAEoBBINCgVlcnJvchgFIAEoCRImCgtkaWFnbm9zdGljcxgGIAMoCzIRLnN5c21sLkRpYWdub3N0aWMSLAoOZmFpbHVyZV9yZWFzb24YByABKA4yFC5zeXNtbC5GYWlsdXJlUmVhc29uEiIKCWluc3RhbmNlcxgIIAMoCzIPLnN5c21sLkluc3RhbmNlEg4KBmVuZ2luZRgJIAEoCRIQCghzdHJlbmd0aBgKIAEoCRIcCgZib3VuZHMYCyADKAsyDC5zeXNtbC5Cb3VuZCJuChdSdW5Eb2N1bWVudFF1ZXJ5UmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEhAKCHF1ZXJ5X2lkGAIgASgJEi0KCGJpbmRpbmdzGAMgAygLMhsuc3lzbWwuRG9jdW1lbnRRdWVyeUJpbmRpbmciTwoURG9jdW1lbnRRdWVyeUJpbmRpbmcSEQoJcGFyYW1ldGVyGAEgASgJEiQKBnZhbHVlcxgCIAMoCzIULnN5c21sLkRvY3VtZW50VmFsdWUi9wIKDURvY3VtZW50VmFsdWUSFAoKZWxlbWVudF9pZBgBIAEoCUgAEhYKDHN0cmluZ192YWx1ZRgCIAEoCUgAEhMKCWludF92YWx1ZRgDIAEoA0gAEhQKCnJlYWxfdmFsdWUYBCABKAFIABIUCgpib29sX3ZhbHVlGAUgASgISAASEgoIaW5maW5pdHkYBiABKAhIABIjCghxdWFudGl0eRgIIAEoCzIPLnN5c21sLlF1YW50aXR5SAASKQoHdmVyZGljdBgJIAEoCzIWLnN5c21sLkRvY3VtZW50VmVyZGljdEgAEicKBm9iamVjdBgKIAEoCzIVLnN5c21sLkRvY3VtZW50T2JqZWN0SAASJQoFc3RhdGUYCyABKAsyFC5zeXNtbC5Eb2N1bWVudFN0YXRlSAASJQoFZXZlbnQYDCABKAsyFC5zeXNtbC5Eb2N1bWVudEV2ZW50SAASFAoMZWxlbWVudF90eXBlGAcgASgJQgYKBGtpbmQiWgoORG9jdW1lbnRPYmplY3QSEwoLaW5zdGFuY2VfaWQYASABKAMSDAoEcGF0aBgCIAEoCRIlCgdlbGVtZW50GAMgASgLMhQuc3lzbWwuRG9jdW1lbnRWYWx1ZSKuAQoPRG9jdW1lbnRWZXJkaWN0EicKCWFzc2VydGlvbhgBIAEoCzIULnN5c21sLkRvY3VtZW50VmFsdWUSDAoEa2luZBgCIAEoCRIMCgR0ZXh0GAMgASgJEgwKBHBhdGgYBCABKAkSDwoHdmVyZGljdBgFIAEoCRIRCgljb25kaXRpb24YBiABKAkSDgoGcmVhc29uGAcgASgJEhQKDHZlcmlmaWNhdGlvbhgIIAMoCSKxAQoNRG9jdW1lbnRTdGF0ZRIlCgZvYmplY3QYASABKAsyFS5zeXNtbC5Eb2N1bWVudE9iamVjdBIPCgdtYWNoaW5lGAIgASgJEgwKBG5hbWUYAyABKAkSEgoKc3RhdGVfcGF0aBgEIAEoCRIjCgVzdGF0ZRgFIAEoCzIULnN5c21sLkRvY3VtZW50VmFsdWUSDgoGcmVnaW9uGAYgASgJEhEKCWVuY2xvc2luZxgHIAMoCSKcAgoNRG9jdW1lbnRFdmVudBIMCgRraW5kGAEgASgJEiIKBHRpbWUYAiABKAsyFC5zeXNtbC5Eb2N1bWVudFZhbHVlEiUKBm9iamVjdBgDIAEoCzIVLnN5c21sLkRvY3VtZW50T2JqZWN0Eg8KB21hY2hpbmUYBCABKAkSDQoFc3RhdGUYBSABKAkSDAoEZnJvbRgGIAEoCRIKCgJ0bxgHIAEoCRIlCgZ0YXJnZXQYCCABKAsyFS5zeXNtbC5Eb2N1bWVudE9iamVjdBINCgVldmVudBgJIAEoCRIPCgdwYXlsb2FkGAogAygJEhQKDGFsdGVybmF0aXZlcxgLIAMoCRINCgV0YWtlbhgMIAEoCRIMCgR0ZXh0GA0gASgJIiMKE0RvY3VtZW50UXVlcnlDb2x1bW4SDAoEbmFtZRgBIAEoCSI5ChFEb2N1bWVudFF1ZXJ5Q2VsbBIkCgZ2YWx1ZXMYASADKAsyFC5zeXNtbC5Eb2N1bWVudFZhbHVlImIKEERvY3VtZW50UXVlcnlSb3cSJQoHZWxlbWVudBgBIAEoCzIULnN5c21sLkRvY3VtZW50VmFsdWUSJwoFY2VsbHMYAiADKAsyGC5zeXNtbC5Eb2N1bWVudFF1ZXJ5Q2VsbCJuChhSdW5Eb2N1bWVudFF1ZXJ5UmVzcG9uc2USKwoHY29sdW1ucxgBIAMoCzIaLnN5c21sLkRvY3VtZW50UXVlcnlDb2x1bW4SJQoEcm93cxgCIAMoCzIXLnN5c21sLkRvY3VtZW50UXVlcnlSb3ciTgoVUmVuZGVyRG9jdW1lbnRSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSEwoLZG9jdW1lbnRfaWQYAiABKAkSDAoEZm9ybRgDIAEoCSI4ChZSZW5kZXJEb2N1bWVudFJlc3BvbnNlEhAKCG1hcmtkb3duGAEgASgJEgwKBGh0bWwYAiABKAkqsQEKDUZhaWx1cmVSZWFzb24SHgoaRkFJTFVSRV9SRUFTT05fVU5TUEVDSUZJRUQQABIdChlGQUlMVVJFX1JFQVNPTl9FVkFMVUFUSU9OEAESHQoZRkFJTFVSRV9SRUFTT05fV1JPTkdfS0lORBACEiQKIEZBSUxVUkVfUkVBU09OX0FNQklHVU9VU19TVUJKRUNUEAMSHAoYRkFJTFVSRV9SRUFTT05fVU5ERUNJREVEEAQqjAUKC0VkaXRGYWlsdXJlEhwKGEVESVRfRkFJTFVSRV9VTlNQRUNJRklFRBAAEh4KGkVESVRfRkFJTFVSRV9OT19PUEVSQVRJT05TEAESHwobRURJVF9GQUlMVVJFX1VOS05PV05fVEFSR0VUEAISIQodRURJVF9GQUlMVVJFX0FNQklHVU9VU19UQVJHRVQQAxIbChdFRElUX0ZBSUxVUkVfTk9UX1ZBTFVFRBAEEh4KGkVESVRfRkFJTFVSRV9JTlZBTElEX1ZBTFVFEAUSHQoZRURJVF9GQUlMVVJFX0lOVkFMSURfTkFNRRAGEhoKFkVESVRfRkFJTFVSRV9OT1RfTkFNRUQQBxIiCh5FRElUX0ZBSUxVUkVfUkVOQU1FX1JFRkVSRU5DRUQQCBIiCh5FRElUX0ZBSUxVUkVfT1ZFUkxBUFBJTkdfRURJVFMQCRIfChtFRElUX0ZBSUxVUkVfUkVTVUxUX0lOVkFMSUQQChIeChpFRElUX0ZBSUxVUkVfT1dORVJfVU5LTk9XThALEiQKIEVESVRfRkFJTFVSRV9PV05FUl9OT1RfTkFNRVNQQUNFEAwSHQoZRURJVF9GQUlMVVJFX0lMTEVHQUxfS0lORBANEiIKHkVESVRfRkFJTFVSRV9NRU1CRVJfTkFNRV9UQUtFThAOEiIKHkVESVRfRkFJTFVSRV9ERUxFVEVfUkVGRVJFTkNFRBAPEiQKIEVESVRfRkFJTFVSRV9PV05FUl9JTlNJREVfVEFSR0VUEBASIAocRURJVF9GQUlMVVJFX01PVkVfUkVGRVJFTkNFRBAREiUKIUVESVRfRkFJTFVSRV9SRUZFUkVOQ0VEX0VMU0VXSEVSRRASKpIBChFQcmltaXRpdmVPcGVyYXRvchIiCh5QUklNSVRJVkVfT1BFUkFUT1JfVU5TUEVDSUZJRUQQABIcChhQUklNSVRJVkVfT1BFUkFUT1JfRVFVQUwQARIeChpQUklNSVRJVkVfT1BFUkFUT1JfR1JFQVRFUhACEhsKF1BSSU1JVElWRV9PUEVSQVRPUl9MRVNTEAMqbgoRQ29tcG9zaXRlT3BlcmF0b3ISIgoeQ09NUE9TSVRFX09QRVJBVE9SX1VOU1BFQ0lGSUVEEAASGgoWQ09NUE9TSVRFX09QRVJBVE9SX0FORBABEhkKFUNPTVBPU0lURV9PUEVSQVRPUl9PUhACMr8MCgxTeXNNTFNlcnZpY2USRAoNR2V0U2VydmVySW5mbxIYLnN5c21sLlNlcnZlckluZm9SZXF1ZXN0Ghkuc3lzbWwuU2VydmVySW5mb1Jlc3BvbnNlEj4KCVBhcnNlRmlsZRIXLnN5c21sLlBhcnNlRmlsZVJlcXVlc3QaGC5zeXNtbC5QYXJzZUZpbGVSZXNwb25zZRJHCgxQYXJzZVNvdXJjZXMSGi5zeXNtbC5QYXJzZVNvdXJjZXNSZXF1ZXN0Ghsuc3lzbWwuUGFyc2VTb3VyY2VzUmVzcG9uc2USOwoJR2V0U3ltYm9sEhcuc3lzbWwuR2V0U3ltYm9sUmVxdWVzdBoVLnN5c21sLlN5bWJvbFJlc3BvbnNlEkcKDkdldERpYWdub3N0aWNzEhkuc3lzbWwuRGlhZ25vc3RpY3NSZXF1ZXN0Ghouc3lzbWwuRGlhZ25vc3RpY3NSZXNwb25zZRI7CghFdmFsdWF0ZRIWLnN5c21sLkV2YWx1YXRlUmVxdWVzdBoXLnN5c21sLkV2YWx1YXRlUmVzcG9uc2USRAoLSW5zdGFudGlhdGUSGS5zeXNtbC5JbnN0YW50aWF0ZVJlcXVlc3QaGi5zeXNtbC5JbnN0YW50aWF0ZVJlc3BvbnNlEkoKDUV4ZWN1dGVBY3Rpb24SGy5zeXNtbC5FeGVjdXRlQWN0aW9uUmVxdWVzdBocLnN5c21sLkV4ZWN1dGVBY3Rpb25SZXNwb25zZRJHCgxFeGVjdXRlU3RhdGUSGi5zeXNtbC5FeGVjdXRlU3RhdGVSZXF1ZXN0Ghsuc3lzbWwuRXhlY3V0ZVN0YXRlUmVzcG9uc2USOAoHQ29udmVydBIVLnN5c21sLkNvbnZlcnRSZXF1ZXN0GhYuc3lzbWwuQ29udmVydFJlc3BvbnNlEkEKCkFwcGx5RWRpdHMSGC5zeXNtbC5BcHBseUVkaXRzUmVxdWVzdBoZLnN5c21sLkFwcGx5RWRpdHNSZXNwb25zZRJTChBWZXJpZnlDb25zdHJhaW50Eh4uc3lzbWwuVmVyaWZ5Q29uc3RyYWludFJlcXVlc3QaHy5zeXNtbC5WZXJpZnlDb25zdHJhaW50UmVzcG9uc2USVgoRVmVyaWZ5UmVxdWlyZW1lbnQSHy5zeXNtbC5WZXJpZnlSZXF1aXJlbWVudFJlcXVlc3QaIC5zeXNtbC5WZXJpZnlSZXF1aXJlbWVudFJlc3BvbnNlElkKElZlcmlmeVNhdGlzZmFjdGlvbhIgLnN5c21sLlZlcmlmeVNhdGlzZmFjdGlvblJlcXVlc3QaIS5zeXNtbC5WZXJpZnlTYXRpc2ZhY3Rpb25SZXNwb25zZRJTChBWYWxpZGF0ZUluc3RhbmNlEh4uc3lzbWwuVmFsaWRhdGVJbnN0YW5jZVJlcXVlc3QaHy5zeXNtbC5WYWxpZGF0ZUluc3RhbmNlUmVzcG9uc2USRwoMRXZhbHVhdGVDYWxjEhouc3lzbWwuRXZhbHVhdGVDYWxjUmVxdWVzdBobLnN5c21sLkV2YWx1YXRlQ2FsY1Jlc3BvbnNlEkQKC1J1bkFuYWx5c2lzEhkuc3lzbWwuUnVuQW5hbHlzaXNSZXF1ZXN0Ghouc3lzbWwuUnVuQW5hbHlzaXNSZXNwb25zZRI7CghSdW5Td2VlcBIWLnN5c21sLlJ1blN3ZWVwUmVxdWVzdBoXLnN5c21sLlJ1blN3ZWVwUmVzcG9uc2USRAoLTGlzdEVuZ2luZXMSGS5zeXNtbC5MaXN0RW5naW5lc1JlcXVlc3QaGi5zeXNtbC5MaXN0RW5naW5lc1Jlc3BvbnNlEjIKBVF1ZXJ5EhMuc3lzbWwuUXVlcnlSZXF1ZXN0GhQuc3lzbWwuUXVlcnlSZXNwb25zZRJTChBSdW5Eb2N1bWVudFF1ZXJ5Eh4uc3lzbWwuUnVuRG9jdW1lbnRRdWVyeVJlcXVlc3QaHy5zeXNtbC5SdW5Eb2N1bWVudFF1ZXJ5UmVzcG9uc2USTQoOUmVuZGVyRG9jdW1lbnQSHC5zeXNtbC5SZW5kZXJEb2N1bWVudFJlcXVlc3QaHS5zeXNtbC5SZW5kZXJEb2N1bWVudFJlc3BvbnNlQipaKGdpdGh1Yi5jb20vT3Blbi1NQkVFL09wZW5TeXNNTC9hcGkvcHJvdG9iBnByb3RvMw"); + fileDesc("CgtzeXNtbC5wcm90bxIFc3lzbWwihgMKB1ZlcmRpY3QSDAoEa2luZBgBIAEoCRISCgplbGVtZW50X2lkGAIgASgJEg8KB2VsZW1lbnQYAyABKAkSDQoFaG9sZHMYBCABKAgSEQoJY29uZGl0aW9uGAUgASgJEhMKC2luc3RhbmNlX2lkGAYgASgDEhgKEGluc3RhbmNlX3R5cGVfaWQYByABKAkSDQoFZXJyb3IYCCABKAkSLAoOZmFpbHVyZV9yZWFzb24YCSABKA4yFC5zeXNtbC5GYWlsdXJlUmVhc29uEhYKDnJlcXVpcmVtZW50X2lkGAogASgJEg4KBmVuZ2luZRgLIAEoCRIQCghzdHJlbmd0aBgMIAEoCRIcCgZib3VuZHMYDSADKAsyDC5zeXNtbC5Cb3VuZBIVCg1pbnN0YW5jZV9wYXRoGA4gASgJEhAKCHF1ZXN0aW9uGA8gASgJEg4KBnN0YXR1cxgQIAEoCRIpCgd3aXRuZXNzGBEgAygLMhguc3lzbWwuV2l0bmVzc0Fzc2lnbm1lbnQiXgoRV2l0bmVzc0Fzc2lnbm1lbnQSDwoHZmVhdHVyZRgBIAEoCRIbCgV2YWx1ZRgCIAEoCzIMLnN5c21sLlZhbHVlEgwKBHVuaXQYAyABKAkSDQoFZXhhY3QYBCABKAkiNQoFQm91bmQSDAoEbmFtZRgBIAEoCRINCgVsaW1pdBgCIAEoAxIPCgdyZWFjaGVkGAMgASgIIn0KF1ZlcmlmeUNvbnN0cmFpbnRSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSEQoJc3ltYm9sX2lkGAIgASgJEhkKEXN1YmplY3Rfc3ltYm9sX2lkGAMgASgJEg4KBmVuZ2luZRgEIAEoCRIQCghxdWVzdGlvbhgFIAEoCSKWAQoYVmVyaWZ5Q29uc3RyYWludFJlc3BvbnNlEh8KB3ZlcmRpY3QYASABKAsyDi5zeXNtbC5WZXJkaWN0EiIKCWluc3RhbmNlcxgCIAMoCzIPLnN5c21sLkluc3RhbmNlEg0KBWVycm9yGAMgASgJEiYKC2RpYWdub3N0aWNzGAQgAygLMhEuc3lzbWwuRGlhZ25vc3RpYyJ+ChhWZXJpZnlSZXF1aXJlbWVudFJlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRIRCglzeW1ib2xfaWQYAiABKAkSGQoRc3ViamVjdF9zeW1ib2xfaWQYAyABKAkSDgoGZW5naW5lGAQgASgJEhAKCHF1ZXN0aW9uGAUgASgJIm0KE1ZlcmlmaWNhdGlvblZlcmRpY3QSDwoHY2FzZV9pZBgBIAEoCRIMCgRraW5kGAIgASgJEg4KBmRldGFpbBgDIAEoCRIPCgdzdWJjYXNlGAQgASgIEhYKDnJlcXVpcmVtZW50X2lkGAUgASgJItIBChlWZXJpZnlSZXF1aXJlbWVudFJlc3BvbnNlEh8KB3ZlcmRpY3QYASABKAsyDi5zeXNtbC5WZXJkaWN0EiIKCWluc3RhbmNlcxgCIAMoCzIPLnN5c21sLkluc3RhbmNlEg0KBWVycm9yGAMgASgJEiYKC2RpYWdub3N0aWNzGAQgAygLMhEuc3lzbWwuRGlhZ25vc3RpYxI5ChV2ZXJpZmljYXRpb25fdmVyZGljdHMYBSADKAsyGi5zeXNtbC5WZXJpZmljYXRpb25WZXJkaWN0ImQKGVZlcmlmeVNhdGlzZmFjdGlvblJlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRIRCglzeW1ib2xfaWQYAiABKAkSDgoGZW5naW5lGAMgASgJEhAKCHF1ZXN0aW9uGAQgASgJIoICChpWZXJpZnlTYXRpc2ZhY3Rpb25SZXNwb25zZRIgCgh2ZXJkaWN0cxgBIAMoCzIOLnN5c21sLlZlcmRpY3QSIgoJaW5zdGFuY2VzGAIgAygLMg8uc3lzbWwuSW5zdGFuY2USDQoFZXJyb3IYAyABKAkSJgoLZGlhZ25vc3RpY3MYBCADKAsyES5zeXNtbC5EaWFnbm9zdGljEiwKDmZhaWx1cmVfcmVhc29uGAUgASgOMhQuc3lzbWwuRmFpbHVyZVJlYXNvbhI5ChV2ZXJpZmljYXRpb25fdmVyZGljdHMYBiADKAsyGi5zeXNtbC5WZXJpZmljYXRpb25WZXJkaWN0IlAKF1ZhbGlkYXRlSW5zdGFuY2VSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSEQoJc3ltYm9sX2lkGAIgASgJEg4KBmVuZ2luZRgDIAEoCSKyAgoYVmFsaWRhdGVJbnN0YW5jZVJlc3BvbnNlEiAKCHZlcmRpY3RzGAEgAygLMg4uc3lzbWwuVmVyZGljdBIfCgdzdW1tYXJ5GAIgASgLMg4uc3lzbWwuVmVyZGljdBIiCglpbnN0YW5jZXMYAyADKAsyDy5zeXNtbC5JbnN0YW5jZRINCgVlcnJvchgEIAEoCRImCgtkaWFnbm9zdGljcxgFIAMoCzIRLnN5c21sLkRpYWdub3N0aWMSLAoOZmFpbHVyZV9yZWFzb24YBiABKA4yFC5zeXNtbC5GYWlsdXJlUmVhc29uEjkKFXZlcmlmaWNhdGlvbl92ZXJkaWN0cxgHIAMoCzIaLnN5c21sLlZlcmlmaWNhdGlvblZlcmRpY3QSDwoHYm91bmRlZBgIIAEoCCJtChNFdmFsdWF0ZUNhbGNSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSEQoJc3ltYm9sX2lkGAIgASgJEh8KCWFyZ3VtZW50cxgDIAMoCzIMLnN5c21sLlZhbHVlEg4KBmVuZ2luZRgEIAEoCSL9AQoURXZhbHVhdGVDYWxjUmVzcG9uc2USHAoGcmVzdWx0GAEgASgLMgwuc3lzbWwuVmFsdWUSIgoHb3V0cHV0cxgCIAMoCzIRLnN5c21sLkNhbGNPdXRwdXQSDQoFZXJyb3IYAyABKAkSJgoLZGlhZ25vc3RpY3MYBCADKAsyES5zeXNtbC5EaWFnbm9zdGljEiwKDmZhaWx1cmVfcmVhc29uGAUgASgOMhQuc3lzbWwuRmFpbHVyZVJlYXNvbhIOCgZlbmdpbmUYBiABKAkSEAoIc3RyZW5ndGgYByABKAkSHAoGYm91bmRzGAggAygLMgwuc3lzbWwuQm91bmQiNwoKQ2FsY091dHB1dBIMCgRuYW1lGAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWUikwEKDkNhc2VFdmFsdWF0aW9uEhMKC2Z1bmN0aW9uX2lkGAEgASgJEh8KCWFyZ3VtZW50cxgCIAMoCzIMLnN5c21sLlZhbHVlEhwKBnJlc3VsdBgDIAEoCzIMLnN5c21sLlZhbHVlEg0KBWVycm9yGAQgASgJEhAKCHNlbGVjdGVkGAUgASgIEgwKBHRpZWQYBiABKAgipgIKElJ1bkFuYWx5c2lzUmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEhEKCXN5bWJvbF9pZBgCIAEoCRIZChFzdWJqZWN0X3N5bWJvbF9pZBgDIAEoCRIfCglhcmd1bWVudHMYBCADKAsyDC5zeXNtbC5WYWx1ZRJGCg9uYW1lZF9hcmd1bWVudHMYBSADKAsyLS5zeXNtbC5SdW5BbmFseXNpc1JlcXVlc3QuTmFtZWRBcmd1bWVudHNFbnRyeRIQCghzY2hlZHVsZRgGIAEoCRIOCgZlbmdpbmUYByABKAkaQwoTTmFtZWRBcmd1bWVudHNFbnRyeRILCgNrZXkYASABKAkSGwoFdmFsdWUYAiABKAsyDC5zeXNtbC5WYWx1ZToCOAEi3AMKE1J1bkFuYWx5c2lzUmVzcG9uc2USIgoHb3V0cHV0cxgBIAMoCzIRLnN5c21sLkNhbGNPdXRwdXQSIAoIdmVyZGljdHMYAiADKAsyDi5zeXNtbC5WZXJkaWN0EiIKCWluc3RhbmNlcxgDIAMoCzIPLnN5c21sLkluc3RhbmNlEg0KBWVycm9yGAQgASgJEiYKC2RpYWdub3N0aWNzGAUgAygLMhEuc3lzbWwuRGlhZ25vc3RpYxIsCg5mYWlsdXJlX3JlYXNvbhgGIAEoDjIULnN5c21sLkZhaWx1cmVSZWFzb24SOQoVdmVyaWZpY2F0aW9uX3ZlcmRpY3RzGAcgAygLMhouc3lzbWwuVmVyaWZpY2F0aW9uVmVyZGljdBIgCghvdXRjb21lcxgIIAMoCzIOLnN5c21sLk91dGNvbWUSLQoLZXhwbG9yYXRpb24YCSABKAsyGC5zeXNtbC5FeHBsb3JhdGlvblN0YXR1cxIqCgtldmFsdWF0aW9ucxgKIAMoCzIVLnN5c21sLkNhc2VFdmFsdWF0aW9uEg4KBmVuZ2luZRgLIAEoCRIQCghzdHJlbmd0aBgMIAEoCRIcCgZib3VuZHMYDSADKAsyDC5zeXNtbC5Cb3VuZCKXAgoHT3V0Y29tZRIsCgdvdXRwdXRzGAEgAygLMhsuc3lzbWwuT3V0Y29tZS5PdXRwdXRzRW50cnkSEwoLZmluYWxfc3RhdGUYAiABKAkSFgoOc3RhdGVzX3Zpc2l0ZWQYAyADKAkSDQoFZXJyb3IYBCABKAkSFgoObGluZWFyaXphdGlvbnMYBSABKAUSDwoHd2l0bmVzcxgGIAMoCRImCgtkaWFnbm9zdGljcxgHIAMoCzIRLnN5c21sLkRpYWdub3N0aWMSEwoLcHJvYmFiaWxpdHkYCCABKAEaPAoMT3V0cHV0c0VudHJ5EgsKA2tleRgBIAEoCRIbCgV2YWx1ZRgCIAEoCzIMLnN5c21sLlZhbHVlOgI4ASKWAQoRRXhwbG9yYXRpb25TdGF0dXMSEAoIY29tcGxldGUYASABKAgSDAoEcnVucxgCIAEoBRITCgtidWRnZXRzX2hpdBgDIAMoCRITCgtydW5zX2J1ZGdldBgEIAEoBRIUCgxkZXB0aF9idWRnZXQYBSABKAUSIQoZcHJvYmFiaWxpdGllc19sb3dlcl9ib3VuZBgGIAEoCCIUChJMaXN0RW5naW5lc1JlcXVlc3Qi/AEKCkVuZ2luZUluZm8SDAoEbmFtZRgBIAEoCRIRCglhdXRob3JpdHkYAiABKAkSDwoHYW5zd2VycxgDIAMoCRIOCgZib3VuZHMYBCADKAkSDwoHcHJvY2VzcxgFIAEoCRIVCg1wcm9jZXNzX2ZvdW5kGAYgASgJEg0KBXJlYWR5GAcgASgIEhMKC3VuYXZhaWxhYmxlGAggASgJEgwKBGtpbmQYCSABKAkSEAoIcHJvdG9jb2wYCiABKAkSDgoGc291cmNlGAsgASgJEg8KB2NvbW1hbmQYDCABKAkSDwoHdmVyc2lvbhgNIAEoCRIOCgZzZXJ2ZWQYDiABKAgiOQoTTGlzdEVuZ2luZXNSZXNwb25zZRIiCgdlbmdpbmVzGAEgAygLMhEuc3lzbWwuRW5naW5lSW5mbyKMAQoQUGFyc2VGaWxlUmVxdWVzdBITCglmaWxlX3BhdGgYASABKAlIABIRCgdjb250ZW50GAIgASgJSAASGAoMY29udGVudF9oYXNoGAMgASgJQgIYARIQCghsYW5ndWFnZRgEIAEoCRIaChJzdHJpY3RfY29uZm9ybWFuY2UYBSABKAhCCAoGc291cmNlImIKDlNvdXJjZURvY3VtZW50EhMKCWZpbGVfcGF0aBgBIAEoCUgAEhEKB2NvbnRlbnQYAiABKAlIABIQCghsYW5ndWFnZRgDIAEoCRIMCgRuYW1lGAQgASgJQggKBnNvdXJjZSJbChNQYXJzZVNvdXJjZXNSZXF1ZXN0EigKCWRvY3VtZW50cxgBIAMoCzIVLnN5c21sLlNvdXJjZURvY3VtZW50EhoKEnN0cmljdF9jb25mb3JtYW5jZRgCIAEoCCKDAQoUUGFyc2VTb3VyY2VzUmVzcG9uc2USEgoKbW9kZWxfaGFzaBgBIAEoCRIgCgVyb290cxgCIAMoCzIRLnN5c21sLlN5bWJvbEluZm8SJgoLZGlhZ25vc3RpY3MYAyADKAsyES5zeXNtbC5EaWFnbm9zdGljEg0KBWVycm9yGAQgASgJIn8KEVBhcnNlRmlsZVJlc3BvbnNlEhIKCm1vZGVsX2hhc2gYASABKAkSHwoEcm9vdBgCIAEoCzIRLnN5c21sLlN5bWJvbEluZm8SJgoLZGlhZ25vc3RpY3MYAyADKAsyES5zeXNtbC5EaWFnbm9zdGljEg0KBWVycm9yGAQgASgJIjkKEEdldFN5bWJvbFJlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRIRCglzeW1ib2xfaWQYAiABKAkiQgoOU3ltYm9sUmVzcG9uc2USIQoGc3ltYm9sGAEgASgLMhEuc3lzbWwuU3ltYm9sSW5mbxINCgVlcnJvchgCIAEoCSIoChJEaWFnbm9zdGljc1JlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCSJMChNEaWFnbm9zdGljc1Jlc3BvbnNlEiYKC2RpYWdub3N0aWNzGAEgAygLMhEuc3lzbWwuRGlhZ25vc3RpYxINCgVlcnJvchgCIAEoCSJvCg9FdmFsdWF0ZVJlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRISCgpleHByZXNzaW9uGAIgASgJEhkKEWNvbnRleHRfc3ltYm9sX2lkGAMgASgJEhkKEXN1YmplY3Rfc3ltYm9sX2lkGAQgASgJImcKEEV2YWx1YXRlUmVzcG9uc2USHAoGcmVzdWx0GAEgASgLMgwuc3lzbWwuVmFsdWUSDQoFZXJyb3IYAiABKAkSJgoLZGlhZ25vc3RpY3MYAyADKAsyES5zeXNtbC5EaWFnbm9zdGljIsIBCghJbnN0YW5jZRIKCgJpZBgBIAEoAxIWCg50eXBlX3N5bWJvbF9pZBgCIAEoCRI6Cg5mZWF0dXJlX3ZhbHVlcxgEIAMoCzIiLnN5c21sLkluc3RhbmNlLkZlYXR1cmVWYWx1ZXNFbnRyeRpJChJGZWF0dXJlVmFsdWVzRW50cnkSCwoDa2V5GAEgASgJEiIKBXZhbHVlGAIgASgLMhMuc3lzbWwuRmVhdHVyZVZhbHVlOgI4AUoECAMQBFIFc2xvdHMihAEKDEZlYXR1cmVWYWx1ZRIUCgxmZWF0dXJlX25hbWUYASABKAkSGwoFdmFsdWUYAiABKAsyDC5zeXNtbC5WYWx1ZRIcCgZ2YWx1ZXMYAyADKAsyDC5zeXNtbC5WYWx1ZRIUCgxtYXRlcmlhbGl6ZWQYBCABKAgSDQoFZXJyb3IYBSABKAkiOwoSSW5zdGFudGlhdGVSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSEQoJc3ltYm9sX2lkGAIgASgJIpMBChNJbnN0YW50aWF0ZVJlc3BvbnNlEiEKCGluc3RhbmNlGAEgASgLMg8uc3lzbWwuSW5zdGFuY2USDQoFZXJyb3IYAiABKAkSJgoLZGlhZ25vc3RpY3MYAyADKAsyES5zeXNtbC5EaWFnbm9zdGljEiIKCWluc3RhbmNlcxgEIAMoCzIPLnN5c21sLkluc3RhbmNlIukBChRFeGVjdXRlQWN0aW9uUmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEhgKEGFjdGlvbl9zeW1ib2xfaWQYAiABKAkSNwoGaW5wdXRzGAMgAygLMicuc3lzbWwuRXhlY3V0ZUFjdGlvblJlcXVlc3QuSW5wdXRzRW50cnkSEAoIc2NoZWR1bGUYBCABKAkSGwoTcGVyZm9ybWVyX3N5bWJvbF9pZBgFIAEoCRo7CgtJbnB1dHNFbnRyeRILCgNrZXkYASABKAkSGwoFdmFsdWUYAiABKAsyDC5zeXNtbC5WYWx1ZToCOAEizAMKFUV4ZWN1dGVBY3Rpb25SZXNwb25zZRI6CgdvdXRwdXRzGAEgAygLMikuc3lzbWwuRXhlY3V0ZUFjdGlvblJlc3BvbnNlLk91dHB1dHNFbnRyeRINCgVlcnJvchgCIAEoCRImCgtkaWFnbm9zdGljcxgDIAMoCzIRLnN5c21sLkRpYWdub3N0aWMSIAoIb3V0Y29tZXMYBCADKAsyDi5zeXNtbC5PdXRjb21lEi0KC2V4cGxvcmF0aW9uGAUgASgLMhguc3lzbWwuRXhwbG9yYXRpb25TdGF0dXMSEgoKZmluYWxfdGltZRgGIAEoARJTChRwZXJmb3JtZXJfYXR0cmlidXRlcxgHIAMoCzI1LnN5c21sLkV4ZWN1dGVBY3Rpb25SZXNwb25zZS5QZXJmb3JtZXJBdHRyaWJ1dGVzRW50cnkaPAoMT3V0cHV0c0VudHJ5EgsKA2tleRgBIAEoCRIbCgV2YWx1ZRgCIAEoCzIMLnN5c21sLlZhbHVlOgI4ARpIChhQZXJmb3JtZXJBdHRyaWJ1dGVzRW50cnkSCwoDa2V5GAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWU6AjgBIokBChNFeGVjdXRlU3RhdGVSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSHwoXc3RhdGVfbWFjaGluZV9zeW1ib2xfaWQYAiABKAkSDgoGZXZlbnRzGAMgAygJEhAKCHNjaGVkdWxlGAQgASgJEhsKE3BlcmZvcm1lcl9zeW1ib2xfaWQYBSABKAki0wIKFEV4ZWN1dGVTdGF0ZVJlc3BvbnNlEhYKDnN0YXRlc192aXNpdGVkGAEgAygJEkQKDWZpbmFsX2NvbnRleHQYAiADKAsyLS5zeXNtbC5FeGVjdXRlU3RhdGVSZXNwb25zZS5GaW5hbENvbnRleHRFbnRyeRINCgVlcnJvchgDIAEoCRImCgtkaWFnbm9zdGljcxgEIAMoCzIRLnN5c21sLkRpYWdub3N0aWMSIAoIb3V0Y29tZXMYBSADKAsyDi5zeXNtbC5PdXRjb21lEi0KC2V4cGxvcmF0aW9uGAYgASgLMhguc3lzbWwuRXhwbG9yYXRpb25TdGF0dXMSEgoKZmluYWxfdGltZRgHIAEoARpBChFGaW5hbENvbnRleHRFbnRyeRILCgNrZXkYASABKAkSGwoFdmFsdWUYAiABKAsyDC5zeXNtbC5WYWx1ZToCOAEisQEKDkNvbnZlcnRSZXF1ZXN0EhMKCWZpbGVfcGF0aBgBIAEoCUgAEhEKB2NvbnRlbnQYAiABKAlIABIUCgptb2RlbF9oYXNoGAYgASgJSAASEwoLZnJvbV9mb3JtYXQYAyABKAkSEQoJdG9fZm9ybWF0GAQgASgJEh4KFnRvbGVyYXRlX3N5bnRheF9lcnJvcnMYBSABKAgSDwoHaWRfZm9ybRgHIAEoCUIICgZzb3VyY2UitAEKD0NvbnZlcnRSZXNwb25zZRIPCgdjb250ZW50GAEgASgJEhMKC2Zyb21fZm9ybWF0GAIgASgJEhEKCXRvX2Zvcm1hdBgDIAEoCRINCgVlcnJvchgEIAEoCRImCgtkaWFnbm9zdGljcxgFIAMoCzIRLnN5c21sLkRpYWdub3N0aWMSFAoMZXhwZXJpbWVudGFsGAYgASgIEhsKE2V4cGVyaW1lbnRhbF9ub3RpY2UYByABKAkifQoRQXBwbHlFZGl0c1JlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRIoCgpvcGVyYXRpb25zGAIgAygLMhQuc3lzbWwuRWRpdE9wZXJhdGlvbhIQCghkb2N1bWVudBgDIAEoCRIYChBhY2NlcHRfZG9jdW1lbnRzGAQgASgIIsMGCg1FZGl0T3BlcmF0aW9uEigKCXNldF92YWx1ZRgBIAEoCzITLnN5c21sLlNldFZhbHVlRWRpdEgAEiMKBnJlbmFtZRgCIAEoCzIRLnN5c21sLlJlbmFtZUVkaXRIABIqCgphZGRfbWVtYmVyGAMgASgLMhQuc3lzbWwuQWRkTWVtYmVyRWRpdEgAEiMKBmRlbGV0ZRgEIAEoCzIRLnN5c21sLkRlbGV0ZUVkaXRIABIfCgRtb3ZlGAUgASgLMg8uc3lzbWwuTW92ZUVkaXRIABIyCg5hZGRfY29ubmVjdGlvbhgGIAEoCzIYLnN5c21sLkFkZENvbm5lY3Rpb25FZGl0SAASLAoLYWRkX3NhdGlzZnkYByABKAsyFS5zeXNtbC5BZGRTYXRpc2Z5RWRpdEgAEkkKGmFkZF9yZXF1aXJlbWVudF9jb25zdHJhaW50GAggASgLMiMuc3lzbWwuQWRkUmVxdWlyZW1lbnRDb25zdHJhaW50RWRpdEgAEjIKDmFkZF90cmFuc2l0aW9uGAkgASgLMhguc3lzbWwuQWRkVHJhbnNpdGlvbkVkaXRIABIqCgphZGRfaW1wb3J0GAogASgLMhQuc3lzbWwuQWRkSW1wb3J0RWRpdEgAEjgKEWFkZF9kb2N1bWVudGF0aW9uGAsgASgLMhsuc3lzbWwuQWRkRG9jdW1lbnRhdGlvbkVkaXRIABIqCgphZGRfdmVyaWZ5GAwgASgLMhQuc3lzbWwuQWRkVmVyaWZ5RWRpdEgAEi4KDGFkZF9tZXRhZGF0YRgNIAEoCzIWLnN5c21sLkFkZE1ldGFkYXRhRWRpdEgAEi4KDGFkZF9zZXF1ZW5jZRgOIAEoCzIWLnN5c21sLkFkZFNlcXVlbmNlRWRpdEgAEjsKE2FkZF9tZXRhZGF0YV9wcmVmaXgYDyABKAsyHC5zeXNtbC5BZGRNZXRhZGF0YVByZWZpeEVkaXRIABIsCgthZGRfY29tbWVudBgQIAEoCzIVLnN5c21sLkFkZENvbW1lbnRFZGl0SAASJgoIYWRkX25vdGUYEiABKAsyEi5zeXNtbC5BZGROb3RlRWRpdEgAQgsKCW9wZXJhdGlvbiKSAgoNQWRkTWVtYmVyRWRpdBINCgVvd25lchgBIAEoCRIMCgRraW5kGAIgASgJEgwKBG5hbWUYAyABKAkSDAoEdHlwZRgEIAEoCRIUCgxtdWx0aXBsaWNpdHkYBSABKAkSDQoFdmFsdWUYBiABKAkSEwoLc3BlY2lhbGl6ZXMYByADKAkSEwoLaXNfYWJzdHJhY3QYCCABKAgSEQoJcmVkZWZpbmVzGAkgAygJEhIKCmlzX2RlZmF1bHQYCiABKAgSEQoJZGlyZWN0aW9uGAsgASgJEhkKEW1ldGFkYXRhX3ByZWZpeGVzGA4gAygJEgsKA2RvYxgMIAEoCRIXCg9ib2R5X2V4cHJlc3Npb24YDSABKAkieQoOQWRkU2F0aXNmeUVkaXQSDQoFb3duZXIYASABKAkSEwoLcmVxdWlyZW1lbnQYAiABKAkSGgoSc2F0aXNmeWluZ19mZWF0dXJlGAMgASgJEhMKC2lzX2Fzc2VydGVkGAQgASgIEhIKCmlzX25lZ2F0ZWQYBSABKAgiXQocQWRkUmVxdWlyZW1lbnRDb25zdHJhaW50RWRpdBINCgVvd25lchgBIAEoCRIMCgRraW5kGAIgASgJEhIKCmV4cHJlc3Npb24YAyABKAkSDAoEbmFtZRgEIAEoCSKRAQoRQWRkVHJhbnNpdGlvbkVkaXQSDQoFb3duZXIYASABKAkSDAoEbmFtZRgCIAEoCRIOCgZzb3VyY2UYAyABKAkSDgoGdGFyZ2V0GAQgASgJEg8KB3RyaWdnZXIYBSABKAkSDQoFZ3VhcmQYBiABKAkSDgoGZWZmZWN0GAcgASgJEg8KB2luaXRpYWwYCCABKAgiMwoNQWRkVmVyaWZ5RWRpdBINCgVvd25lchgBIAEoCRITCgtyZXF1aXJlbWVudBgCIAEoCSI2ChRNZXRhZGF0YUZlYXR1cmVWYWx1ZRIPCgdmZWF0dXJlGAEgASgJEg0KBXZhbHVlGAIgASgJIpQBCg9BZGRNZXRhZGF0YUVkaXQSDQoFb3duZXIYASABKAkSFQoNbWV0YWRhdGFfdHlwZRgCIAEoCRIMCgRuYW1lGAMgASgJEg0KBWFib3V0GAQgAygJEisKBnZhbHVlcxgFIAMoCzIbLnN5c21sLk1ldGFkYXRhRmVhdHVyZVZhbHVlEhEKCXNob3J0aGFuZBgGIAEoCCI+ChVBZGRNZXRhZGF0YVByZWZpeEVkaXQSDgoGdGFyZ2V0GAEgASgJEhUKDW1ldGFkYXRhX3R5cGUYAiABKAkigAEKDUFkZEltcG9ydEVkaXQSDQoFb3duZXIYASABKAkSEgoKdmlzaWJpbGl0eRgCIAEoCRIOCgZ0YXJnZXQYAyABKAkSFAoMaXNfcmVjdXJzaXZlGAQgASgIEhUKDWlzX2ltcG9ydF9hbGwYBSABKAgSDwoHZmlsdGVycxgGIAMoCSJjChRBZGREb2N1bWVudGF0aW9uRWRpdBIOCgZ0YXJnZXQYASABKAkSDAoEYm9keRgCIAEoCRIMCgRuYW1lGAMgASgJEg4KBmxvY2FsZRgEIAEoCRIPCgdyZXBsYWNlGAUgASgIIloKDkFkZENvbW1lbnRFZGl0Eg0KBW93bmVyGAEgASgJEgwKBGJvZHkYAiABKAkSDAoEbmFtZRgDIAEoCRINCgVhYm91dBgEIAMoCRIOCgZsb2NhbGUYBSABKAkiKwoLQWRkTm90ZUVkaXQSDgoGdGFyZ2V0GAEgASgJEgwKBHRleHQYAiABKAkizQIKD0FkZFNlcXVlbmNlRWRpdBINCgVvd25lchgBIAEoCRIPCgdrZXl3b3JkGAIgASgJEgsKA3JlZhgDIAEoCRITCgttZW1iZXJfa2luZBgEIAEoCRITCgttZW1iZXJfbmFtZRgFIAEoCRIMCgR0eXBlGAYgASgJEg0KBWFmdGVyGAcgASgJEhEKCWNvbmRpdGlvbhgIIAEoCRINCgV2YWx1ZRgJIAEoCRIOCgZ0YXJnZXQYCiABKAkSCwoDdmlhGAsgASgJEg0KBXVudGlsGAwgASgJEiQKBGJvZHkYDSADKAsyFi5zeXNtbC5BZGRTZXF1ZW5jZUVkaXQSKQoJZWxzZV9ib2R5GA4gAygLMhYuc3lzbWwuQWRkU2VxdWVuY2VFZGl0EhQKDG11bHRpcGxpY2l0eRgPIAEoCRIRCglwYXJhbWV0ZXIYECABKAkibgoRQWRkQ29ubmVjdGlvbkVkaXQSDQoFb3duZXIYASABKAkSDAoEa2luZBgCIAEoCRIQCghmcm9tX2VuZBgDIAEoCRIOCgZ0b19lbmQYBCABKAkSDAoEbmFtZRgFIAEoCRIMCgR0eXBlGAYgASgJIi0KCkRlbGV0ZUVkaXQSDgoGdGFyZ2V0GAEgASgJEg8KB2Nhc2NhZGUYAiABKAgiKQoITW92ZUVkaXQSDgoGdGFyZ2V0GAEgASgJEg0KBW93bmVyGAIgASgJIi0KDFNldFZhbHVlRWRpdBIOCgZ0YXJnZXQYASABKAkSDQoFdmFsdWUYAiABKAkiLgoKUmVuYW1lRWRpdBIOCgZ0YXJnZXQYASABKAkSEAoIbmV3X25hbWUYAiABKAkikAIKEkFwcGx5RWRpdHNSZXNwb25zZRIPCgdjb250ZW50GAEgASgJEiMKB2FwcGxpZWQYAiADKAsyEi5zeXNtbC5BcHBsaWVkRWRpdBINCgVlcnJvchgDIAEoCRIjCgdmYWlsdXJlGAQgASgOMhIuc3lzbWwuRWRpdEZhaWx1cmUSJgoLZGlhZ25vc3RpY3MYBSADKAsyES5zeXNtbC5EaWFnbm9zdGljEhoKEnJlZmVycmluZ19lbGVtZW50cxgGIAMoCRIoCglkb2N1bWVudHMYByADKAsyFS5zeXNtbC5FZGl0ZWREb2N1bWVudBIiCglyZWZlcnJlcnMYCCADKAsyDy5zeXNtbC5SZWZlcnJlciIvCg5FZGl0ZWREb2N1bWVudBIMCgRuYW1lGAEgASgJEg8KB2NvbnRlbnQYAiABKAkiKgoIUmVmZXJyZXISDAoEbmFtZRgBIAEoCRIQCghkb2N1bWVudBgCIAEoCSKMAQoLQXBwbGllZEVkaXQSFwoPb3BlcmF0aW9uX2luZGV4GAEgASgFEg4KBnRhcmdldBgCIAEoCRIOCgZvZmZzZXQYAyABKAUSDgoGbGVuZ3RoGAQgASgFEhAKCG9sZF90ZXh0GAUgASgJEhAKCG5ld190ZXh0GAYgASgJEhAKCGRvY3VtZW50GAcgASgJIv0CCgpTeW1ib2xJbmZvEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSDAoEa2luZBgDIAEoCRIxCghtZXRhZGF0YRgEIAMoCzIfLnN5c21sLlN5bWJvbEluZm8uTWV0YWRhdGFFbnRyeRIRCgljaGlsZF9pZHMYBSADKAkSKAoKYXR0cmlidXRlcxgGIAMoCzIULnN5c21sLkF0dHJpYnV0ZUluZm8SIgoJdHlwZV9pbmZvGAcgASgLMg8uc3lzbWwuVHlwZUluZm8SLQoMbXVsdGlwbGljaXR5GAggASgLMhcuc3lzbWwuTXVsdGlwbGljaXR5SW5mbxIuCg9zcGVjaWFsaXphdGlvbnMYCSADKAsyFS5zeXNtbC5TcGVjaWFsaXphdGlvbhIjCht3aXRoaGVsZF9saWJyYXJ5X2F0dHJpYnV0ZXMYCiABKAUaLwoNTWV0YWRhdGFFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIlgKDlNwZWNpYWxpemF0aW9uEgwKBGtpbmQYASABKAkSEAoIZGVjbGFyZWQYAiABKAkSEQoJdGFyZ2V0X2lkGAMgASgJEhMKC3RhcmdldF9raW5kGAQgASgJIpUBCghUeXBlSW5mbxIQCghkZWNsYXJlZBgBIAEoCRITCgtyZXNvbHZlZF9pZBgCIAEoCRIVCg1yZXNvbHZlZF9raW5kGAMgASgJEhEKCXByaW1pdGl2ZRgEIAEoCRIYChBwcmltaXRpdmVfc291cmNlGAUgASgJEhAKCHF1YW50aXR5GAYgASgIEgwKBHVuaXQYByABKAkiMAoQTXVsdGlwbGljaXR5SW5mbxINCgVsb3dlchgBIAEoCRINCgV1cHBlchgCIAEoCSJWCg1BdHRyaWJ1dGVJbmZvEgwKBG5hbWUYASABKAkSDAoEdHlwZRgCIAEoCRIbCgV2YWx1ZRgDIAEoCzIMLnN5c21sLlZhbHVlEgwKBHVuaXQYBCABKAkiwwUKBVZhbHVlEhMKCWludF92YWx1ZRgBIAEoA0gAEhQKCnJlYWxfdmFsdWUYAiABKAFIABIUCgpib29sX3ZhbHVlGAMgASgISAASFgoMc3RyaW5nX3ZhbHVlGAQgASgJSAASFQoLaW5zdGFuY2VfaWQYBSABKANIABIoCghzZXF1ZW5jZRgGIAEoCzIULnN5c21sLlZhbHVlU2VxdWVuY2VIABIOCgRudWxsGAcgASgJSAASIwoIcXVhbnRpdHkYCCABKAsyDy5zeXNtbC5RdWFudGl0eUgAEioKDGVudW1fbGl0ZXJhbBgJIAEoCzISLnN5c21sLkVudW1MaXRlcmFsSAASDwoFdW5zZXQYCiABKAhIABIhCgdjb21wbGV4GAsgASgLMg4uc3lzbWwuQ29tcGxleEgAEh0KBWFycmF5GAwgASgLMgwuc3lzbWwuQXJyYXlIABIfCgZ2ZWN0b3IYDSABKAsyDS5zeXNtbC5WZWN0b3JIABIwCg92ZWN0b3JfcXVhbnRpdHkYDiABKAsyFS5zeXNtbC5WZWN0b3JRdWFudGl0eUgAEjAKD21lYXN1cmVtZW50X3JlZhgPIAEoCzIVLnN5c21sLk1lYXN1cmVtZW50UmVmSAASEgoIaW5maW5pdHkYECABKAhIABIjCghmdW5jdGlvbhgRIAEoCzIPLnN5c21sLkZ1bmN0aW9uSAASHgoDc2V0GBIgASgLMg8uc3lzbWwuVmFsdWVTZXRIABIwCg90ZW5zb3JfcXVhbnRpdHkYEyABKAsyFS5zeXNtbC5UZW5zb3JRdWFudGl0eUgAEicKCm1ldGFvYmplY3QYFCABKAsyES5zeXNtbC5NZXRhb2JqZWN0SAASKwoMdW5kZXRlcm1pbmVkGBUgASgLMhMuc3lzbWwuVW5kZXRlcm1pbmVkSABCBgoEa2luZCI2CgpNZXRhb2JqZWN0EhIKCmVsZW1lbnRfaWQYASABKAkSFAoMbWV0YWNsYXNzX2lkGAIgASgJIkYKDFVuZGV0ZXJtaW5lZBIOCgZyZWFzb24YASABKAkSJgoFY291bnQYAiABKAsyFy5zeXNtbC5NdWx0aXBsaWNpdHlJbmZvIiwKCEZ1bmN0aW9uEg8KB2NhbGNfaWQYASABKAkSDwoHc2VsZl9pZBgCIAEoAyIqCghWYWx1ZVNldBIeCghlbGVtZW50cxgBIAMoCzIMLnN5c21sLlZhbHVlIkkKDlRlbnNvclF1YW50aXR5EhIKCmRpbWVuc2lvbnMYASADKAMSIwoKY29tcG9uZW50cxgCIAMoCzIPLnN5c21sLlF1YW50aXR5IjsKBUFycmF5EhIKCmRpbWVuc2lvbnMYASADKAMSHgoIZWxlbWVudHMYAiADKAsyDC5zeXNtbC5WYWx1ZSIqCgZWZWN0b3ISIAoKY29tcG9uZW50cxgBIAMoCzIMLnN5c21sLlZhbHVlIjUKDlZlY3RvclF1YW50aXR5EiMKCmNvbXBvbmVudHMYASADKAsyDy5zeXNtbC5RdWFudGl0eSIqCgdDb21wbGV4EgwKBHJlYWwYASABKAESEQoJaW1hZ2luYXJ5GAIgASgBImQKC0VudW1MaXRlcmFsEhIKCmxpdGVyYWxfaWQYASABKAkSFgoOZW51bWVyYXRpb25faWQYAiABKAkSDAoEbmFtZRgDIAEoCRIbCgV2YWx1ZRgEIAEoCzIMLnN5c21sLlZhbHVlIi8KDVZhbHVlU2VxdWVuY2USHgoIZWxlbWVudHMYASADKAsyDC5zeXNtbC5WYWx1ZSJ8CghRdWFudGl0eRIXCg1pbnRfbWFnbml0dWRlGAEgASgDSAASGAoOcmVhbF9tYWduaXR1ZGUYAiABKAFIABIMCgR1bml0GAMgASgJEiIKCXVuaXRfdGVybRgEIAEoCzIPLnN5c21sLlVuaXRUZXJtQgsKCW1hZ25pdHVkZSJTCg5NZWFzdXJlbWVudFJlZhIMCgR1bml0GAEgASgJEiIKCXVuaXRfdGVybRgCIAEoCzIPLnN5c21sLlVuaXRUZXJtEg8KB3VuaXRfaWQYAyABKAkiVAoIVW5pdFRlcm0SEQoJc2NhbGVfbnVtGAEgASgBEhEKCXNjYWxlX2RlbhgCIAEoARIiCgdmYWN0b3JzGAMgAygLMhEuc3lzbWwuVW5pdEZhY3RvciIvCgpVbml0RmFjdG9yEg8KB3VuaXRfaWQYASABKAkSEAoIZXhwb25lbnQYAiABKAEiWAoKRGlhZ25vc3RpYxIQCghzZXZlcml0eRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJEhkKBHNwYW4YAyABKAsyCy5zeXNtbC5TcGFuEgwKBGNvZGUYBCABKAkiXgoEU3BhbhIMCgRmaWxlGAEgASgJEhIKCnN0YXJ0X2xpbmUYAiABKAUSEQoJc3RhcnRfY29sGAMgASgFEhAKCGVuZF9saW5lGAQgASgFEg8KB2VuZF9jb2wYBSABKAUiEwoRU2VydmVySW5mb1JlcXVlc3QiOwoSU2VydmVySW5mb1Jlc3BvbnNlEg8KB3ZlcnNpb24YASABKAkSFAoMY2FwYWJpbGl0aWVzGAIgAygJIlMKDFF1ZXJ5UmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEhsKBXF1ZXJ5GAIgASgLMgwuc3lzbWwuUXVlcnkSEgoKb3NsY19xdWVyeRgDIAEoCSI8Cg1RdWVyeVJlc3BvbnNlEisKCGVsZW1lbnRzGAEgAygLMhkuc3lzbWwuUXVlcnlSZXN1bHRFbGVtZW50IkgKBVF1ZXJ5Eg0KBXNjb3BlGAEgAygJEg4KBnNlbGVjdBgCIAMoCRIgCgV3aGVyZRgDIAEoCzIRLnN5c21sLkNvbnN0cmFpbnQifAoKQ29uc3RyYWludBIvCglwcmltaXRpdmUYASABKAsyGi5zeXNtbC5QcmltaXRpdmVDb25zdHJhaW50SAASLwoJY29tcG9zaXRlGAIgASgLMhouc3lzbWwuQ29tcG9zaXRlQ29uc3RyYWludEgAQgwKCmNvbnN0cmFpbnQicwoTUHJpbWl0aXZlQ29uc3RyYWludBIPCgdpbnZlcnNlGAEgASgIEhAKCHByb3BlcnR5GAIgASgJEioKCG9wZXJhdG9yGAMgASgOMhguc3lzbWwuUHJpbWl0aXZlT3BlcmF0b3ISDQoFdmFsdWUYBCADKAkiaAoTQ29tcG9zaXRlQ29uc3RyYWludBIqCghvcGVyYXRvchgBIAEoDjIYLnN5c21sLkNvbXBvc2l0ZU9wZXJhdG9yEiUKCmNvbnN0cmFpbnQYAiADKAsyES5zeXNtbC5Db25zdHJhaW50IqABChJRdWVyeVJlc3VsdEVsZW1lbnQSCgoCaWQYASABKAkSDAoEdHlwZRgCIAEoCRI9Cgpwcm9wZXJ0aWVzGAMgAygLMikuc3lzbWwuUXVlcnlSZXN1bHRFbGVtZW50LlByb3BlcnRpZXNFbnRyeRoxCg9Qcm9wZXJ0aWVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASJzCgpTd2VlcFJhbmdlEhEKCXBhcmFtZXRlchgBIAEoCRIbCgVzdGFydBgCIAEoCzIMLnN5c21sLlZhbHVlEhkKA2VuZBgDIAEoCzIMLnN5c21sLlZhbHVlEhoKBHN0ZXAYBCABKAsyDC5zeXNtbC5WYWx1ZSLQAgoPUnVuU3dlZXBSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSEQoJc3ltYm9sX2lkGAIgASgJEhkKEXN1YmplY3Rfc3ltYm9sX2lkGAMgASgJEh8KCWFyZ3VtZW50cxgEIAMoCzIMLnN5c21sLlZhbHVlEkMKD25hbWVkX2FyZ3VtZW50cxgFIAMoCzIqLnN5c21sLlJ1blN3ZWVwUmVxdWVzdC5OYW1lZEFyZ3VtZW50c0VudHJ5EiEKBnJhbmdlcxgGIAMoCzIRLnN5c21sLlN3ZWVwUmFuZ2USDwoHc2FtcGxlcxgHIAEoAxIMCgRzZWVkGAggASgEEg4KBmVuZ2luZRgJIAEoCRpDChNOYW1lZEFyZ3VtZW50c0VudHJ5EgsKA2tleRgBIAEoCRIbCgV2YWx1ZRgCIAEoCzIMLnN5c21sLlZhbHVlOgI4ASL0AQoIU3dlZXBSb3cSIQoGaW5wdXRzGAEgAygLMhEuc3lzbWwuQ2FsY091dHB1dBIiCgdvdXRwdXRzGAIgAygLMhEuc3lzbWwuQ2FsY091dHB1dBIgCgh2ZXJkaWN0cxgDIAMoCzIOLnN5c21sLlZlcmRpY3QSFgoOZWxhcHNlZF9taWNyb3MYBCABKAMSDQoFZXJyb3IYBSABKAkSLAoOZmFpbHVyZV9yZWFzb24YBiABKA4yFC5zeXNtbC5GYWlsdXJlUmVhc29uEioKC2V2YWx1YXRpb25zGAcgAygLMhUuc3lzbWwuQ2FzZUV2YWx1YXRpb24irQIKEFJ1blN3ZWVwUmVzcG9uc2USHQoEcm93cxgBIAMoCzIPLnN5c21sLlN3ZWVwUm93EhIKCnBhcmFtZXRlcnMYAiADKAkSDwoHc2FtcGxlZBgDIAEoCBIMCgRzZWVkGAQgASgEEg0KBWVycm9yGAUgASgJEiYKC2RpYWdub3N0aWNzGAYgAygLMhEuc3lzbWwuRGlhZ25vc3RpYxIsCg5mYWlsdXJlX3JlYXNvbhgHIAEoDjIULnN5c21sLkZhaWx1cmVSZWFzb24SIgoJaW5zdGFuY2VzGAggAygLMg8uc3lzbWwuSW5zdGFuY2USDgoGZW5naW5lGAkgASgJEhAKCHN0cmVuZ3RoGAogASgJEhwKBmJvdW5kcxgLIAMoCzIMLnN5c21sLkJvdW5kIm4KF1J1bkRvY3VtZW50UXVlcnlSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSEAoIcXVlcnlfaWQYAiABKAkSLQoIYmluZGluZ3MYAyADKAsyGy5zeXNtbC5Eb2N1bWVudFF1ZXJ5QmluZGluZyJPChREb2N1bWVudFF1ZXJ5QmluZGluZxIRCglwYXJhbWV0ZXIYASABKAkSJAoGdmFsdWVzGAIgAygLMhQuc3lzbWwuRG9jdW1lbnRWYWx1ZSL3AgoNRG9jdW1lbnRWYWx1ZRIUCgplbGVtZW50X2lkGAEgASgJSAASFgoMc3RyaW5nX3ZhbHVlGAIgASgJSAASEwoJaW50X3ZhbHVlGAMgASgDSAASFAoKcmVhbF92YWx1ZRgEIAEoAUgAEhQKCmJvb2xfdmFsdWUYBSABKAhIABISCghpbmZpbml0eRgGIAEoCEgAEiMKCHF1YW50aXR5GAggASgLMg8uc3lzbWwuUXVhbnRpdHlIABIpCgd2ZXJkaWN0GAkgASgLMhYuc3lzbWwuRG9jdW1lbnRWZXJkaWN0SAASJwoGb2JqZWN0GAogASgLMhUuc3lzbWwuRG9jdW1lbnRPYmplY3RIABIlCgVzdGF0ZRgLIAEoCzIULnN5c21sLkRvY3VtZW50U3RhdGVIABIlCgVldmVudBgMIAEoCzIULnN5c21sLkRvY3VtZW50RXZlbnRIABIUCgxlbGVtZW50X3R5cGUYByABKAlCBgoEa2luZCJaCg5Eb2N1bWVudE9iamVjdBITCgtpbnN0YW5jZV9pZBgBIAEoAxIMCgRwYXRoGAIgASgJEiUKB2VsZW1lbnQYAyABKAsyFC5zeXNtbC5Eb2N1bWVudFZhbHVlIq4BCg9Eb2N1bWVudFZlcmRpY3QSJwoJYXNzZXJ0aW9uGAEgASgLMhQuc3lzbWwuRG9jdW1lbnRWYWx1ZRIMCgRraW5kGAIgASgJEgwKBHRleHQYAyABKAkSDAoEcGF0aBgEIAEoCRIPCgd2ZXJkaWN0GAUgASgJEhEKCWNvbmRpdGlvbhgGIAEoCRIOCgZyZWFzb24YByABKAkSFAoMdmVyaWZpY2F0aW9uGAggAygJIrEBCg1Eb2N1bWVudFN0YXRlEiUKBm9iamVjdBgBIAEoCzIVLnN5c21sLkRvY3VtZW50T2JqZWN0Eg8KB21hY2hpbmUYAiABKAkSDAoEbmFtZRgDIAEoCRISCgpzdGF0ZV9wYXRoGAQgASgJEiMKBXN0YXRlGAUgASgLMhQuc3lzbWwuRG9jdW1lbnRWYWx1ZRIOCgZyZWdpb24YBiABKAkSEQoJZW5jbG9zaW5nGAcgAygJIpwCCg1Eb2N1bWVudEV2ZW50EgwKBGtpbmQYASABKAkSIgoEdGltZRgCIAEoCzIULnN5c21sLkRvY3VtZW50VmFsdWUSJQoGb2JqZWN0GAMgASgLMhUuc3lzbWwuRG9jdW1lbnRPYmplY3QSDwoHbWFjaGluZRgEIAEoCRINCgVzdGF0ZRgFIAEoCRIMCgRmcm9tGAYgASgJEgoKAnRvGAcgASgJEiUKBnRhcmdldBgIIAEoCzIVLnN5c21sLkRvY3VtZW50T2JqZWN0Eg0KBWV2ZW50GAkgASgJEg8KB3BheWxvYWQYCiADKAkSFAoMYWx0ZXJuYXRpdmVzGAsgAygJEg0KBXRha2VuGAwgASgJEgwKBHRleHQYDSABKAkiIwoTRG9jdW1lbnRRdWVyeUNvbHVtbhIMCgRuYW1lGAEgASgJIjkKEURvY3VtZW50UXVlcnlDZWxsEiQKBnZhbHVlcxgBIAMoCzIULnN5c21sLkRvY3VtZW50VmFsdWUiYgoQRG9jdW1lbnRRdWVyeVJvdxIlCgdlbGVtZW50GAEgASgLMhQuc3lzbWwuRG9jdW1lbnRWYWx1ZRInCgVjZWxscxgCIAMoCzIYLnN5c21sLkRvY3VtZW50UXVlcnlDZWxsIm4KGFJ1bkRvY3VtZW50UXVlcnlSZXNwb25zZRIrCgdjb2x1bW5zGAEgAygLMhouc3lzbWwuRG9jdW1lbnRRdWVyeUNvbHVtbhIlCgRyb3dzGAIgAygLMhcuc3lzbWwuRG9jdW1lbnRRdWVyeVJvdyJOChVSZW5kZXJEb2N1bWVudFJlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRITCgtkb2N1bWVudF9pZBgCIAEoCRIMCgRmb3JtGAMgASgJIjgKFlJlbmRlckRvY3VtZW50UmVzcG9uc2USEAoIbWFya2Rvd24YASABKAkSDAoEaHRtbBgCIAEoCSqxAQoNRmFpbHVyZVJlYXNvbhIeChpGQUlMVVJFX1JFQVNPTl9VTlNQRUNJRklFRBAAEh0KGUZBSUxVUkVfUkVBU09OX0VWQUxVQVRJT04QARIdChlGQUlMVVJFX1JFQVNPTl9XUk9OR19LSU5EEAISJAogRkFJTFVSRV9SRUFTT05fQU1CSUdVT1VTX1NVQkpFQ1QQAxIcChhGQUlMVVJFX1JFQVNPTl9VTkRFQ0lERUQQBCqMBQoLRWRpdEZhaWx1cmUSHAoYRURJVF9GQUlMVVJFX1VOU1BFQ0lGSUVEEAASHgoaRURJVF9GQUlMVVJFX05PX09QRVJBVElPTlMQARIfChtFRElUX0ZBSUxVUkVfVU5LTk9XTl9UQVJHRVQQAhIhCh1FRElUX0ZBSUxVUkVfQU1CSUdVT1VTX1RBUkdFVBADEhsKF0VESVRfRkFJTFVSRV9OT1RfVkFMVUVEEAQSHgoaRURJVF9GQUlMVVJFX0lOVkFMSURfVkFMVUUQBRIdChlFRElUX0ZBSUxVUkVfSU5WQUxJRF9OQU1FEAYSGgoWRURJVF9GQUlMVVJFX05PVF9OQU1FRBAHEiIKHkVESVRfRkFJTFVSRV9SRU5BTUVfUkVGRVJFTkNFRBAIEiIKHkVESVRfRkFJTFVSRV9PVkVSTEFQUElOR19FRElUUxAJEh8KG0VESVRfRkFJTFVSRV9SRVNVTFRfSU5WQUxJRBAKEh4KGkVESVRfRkFJTFVSRV9PV05FUl9VTktOT1dOEAsSJAogRURJVF9GQUlMVVJFX09XTkVSX05PVF9OQU1FU1BBQ0UQDBIdChlFRElUX0ZBSUxVUkVfSUxMRUdBTF9LSU5EEA0SIgoeRURJVF9GQUlMVVJFX01FTUJFUl9OQU1FX1RBS0VOEA4SIgoeRURJVF9GQUlMVVJFX0RFTEVURV9SRUZFUkVOQ0VEEA8SJAogRURJVF9GQUlMVVJFX09XTkVSX0lOU0lERV9UQVJHRVQQEBIgChxFRElUX0ZBSUxVUkVfTU9WRV9SRUZFUkVOQ0VEEBESJQohRURJVF9GQUlMVVJFX1JFRkVSRU5DRURfRUxTRVdIRVJFEBIqkgEKEVByaW1pdGl2ZU9wZXJhdG9yEiIKHlBSSU1JVElWRV9PUEVSQVRPUl9VTlNQRUNJRklFRBAAEhwKGFBSSU1JVElWRV9PUEVSQVRPUl9FUVVBTBABEh4KGlBSSU1JVElWRV9PUEVSQVRPUl9HUkVBVEVSEAISGwoXUFJJTUlUSVZFX09QRVJBVE9SX0xFU1MQAypuChFDb21wb3NpdGVPcGVyYXRvchIiCh5DT01QT1NJVEVfT1BFUkFUT1JfVU5TUEVDSUZJRUQQABIaChZDT01QT1NJVEVfT1BFUkFUT1JfQU5EEAESGQoVQ09NUE9TSVRFX09QRVJBVE9SX09SEAIyvwwKDFN5c01MU2VydmljZRJECg1HZXRTZXJ2ZXJJbmZvEhguc3lzbWwuU2VydmVySW5mb1JlcXVlc3QaGS5zeXNtbC5TZXJ2ZXJJbmZvUmVzcG9uc2USPgoJUGFyc2VGaWxlEhcuc3lzbWwuUGFyc2VGaWxlUmVxdWVzdBoYLnN5c21sLlBhcnNlRmlsZVJlc3BvbnNlEkcKDFBhcnNlU291cmNlcxIaLnN5c21sLlBhcnNlU291cmNlc1JlcXVlc3QaGy5zeXNtbC5QYXJzZVNvdXJjZXNSZXNwb25zZRI7CglHZXRTeW1ib2wSFy5zeXNtbC5HZXRTeW1ib2xSZXF1ZXN0GhUuc3lzbWwuU3ltYm9sUmVzcG9uc2USRwoOR2V0RGlhZ25vc3RpY3MSGS5zeXNtbC5EaWFnbm9zdGljc1JlcXVlc3QaGi5zeXNtbC5EaWFnbm9zdGljc1Jlc3BvbnNlEjsKCEV2YWx1YXRlEhYuc3lzbWwuRXZhbHVhdGVSZXF1ZXN0Ghcuc3lzbWwuRXZhbHVhdGVSZXNwb25zZRJECgtJbnN0YW50aWF0ZRIZLnN5c21sLkluc3RhbnRpYXRlUmVxdWVzdBoaLnN5c21sLkluc3RhbnRpYXRlUmVzcG9uc2USSgoNRXhlY3V0ZUFjdGlvbhIbLnN5c21sLkV4ZWN1dGVBY3Rpb25SZXF1ZXN0Ghwuc3lzbWwuRXhlY3V0ZUFjdGlvblJlc3BvbnNlEkcKDEV4ZWN1dGVTdGF0ZRIaLnN5c21sLkV4ZWN1dGVTdGF0ZVJlcXVlc3QaGy5zeXNtbC5FeGVjdXRlU3RhdGVSZXNwb25zZRI4CgdDb252ZXJ0EhUuc3lzbWwuQ29udmVydFJlcXVlc3QaFi5zeXNtbC5Db252ZXJ0UmVzcG9uc2USQQoKQXBwbHlFZGl0cxIYLnN5c21sLkFwcGx5RWRpdHNSZXF1ZXN0Ghkuc3lzbWwuQXBwbHlFZGl0c1Jlc3BvbnNlElMKEFZlcmlmeUNvbnN0cmFpbnQSHi5zeXNtbC5WZXJpZnlDb25zdHJhaW50UmVxdWVzdBofLnN5c21sLlZlcmlmeUNvbnN0cmFpbnRSZXNwb25zZRJWChFWZXJpZnlSZXF1aXJlbWVudBIfLnN5c21sLlZlcmlmeVJlcXVpcmVtZW50UmVxdWVzdBogLnN5c21sLlZlcmlmeVJlcXVpcmVtZW50UmVzcG9uc2USWQoSVmVyaWZ5U2F0aXNmYWN0aW9uEiAuc3lzbWwuVmVyaWZ5U2F0aXNmYWN0aW9uUmVxdWVzdBohLnN5c21sLlZlcmlmeVNhdGlzZmFjdGlvblJlc3BvbnNlElMKEFZhbGlkYXRlSW5zdGFuY2USHi5zeXNtbC5WYWxpZGF0ZUluc3RhbmNlUmVxdWVzdBofLnN5c21sLlZhbGlkYXRlSW5zdGFuY2VSZXNwb25zZRJHCgxFdmFsdWF0ZUNhbGMSGi5zeXNtbC5FdmFsdWF0ZUNhbGNSZXF1ZXN0Ghsuc3lzbWwuRXZhbHVhdGVDYWxjUmVzcG9uc2USRAoLUnVuQW5hbHlzaXMSGS5zeXNtbC5SdW5BbmFseXNpc1JlcXVlc3QaGi5zeXNtbC5SdW5BbmFseXNpc1Jlc3BvbnNlEjsKCFJ1blN3ZWVwEhYuc3lzbWwuUnVuU3dlZXBSZXF1ZXN0Ghcuc3lzbWwuUnVuU3dlZXBSZXNwb25zZRJECgtMaXN0RW5naW5lcxIZLnN5c21sLkxpc3RFbmdpbmVzUmVxdWVzdBoaLnN5c21sLkxpc3RFbmdpbmVzUmVzcG9uc2USMgoFUXVlcnkSEy5zeXNtbC5RdWVyeVJlcXVlc3QaFC5zeXNtbC5RdWVyeVJlc3BvbnNlElMKEFJ1bkRvY3VtZW50UXVlcnkSHi5zeXNtbC5SdW5Eb2N1bWVudFF1ZXJ5UmVxdWVzdBofLnN5c21sLlJ1bkRvY3VtZW50UXVlcnlSZXNwb25zZRJNCg5SZW5kZXJEb2N1bWVudBIcLnN5c21sLlJlbmRlckRvY3VtZW50UmVxdWVzdBodLnN5c21sLlJlbmRlckRvY3VtZW50UmVzcG9uc2VCKlooZ2l0aHViLmNvbS9PcGVuLU1CRUUvT3BlblN5c01ML2FwaS9wcm90b2IGcHJvdG8z"); /** * Verdict is one verification's answer: whether the condition held, and, when @@ -2200,6 +2200,18 @@ export type ConvertRequest = Message<"sysml.ConvertRequest"> & { * @generated from field: bool tolerate_syntax_errors = 5; */ tolerateSyntaxErrors: boolean; + + /** + * How derived element ids are spelled when notation is written as a graph + * ("ttl" or "api-json"), as `sysml -id` does: "qualified" (the default, each + * derived from its qualified name) or "uuid" (name-based uuids under each root + * package, the library convention). Declared and normative ids are unchanged. + * Empty is "qualified"; any other value, or one given for another direction, + * is INVALID_ARGUMENT. + * + * @generated from field: string id_form = 7; + */ + idForm: string; }; /** diff --git a/client/python/DEVELOPING.md b/client/python/DEVELOPING.md new file mode 100644 index 0000000000..b1f84f67f3 --- /dev/null +++ b/client/python/DEVELOPING.md @@ -0,0 +1,436 @@ +# Developing opensysml + +`opensysml` is the Python client for OpenSysML: it parses, inspects and executes SysML v2 +models over the `sysml-grpc` service. [README.md](README.md) is the page PyPI shows; this +document is the complete walkthrough of the client's surface, its service resolution and trust +model, and how to develop it from a checkout. + +```bash +pip install opensysml # from PyPI +pip install -e client/python/ # or from a checkout, at the repository root +``` + +```python +import opensysml + +model = opensysml.load("model.sysml", strict=True) # raises on error diagnostics +print(model.eval("1 + 2 * 3")) # 7 + +print(model.eval("mass", subject="Demo::sedan")) # 1200.0 — that object, not the default + # requires the service's evaluate_subject + # capability; the client checks it first + +vehicle = model["Vehicle"] # by short name or FQN +vehicle.attributes() # own and inherited, with resolved facts +inst = model.instantiate("Demo::Vehicle") +inst.mass # 1500.0 [kg] — a Quantity + +model.verify_satisfaction() # every assert satisfy … by … +model.verify_constraint("Demo::Vehicle::massOK", subject="Demo::sedan", engine="check") +model.connection.list_engines() # what `sysml -engines` prints +model.save("model.ttl") # RDF Turtle (experimental) +model.save("model.json") # OMG API element JSON (experimental) +``` + +A value arrives as the Python value of its kind — `Quantity`, `complex`, `Array`, `Vector`, +`VectorQuantity`, `TensorQuantity`, `SetValue`, `MeasurementRef`, `Function`, `Metaobject`, +`EnumLiteral`, `Undetermined`, `INFINITY` — never a string to parse; every verdict carries a +`Standing` naming the engine that answered and the strength of its evidence. + +The verify calls take a `question` beyond the default `"evaluate"`: `"holds"` proves the claim +for every assignment the free features can take and `"satisfiable"` finds one, answered by the +service's solvers against a service advertising `verification_questions`. The verdict's +`question` and `status` say what was answered (`holds` | `violated` | `undecided` | +`satisfiable` | `unsatisfiable`); a violated or satisfiable answer reports `witness`, the free +features' replayed values with `unit` and `exact`, and undecided reports the reason — a refused +translation, an absent solver, arithmetic the backend could not close, or a rounded unsat that +is no proof — in `error`, never a false claim: + +```python +v = model.verify_constraint("Demo::lemma", question="holds") +v.status, v.strength # 'holds', 'proved' +v = model.verify_constraint("Demo::bad", question="holds") +v.status, v.witness # 'violated', the assignment the evaluator replayed +``` + +Declarations can be authored from notation strings while preserving the +untouched source: + +```python +model.edit().add_part_def("", "Vehicle").apply() +model.edit().add_part("Vehicle", "engine", type="Engine").apply() +model.edit().add_allocation("Demo::System", "a", "b", name="alloc1").apply() +``` + +`Editor.add_connection(owner, kind, from_, to, name=None, type=None)` writes +connection-like usages; `add_allocation` and `add_flow` are typed helpers. +`Editor.add_member` also accepts `abstract`, `redefines`, `default`, `direction`, +`metadata`, `expression=` and `doc=` options, and supports the SysML `ref` and +`return` kinds where they are admitted. `metadata` writes `#M` prefixes on the +new member. `expression=` writes a body expression for supported kinds: a +constraint condition, or a calculation/case result expression. Requirement-body +kinds do not admit result expressions. `doc=` writes plain documentation text +as the new declaration's first body member. +Use `add_satisfy`, `add_requirement_constraint`, `add_require_constraint`, +`add_assume_constraint`, `add_transition` or `add_entry_transition` to author +requirement statements and state transitions; `add_first` and `add_then` write +`first`/`then` action-body sequencing, with recursive action-body items and +source-end multiplicities available through the extended sequence fields. +These operations preflight `member_modifiers`, `satisfy_authoring`, +`requirement_constraint_authoring`, `transition_authoring`, `sequence_authoring`, +`implicit_parameters`, `action_body_statement_authoring`, `constraint_body_authoring`, +`state_action_authoring`, `import_authoring`, `documentation_authoring` and +`comment_authoring` as applicable. +`add_objective(owner, name=None, type=None)` adds a named or anonymous objective, +and `add_verify(owner, requirement)` writes `verify ;` in a +verification case objective. `add_metadata(owner, metadata_type, values=None, +name=None, about=None, shorthand=False)` writes metadata usages with optional +ordered feature values and `about` references; `shorthand=True` uses `@M`. +`add_metadata_prefix(target, metadata_type)` adds a metadata prefix to an existing declaration. +Verification authoring requires `authoring` and `verification_objective_authoring`; metadata +usages and new-member prefixes require `authoring` and `metadata_authoring`; existing-declaration +prefixes require `authoring` and `metadata_prefix_authoring`. +`add_parameter` writes an implicit +directed usage — `in x : T;` — unless an explicit `kind` is given +(`kind="ref"` writes `in ref x : T;`). +`add_constraint_def` and +`add_constraint` accept `expression=` for a constraint body (`{ ... }`), while +`value=` writes a feature value (`= ...`). `add_assert_constraint` optionally +negates an asserted constraint body. `add_assert(owner, ref, negated=False)` +adds an anonymous reference assertion (`assert ;` or `assert not ;`); +`ref` names the constraint target, not the assertion. `add_exhibit_state` and +`add_exhibit` author state exhibits; `add_state_action` accepts `entry`, `do` or +`exit`. +`add_member` and every typed helper accept `doc="..."`, written as the new +member's `doc /* ... */`, and +`add_documentation(target, body, name=None, locale=None, replace=False)` documents +an existing declaration, refusing one that already has documentation unless +`replace=True`. `add_comment(owner, body, name=None, about=None, locale=None)` writes a +`comment` element and `add_note(target, text)` a `// text` line note above a declaration. +`add_import` authors import declarations. The editor preflights +`member_modifiers`, `satisfy_authoring`, `requirement_constraint_authoring`, +`transition_authoring`, `sequence_authoring`, `implicit_parameters`, +`action_body_statement_authoring`, `constraint_body_authoring`, `state_action_authoring`, +`import_authoring`, `documentation_authoring` and `comment_authoring` as +applicable, alongside `authoring`. +`add_calc_def` and `add_calc` accept input pairs, `return_type` and +`return_expression`; `expression=` instead writes the body's result expression. +A `return_expression` requires a return type, is bound to the result parameter +rather than written as `return ;`, and cannot be combined with +`expression=`. `expression=` may be used with `return_type`. `add_action_def` +and `add_action` accept input and output pairs. `add_perform_action` writes +`perform action name : Type`, and `add_perform(owner, action)` writes +`perform ;` — a perform usage named by the action usage it references, +for example `add_perform("Demo::Kitchen", "t.heat")` writes `perform t.heat;`. + +Use `opensysml.loads(text, language="kerml")` for inline KerML content. + +Each `load` or `loads` parses **one document as a model of its own**: a `private import Base::*;` in `chapter.sysml` does not resolve while `base.sysml` is only a neighbour on disk, and `load` refuses a directory. `parse_sources` parses several documents as one model (the service's `ParseSources` RPC, the `parse_sources` capability), so the import resolves and each diagnostic names its document: + +```python +model = opensysml.parse_sources([ + "base.sysml", # a file the service reads + ("chapter.sysml", chapter_text), # inline text under a name +], strict=True) +model["Chapter::Car"] # resolved across documents +model.documents # ('base.sysml', 'chapter.sysml') +``` + +A root package named like a standard library package (`Base`, `Requirements`, …) is a separate hazard: from another document a qualified name starting with it resolves to the library, as the `library-root-name` warning says. + +Every call goes through the `sysml-grpc` service, which `opensysml` starts automatically from +the first place it finds one; the guide below describes how to install it there. + +## Resolving the service binary + +Every client resolves the service binary in the same order, and this one is no +exception: + +1. **`$OPENSYSML_BINARY`**, when set and non-empty: exactly that path is started. + If it names something that is not an executable file, that is an error naming + the variable and the path — an explicit instruction is never a fallback. +2. **The shared cache** `~/.opensysml/bin/sysml-grpc` (`sysml-grpc.exe` on + Windows), where a verified download puts it and where `make build` can put + your own build. +3. **A release download** into that cache, using the release this client was + built against unless `ensure_binary(version=...)` or + `$OPENSYSML_GRPC_VERSION` selects another one. An executable cache without + release metadata is treated as a hand-installed build and kept. +4. **`$PATH`**: the first executable `sysml-grpc` (`sysml-grpc.exe` on Windows) + on it, which is what a package manager or `go install` leaves behind. + +If the built-against release is unavailable, an executable on `$PATH` is used +with a warning; otherwise the error names the release and what would fix it. + +A binary from `$OPENSYSML_BINARY` or `$PATH` is used exactly as it is found: it +belongs to no release, so **it is not verified against the pinned digests below**, +not copied into the shared cache, and started at its own path rather than a +digest-named link. Naming it, or installing it on `$PATH`, is trusting it; the +pinned-digest trust model covers downloads only. + +## Service ownership + +`opensysml` uses a service of its own, and never stops a service it did not +start. + +- A connection made without naming a service starts a **private child** of this + interpreter. The child binds port 0, so the kernel assigns the port, and it + reports the address it was given on its stdout — no port is chosen, probed or + retried by the client, and two interpreters starting at once cannot collide. +- One private child serves **every** connection of an interpreter that needs the + same service release. The first of them starts it; it stops when the last one + closes, or when the interpreter exits. Sharing it shares its parse cache, + which is what makes a second connection cheap (see below). +- Its lifetime is this interpreter's. Nothing is recorded on disk about it, no + other process adopts it, and a service another process left listening is + neither reused nor cleaned up. +- Connecting to a service `opensysml` did not start is explicit: pass a host and + port (`opensysml.connect("localhost", 50051)`, or `connect("localhost:50051")`), + set `$OPENSYSML_SERVICE=host:port`, or pass `auto_start=False` to require a + service the caller manages. Closing such a connection leaves it running. + +### No orphans + +The client holds the write end of the child's **stdin pipe** and never writes to +it; the child reads its stdin and shuts down on end of file. Nothing else holds +that write end, so the pipe closes when the owning process goes away — and it is +the kernel that closes it, not any code of ours. That survives what an `atexit` +hook or a supervisor thread does not: `SIGKILL`, `os._exit`, a fatal interpreter +error, and a crash during shutdown. On an orderly close the client also closes +stdin itself and then signals the child, so exit is prompt rather than eventual. + +The client signals only through the `Popen` object of the child it started, so no +pid it did not start — including one the operating system has since reused — +can be signalled. That guarantee no longer needs a start-time check to hold, +because there is no pid on disk to re-authenticate. + +Per platform: + +- **Linux** and **macOS**: the child is started in a session of its own + (`start_new_session=True`), so a `SIGINT` or `SIGHUP` sent to the client's + process group does not reach it; stdin is what ends it. Other children the + client spawns do not inherit the write end, since CPython closes descriptors + across `subprocess` by default, so it has exactly one holder. +- **Windows**: the operating system closes the same anonymous pipe when the + owning process exits, however it exits, so the guarantee is unchanged. Windows + has no `fork()`, so the case below cannot arise there. +- **`fork()`**: the forked child inherits the write end, which would hold the + service open past its owner. An `os.register_at_fork` hook therefore disowns + the inherited services in the new process and closes its copy of the pipe: the + service stays tied to the process that started it, and a forked child that + connects starts one of its own. + +The single limitation is deliberate: a service reached explicitly is not tied to +the client's lifetime, because the client does not own it. + +### Cost of a private child + +Measured on Linux with `client/python/scripts/measure_private_service.py` (n=20): + +| | p50 | p95 | +| ----------------------------------------------------- | ------: | ------: | +| first connection: spawn, bind, report, handshake | 7.0 ms | 9.1 ms | +| a later connection joining this interpreter's child | 0.6 ms | 1.0 ms | +| a child per connection, rather than one shared | 29.6 ms | 54.6 ms | +| parsing a model the shared child has already parsed | 0.3 ms | 1.2 ms | +| the same parse in a child of that connection's own | 139.8 ms | 269.6 ms | + +The last two rows are why the child is per interpreter rather than per +connection: a child per connection would not only spawn N times, it would parse +each model N times, against a cache hit some 500x cheaper. + +## Pinned release digests + +A download is verified against the table in `client/release-digests.json`, which +pins the SHA-256 of every asset of a release and is the one table every client +verifies against; `opensysml` ships its own synced copy of it as +`opensysml/release-digests.json` and reads it as `binary.PINNED_SHA256`, because a +pin resolved from outside the published wheel would not be a pin. The `.sha256` served beside a +binary comes from whoever served the binary, so it detects corruption but not a +republished release; a pinned digest is independent of that origin. A download +with no pin fails with a message naming the version, rather than falling back to +the served checksum — `$OPENSYSML_ALLOW_UNPINNED_DOWNLOAD=` (or `=1` for +any repository) accepts same-origin trust explicitly for what it names, with a +warning. + +The cache at `~/.opensysml/bin/sysml-grpc` is shared with the other clients, so +deciding whether it is the release asked for and replacing the binary and its +metadata is done holding `~/.opensysml/bin/sysml-grpc.lock` (`fcntl.lockf`, the +same lock a Java `FileLock` and the Rust client take). Concurrent installers +therefore queue rather than pair one release's bytes with another's record. Because that lock is held +over the download, every response is read bounded — 512 MiB for a binary, 8 MiB +for a checksum, manifest, bundle or release JSON — so an endless body is refused +rather than filling memory while other clients wait. + +What a service is started from is not that shared path but a link to it under its +own digest, `~/.opensysml/bin/sysml-grpc-`, made +while the lock is held: the cache is replaced in place, so starting it after the +lock is dropped could start whatever another client installed in between. The +Java and Rust clients name that file the same way, so the three share it, and a +cache that cannot be hashed or linked is started directly with a warning saying so. + +A release of `opensysml` pins the five `sysml-grpc-*` binaries of its own +release: `build-python-package` runs `pin_release_checksums.py --version +"$CIRCLE_TAG" --from-binaries dist/grpc --table +client/python/opensysml/release-digests.json` against the binaries +`build-release-binaries` just built, then fails unless the wheel and sdist pin +all five assets for the tag. The committed tables are untouched by that stamp, +so `pip install opensysml==X.Y.Z` followed by `opensysml.connect()` verifies the +service it downloads against a digest inside the wheel, with no environment +variable and no `sigstore` at run time. For another release, or one newer than +the package's table, the client verifies the release's signed checksum manifest +with `sigstore` and uses its digest; if `sigstore` (or a package it depends on) +is not installed, the download is refused rather than taken unverified, and +`SigstoreUnavailableError` names the missing package and its install, +`python -m pip install 'sigstore>=4.5.0,<5'`. + +After a release, after the service binaries are published and final, the same +script back-fills the committed table so later releases pin that one too: + +```bash +export GITHUB_TOKEN=... # the release API rate-limits unauthenticated calls +python scripts/pin_release_checksums.py --version v0.0.9 --write +git commit -am 'chore(clients): pin release digests for v0.0.9' +``` + +The script downloads every `sysml-grpc-*` asset of that release, hashes what it +downloaded, refuses the release if a `.sha256` sidecar disagrees with the asset +it describes, rewrites the table in place, and syncs it into every client that +ships a copy (`python3 scripts/sync-release-digests.py`, whose `--check` mode CI +runs so a copy cannot drift). `--check` re-hashes the assets of +every pinned release and fails on any disagreement, catching a release +republished with another binary. A opensysml release therefore pins the service +releases published before it; asking for a newer one needs a newer opensysml (or +the explicit opt-in above), and leaves an already-downloaded binary serving +rather than refusing to start — only a digest that *contradicts* a pin is +treated as tampering and refuses to fall back. + +## The FMI runner (optional) + +`pip install opensysml[fmi]` adds FMPy and the `opensysml-fmi-runner` executable: +the reference runner the `tool:fmi` engine speaks the fmi/1 protocol to — one JSON +request on standard input, one reply on standard output — simulating +co-simulation and model-exchange FMUs. Point `OPENSYSML_FMI_RUNNER` at it and a +`calc def` imported from an FMU (`sysml -convert sysml model.fmu`) evaluates +through it; see docs/reference/fmi.md. + +## Version + +`opensysml/_version.py` is the only declaration: the packaging metadata reads it, +`opensysml.__version__` reports the installed distribution's version, and +`scripts/check_version.py` fails a release whose tag names another version. The +version tests therefore require the tree under test to be the installed +distribution — `pip install -e client/python/`. A wheel of another version installed +beside the source tree makes them fail with that remedy: the artifact is what is +stale, not the declaration. + +## Generated typed classes + +`python -m opensysml.generate model.sysml -o model_types.py` emits one class per +SysML *definition*, and the generated hierarchy follows the model's +generalization edges: `specializes`, `subsets` and `redefines` all become base +classes, because Python has a single notion of inheritance. What tells the two +apart is the members, not the bases: + +- a **redefinition** reuses the redefined feature's name, so its property + overrides the base class's property of that name, and takes over the type and + multiplicity it does not restate (`attribute :>> mass = 2.0;` stays `float`, + and a redefined `0..*` feature stays a `list[...]`); +- a **subset** under a new name adds a property beside the base class's one, and + likewise inherits the type and multiplicity it leaves out. + +With **multiple supertypes**, bases are emitted in declaration order, a target +named twice appearing once, and Python resolves members left to right by its +usual MRO. A base another declared base already specializes is left implicit — +`Hybrid :> Vehicle, Electric` where `Electric :> Vehicle` emits +`class Hybrid(Electric)`, which Python can linearize and which keeps both +relationships and `Electric`'s properties. Where no order linearizes at all +(two bases specializing a shared pair in opposite orders), rather than emit a +module that fails to import, the generator keeps the bases it can and records +what it left out as a comment on the class, naming the edge: + +```python +class Both(One): + # specializes Demo::Two, left out: Python cannot linearize it with the bases above +``` + +A base outside the generated model is reported the same way. Both are the model's +hierarchy being wider than Python's, not facts being discarded — the service +reports every edge, and `Symbol.specializations` still carries them all. + +**Limitation, unchanged:** only structural usages (`attribute`, `part`, `item`, +`occurrence`, `individual`, `port`, `enum`) become properties. Behavioral and +connector usages — `action`, `state`, `calc`, `constraint`, `requirement`, +`connection`, `flow`, `interface`, `allocation`, `case` — are not instance feature values, +so a generated class has no member for them; reach them through +`model["Demo::Vehicle"]`, `verify_constraint` and `verify_satisfaction`. + +## Diagnostics + +A `Diagnostic` has `severity`, `message`, `code` and a location (`file`, +`start_line`, `start_column`, `end_line`, `end_column`, or the raw `span`). Branch +on `code`, not on the message text: `"syntax"` for a syntax error, a validation +code such as `"unresolved"` for a finding, `"choice-point"` and +`"guard-unevaluable"` for a run's notes; `""` when the service assigned none. A service +that populates `code` advertises `opensysml.capabilities.CAPABILITY_DIAGNOSTIC_CODES`; without +it every code is `""`. + +```python +model = opensysml.load("model.sysml") +unresolved = [d for d in model.diagnostics if d.code == "unresolved"] +``` + +## Names that shadow builtins + +Neither builtin name is a live part of the API any more: the module-level +evaluation function is `opensysml.evaluate`, and the execution error is +`opensysml.ExecutionError`. `opensysml.eval` and `opensysml.errors.RuntimeError` +remain as deprecated aliases that warn on use, out of their modules' `__all__`, +so a star-import binds neither. + +```python +import opensysml + +opensysml.evaluate("1 + 2", file_path="model.sysml") # opensysml.eval warns +model.eval("mass", subject="Demo::sedan") # a method shadows nothing +``` + +```python +from opensysml import eval # shadows the builtin in this module — avoid +``` + +Guidance for this package and for code around it: + +- **Call `opensysml.evaluate`.** `opensysml.eval` still works and returns the same + result, warning `DeprecationWarning`; it goes away in 1.0.0. +- Import the package, not its names, for anything named like a builtin. +- Catch `opensysml.ExecutionError` (or its base `opensysml.OpenSysMLError`), never + `opensysml.errors.RuntimeError`, which warns and is due for removal. +- Do not name a new public function or exception after a builtin. + +0.2.0 therefore publishes `evaluate` as the name to write, with both builtin +names deprecated rather than removed, so code written against 0.1.x keeps +running until 1.0.0. + +## Running the tests + +```bash +make build # builds bin/sysml-grpc +pip install -e client/python/ && pip install pytest pytest-mock +python -m pytest client/python/tests/ -q # service-backed tests skip +``` + +Tests that need a service skip when none answers on `localhost:50051` and no +binary is available to spawn one. Where a service *is* provided — as in CI — +export `OPENSYSML_REQUIRE_SERVICE=1`, and its absence fails instead of skipping. + +## Documentation + +- Using the client: + [docs/guide/09-clients.md](https://github.com/Open-MBEE/OpenSysML/blob/main/docs/guide/09-clients.md) + — installing the service binary, loading a model, instances, verification, conversion + and queries +- The API surface, generated typed classes, latency and the module map: + [docs/reference/python-api.md](https://github.com/Open-MBEE/OpenSysML/blob/main/docs/reference/python-api.md) +- Installing from source and running the tests: + [INSTALL.md](https://github.com/Open-MBEE/OpenSysML/blob/main/client/python/INSTALL.md) diff --git a/client/python/INSTALL.md b/client/python/INSTALL.md index c89889e1f3..92ddfafd26 100644 --- a/client/python/INSTALL.md +++ b/client/python/INSTALL.md @@ -8,13 +8,12 @@ pip install opensysml Published to [PyPI](https://pypi.org/project/opensysml/) from CircleCI by the core `v*` release tag, at the core's version: `v0.9.0` publishes `opensysml` 0.9.0. The package -downloads the `sysml-grpc` service it needs at runtime from the release -`OPENSYSML_GRPC_VERSION` (or `version=`) names, so pinning both to one version gives the -pairing that release tested: +downloads the matching `sysml-grpc` service at runtime, defaulting to the +release it was built against. `OPENSYSML_GRPC_VERSION` (or `version=`) +selects another release: ```bash pip install opensysml==0.9.0 -export OPENSYSML_GRPC_VERSION=v0.9.0 ``` See [docs/project/releasing.md](../../docs/project/releasing.md#releasing-opensysml-to-pypi). diff --git a/client/python/README.md b/client/python/README.md index 94562e4a33..6fc7336813 100644 --- a/client/python/README.md +++ b/client/python/README.md @@ -1,417 +1,84 @@ # opensysml -Python client for OpenSysML: parse, inspect and execute SysML v2 models over the -`sysml-grpc` service. +`opensysml` is the Python client for the OpenSysML SysML v2 parser, model +analysis and execution service. Load SysML models, inspect symbols and +diagnostics, evaluate values, verify constraints, run behaviors, edit source, +and query model documents from Python. -```bash -pip install opensysml # from PyPI -pip install -e client/python/ # or from a checkout, at the repository root -``` - -```python -import opensysml - -model = opensysml.load("model.sysml", strict=True) # raises on error diagnostics -print(model.eval("1 + 2 * 3")) # 7 - -print(model.eval("mass", subject="Demo::sedan")) # 1200.0 — that object, not the default - # requires the service's evaluate_subject - # capability; the client checks it first - -vehicle = model["Vehicle"] # by short name or FQN -vehicle.attributes() # own and inherited, with resolved facts -inst = model.instantiate("Demo::Vehicle") -inst.mass # 1500.0 [kg] — a Quantity - -model.verify_satisfaction() # every assert satisfy … by … -model.verify_constraint("Demo::Vehicle::massOK", subject="Demo::sedan", engine="check") -model.connection.list_engines() # what `sysml -engines` prints -model.save("model.ttl") # RDF Turtle (experimental) -model.save("model.json") # OMG API element JSON (experimental) -``` - -A value arrives as the Python value of its kind — `Quantity`, `complex`, `Array`, `Vector`, -`VectorQuantity`, `TensorQuantity`, `SetValue`, `MeasurementRef`, `Function`, `Metaobject`, -`EnumLiteral`, `Undetermined`, `INFINITY` — never a string to parse; every verdict carries a -`Standing` naming the engine that answered and the strength of its evidence. - -The verify calls take a `question` beyond the default `"evaluate"`: `"holds"` proves the claim -for every assignment the free features can take and `"satisfiable"` finds one, answered by the -service's solvers against a service advertising `verification_questions`. The verdict's -`question` and `status` say what was answered (`holds` | `violated` | `undecided` | -`satisfiable` | `unsatisfiable`); a violated or satisfiable answer reports `witness`, the free -features' replayed values with `unit` and `exact`, and undecided reports the reason — a refused -translation, an absent solver, arithmetic the backend could not close, or a rounded unsat that -is no proof — in `error`, never a false claim: +## Install -```python -v = model.verify_constraint("Demo::lemma", question="holds") -v.status, v.strength # 'holds', 'proved' -v = model.verify_constraint("Demo::bad", question="holds") -v.status, v.witness # 'violated', the assignment the evaluator replayed -``` +Python 3.10 or later is required. Install the published package from PyPI: -Declarations can be authored from notation strings while preserving the -untouched source: - -```python -model.edit().add_part_def("", "Vehicle").apply() -model.edit().add_part("Vehicle", "engine", type="Engine").apply() -model.edit().add_allocation("Demo::System", "a", "b", name="alloc1").apply() +```bash +pip install opensysml ``` -`Editor.add_connection(owner, kind, from_, to, name=None, type=None)` writes -connection-like usages; `add_allocation` and `add_flow` are typed helpers. -`Editor.add_member` also accepts `abstract`, `redefines`, `default`, `direction`, -`metadata`, `expression=` and `doc=` options, and supports the SysML `ref` and -`return` kinds where they are admitted. `metadata` writes `#M` prefixes on the -new member. `expression=` writes a body expression for supported kinds: a -constraint condition, or a calculation/case result expression. Requirement-body -kinds do not admit result expressions. `doc=` writes plain documentation text -as the new declaration's first body member. -Use `add_satisfy`, `add_requirement_constraint`, `add_require_constraint`, -`add_assume_constraint`, `add_transition` or `add_entry_transition` to author -requirement statements and state transitions; `add_first` and `add_then` write -`first`/`then` action-body sequencing, with recursive action-body items and -source-end multiplicities available through the extended sequence fields. -These operations preflight `member_modifiers`, `satisfy_authoring`, -`requirement_constraint_authoring`, `transition_authoring`, `sequence_authoring`, -`implicit_parameters`, `action_body_statement_authoring`, `constraint_body_authoring`, -`state_action_authoring`, `import_authoring`, `documentation_authoring` and -`comment_authoring` as applicable. -`add_objective(owner, name=None, type=None)` adds a named or anonymous objective, -and `add_verify(owner, requirement)` writes `verify ;` in a -verification case objective. `add_metadata(owner, metadata_type, values=None, -name=None, about=None, shorthand=False)` writes metadata usages with optional -ordered feature values and `about` references; `shorthand=True` uses `@M`. -`add_metadata_prefix(target, metadata_type)` adds a metadata prefix to an existing declaration. -Verification authoring requires `authoring` and `verification_objective_authoring`; metadata -usages and new-member prefixes require `authoring` and `metadata_authoring`; existing-declaration -prefixes require `authoring` and `metadata_prefix_authoring`. -`add_parameter` writes an implicit -directed usage — `in x : T;` — unless an explicit `kind` is given -(`kind="ref"` writes `in ref x : T;`). -`add_constraint_def` and -`add_constraint` accept `expression=` for a constraint body (`{ ... }`), while -`value=` writes a feature value (`= ...`). `add_assert_constraint` optionally -negates an asserted constraint body. `add_assert(owner, ref, negated=False)` -adds an anonymous reference assertion (`assert ;` or `assert not ;`); -`ref` names the constraint target, not the assertion. `add_exhibit_state` and -`add_exhibit` author state exhibits; `add_state_action` accepts `entry`, `do` or -`exit`. -`add_member` and every typed helper accept `doc="..."`, written as the new -member's `doc /* ... */`, and -`add_documentation(target, body, name=None, locale=None, replace=False)` documents -an existing declaration, refusing one that already has documentation unless -`replace=True`. `add_comment(owner, body, name=None, about=None, locale=None)` writes a -`comment` element and `add_note(target, text)` a `// text` line note above a declaration. -`add_import` authors import declarations. The editor preflights -`member_modifiers`, `satisfy_authoring`, `requirement_constraint_authoring`, -`transition_authoring`, `sequence_authoring`, `implicit_parameters`, -`action_body_statement_authoring`, `constraint_body_authoring`, `state_action_authoring`, -`import_authoring`, `documentation_authoring` and `comment_authoring` as -applicable, alongside `authoring`. -`add_calc_def` and `add_calc` accept input pairs, `return_type` and -`return_expression`; `expression=` instead writes the body's result expression. -A `return_expression` requires a return type, is bound to the result parameter -rather than written as `return ;`, and cannot be combined with -`expression=`. `expression=` may be used with `return_type`. `add_action_def` -and `add_action` accept input and output pairs. `add_perform_action` writes -`perform action name : Type`, and `add_perform(owner, action)` writes -`perform ;` — a perform usage named by the action usage it references, -for example `add_perform("Demo::Kitchen", "t.heat")` writes `perform t.heat;`. - -Use `opensysml.loads(text, language="kerml")` for inline KerML content. +The runtime dependencies are `grpcio>=1.83.0`, `protobuf>=7.35.1` and +`sigstore>=4.5.0,<5`. -Each `load` or `loads` parses **one document as a model of its own**: a `private import Base::*;` in `chapter.sysml` does not resolve while `base.sysml` is only a neighbour on disk, and `load` refuses a directory. `parse_sources` parses several documents as one model (the service's `ParseSources` RPC, the `parse_sources` capability), so the import resolves and each diagnostic names its document: +## Quickstart ```python -model = opensysml.parse_sources([ - "base.sysml", # a file the service reads - ("chapter.sysml", chapter_text), # inline text under a name -], strict=True) -model["Chapter::Car"] # resolved across documents -model.documents # ('base.sysml', 'chapter.sysml') -``` - -A root package named like a standard library package (`Base`, `Requirements`, …) is a separate hazard: from another document a qualified name starting with it resolves to the library, as the `library-root-name` warning says. - -Every call goes through the `sysml-grpc` service, which `opensysml` starts automatically from -the first place it finds one; the guide below describes how to install it there. - -## Resolving the service binary - -Every client resolves the service binary in the same order, and this one is no -exception: - -1. **`$OPENSYSML_BINARY`**, when set and non-empty: exactly that path is started. - If it names something that is not an executable file, that is an error naming - the variable and the path — an explicit instruction is never a fallback. -2. **The shared cache** `~/.opensysml/bin/sysml-grpc` (`sysml-grpc.exe` on - Windows), where a verified download puts it and where `make build` can put - your own build. -3. **A release download** into that cache, when a release is asked for by - `ensure_binary(version=...)` or `$OPENSYSML_GRPC_VERSION`. A download that was - asked for and failed is an error, not a reason to try `$PATH`, whose binary is - of no known release. -4. **`$PATH`**: the first executable `sysml-grpc` (`sysml-grpc.exe` on Windows) - on it, which is what a package manager or `go install` leaves behind. - -With none of those, the error lists everywhere it looked and what would fix it. - -A binary from `$OPENSYSML_BINARY` or `$PATH` is used exactly as it is found: it -belongs to no release, so **it is not verified against the pinned digests below**, -not copied into the shared cache, and started at its own path rather than a -digest-named link. Naming it, or installing it on `$PATH`, is trusting it; the -pinned-digest trust model covers downloads only. - -## Service ownership - -`opensysml` uses a service of its own, and never stops a service it did not -start. - -- A connection made without naming a service starts a **private child** of this - interpreter. The child binds port 0, so the kernel assigns the port, and it - reports the address it was given on its stdout — no port is chosen, probed or - retried by the client, and two interpreters starting at once cannot collide. -- One private child serves **every** connection of an interpreter that needs the - same service release. The first of them starts it; it stops when the last one - closes, or when the interpreter exits. Sharing it shares its parse cache, - which is what makes a second connection cheap (see below). -- Its lifetime is this interpreter's. Nothing is recorded on disk about it, no - other process adopts it, and a service another process left listening is - neither reused nor cleaned up. -- Connecting to a service `opensysml` did not start is explicit: pass a host and - port (`opensysml.connect("localhost", 50051)`, or `connect("localhost:50051")`), - set `$OPENSYSML_SERVICE=host:port`, or pass `auto_start=False` to require a - service the caller manages. Closing such a connection leaves it running. - -### No orphans - -The client holds the write end of the child's **stdin pipe** and never writes to -it; the child reads its stdin and shuts down on end of file. Nothing else holds -that write end, so the pipe closes when the owning process goes away — and it is -the kernel that closes it, not any code of ours. That survives what an `atexit` -hook or a supervisor thread does not: `SIGKILL`, `os._exit`, a fatal interpreter -error, and a crash during shutdown. On an orderly close the client also closes -stdin itself and then signals the child, so exit is prompt rather than eventual. - -The client signals only through the `Popen` object of the child it started, so no -pid it did not start — including one the operating system has since reused — -can be signalled. That guarantee no longer needs a start-time check to hold, -because there is no pid on disk to re-authenticate. - -Per platform: - -- **Linux** and **macOS**: the child is started in a session of its own - (`start_new_session=True`), so a `SIGINT` or `SIGHUP` sent to the client's - process group does not reach it; stdin is what ends it. Other children the - client spawns do not inherit the write end, since CPython closes descriptors - across `subprocess` by default, so it has exactly one holder. -- **Windows**: the operating system closes the same anonymous pipe when the - owning process exits, however it exits, so the guarantee is unchanged. Windows - has no `fork()`, so the case below cannot arise there. -- **`fork()`**: the forked child inherits the write end, which would hold the - service open past its owner. An `os.register_at_fork` hook therefore disowns - the inherited services in the new process and closes its copy of the pipe: the - service stays tied to the process that started it, and a forked child that - connects starts one of its own. - -The single limitation is deliberate: a service reached explicitly is not tied to -the client's lifetime, because the client does not own it. - -### Cost of a private child - -Measured on Linux with `client/python/scripts/measure_private_service.py` (n=20): - -| | p50 | p95 | -| ----------------------------------------------------- | ------: | ------: | -| first connection: spawn, bind, report, handshake | 7.0 ms | 9.1 ms | -| a later connection joining this interpreter's child | 0.6 ms | 1.0 ms | -| a child per connection, rather than one shared | 29.6 ms | 54.6 ms | -| parsing a model the shared child has already parsed | 0.3 ms | 1.2 ms | -| the same parse in a child of that connection's own | 139.8 ms | 269.6 ms | - -The last two rows are why the child is per interpreter rather than per -connection: a child per connection would not only spawn N times, it would parse -each model N times, against a cache hit some 500x cheaper. - -## Pinned release digests - -A download is verified against the table in `client/release-digests.json`, which -pins the SHA-256 of every asset of a release and is the one table every client -verifies against; `opensysml` ships its own synced copy of it as -`opensysml/release-digests.json` and reads it as `binary.PINNED_SHA256`, because a -pin resolved from outside the published wheel would not be a pin. The `.sha256` served beside a -binary comes from whoever served the binary, so it detects corruption but not a -republished release; a pinned digest is independent of that origin. A download -with no pin fails with a message naming the version, rather than falling back to -the served checksum — `$OPENSYSML_ALLOW_UNPINNED_DOWNLOAD=` (or `=1` for -any repository) accepts same-origin trust explicitly for what it names, with a -warning. - -The cache at `~/.opensysml/bin/sysml-grpc` is shared with the other clients, so -deciding whether it is the release asked for and replacing the binary and its -metadata is done holding `~/.opensysml/bin/sysml-grpc.lock` (`fcntl.lockf`, the -same lock a Java `FileLock` and the Rust client take). Concurrent installers -therefore queue rather than pair one release's bytes with another's record. Because that lock is held -over the download, every response is read bounded — 512 MiB for a binary, 8 MiB -for a checksum, manifest, bundle or release JSON — so an endless body is refused -rather than filling memory while other clients wait. - -What a service is started from is not that shared path but a link to it under its -own digest, `~/.opensysml/bin/sysml-grpc-`, made -while the lock is held: the cache is replaced in place, so starting it after the -lock is dropped could start whatever another client installed in between. The -Java and Rust clients name that file the same way, so the three share it, and a -cache that cannot be hashed or linked is started directly with a warning saying so. - -At release time, after the service binaries are published and final: +import opensysml -```bash -export GITHUB_TOKEN=... # the release API rate-limits unauthenticated calls -python scripts/pin_release_checksums.py --version v0.0.9 --write -git commit -am 'chore(clients): pin release digests for v0.0.9' +source = """\ +package Demo { + part def Vehicle { + attribute mass default = 1500.0; + } + part sedan : Vehicle { + attribute :>> mass = 1800.0; + } +} +""" + +model = opensysml.loads(source) +if not model.ok: + for diagnostic in model.diagnostics: + print(diagnostic) + raise SystemExit("The model has errors.") + +print(model.eval("mass", subject="Demo::sedan")) ``` -The script downloads every `sysml-grpc-*` asset of that release, hashes what it -downloaded, refuses the release if a `.sha256` sidecar disagrees with the asset -it describes, rewrites the table in place, and syncs it into every client that -ships a copy (`python3 scripts/sync-release-digests.py`, whose `--check` mode CI -runs so a copy cannot drift). `--check` re-hashes the assets of -every pinned release and fails on any disagreement, catching a release -republished with another binary. A opensysml release therefore pins the service -releases published before it; asking for a newer one needs a newer opensysml (or -the explicit opt-in above), and leaves an already-downloaded binary serving -rather than refusing to start — only a digest that *contradicts* a pin is -treated as tampering and refuses to fall back. - -## The FMI runner (optional) - -`pip install opensysml[fmi]` adds FMPy and the `opensysml-fmi-runner` executable: -the reference runner the `tool:fmi` engine speaks the fmi/1 protocol to — one JSON -request on standard input, one reply on standard output — simulating -co-simulation and model-exchange FMUs. Point `OPENSYSML_FMI_RUNNER` at it and a -`calc def` imported from an FMU (`sysml -convert sysml model.fmu`) evaluates -through it; see docs/reference/fmi.md. - -## Version - -`opensysml/_version.py` is the only declaration: the packaging metadata reads it, -`opensysml.__version__` reports the installed distribution's version, and -`scripts/check_version.py` fails a release whose tag names another version. The -version tests therefore require the tree under test to be the installed -distribution — `pip install -e client/python/`. A wheel of another version installed -beside the source tree makes them fail with that remedy: the artifact is what is -stale, not the declaration. - -## Generated typed classes - -`python -m opensysml.generate model.sysml -o model_types.py` emits one class per -SysML *definition*, and the generated hierarchy follows the model's -generalization edges: `specializes`, `subsets` and `redefines` all become base -classes, because Python has a single notion of inheritance. What tells the two -apart is the members, not the bases: - -- a **redefinition** reuses the redefined feature's name, so its property - overrides the base class's property of that name, and takes over the type and - multiplicity it does not restate (`attribute :>> mass = 2.0;` stays `float`, - and a redefined `0..*` feature stays a `list[...]`); -- a **subset** under a new name adds a property beside the base class's one, and - likewise inherits the type and multiplicity it leaves out. - -With **multiple supertypes**, bases are emitted in declaration order, a target -named twice appearing once, and Python resolves members left to right by its -usual MRO. A base another declared base already specializes is left implicit — -`Hybrid :> Vehicle, Electric` where `Electric :> Vehicle` emits -`class Hybrid(Electric)`, which Python can linearize and which keeps both -relationships and `Electric`'s properties. Where no order linearizes at all -(two bases specializing a shared pair in opposite orders), rather than emit a -module that fails to import, the generator keeps the bases it can and records -what it left out as a comment on the class, naming the edge: - -```python -class Both(One): - # specializes Demo::Two, left out: Python cannot linearize it with the bases above +```text +1800.0 ``` -A base outside the generated model is reported the same way. Both are the model's -hierarchy being wider than Python's, not facts being discarded — the service -reports every edge, and `Symbol.specializations` still carries them all. - -**Limitation, unchanged:** only structural usages (`attribute`, `part`, `item`, -`occurrence`, `individual`, `port`, `enum`) become properties. Behavioral and -connector usages — `action`, `state`, `calc`, `constraint`, `requirement`, -`connection`, `flow`, `interface`, `allocation`, `case` — are not instance feature values, -so a generated class has no member for them; reach them through -`model["Demo::Vehicle"]`, `verify_constraint` and `verify_satisfaction`. +## The service -## Diagnostics +The client talks to a `sysml-grpc` service. You do not have to install or +start one: the first connection starts a private service for the current +interpreter and stops it when the interpreter exits. -A `Diagnostic` has `severity`, `message`, `code` and a location (`file`, -`start_line`, `start_column`, `end_line`, `end_column`, or the raw `span`). Branch -on `code`, not on the message text: `"syntax"` for a syntax error, a validation -code such as `"unresolved"` for a finding, `"choice-point"` and -`"guard-unevaluable"` for a run's notes; `""` when the service assigned none. A service -that populates `code` advertises `opensysml.capabilities.CAPABILITY_DIAGNOSTIC_CODES`; without -it every code is `""`. +To find the service binary, the client checks, in order: -```python -model = opensysml.load("model.sysml") -unresolved = [d for d in model.diagnostics if d.code == "unresolved"] -``` +1. `$OPENSYSML_BINARY`, if set. +2. The shared cache at `~/.opensysml/bin/sysml-grpc`. +3. A download of the OpenSysML release this package was built against. +4. A `sysml-grpc` on `$PATH`. -## Names that shadow builtins - -Neither builtin name is a live part of the API any more: the module-level -evaluation function is `opensysml.evaluate`, and the execution error is -`opensysml.ExecutionError`. `opensysml.eval` and `opensysml.errors.RuntimeError` -remain as deprecated aliases that warn on use, out of their modules' `__all__`, -so a star-import binds neither. - -```python -import opensysml +A downloaded binary is verified against a SHA-256 digest shipped inside the +package, so a normal `pip install opensysml` followed by `opensysml.connect()` +needs no environment variables and no extra setup. Downloading another release +is also verified, through its signed checksum manifest; an unverifiable download +is refused rather than trusted. -opensysml.evaluate("1 + 2", file_path="model.sysml") # opensysml.eval warns -model.eval("mass", subject="Demo::sedan") # a method shadows nothing -``` +To use a service you run yourself, pass its address: ```python -from opensysml import eval # shadows the builtin in this module — avoid +model = opensysml.connect("localhost:50051").load("model.sysml") ``` -Guidance for this package and for code around it: - -- **Call `opensysml.evaluate`.** `opensysml.eval` still works and returns the same - result, warning `DeprecationWarning`; it goes away in 1.0.0. -- Import the package, not its names, for anything named like a builtin. -- Catch `opensysml.ExecutionError` (or its base `opensysml.OpenSysMLError`), never - `opensysml.errors.RuntimeError`, which warns and is due for removal. -- Do not name a new public function or exception after a builtin. - -0.2.0 therefore publishes `evaluate` as the name to write, with both builtin -names deprecated rather than removed, so code written against 0.1.x keeps -running until 1.0.0. - -## Running the tests - -```bash -make build # builds bin/sysml-grpc -pip install -e client/python/ && pip install pytest pytest-mock -python -m pytest client/python/tests/ -q # service-backed tests skip -``` - -Tests that need a service skip when none answers on `localhost:50051` and no -binary is available to spawn one. Where a service *is* provided — as in CI — -export `OPENSYSML_REQUIRE_SERVICE=1`, and its absence fails instead of skipping. +The [Python client guide](https://opensysml.org/guide/09-clients/) covers the +cache, offline use, trust configuration and connecting to an external service. ## Documentation -- Using the client: - [docs/guide/09-clients.md](https://github.com/Open-MBEE/OpenSysML/blob/main/docs/guide/09-clients.md) - — installing the service binary, loading a model, instances, verification, conversion - and queries -- The API surface, generated typed classes, latency and the module map: - [docs/reference/python-api.md](https://github.com/Open-MBEE/OpenSysML/blob/main/docs/reference/python-api.md) -- Installing from source and running the tests: - [INSTALL.md](https://github.com/Open-MBEE/OpenSysML/blob/main/client/python/INSTALL.md) +- [Python client guide](https://opensysml.org/guide/09-clients/) +- [API reference](https://opensysml.org/reference/python-api/) +- [Metamodel classes and JSON](https://opensysml.org/reference/python-metamodel/) + +To install from a checkout, run tests, regenerate protobufs or pin release +digests, see +[DEVELOPING.md](https://github.com/Open-MBEE/OpenSysML/blob/main/client/python/DEVELOPING.md). diff --git a/client/python/opensysml/__init__.py b/client/python/opensysml/__init__.py index be684db51b..a5f494b681 100644 --- a/client/python/opensysml/__init__.py +++ b/client/python/opensysml/__init__.py @@ -52,6 +52,7 @@ format_of_path, is_experimental, ) from opensysml.edit import AppliedEdit, Body, EditedDocument, EditResult, Editor +from opensysml.metamodel import read_json from opensysml.errors import ( OpenSysMLError, AnalysisRunError, ChecksumMismatchError, ConnectionError, ConversionError, EditError, EditResultError, EditTargetError, ExecutionError, @@ -62,7 +63,7 @@ ReferencedElsewhereError, Referrer, InstanceTypeError, InvalidRequestError, ManifestSignatureError, ModelError, ModelFileNotFoundError, ModelNotFoundError, ServiceError, - ServiceTimeoutError, StaleServiceError, SymbolNotFoundError, + ServiceTimeoutError, SigstoreUnavailableError, StaleServiceError, SymbolNotFoundError, TypeMismatchError, UnpinnedReleaseError, UnsignedReleaseError, UnsupportedOperationError, UnsupportedValueError, WrongKindError, ) @@ -98,12 +99,12 @@ "MissingCapabilityError", "CAPABILITY_CONSTRAINT_BODY_AUTHORING", "CAPABILITY_STATE_ACTION_AUTHORING", "ModelError", "ModelFileNotFoundError", "ModelNotFoundError", - "ServiceError", "ServiceTimeoutError", "StaleServiceError", + "ServiceError", "ServiceTimeoutError", "SigstoreUnavailableError", "StaleServiceError", "SymbolNotFoundError", "TypeMismatchError", "UnpinnedReleaseError", "UnsignedReleaseError", "UnsupportedOperationError", "UnsupportedValueError", "WrongKindError", - "load", "loads", "parse_sources", "connect", "convert", + "load", "loads", "parse_sources", "connect", "convert", "read_json", # "eval" is deprecated in favour of "evaluate", so it is not exported. "evaluate", "instantiate", "DEFAULT_PORT", "split_target", diff --git a/client/python/opensysml/_version.py b/client/python/opensysml/_version.py index 4e1ff23725..ca18f53b5a 100644 --- a/client/python/opensysml/_version.py +++ b/client/python/opensysml/_version.py @@ -6,4 +6,4 @@ this value with the release tag before anything is uploaded. """ -VERSION = "0.9.1" +VERSION = "0.9.2" diff --git a/client/python/opensysml/binary.py b/client/python/opensysml/binary.py index 7c6b416b6b..610275a1e9 100644 --- a/client/python/opensysml/binary.py +++ b/client/python/opensysml/binary.py @@ -5,6 +5,7 @@ import json import os import platform +import re import shutil import stat import threading @@ -12,9 +13,11 @@ from opensysml.errors import ( ChecksumMismatchError, ConnectionError, + SigstoreUnavailableError, UnpinnedReleaseError, UnsignedReleaseError, ) +from opensysml._version import VERSION from opensysml.signing import ( BUNDLE_ASSET, MANIFEST_ASSET, @@ -108,7 +111,7 @@ def _load_pinned_digests(): #: SHA-256 digest expected of each release asset, keyed by repository, release tag #: and asset name: independent of the origin serving the download, so a republished #: release is refused. Synced from client/release-digests.json; see "Pinned release -#: digests" in client/python/README.md. +#: digests" in client/python/DEVELOPING.md. PINNED_SHA256 = _load_pinned_digests() #: Set to the repository whose unpinned downloads may be accepted (`1` for any), @@ -121,6 +124,26 @@ def _load_pinned_digests(): BINARY_ENV = 'OPENSYSML_BINARY' +_BUILT_AGAINST_VERSION = re.compile( + r'^(?P\d+\.\d+\.\d+)(?:(?Pa|b|rc)(?P\d+))?$' +) +_SEMVER_PHASE = {'a': 'alpha', 'b': 'beta', 'rc': 'rc'} + + +def built_against_releases(): + """The SemVer tags corresponding to this opensysml distribution's version.""" + match = _BUILT_AGAINST_VERSION.fullmatch(VERSION) + if match is None: + return (f'v{VERSION}',) + phase = match['phase'] + if phase is None: + return (f"v{match['release']}",) + release = match['release'] + suffix = _SEMVER_PHASE[phase] + number = match['number'] + return (f'v{release}-{suffix}{number}', f'v{release}-{suffix}.{number}') + + def default_github_repo(): """Repository releases are downloaded from. @@ -180,8 +203,9 @@ def expected_digest(version, asset, served_digest, github_repo=None, github_repo (str, optional): GitHub repository (owner/repo) verified_digest (str, optional): Digest from the release's signed checksum manifest, once its signature verified - unverified_reason (str, optional): Why there is no verified digest, said - in the refusal when there is no pin either + unverified_reason (str or UnsignedReleaseError, optional): Why there is + no verified digest, said in the refusal when there is no pin either; + a :class:`SigstoreUnavailableError` makes the remedy name the package Returns: str: The digest to verify the download against @@ -201,14 +225,12 @@ def expected_digest(version, asset, served_digest, github_repo=None, # origin vouching for itself: as good as a pin. return verified_digest if not unpinned_downloads_allowed(repo): - unverified = f" and {unverified_reason}" if unverified_reason else "" + unverified = f", and {unverified_reason}" if unverified_reason else "" raise UnpinnedReleaseError( f"opensysml pins no SHA-256 digest for {asset} of {version} of {repo}" f"{unverified}, so the only checksum available is the one served beside " - f"the binary, which a compromised release would serve too. Upgrade " - f"opensysml to a release that pins {version}, ask for a pinned release " - f"with version=, or accept same-origin trust for this repository by " - f"setting ${ALLOW_UNPINNED_ENV}={repo} (or =1 for any repository)." + f"the binary, which a compromised release would serve too; it was not " + f"downloaded. {unpinned_remedy(version, repo, unverified_reason)}" ) warnings.warn( f"opensysml pins no digest for {asset} of {version} of {repo}; verifying it " @@ -233,6 +255,43 @@ def expected_digest(version, asset, served_digest, github_repo=None, return pinned +def unpinned_remedy(version, repo, unverified_reason=None): + """What to do about a release nothing vouches for. + + A release of opensysml ships the digests of its own core release, so a + refusal only arises for another release, or for an opensysml older than the + release asked for. When the manifest went unchecked because sigstore is not + installed, the remedy says so first: the release may well be signed, and + only this install cannot tell. + + Args: + version (str): Release tag, resolved (never 'latest') + repo (str): GitHub repository (owner/repo) + unverified_reason (str or UnsignedReleaseError, optional): Why the signed + manifest did not vouch for the release + + Returns: + str: The remedies, as a sentence + """ + same_origin = ( + f"accept same-origin trust for this repository by setting " + f"${ALLOW_UNPINNED_ENV}={repo} (or =1 for any repository)." + ) + if isinstance(unverified_reason, SigstoreUnavailableError): + return ( + f"A release of opensysml ships the digests of its own core release, so " + f"this arises only for another release or for an opensysml older than " + f"{version} (this is opensysml {VERSION}): install the sigstore package " + f"({unverified_reason.install_command}) so the signature on {version}'s " + f"{MANIFEST_ASSET} can be verified, upgrade opensysml to a release that " + f"pins {version}, ask for a pinned release with version=, or {same_origin}" + ) + return ( + f"Upgrade opensysml to a release that pins {version}, ask for a pinned " + f"release with version=, or {same_origin}" + ) + + def release_download_url(version, asset, github_repo=None): """URL a release publishes an asset at. @@ -716,7 +775,7 @@ def _download_binary_locked(version, github_repo): version, binary_name, github_repo ) except UnsignedReleaseError as e: - unverified_reason = str(e) + unverified_reason = e # The pinned digest wins, so a release republished with another binary # cannot vouch for itself through the sidecar it serves. expected_checksum = expected_digest( @@ -883,17 +942,15 @@ def ensure_binary(force_download=False, version=None, github_repo=None): """Ensure sysml-grpc binary is available, downloading if necessary. Resolution is the order every client shares: $OPENSYSML_BINARY, then the - shared cache at ~/.opensysml/bin, then a release download when one is asked - for, then a sysml-grpc on $PATH. - - A cached binary is reused only when it is the release asked for; when no - version is asked for, whatever is cached stands, locally built included. A - replacement that cannot be downloaded leaves the working cache in place, and - a download that was asked for and failed is an error rather than a fall - through to $PATH, whose binary is of no known release. The whole cache - decision is made holding the shared cache lock, so a concurrent installer - - in another process or in the Java client - cannot install between the check - and the replacement. + shared cache at ~/.opensysml/bin, then a release download, then a + sysml-grpc on $PATH. + + An explicit version comes from ``version`` or $OPENSYSML_GRPC_VERSION. + Without one, the client tries the SemVer tag or tags corresponding to its + built-against version, except that an unrecorded hand-installed cache remains + in use. A failed replacement leaves the working cache in place; an unavailable + implicit download may use $PATH, but integrity failures are never bypassed. + The whole cache decision is made holding the shared cache lock. What is returned for the shared cache is a link to it under its own digest, not the cache path itself: the cache is replaced in place, so starting it @@ -906,10 +963,8 @@ def ensure_binary(force_download=False, version=None, github_repo=None): force_download (bool): If True, download even if binary exists version (str, optional): Specific version tag to download (e.g. 'v0.1.0'), or 'latest' for the newest release. If None, - $OPENSYSML_GRPC_VERSION is used; without it - auto-download is disabled and the binary must be - pre-installed via `make build`, named by - $OPENSYSML_BINARY, or found on $PATH. + $OPENSYSML_GRPC_VERSION is used, then the + built-against release tags when neither is set. Returns: str: Path to binary, digest-named when it is the shared cache @@ -920,90 +975,130 @@ def ensure_binary(force_download=False, version=None, github_repo=None): binary_path = get_binary_path() if version is None: version = os.environ.get('OPENSYSML_GRPC_VERSION') or None + implicit = version is None + versions = built_against_releases() if implicit else (version,) + requested_versions = ', '.join(versions) # Neither of these touches the cache, so neither takes the lock over it. named = named_binary() if named is not None: return named - with cache_lock(): - chosen = _ensure_binary_locked( - force_download, version, github_repo, binary_path - ) - if chosen is not None: + try: + with cache_lock(): + chosen = _ensure_binary_locked( + force_download, versions, github_repo, binary_path, implicit + ) return stable_binary() if chosen == binary_path else chosen + except UnpinnedReleaseError as e: + if not implicit: + raise + return _fallback_to_path_or_raise(requested_versions, binary_path, e) + except ChecksumMismatchError: + raise + except ConnectionError as e: + if not implicit: + raise + return _fallback_to_path_or_raise(requested_versions, binary_path, e) + +def _fallback_to_path_or_raise(version, binary_path, download_error): on_path = binary_on_path() if on_path is not None: + warnings.warn( + f"Could not download sysml-grpc release {version} ({download_error}); " + f"using {on_path} from $PATH instead.", + stacklevel=3, + ) return on_path + reason = str(download_error).rstrip('.') + detail = f"Could not download the sysml-grpc release {version}: {reason}." + if '404' in str(download_error): + detail += " This may be an unreleased checkout." raise ConnectionError( - f"Binary not found at {binary_path}, named by ${BINARY_ENV} or on $PATH, and " - f"auto-download disabled. Looked at: ${BINARY_ENV}, {binary_path}, $PATH.\n" + f"{detail} Looked at: ${BINARY_ENV}, {binary_path}, $PATH.\n" f" fix: build it (`make build-grpc`) and set ${BINARY_ENV} to the result, or\n" - f" ask for a release to download by setting $OPENSYSML_GRPC_VERSION " + f" ask for another release by setting $OPENSYSML_GRPC_VERSION " f"(e.g. latest), or passing version= here, or\n" f" install a sysml-grpc on $PATH, or\n" f" start a service yourself and pass its address to connect()." ) -def _ensure_binary_locked(force_download, version, github_repo, binary_path): - """The cache or a download of the release asked for, with the shared cache held. +def _cached_binary(force_download, versions, github_repo, binary_path, implicit): + """The cached executable and why it is stale, or (None, None) with nothing cached. + + A stale reason of None keeps the cache. An unrecorded executable may be a + developer's hand-installed build, so an implicit request keeps it. + """ + if force_download or not os.path.exists(binary_path) or not os.access(binary_path, os.X_OK): + return None, None + if implicit and not os.path.exists(metadata_path()): + return binary_path, None + if implicit and cached_release(github_repo) in versions: + return binary_path, None + return binary_path, stale_cache_reason(versions[0], github_repo) + + +def _unavailable_details(unavailable): + return '; '.join(f'{candidate}: {error}' for candidate, error in unavailable) + + +def _ensure_binary_locked(force_download, versions, github_repo, binary_path, implicit=False): + """The cache or a download of the release tags asked for, with the cache held. Returns: - str or None: The binary chosen, or None when nothing is cached and no - release was asked for, which leaves $PATH to answer - """ - # Check if binary already exists and is executable - cached = None - if not force_download and os.path.exists(binary_path): - if os.access(binary_path, os.X_OK): - stale = stale_cache_reason(version, github_repo) - if stale is None: - return binary_path - cached = binary_path - warnings.warn( - f"Replacing the cached sysml-grpc: {stale}. Downloading {version}.", - stacklevel=3, - ) - - # Nothing cached and no release asked for, so $PATH is next, outside the lock. - if version is None: - # A download asked for with nothing to download is an error, as one that - # fails is: neither is answered by a $PATH binary of unknown release. - if force_download: - raise ConnectionError( - "A download was asked for without a release to download. Set " - "$OPENSYSML_GRPC_VERSION, or pass version= here." - ) - return None - - # Download binary with explicit version - try: - return download_binary(version=version, github_repo=github_repo) - except UnpinnedReleaseError as e: - # A release this opensysml pins nothing for contradicts nothing, so a - # working cache stands. - if cached is None: - raise - warnings.warn( - f"Keeping the cached sysml-grpc at {cached}: {version} was not downloaded " - f"({e}). It may be an older release than asked for.", - stacklevel=3, + str: The executable path chosen from the cache or release download + """ + version = versions[0] + requested_versions = ', '.join(versions) + cached, stale = _cached_binary(force_download, versions, github_repo, binary_path, implicit) + if cached is not None: + if stale is None: + return cached + download_target = ( + f'one of {requested_versions}' if implicit and len(versions) > 1 else version ) - return cached - except ChecksumMismatchError: - # A download that may have been tampered with is never answered from the - # cache, so it must not reach the ConnectionError fallback below. - raise - except ConnectionError as e: - if cached is None: - raise - # A release with no binary to fetch is no reason to lose a working one. warnings.warn( - f"Keeping the cached sysml-grpc at {cached}: {version} could not be " - f"downloaded ({e}). It may be an older release than asked for.", + f"Replacing the cached sysml-grpc: {stale}. Downloading {download_target}.", stacklevel=3, ) + + unavailable = [] + for candidate in versions: + try: + return download_binary(version=candidate, github_repo=github_repo) + except UnpinnedReleaseError as e: + unavailable.append((candidate, e)) + except ChecksumMismatchError: + # A download that may have been tampered with is never answered from + # the cache or replaced by another candidate. + raise + except ConnectionError as e: + unavailable.append((candidate, e)) + + if cached is not None: + if len(unavailable) == 1: + candidate, error = unavailable[0] + warnings.warn( + f"Keeping the cached sysml-grpc at {cached}: {candidate} could not " + f"be downloaded ({error}). It may be an older release than asked for.", + stacklevel=3, + ) + else: + warnings.warn( + f"Keeping the cached sysml-grpc at {cached}: none of the built-against " + f"releases {requested_versions} could be downloaded " + f"({_unavailable_details(unavailable)}). It may be an older release than " + "asked for.", + stacklevel=3, + ) return cached + + if len(unavailable) == 1: + raise unavailable[0][1] + raise ConnectionError( + f"Could not download any of the built-against releases " + f"({requested_versions}): {_unavailable_details(unavailable)}" + ) diff --git a/client/python/opensysml/connection.py b/client/python/opensysml/connection.py index 41b62c86b0..88c00e7094 100644 --- a/client/python/opensysml/connection.py +++ b/client/python/opensysml/connection.py @@ -1029,12 +1029,13 @@ def __init__(self, host='localhost', port=None, auto_start=True, named. If False, connect to the address named, or to the standard port, and start nothing (default: True) version (str, optional): Release tag the service must report, or - 'latest'. Defaults to $OPENSYSML_GRPC_VERSION, the same tag the - binary cache is checked against; without either, whatever - release answers is accepted. Private children are held per - requirement, so a connection never joins one of another release. - An externally managed service that is not listening yet is - checked at the first call instead. + 'latest'. Defaults to $OPENSYSML_GRPC_VERSION for service + compatibility checks; without either, any release is accepted. + Binary resolution separately defaults to the release this client + was built against. Private children are held per requirement, + so a connection never joins one of another release. An externally + managed service that is not listening yet is checked at the first + call instead. require_capabilities (iterable, optional): Capability names the service must report, checked once at connect time rather than when the first call needing one is made diff --git a/client/python/opensysml/errors.py b/client/python/opensysml/errors.py index d27af1c447..6546d36c2c 100644 --- a/client/python/opensysml/errors.py +++ b/client/python/opensysml/errors.py @@ -78,6 +78,26 @@ class UnsignedReleaseError(UnpinnedReleaseError): """ +class SigstoreUnavailableError(UnsignedReleaseError): + """Raised when the ``sigstore`` package the manifest is verified with is absent. + + Or a package it depends on; the message names which. The release may well + be signed; this install cannot check. An + :class:`UnsignedReleaseError`, since nothing was verified either way, but its + own class so the remedy can name the package to install rather than the + release. A release of opensysml ships the digests of its own core release, so + this only arises for another release, or for an opensysml older than the + release it is asked for. + + Attributes: + install_command (str): The ``pip install`` that provides the package + """ + + #: The dependency opensysml declares, which brings its own dependencies + #: with it; a complete install already has them all. + install_command = "python -m pip install 'sigstore>=4.5.0,<5'" + + class ManifestSignatureError(ChecksumMismatchError): """Raised when the signature on a release's checksum manifest does not verify. diff --git a/client/python/opensysml/generate.py b/client/python/opensysml/generate.py index a631297d2a..8ebae5c647 100644 --- a/client/python/opensysml/generate.py +++ b/client/python/opensysml/generate.py @@ -45,7 +45,7 @@ # Definition kinds get a class; these usage kinds become properties on the # enclosing class. Behavioral and connector usages (action, state, calc, # constraint, requirement, connection, flow, interface, allocation, case) are -# not instance feature values and are skipped — see client/python/README.md. +# not instance feature values and are skipped — see client/python/DEVELOPING.md. FEATURE_KINDS = frozenset( { "attributeusage", diff --git a/client/python/opensysml/metamodel/__init__.py b/client/python/opensysml/metamodel/__init__.py new file mode 100644 index 0000000000..cc1aa22f1b --- /dev/null +++ b/client/python/opensysml/metamodel/__init__.py @@ -0,0 +1,31 @@ +"""Generated metamodel classes and a reader for exported JSON documents.""" + +# pyright: reportUnsupportedDunderAll=false + +from ._generated import * +from ._generated import __all__ as _generated_all +from ._reader import ElementGraph, read_json +from ._runtime import ( + Many, + MalformedDocument, + MalformedValue, + MetamodelError, + NotSupplied, + Opt, + UnknownJSONKey, + UnresolvedReference, +) + +__all__ = [ + *_generated_all, + "ElementGraph", + "Many", + "MalformedDocument", + "MalformedValue", + "MetamodelError", + "NotSupplied", + "Opt", + "UnknownJSONKey", + "UnresolvedReference", + "read_json", +] diff --git a/client/python/opensysml/metamodel/_generated.py b/client/python/opensysml/metamodel/_generated.py new file mode 100644 index 0000000000..4a18e9de03 --- /dev/null +++ b/client/python/opensysml/metamodel/_generated.py @@ -0,0 +1,3647 @@ +# Code generated by tools/gen/pymetamodel. DO NOT EDIT. +# Metamodel: 20250201 +# Pilot tag: 2026-08 +# Pilot commit: 692170b71867353b8f90341e61556f49a5beb0e5 +# Regenerate with: make python-metamodel + +from __future__ import annotations + +import builtins +from enum import Enum +from types import MappingProxyType +from typing import ClassVar, Mapping + +from ._runtime import Many, Opt, _ElementBase # pyright: ignore[reportPrivateUsage] + +METAMODEL_VERSION = "20250201" +SOURCE_TAG = "2026-08" +SOURCE_COMMIT = "692170b71867353b8f90341e61556f49a5beb0e5" + +class FeatureDirectionKind(str, Enum): + IN = "in" + INOUT = "inout" + OUT = "out" + + +class PortionKind(str, Enum): + TIMESLICE = "timeslice" + SNAPSHOT = "snapshot" + + +class RequirementConstraintKind(str, Enum): + ASSUMPTION = "assumption" + REQUIREMENT = "requirement" + + +class StateSubactionKind(str, Enum): + ENTRY = "entry" + DO = "do" + EXIT = "exit" + + +class TransitionFeatureKind(str, Enum): + TRIGGER = "trigger" + GUARD = "guard" + EFFECT = "effect" + + +class TriggerKind(str, Enum): + WHEN = "when" + AT = "at" + AFTER = "after" + + +class VisibilityKind(str, Enum): + PRIVATE = "private" + PROTECTED = "protected" + PUBLIC = "public" + + +class Element(_ElementBase): + "Abstract metaclass ``Element``." + __slots__ = () + METACLASS: ClassVar[str] = "Element" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **_ElementBase.JSON_KEYS, + "aliasIds": "alias_ids", + "declaredName": "declared_name", + "declaredShortName": "declared_short_name", + "documentation": "documentation", + "elementId": "element_id", + "isImpliedIncluded": "is_implied_included", + "isLibraryElement": "is_library_element", + "name": "name", + "ownedAnnotation": "owned_annotation", + "ownedElement": "owned_element", + "ownedRelationship": "owned_relationship", + "owner": "owner", + "owningMembership": "owning_membership", + "owningNamespace": "owning_namespace", + "owningRelationship": "owning_relationship", + "qualifiedName": "qualified_name", + "shortName": "short_name", + "textualRepresentation": "textual_representation", + }) + alias_ids: Many[str] = Many("aliasIds", "str", ordered=True) + "``Element::aliasIds`` (many, ordered)." + aliasIds = alias_ids + declared_name: Opt[str] = Opt("declaredName", "str") + "``Element::declaredName`` (single)." + declaredName = declared_name + declared_short_name: Opt[str] = Opt("declaredShortName", "str") + "``Element::declaredShortName`` (single)." + declaredShortName = declared_short_name + documentation: Many[Documentation] = Many("documentation", "Documentation", ordered=True, derived=True) + "``Element::documentation`` (many, ordered, derived)." + element_id: Opt[str] = Opt("elementId", "str") + "``Element::elementId`` (single)." + elementId = element_id + is_implied_included: Opt[bool] = Opt("isImpliedIncluded", "bool") + "``Element::isImpliedIncluded`` (single)." + isImpliedIncluded = is_implied_included + is_library_element: Opt[bool] = Opt("isLibraryElement", "bool", derived=True) + "``Element::isLibraryElement`` (single, derived)." + isLibraryElement = is_library_element + name: Opt[str] = Opt("name", "str", derived=True) + "``Element::name`` (single, derived)." + owned_annotation: Many[Annotation] = Many("ownedAnnotation", "Annotation", ordered=True, derived=True) + "``Element::ownedAnnotation`` (many, ordered, derived)." + ownedAnnotation = owned_annotation + owned_element: Many[Element] = Many("ownedElement", "Element", ordered=True, derived=True) + "``Element::ownedElement`` (many, ordered, derived)." + ownedElement = owned_element + owned_relationship: Many[Relationship] = Many("ownedRelationship", "Relationship", ordered=True) + "``Element::ownedRelationship`` (many, ordered)." + ownedRelationship = owned_relationship + owner: Opt[Element] = Opt("owner", "Element", derived=True) + "``Element::owner`` (single, derived)." + owning_membership: Opt[OwningMembership] = Opt("owningMembership", "OwningMembership", derived=True) + "``Element::owningMembership`` (single, derived)." + owningMembership = owning_membership + owning_namespace: Opt[Namespace] = Opt("owningNamespace", "Namespace", derived=True) + "``Element::owningNamespace`` (single, derived)." + owningNamespace = owning_namespace + owning_relationship: Opt[Relationship] = Opt("owningRelationship", "Relationship") + "``Element::owningRelationship`` (single)." + owningRelationship = owning_relationship + qualified_name: Opt[str] = Opt("qualifiedName", "str", derived=True) + "``Element::qualifiedName`` (single, derived)." + qualifiedName = qualified_name + short_name: Opt[str] = Opt("shortName", "str", derived=True) + "``Element::shortName`` (single, derived)." + shortName = short_name + textual_representation: Many[TextualRepresentation] = Many("textualRepresentation", "TextualRepresentation", ordered=True, derived=True) + "``Element::textualRepresentation`` (many, ordered, derived)." + textualRepresentation = textual_representation + + +class AnnotatingElement(Element): + "Metaclass ``AnnotatingElement``." + __slots__ = () + METACLASS: ClassVar[str] = "AnnotatingElement" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Element.JSON_KEYS, + "annotatedElement": "annotated_element", + "annotation": "annotation", + "ownedAnnotatingRelationship": "owned_annotating_relationship", + "owningAnnotatingRelationship": "owning_annotating_relationship", + }) + annotated_element: Many[Element] = Many("annotatedElement", "Element", ordered=True, derived=True) + "``AnnotatingElement::annotatedElement`` (many, ordered, derived)." + annotatedElement = annotated_element + annotation: Many[Annotation] = Many("annotation", "Annotation", ordered=True, derived=True) + "``AnnotatingElement::annotation`` (many, ordered, derived)." + owned_annotating_relationship: Many[Annotation] = Many("ownedAnnotatingRelationship", "Annotation", ordered=True, derived=True) + "``AnnotatingElement::ownedAnnotatingRelationship`` (many, ordered, derived)." + ownedAnnotatingRelationship = owned_annotating_relationship + owning_annotating_relationship: Opt[Annotation] = Opt("owningAnnotatingRelationship", "Annotation", derived=True) + "``AnnotatingElement::owningAnnotatingRelationship`` (single, derived)." + owningAnnotatingRelationship = owning_annotating_relationship + + +class Comment(AnnotatingElement): + "Metaclass ``Comment``." + __slots__ = () + METACLASS: ClassVar[str] = "Comment" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **AnnotatingElement.JSON_KEYS, + "body": "body", + "locale": "locale", + }) + body: Opt[str] = Opt("body", "str") + "``Comment::body`` (single)." + locale: Opt[str] = Opt("locale", "str") + "``Comment::locale`` (single)." + + +class Documentation(Comment): + "Metaclass ``Documentation``." + __slots__ = () + METACLASS: ClassVar[str] = "Documentation" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Comment.JSON_KEYS, + "documentedElement": "documented_element", + }) + documented_element: Opt[Element] = Opt("documentedElement", "Element", derived=True) + "``Documentation::documentedElement`` (single, derived). Redefines ``AnnotatingElement::annotatedElement``." + documentedElement = documented_element + + +class Namespace(Element): + "Metaclass ``Namespace``." + __slots__ = () + METACLASS: ClassVar[str] = "Namespace" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Element.JSON_KEYS, + "importedMembership": "imported_membership", + "member": "member", + "membership": "membership", + "ownedImport": "owned_import", + "ownedMember": "owned_member", + "ownedMembership": "owned_membership", + }) + imported_membership: Many[Membership] = Many("importedMembership", "Membership", ordered=True, derived=True) + "``Namespace::importedMembership`` (many, ordered, derived)." + importedMembership = imported_membership + member: Many[Element] = Many("member", "Element", ordered=True, derived=True) + "``Namespace::member`` (many, ordered, derived)." + membership: Many[Membership] = Many("membership", "Membership", ordered=True, derived=True) + "``Namespace::membership`` (many, ordered, derived)." + owned_import: Many[Import] = Many("ownedImport", "Import", ordered=True, derived=True) + "``Namespace::ownedImport`` (many, ordered, derived)." + ownedImport = owned_import + owned_member: Many[Element] = Many("ownedMember", "Element", ordered=True, derived=True) + "``Namespace::ownedMember`` (many, ordered, derived)." + ownedMember = owned_member + owned_membership: Many[Membership] = Many("ownedMembership", "Membership", ordered=True, derived=True) + "``Namespace::ownedMembership`` (many, ordered, derived)." + ownedMembership = owned_membership + + +class Package(Namespace): + "Metaclass ``Package``." + __slots__ = () + METACLASS: ClassVar[str] = "Package" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Namespace.JSON_KEYS, + "filterCondition": "filter_condition", + }) + filter_condition: Many[Expression] = Many("filterCondition", "Expression", ordered=True, derived=True) + "``Package::filterCondition`` (many, ordered, derived)." + filterCondition = filter_condition + + +class LibraryPackage(Package): + "Metaclass ``LibraryPackage``." + __slots__ = () + METACLASS: ClassVar[str] = "LibraryPackage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Package.JSON_KEYS, + "isStandard": "is_standard", + }) + is_standard: Opt[bool] = Opt("isStandard", "bool") + "``LibraryPackage::isStandard`` (single)." + isStandard = is_standard + + +class Relationship(Element): + "Abstract metaclass ``Relationship``." + __slots__ = () + METACLASS: ClassVar[str] = "Relationship" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Element.JSON_KEYS, + "isImplied": "is_implied", + "ownedRelatedElement": "owned_related_element", + "owningRelatedElement": "owning_related_element", + "relatedElement": "related_element", + "source": "source", + "target": "target", + }) + is_implied: Opt[bool] = Opt("isImplied", "bool") + "``Relationship::isImplied`` (single)." + isImplied = is_implied + owned_related_element: Many[Element] = Many("ownedRelatedElement", "Element", ordered=True) + "``Relationship::ownedRelatedElement`` (many, ordered)." + ownedRelatedElement = owned_related_element + owning_related_element: Opt[Element] = Opt("owningRelatedElement", "Element") + "``Relationship::owningRelatedElement`` (single)." + owningRelatedElement = owning_related_element + related_element: Many[Element] = Many("relatedElement", "Element", ordered=True, derived=True) + "``Relationship::relatedElement`` (many, ordered, derived)." + relatedElement = related_element + source: Many[Element] = Many("source", "Element", ordered=True) + "``Relationship::source`` (many, ordered)." + target: Many[Element] = Many("target", "Element", ordered=True) + "``Relationship::target`` (many, ordered)." + + +class Annotation(Relationship): + "Metaclass ``Annotation``." + __slots__ = () + METACLASS: ClassVar[str] = "Annotation" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Relationship.JSON_KEYS, + "annotatedElement": "annotated_element", + "annotatingElement": "annotating_element", + "ownedAnnotatingElement": "owned_annotating_element", + "owningAnnotatedElement": "owning_annotated_element", + "owningAnnotatingElement": "owning_annotating_element", + }) + annotated_element: Opt[Element] = Opt("annotatedElement", "Element") + "``Annotation::annotatedElement`` (single). Redefines ``Relationship::target``." + annotatedElement = annotated_element + annotating_element: Opt[AnnotatingElement] = Opt("annotatingElement", "AnnotatingElement", derived=True) + "``Annotation::annotatingElement`` (single, derived). Redefines ``Relationship::source``." + annotatingElement = annotating_element + owned_annotating_element: Opt[AnnotatingElement] = Opt("ownedAnnotatingElement", "AnnotatingElement", derived=True) + "``Annotation::ownedAnnotatingElement`` (single, derived)." + ownedAnnotatingElement = owned_annotating_element + owning_annotated_element: Opt[Element] = Opt("owningAnnotatedElement", "Element", derived=True) + "``Annotation::owningAnnotatedElement`` (single, derived)." + owningAnnotatedElement = owning_annotated_element + owning_annotating_element: Opt[AnnotatingElement] = Opt("owningAnnotatingElement", "AnnotatingElement", derived=True) + "``Annotation::owningAnnotatingElement`` (single, derived)." + owningAnnotatingElement = owning_annotating_element + + +class Conjugation(Relationship): + "Metaclass ``Conjugation``." + __slots__ = () + METACLASS: ClassVar[str] = "Conjugation" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Relationship.JSON_KEYS, + "conjugatedType": "conjugated_type", + "originalType": "original_type", + "owningType": "owning_type", + }) + conjugated_type: Opt[Type] = Opt("conjugatedType", "Type") + "``Conjugation::conjugatedType`` (single). Redefines ``Relationship::source``." + conjugatedType = conjugated_type + original_type: Opt[Type] = Opt("originalType", "Type") + "``Conjugation::originalType`` (single). Redefines ``Relationship::target``." + originalType = original_type + owning_type: Opt[Type] = Opt("owningType", "Type", derived=True) + "``Conjugation::owningType`` (single, derived)." + owningType = owning_type + + +class Dependency(Relationship): + "Metaclass ``Dependency``." + __slots__ = () + METACLASS: ClassVar[str] = "Dependency" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Relationship.JSON_KEYS, + "client": "client", + "supplier": "supplier", + }) + client: Many[Element] = Many("client", "Element", ordered=True) + "``Dependency::client`` (many, ordered). Redefines ``Relationship::source``." + supplier: Many[Element] = Many("supplier", "Element", ordered=True) + "``Dependency::supplier`` (many, ordered). Redefines ``Relationship::target``." + + +class Differencing(Relationship): + "Metaclass ``Differencing``." + __slots__ = () + METACLASS: ClassVar[str] = "Differencing" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Relationship.JSON_KEYS, + "differencingType": "differencing_type", + "typeDifferenced": "type_differenced", + }) + differencing_type: Opt[Type] = Opt("differencingType", "Type") + "``Differencing::differencingType`` (single). Redefines ``Relationship::target``." + differencingType = differencing_type + type_differenced: Opt[Type] = Opt("typeDifferenced", "Type", derived=True) + "``Differencing::typeDifferenced`` (single, derived). Redefines ``Relationship::source``." + typeDifferenced = type_differenced + + +class Disjoining(Relationship): + "Metaclass ``Disjoining``." + __slots__ = () + METACLASS: ClassVar[str] = "Disjoining" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Relationship.JSON_KEYS, + "disjoiningType": "disjoining_type", + "owningType": "owning_type", + "typeDisjoined": "type_disjoined", + }) + disjoining_type: Opt[Type] = Opt("disjoiningType", "Type") + "``Disjoining::disjoiningType`` (single). Redefines ``Relationship::target``." + disjoiningType = disjoining_type + owning_type: Opt[Type] = Opt("owningType", "Type", derived=True) + "``Disjoining::owningType`` (single, derived)." + owningType = owning_type + type_disjoined: Opt[Type] = Opt("typeDisjoined", "Type") + "``Disjoining::typeDisjoined`` (single). Redefines ``Relationship::source``." + typeDisjoined = type_disjoined + + +class FeatureChaining(Relationship): + "Metaclass ``FeatureChaining``." + __slots__ = () + METACLASS: ClassVar[str] = "FeatureChaining" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Relationship.JSON_KEYS, + "chainingFeature": "chaining_feature", + "featureChained": "feature_chained", + }) + chaining_feature: Opt[Feature] = Opt("chainingFeature", "Feature") + "``FeatureChaining::chainingFeature`` (single). Redefines ``Relationship::target``." + chainingFeature = chaining_feature + feature_chained: Opt[Feature] = Opt("featureChained", "Feature", derived=True) + "``FeatureChaining::featureChained`` (single, derived). Redefines ``Relationship::source``." + featureChained = feature_chained + + +class FeatureInverting(Relationship): + "Metaclass ``FeatureInverting``." + __slots__ = () + METACLASS: ClassVar[str] = "FeatureInverting" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Relationship.JSON_KEYS, + "featureInverted": "feature_inverted", + "invertingFeature": "inverting_feature", + "owningFeature": "owning_feature", + }) + feature_inverted: Opt[Feature] = Opt("featureInverted", "Feature") + "``FeatureInverting::featureInverted`` (single). Redefines ``Relationship::source``." + featureInverted = feature_inverted + inverting_feature: Opt[Feature] = Opt("invertingFeature", "Feature") + "``FeatureInverting::invertingFeature`` (single). Redefines ``Relationship::target``." + invertingFeature = inverting_feature + owning_feature: Opt[Feature] = Opt("owningFeature", "Feature", derived=True) + "``FeatureInverting::owningFeature`` (single, derived)." + owningFeature = owning_feature + + +class Import(Relationship): + "Abstract metaclass ``Import``." + __slots__ = () + METACLASS: ClassVar[str] = "Import" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Relationship.JSON_KEYS, + "importOwningNamespace": "import_owning_namespace", + "importedElement": "imported_element", + "isImportAll": "is_import_all", + "isRecursive": "is_recursive", + "visibility": "visibility", + }) + import_owning_namespace: Opt[Namespace] = Opt("importOwningNamespace", "Namespace", derived=True) + "``Import::importOwningNamespace`` (single, derived). Redefines ``Relationship::source``." + importOwningNamespace = import_owning_namespace + imported_element: Opt[Element] = Opt("importedElement", "Element", derived=True) + "``Import::importedElement`` (single, derived)." + importedElement = imported_element + is_import_all: Opt[bool] = Opt("isImportAll", "bool") + "``Import::isImportAll`` (single)." + isImportAll = is_import_all + is_recursive: Opt[bool] = Opt("isRecursive", "bool") + "``Import::isRecursive`` (single)." + isRecursive = is_recursive + visibility: Opt[VisibilityKind] = Opt("visibility", "VisibilityKind") + "``Import::visibility`` (single)." + + +class Expose(Import): + "Abstract metaclass ``Expose``." + __slots__ = () + METACLASS: ClassVar[str] = "Expose" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Import.JSON_KEYS, + }) + + +class Intersecting(Relationship): + "Metaclass ``Intersecting``." + __slots__ = () + METACLASS: ClassVar[str] = "Intersecting" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Relationship.JSON_KEYS, + "intersectingType": "intersecting_type", + "typeIntersected": "type_intersected", + }) + intersecting_type: Opt[Type] = Opt("intersectingType", "Type") + "``Intersecting::intersectingType`` (single). Redefines ``Relationship::target``." + intersectingType = intersecting_type + type_intersected: Opt[Type] = Opt("typeIntersected", "Type", derived=True) + "``Intersecting::typeIntersected`` (single, derived). Redefines ``Relationship::source``." + typeIntersected = type_intersected + + +class Membership(Relationship): + "Metaclass ``Membership``." + __slots__ = () + METACLASS: ClassVar[str] = "Membership" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Relationship.JSON_KEYS, + "memberElement": "member_element", + "memberElementId": "member_element_id", + "memberName": "member_name", + "memberShortName": "member_short_name", + "membershipOwningNamespace": "membership_owning_namespace", + "visibility": "visibility", + }) + member_element: Opt[Element] = Opt("memberElement", "Element") + "``Membership::memberElement`` (single). Redefines ``Relationship::target``." + memberElement = member_element + member_element_id: Opt[str] = Opt("memberElementId", "str", derived=True) + "``Membership::memberElementId`` (single, derived)." + memberElementId = member_element_id + member_name: Opt[str] = Opt("memberName", "str") + "``Membership::memberName`` (single)." + memberName = member_name + member_short_name: Opt[str] = Opt("memberShortName", "str") + "``Membership::memberShortName`` (single)." + memberShortName = member_short_name + membership_owning_namespace: Opt[Namespace] = Opt("membershipOwningNamespace", "Namespace", derived=True) + "``Membership::membershipOwningNamespace`` (single, derived). Redefines ``Relationship::source``." + membershipOwningNamespace = membership_owning_namespace + visibility: Opt[VisibilityKind] = Opt("visibility", "VisibilityKind") + "``Membership::visibility`` (single)." + + +class MembershipImport(Import): + "Metaclass ``MembershipImport``." + __slots__ = () + METACLASS: ClassVar[str] = "MembershipImport" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Import.JSON_KEYS, + "importedMembership": "imported_membership", + }) + imported_membership: Opt[Membership] = Opt("importedMembership", "Membership") + "``MembershipImport::importedMembership`` (single). Redefines ``Relationship::target``." + importedMembership = imported_membership + + +class MembershipExpose(Expose, MembershipImport): + "Metaclass ``MembershipExpose``." + __slots__ = () + METACLASS: ClassVar[str] = "MembershipExpose" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **MembershipImport.JSON_KEYS, + **Expose.JSON_KEYS, + }) + + +class NamespaceImport(Import): + "Metaclass ``NamespaceImport``." + __slots__ = () + METACLASS: ClassVar[str] = "NamespaceImport" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Import.JSON_KEYS, + "importedNamespace": "imported_namespace", + }) + imported_namespace: Opt[Namespace] = Opt("importedNamespace", "Namespace") + "``NamespaceImport::importedNamespace`` (single). Redefines ``Relationship::target``." + importedNamespace = imported_namespace + + +class NamespaceExpose(Expose, NamespaceImport): + "Metaclass ``NamespaceExpose``." + __slots__ = () + METACLASS: ClassVar[str] = "NamespaceExpose" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **NamespaceImport.JSON_KEYS, + **Expose.JSON_KEYS, + }) + + +class OwningMembership(Membership): + "Metaclass ``OwningMembership``." + __slots__ = () + METACLASS: ClassVar[str] = "OwningMembership" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Membership.JSON_KEYS, + "ownedMemberElement": "owned_member_element", + "ownedMemberElementId": "owned_member_element_id", + "ownedMemberName": "owned_member_name", + "ownedMemberShortName": "owned_member_short_name", + }) + owned_member_element: Opt[Element] = Opt("ownedMemberElement", "Element", derived=True) + "``OwningMembership::ownedMemberElement`` (single, derived). Redefines ``Membership::memberElement``." + ownedMemberElement = owned_member_element + owned_member_element_id: Opt[str] = Opt("ownedMemberElementId", "str", derived=True) + "``OwningMembership::ownedMemberElementId`` (single, derived). Redefines ``Membership::memberElementId``." + ownedMemberElementId = owned_member_element_id + owned_member_name: Opt[str] = Opt("ownedMemberName", "str", derived=True) + "``OwningMembership::ownedMemberName`` (single, derived). Redefines ``Membership::memberName``." + ownedMemberName = owned_member_name + owned_member_short_name: Opt[str] = Opt("ownedMemberShortName", "str", derived=True) + "``OwningMembership::ownedMemberShortName`` (single, derived). Redefines ``Membership::memberShortName``." + ownedMemberShortName = owned_member_short_name + + +class ElementFilterMembership(OwningMembership): + "Metaclass ``ElementFilterMembership``." + __slots__ = () + METACLASS: ClassVar[str] = "ElementFilterMembership" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **OwningMembership.JSON_KEYS, + "condition": "condition", + }) + condition: Opt[Expression] = Opt("condition", "Expression", derived=True) + "``ElementFilterMembership::condition`` (single, derived). Redefines ``OwningMembership::ownedMemberElement``." + + +class FeatureMembership(OwningMembership): + "Metaclass ``FeatureMembership``." + __slots__ = () + METACLASS: ClassVar[str] = "FeatureMembership" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **OwningMembership.JSON_KEYS, + "ownedMemberFeature": "owned_member_feature", + "owningType": "owning_type", + }) + owned_member_feature: Opt[Feature] = Opt("ownedMemberFeature", "Feature", derived=True) + "``FeatureMembership::ownedMemberFeature`` (single, derived). Redefines ``OwningMembership::ownedMemberElement``." + ownedMemberFeature = owned_member_feature + owning_type: Opt[Type] = Opt("owningType", "Type", derived=True) + "``FeatureMembership::owningType`` (single, derived). Redefines ``Membership::membershipOwningNamespace``." + owningType = owning_type + + +class EndFeatureMembership(FeatureMembership): + "Metaclass ``EndFeatureMembership``." + __slots__ = () + METACLASS: ClassVar[str] = "EndFeatureMembership" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **FeatureMembership.JSON_KEYS, + }) + + +class FeatureValue(OwningMembership): + "Metaclass ``FeatureValue``." + __slots__ = () + METACLASS: ClassVar[str] = "FeatureValue" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **OwningMembership.JSON_KEYS, + "featureWithValue": "feature_with_value", + "isDefault": "is_default", + "isInitial": "is_initial", + "value": "value", + }) + feature_with_value: Opt[Feature] = Opt("featureWithValue", "Feature", derived=True) + "``FeatureValue::featureWithValue`` (single, derived)." + featureWithValue = feature_with_value + is_default: Opt[bool] = Opt("isDefault", "bool") + "``FeatureValue::isDefault`` (single)." + isDefault = is_default + is_initial: Opt[bool] = Opt("isInitial", "bool") + "``FeatureValue::isInitial`` (single)." + isInitial = is_initial + value: Opt[Expression] = Opt("value", "Expression", derived=True) + "``FeatureValue::value`` (single, derived). Redefines ``OwningMembership::ownedMemberElement``." + + +class ObjectiveMembership(FeatureMembership): + "Metaclass ``ObjectiveMembership``." + __slots__ = () + METACLASS: ClassVar[str] = "ObjectiveMembership" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **FeatureMembership.JSON_KEYS, + "ownedObjectiveRequirement": "owned_objective_requirement", + }) + owned_objective_requirement: Opt[RequirementUsage] = Opt("ownedObjectiveRequirement", "RequirementUsage", derived=True) + "``ObjectiveMembership::ownedObjectiveRequirement`` (single, derived). Redefines ``FeatureMembership::ownedMemberFeature``." + ownedObjectiveRequirement = owned_objective_requirement + + +class ParameterMembership(FeatureMembership): + "Metaclass ``ParameterMembership``." + __slots__ = () + METACLASS: ClassVar[str] = "ParameterMembership" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **FeatureMembership.JSON_KEYS, + "ownedMemberParameter": "owned_member_parameter", + }) + owned_member_parameter: Opt[Feature] = Opt("ownedMemberParameter", "Feature", derived=True) + "``ParameterMembership::ownedMemberParameter`` (single, derived). Redefines ``FeatureMembership::ownedMemberFeature``." + ownedMemberParameter = owned_member_parameter + + +class ActorMembership(ParameterMembership): + "Metaclass ``ActorMembership``." + __slots__ = () + METACLASS: ClassVar[str] = "ActorMembership" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **ParameterMembership.JSON_KEYS, + "ownedActorParameter": "owned_actor_parameter", + }) + owned_actor_parameter: Opt[PartUsage] = Opt("ownedActorParameter", "PartUsage", derived=True) + "``ActorMembership::ownedActorParameter`` (single, derived). Redefines ``ParameterMembership::ownedMemberParameter``." + ownedActorParameter = owned_actor_parameter + + +class PortConjugation(Conjugation): + "Metaclass ``PortConjugation``." + __slots__ = () + METACLASS: ClassVar[str] = "PortConjugation" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Conjugation.JSON_KEYS, + "conjugatedPortDefinition": "conjugated_port_definition", + "originalPortDefinition": "original_port_definition", + }) + conjugated_port_definition: Opt[ConjugatedPortDefinition] = Opt("conjugatedPortDefinition", "ConjugatedPortDefinition", derived=True) + "``PortConjugation::conjugatedPortDefinition`` (single, derived). Redefines ``Conjugation::owningType``." + conjugatedPortDefinition = conjugated_port_definition + original_port_definition: Opt[PortDefinition] = Opt("originalPortDefinition", "PortDefinition") + "``PortConjugation::originalPortDefinition`` (single). Redefines ``Conjugation::originalType``." + originalPortDefinition = original_port_definition + + +class RequirementConstraintMembership(FeatureMembership): + "Metaclass ``RequirementConstraintMembership``." + __slots__ = () + METACLASS: ClassVar[str] = "RequirementConstraintMembership" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **FeatureMembership.JSON_KEYS, + "kind": "kind", + "ownedConstraint": "owned_constraint", + "referencedConstraint": "referenced_constraint", + }) + kind: Opt[RequirementConstraintKind] = Opt("kind", "RequirementConstraintKind") + "``RequirementConstraintMembership::kind`` (single)." + owned_constraint: Opt[ConstraintUsage] = Opt("ownedConstraint", "ConstraintUsage", derived=True) + "``RequirementConstraintMembership::ownedConstraint`` (single, derived). Redefines ``FeatureMembership::ownedMemberFeature``." + ownedConstraint = owned_constraint + referenced_constraint: Opt[ConstraintUsage] = Opt("referencedConstraint", "ConstraintUsage", derived=True) + "``RequirementConstraintMembership::referencedConstraint`` (single, derived)." + referencedConstraint = referenced_constraint + + +class FramedConcernMembership(RequirementConstraintMembership): + "Metaclass ``FramedConcernMembership``." + __slots__ = () + METACLASS: ClassVar[str] = "FramedConcernMembership" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **RequirementConstraintMembership.JSON_KEYS, + "ownedConcern": "owned_concern", + "referencedConcern": "referenced_concern", + }) + owned_concern: Opt[ConcernUsage] = Opt("ownedConcern", "ConcernUsage", derived=True) + "``FramedConcernMembership::ownedConcern`` (single, derived). Redefines ``RequirementConstraintMembership::ownedConstraint``." + ownedConcern = owned_concern + referenced_concern: Opt[ConcernUsage] = Opt("referencedConcern", "ConcernUsage", derived=True) + "``FramedConcernMembership::referencedConcern`` (single, derived). Redefines ``RequirementConstraintMembership::referencedConstraint``." + referencedConcern = referenced_concern + + +class RequirementVerificationMembership(RequirementConstraintMembership): + "Metaclass ``RequirementVerificationMembership``." + __slots__ = () + METACLASS: ClassVar[str] = "RequirementVerificationMembership" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **RequirementConstraintMembership.JSON_KEYS, + "ownedRequirement": "owned_requirement", + "verifiedRequirement": "verified_requirement", + }) + owned_requirement: Opt[RequirementUsage] = Opt("ownedRequirement", "RequirementUsage", derived=True) + "``RequirementVerificationMembership::ownedRequirement`` (single, derived). Redefines ``RequirementConstraintMembership::ownedConstraint``." + ownedRequirement = owned_requirement + verified_requirement: Opt[RequirementUsage] = Opt("verifiedRequirement", "RequirementUsage", derived=True) + "``RequirementVerificationMembership::verifiedRequirement`` (single, derived). Redefines ``RequirementConstraintMembership::referencedConstraint``." + verifiedRequirement = verified_requirement + + +class ResultExpressionMembership(FeatureMembership): + "Metaclass ``ResultExpressionMembership``." + __slots__ = () + METACLASS: ClassVar[str] = "ResultExpressionMembership" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **FeatureMembership.JSON_KEYS, + "ownedResultExpression": "owned_result_expression", + }) + owned_result_expression: Opt[Expression] = Opt("ownedResultExpression", "Expression", derived=True) + "``ResultExpressionMembership::ownedResultExpression`` (single, derived). Redefines ``FeatureMembership::ownedMemberFeature``." + ownedResultExpression = owned_result_expression + + +class ReturnParameterMembership(ParameterMembership): + "Metaclass ``ReturnParameterMembership``." + __slots__ = () + METACLASS: ClassVar[str] = "ReturnParameterMembership" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **ParameterMembership.JSON_KEYS, + }) + + +class Specialization(Relationship): + "Metaclass ``Specialization``." + __slots__ = () + METACLASS: ClassVar[str] = "Specialization" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Relationship.JSON_KEYS, + "general": "general", + "owningType": "owning_type", + "specific": "specific", + }) + general: Opt[Type] = Opt("general", "Type") + "``Specialization::general`` (single). Redefines ``Relationship::target``." + owning_type: Opt[Type] = Opt("owningType", "Type", derived=True) + "``Specialization::owningType`` (single, derived)." + owningType = owning_type + specific: Opt[Type] = Opt("specific", "Type") + "``Specialization::specific`` (single). Redefines ``Relationship::source``." + + +class FeatureTyping(Specialization): + "Metaclass ``FeatureTyping``." + __slots__ = () + METACLASS: ClassVar[str] = "FeatureTyping" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Specialization.JSON_KEYS, + "owningFeature": "owning_feature", + "type": "type", + "typedFeature": "typed_feature", + }) + owning_feature: Opt[Feature] = Opt("owningFeature", "Feature", derived=True) + "``FeatureTyping::owningFeature`` (single, derived). Redefines ``Specialization::owningType``." + owningFeature = owning_feature + type: Opt[Type] = Opt("type", "Type") + "``FeatureTyping::type`` (single). Redefines ``Specialization::general``." + typed_feature: Opt[Feature] = Opt("typedFeature", "Feature") + "``FeatureTyping::typedFeature`` (single). Redefines ``Specialization::specific``." + typedFeature = typed_feature + + +class ConjugatedPortTyping(FeatureTyping): + "Metaclass ``ConjugatedPortTyping``." + __slots__ = () + METACLASS: ClassVar[str] = "ConjugatedPortTyping" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **FeatureTyping.JSON_KEYS, + "conjugatedPortDefinition": "conjugated_port_definition", + "portDefinition": "port_definition", + }) + conjugated_port_definition: Opt[ConjugatedPortDefinition] = Opt("conjugatedPortDefinition", "ConjugatedPortDefinition") + "``ConjugatedPortTyping::conjugatedPortDefinition`` (single). Redefines ``FeatureTyping::type``." + conjugatedPortDefinition = conjugated_port_definition + port_definition: Opt[PortDefinition] = Opt("portDefinition", "PortDefinition", derived=True) + "``ConjugatedPortTyping::portDefinition`` (single, derived)." + portDefinition = port_definition + + +class StakeholderMembership(ParameterMembership): + "Metaclass ``StakeholderMembership``." + __slots__ = () + METACLASS: ClassVar[str] = "StakeholderMembership" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **ParameterMembership.JSON_KEYS, + "ownedStakeholderParameter": "owned_stakeholder_parameter", + }) + owned_stakeholder_parameter: Opt[PartUsage] = Opt("ownedStakeholderParameter", "PartUsage", derived=True) + "``StakeholderMembership::ownedStakeholderParameter`` (single, derived). Redefines ``ParameterMembership::ownedMemberParameter``." + ownedStakeholderParameter = owned_stakeholder_parameter + + +class StateSubactionMembership(FeatureMembership): + "Metaclass ``StateSubactionMembership``." + __slots__ = () + METACLASS: ClassVar[str] = "StateSubactionMembership" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **FeatureMembership.JSON_KEYS, + "action": "action", + "kind": "kind", + }) + action: Opt[ActionUsage] = Opt("action", "ActionUsage", derived=True) + "``StateSubactionMembership::action`` (single, derived). Redefines ``FeatureMembership::ownedMemberFeature``." + kind: Opt[StateSubactionKind] = Opt("kind", "StateSubactionKind") + "``StateSubactionMembership::kind`` (single)." + + +class Subclassification(Specialization): + "Metaclass ``Subclassification``." + __slots__ = () + METACLASS: ClassVar[str] = "Subclassification" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Specialization.JSON_KEYS, + "owningClassifier": "owning_classifier", + "subclassifier": "subclassifier", + "superclassifier": "superclassifier", + }) + owning_classifier: Opt[Classifier] = Opt("owningClassifier", "Classifier", derived=True) + "``Subclassification::owningClassifier`` (single, derived). Redefines ``Specialization::owningType``." + owningClassifier = owning_classifier + subclassifier: Opt[Classifier] = Opt("subclassifier", "Classifier") + "``Subclassification::subclassifier`` (single). Redefines ``Specialization::specific``." + superclassifier: Opt[Classifier] = Opt("superclassifier", "Classifier") + "``Subclassification::superclassifier`` (single). Redefines ``Specialization::general``." + + +class SubjectMembership(ParameterMembership): + "Metaclass ``SubjectMembership``." + __slots__ = () + METACLASS: ClassVar[str] = "SubjectMembership" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **ParameterMembership.JSON_KEYS, + "ownedSubjectParameter": "owned_subject_parameter", + }) + owned_subject_parameter: Opt[Usage] = Opt("ownedSubjectParameter", "Usage", derived=True) + "``SubjectMembership::ownedSubjectParameter`` (single, derived). Redefines ``ParameterMembership::ownedMemberParameter``." + ownedSubjectParameter = owned_subject_parameter + + +class Subsetting(Specialization): + "Metaclass ``Subsetting``." + __slots__ = () + METACLASS: ClassVar[str] = "Subsetting" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Specialization.JSON_KEYS, + "owningFeature": "owning_feature", + "subsettedFeature": "subsetted_feature", + "subsettingFeature": "subsetting_feature", + }) + owning_feature: Opt[Feature] = Opt("owningFeature", "Feature", derived=True) + "``Subsetting::owningFeature`` (single, derived). Redefines ``Specialization::owningType``." + owningFeature = owning_feature + subsetted_feature: Opt[Feature] = Opt("subsettedFeature", "Feature") + "``Subsetting::subsettedFeature`` (single). Redefines ``Specialization::general``." + subsettedFeature = subsetted_feature + subsetting_feature: Opt[Feature] = Opt("subsettingFeature", "Feature") + "``Subsetting::subsettingFeature`` (single). Redefines ``Specialization::specific``." + subsettingFeature = subsetting_feature + + +class CrossSubsetting(Subsetting): + "Metaclass ``CrossSubsetting``." + __slots__ = () + METACLASS: ClassVar[str] = "CrossSubsetting" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Subsetting.JSON_KEYS, + "crossedFeature": "crossed_feature", + "crossingFeature": "crossing_feature", + }) + crossed_feature: Opt[Feature] = Opt("crossedFeature", "Feature") + "``CrossSubsetting::crossedFeature`` (single). Redefines ``Subsetting::subsettedFeature``." + crossedFeature = crossed_feature + crossing_feature: Opt[Feature] = Opt("crossingFeature", "Feature", derived=True) + "``CrossSubsetting::crossingFeature`` (single, derived). Redefines ``Subsetting::owningFeature``, ``Subsetting::subsettingFeature``." + crossingFeature = crossing_feature + + +class Redefinition(Subsetting): + "Metaclass ``Redefinition``." + __slots__ = () + METACLASS: ClassVar[str] = "Redefinition" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Subsetting.JSON_KEYS, + "redefinedFeature": "redefined_feature", + "redefiningFeature": "redefining_feature", + }) + redefined_feature: Opt[Feature] = Opt("redefinedFeature", "Feature") + "``Redefinition::redefinedFeature`` (single). Redefines ``Subsetting::subsettedFeature``." + redefinedFeature = redefined_feature + redefining_feature: Opt[Feature] = Opt("redefiningFeature", "Feature") + "``Redefinition::redefiningFeature`` (single). Redefines ``Subsetting::subsettingFeature``." + redefiningFeature = redefining_feature + + +class ReferenceSubsetting(Subsetting): + "Metaclass ``ReferenceSubsetting``." + __slots__ = () + METACLASS: ClassVar[str] = "ReferenceSubsetting" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Subsetting.JSON_KEYS, + "referencedFeature": "referenced_feature", + "referencingFeature": "referencing_feature", + }) + referenced_feature: Opt[Feature] = Opt("referencedFeature", "Feature") + "``ReferenceSubsetting::referencedFeature`` (single). Redefines ``Subsetting::subsettedFeature``." + referencedFeature = referenced_feature + referencing_feature: Opt[Feature] = Opt("referencingFeature", "Feature", derived=True) + "``ReferenceSubsetting::referencingFeature`` (single, derived). Redefines ``Subsetting::owningFeature``, ``Subsetting::subsettingFeature``." + referencingFeature = referencing_feature + + +class TextualRepresentation(AnnotatingElement): + "Metaclass ``TextualRepresentation``." + __slots__ = () + METACLASS: ClassVar[str] = "TextualRepresentation" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **AnnotatingElement.JSON_KEYS, + "body": "body", + "language": "language", + "representedElement": "represented_element", + }) + body: Opt[str] = Opt("body", "str") + "``TextualRepresentation::body`` (single)." + language: Opt[str] = Opt("language", "str") + "``TextualRepresentation::language`` (single)." + represented_element: Opt[Element] = Opt("representedElement", "Element", derived=True) + "``TextualRepresentation::representedElement`` (single, derived). Redefines ``AnnotatingElement::annotatedElement``." + representedElement = represented_element + + +class TransitionFeatureMembership(FeatureMembership): + "Metaclass ``TransitionFeatureMembership``." + __slots__ = () + METACLASS: ClassVar[str] = "TransitionFeatureMembership" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **FeatureMembership.JSON_KEYS, + "kind": "kind", + "transitionFeature": "transition_feature", + }) + kind: Opt[TransitionFeatureKind] = Opt("kind", "TransitionFeatureKind") + "``TransitionFeatureMembership::kind`` (single)." + transition_feature: Opt[Step] = Opt("transitionFeature", "Step", derived=True) + "``TransitionFeatureMembership::transitionFeature`` (single, derived). Redefines ``FeatureMembership::ownedMemberFeature``." + transitionFeature = transition_feature + + +class Type(Namespace): + "Metaclass ``Type``." + __slots__ = () + METACLASS: ClassVar[str] = "Type" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Namespace.JSON_KEYS, + "differencingType": "differencing_type", + "directedFeature": "directed_feature", + "endFeature": "end_feature", + "feature": "feature", + "featureMembership": "feature_membership", + "inheritedFeature": "inherited_feature", + "inheritedMembership": "inherited_membership", + "input": "input", + "intersectingType": "intersecting_type", + "isAbstract": "is_abstract", + "isConjugated": "is_conjugated", + "isSufficient": "is_sufficient", + "multiplicity": "multiplicity", + "output": "output", + "ownedConjugator": "owned_conjugator", + "ownedDifferencing": "owned_differencing", + "ownedDisjoining": "owned_disjoining", + "ownedEndFeature": "owned_end_feature", + "ownedFeature": "owned_feature", + "ownedFeatureMembership": "owned_feature_membership", + "ownedIntersecting": "owned_intersecting", + "ownedSpecialization": "owned_specialization", + "ownedUnioning": "owned_unioning", + "unioningType": "unioning_type", + }) + differencing_type: Many[Type] = Many("differencingType", "Type", ordered=True, derived=True) + "``Type::differencingType`` (many, ordered, derived)." + differencingType = differencing_type + directed_feature: Many[Feature] = Many("directedFeature", "Feature", ordered=True, derived=True) + "``Type::directedFeature`` (many, ordered, derived)." + directedFeature = directed_feature + end_feature: Many[Feature] = Many("endFeature", "Feature", ordered=True, derived=True) + "``Type::endFeature`` (many, ordered, derived)." + endFeature = end_feature + feature: Many[Feature] = Many("feature", "Feature", ordered=True, derived=True) + "``Type::feature`` (many, ordered, derived)." + feature_membership: Many[FeatureMembership] = Many("featureMembership", "FeatureMembership", ordered=True, derived=True) + "``Type::featureMembership`` (many, ordered, derived)." + featureMembership = feature_membership + inherited_feature: Many[Feature] = Many("inheritedFeature", "Feature", ordered=True, derived=True) + "``Type::inheritedFeature`` (many, ordered, derived)." + inheritedFeature = inherited_feature + inherited_membership: Many[Membership] = Many("inheritedMembership", "Membership", ordered=True, derived=True) + "``Type::inheritedMembership`` (many, ordered, derived)." + inheritedMembership = inherited_membership + input: Many[Feature] = Many("input", "Feature", ordered=True, derived=True) + "``Type::input`` (many, ordered, derived)." + intersecting_type: Many[Type] = Many("intersectingType", "Type", ordered=True, derived=True) + "``Type::intersectingType`` (many, ordered, derived)." + intersectingType = intersecting_type + is_abstract: Opt[bool] = Opt("isAbstract", "bool") + "``Type::isAbstract`` (single)." + isAbstract = is_abstract + is_conjugated: Opt[bool] = Opt("isConjugated", "bool", derived=True) + "``Type::isConjugated`` (single, derived)." + isConjugated = is_conjugated + is_sufficient: Opt[bool] = Opt("isSufficient", "bool") + "``Type::isSufficient`` (single)." + isSufficient = is_sufficient + multiplicity: Opt[Multiplicity] = Opt("multiplicity", "Multiplicity", derived=True) + "``Type::multiplicity`` (single, derived)." + output: Many[Feature] = Many("output", "Feature", ordered=True, derived=True) + "``Type::output`` (many, ordered, derived)." + owned_conjugator: Opt[Conjugation] = Opt("ownedConjugator", "Conjugation", derived=True) + "``Type::ownedConjugator`` (single, derived)." + ownedConjugator = owned_conjugator + owned_differencing: Many[Differencing] = Many("ownedDifferencing", "Differencing", ordered=True, derived=True) + "``Type::ownedDifferencing`` (many, ordered, derived)." + ownedDifferencing = owned_differencing + owned_disjoining: Many[Disjoining] = Many("ownedDisjoining", "Disjoining", ordered=False, derived=True) + "``Type::ownedDisjoining`` (many, derived)." + ownedDisjoining = owned_disjoining + owned_end_feature: Many[Feature] = Many("ownedEndFeature", "Feature", ordered=True, derived=True) + "``Type::ownedEndFeature`` (many, ordered, derived)." + ownedEndFeature = owned_end_feature + owned_feature: Many[Feature] = Many("ownedFeature", "Feature", ordered=True, derived=True) + "``Type::ownedFeature`` (many, ordered, derived)." + ownedFeature = owned_feature + owned_feature_membership: Many[FeatureMembership] = Many("ownedFeatureMembership", "FeatureMembership", ordered=True, derived=True) + "``Type::ownedFeatureMembership`` (many, ordered, derived)." + ownedFeatureMembership = owned_feature_membership + owned_intersecting: Many[Intersecting] = Many("ownedIntersecting", "Intersecting", ordered=True, derived=True) + "``Type::ownedIntersecting`` (many, ordered, derived)." + ownedIntersecting = owned_intersecting + owned_specialization: Many[Specialization] = Many("ownedSpecialization", "Specialization", ordered=True, derived=True) + "``Type::ownedSpecialization`` (many, ordered, derived)." + ownedSpecialization = owned_specialization + owned_unioning: Many[Unioning] = Many("ownedUnioning", "Unioning", ordered=True, derived=True) + "``Type::ownedUnioning`` (many, ordered, derived)." + ownedUnioning = owned_unioning + unioning_type: Many[Type] = Many("unioningType", "Type", ordered=True, derived=True) + "``Type::unioningType`` (many, ordered, derived)." + unioningType = unioning_type + + +class Classifier(Type): + "Metaclass ``Classifier``." + __slots__ = () + METACLASS: ClassVar[str] = "Classifier" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Type.JSON_KEYS, + "ownedSubclassification": "owned_subclassification", + }) + owned_subclassification: Many[Subclassification] = Many("ownedSubclassification", "Subclassification", ordered=False, derived=True) + "``Classifier::ownedSubclassification`` (many, derived)." + ownedSubclassification = owned_subclassification + + +class Association(Classifier, Relationship): + "Metaclass ``Association``." + __slots__ = () + METACLASS: ClassVar[str] = "Association" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Relationship.JSON_KEYS, + **Classifier.JSON_KEYS, + "associationEnd": "association_end", + "relatedType": "related_type", + "sourceType": "source_type", + "targetType": "target_type", + }) + association_end: Many[Feature] = Many("associationEnd", "Feature", ordered=False, derived=True) + "``Association::associationEnd`` (many, derived). Redefines ``Type::endFeature``." + associationEnd = association_end + related_type: Many[Type] = Many("relatedType", "Type", ordered=True, derived=True) + "``Association::relatedType`` (many, ordered, derived). Redefines ``Relationship::relatedElement``." + relatedType = related_type + source_type: Opt[Type] = Opt("sourceType", "Type", derived=True) + "``Association::sourceType`` (single, derived). Redefines ``Relationship::source``." + sourceType = source_type + target_type: Many[Type] = Many("targetType", "Type", ordered=False, derived=True) + "``Association::targetType`` (many, derived). Redefines ``Relationship::target``." + targetType = target_type + + +class Class(Classifier): + "Metaclass ``Class``." + __slots__ = () + METACLASS: ClassVar[str] = "Class" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Classifier.JSON_KEYS, + }) + + +class Behavior(Class): + "Metaclass ``Behavior``." + __slots__ = () + METACLASS: ClassVar[str] = "Behavior" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Class.JSON_KEYS, + "parameter": "parameter", + "step": "step", + }) + parameter: Many[Feature] = Many("parameter", "Feature", ordered=True, derived=True) + "``Behavior::parameter`` (many, ordered, derived). Redefines ``Type::directedFeature``." + step: Many[Step] = Many("step", "Step", ordered=False, derived=True) + "``Behavior::step`` (many, derived)." + + +class DataType(Classifier): + "Metaclass ``DataType``." + __slots__ = () + METACLASS: ClassVar[str] = "DataType" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Classifier.JSON_KEYS, + }) + + +class Definition(Classifier): + "Metaclass ``Definition``." + __slots__ = () + METACLASS: ClassVar[str] = "Definition" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Classifier.JSON_KEYS, + "directedUsage": "directed_usage", + "isVariation": "is_variation", + "ownedAction": "owned_action", + "ownedAllocation": "owned_allocation", + "ownedAnalysisCase": "owned_analysis_case", + "ownedAttribute": "owned_attribute", + "ownedCalculation": "owned_calculation", + "ownedCase": "owned_case", + "ownedConcern": "owned_concern", + "ownedConnection": "owned_connection", + "ownedConstraint": "owned_constraint", + "ownedEnumeration": "owned_enumeration", + "ownedFlow": "owned_flow", + "ownedInterface": "owned_interface", + "ownedItem": "owned_item", + "ownedMetadata": "owned_metadata", + "ownedOccurrence": "owned_occurrence", + "ownedPart": "owned_part", + "ownedPort": "owned_port", + "ownedReference": "owned_reference", + "ownedRendering": "owned_rendering", + "ownedRequirement": "owned_requirement", + "ownedState": "owned_state", + "ownedTransition": "owned_transition", + "ownedUsage": "owned_usage", + "ownedUseCase": "owned_use_case", + "ownedVerificationCase": "owned_verification_case", + "ownedView": "owned_view", + "ownedViewpoint": "owned_viewpoint", + "usage": "usage", + "variant": "variant", + "variantMembership": "variant_membership", + }) + directed_usage: Many[Usage] = Many("directedUsage", "Usage", ordered=True, derived=True) + "``Definition::directedUsage`` (many, ordered, derived)." + directedUsage = directed_usage + is_variation: Opt[bool] = Opt("isVariation", "bool") + "``Definition::isVariation`` (single)." + isVariation = is_variation + owned_action: Many[ActionUsage] = Many("ownedAction", "ActionUsage", ordered=True, derived=True) + "``Definition::ownedAction`` (many, ordered, derived)." + ownedAction = owned_action + owned_allocation: Many[AllocationUsage] = Many("ownedAllocation", "AllocationUsage", ordered=True, derived=True) + "``Definition::ownedAllocation`` (many, ordered, derived)." + ownedAllocation = owned_allocation + owned_analysis_case: Many[AnalysisCaseUsage] = Many("ownedAnalysisCase", "AnalysisCaseUsage", ordered=True, derived=True) + "``Definition::ownedAnalysisCase`` (many, ordered, derived)." + ownedAnalysisCase = owned_analysis_case + owned_attribute: Many[AttributeUsage] = Many("ownedAttribute", "AttributeUsage", ordered=True, derived=True) + "``Definition::ownedAttribute`` (many, ordered, derived)." + ownedAttribute = owned_attribute + owned_calculation: Many[CalculationUsage] = Many("ownedCalculation", "CalculationUsage", ordered=True, derived=True) + "``Definition::ownedCalculation`` (many, ordered, derived)." + ownedCalculation = owned_calculation + owned_case: Many[CaseUsage] = Many("ownedCase", "CaseUsage", ordered=True, derived=True) + "``Definition::ownedCase`` (many, ordered, derived)." + ownedCase = owned_case + owned_concern: Many[ConcernUsage] = Many("ownedConcern", "ConcernUsage", ordered=False, derived=True) + "``Definition::ownedConcern`` (many, derived)." + ownedConcern = owned_concern + owned_connection: Many[ConnectorAsUsage] = Many("ownedConnection", "ConnectorAsUsage", ordered=True, derived=True) + "``Definition::ownedConnection`` (many, ordered, derived)." + ownedConnection = owned_connection + owned_constraint: Many[ConstraintUsage] = Many("ownedConstraint", "ConstraintUsage", ordered=True, derived=True) + "``Definition::ownedConstraint`` (many, ordered, derived)." + ownedConstraint = owned_constraint + owned_enumeration: Many[EnumerationUsage] = Many("ownedEnumeration", "EnumerationUsage", ordered=True, derived=True) + "``Definition::ownedEnumeration`` (many, ordered, derived)." + ownedEnumeration = owned_enumeration + owned_flow: Many[FlowUsage] = Many("ownedFlow", "FlowUsage", ordered=False, derived=True) + "``Definition::ownedFlow`` (many, derived)." + ownedFlow = owned_flow + owned_interface: Many[InterfaceUsage] = Many("ownedInterface", "InterfaceUsage", ordered=True, derived=True) + "``Definition::ownedInterface`` (many, ordered, derived)." + ownedInterface = owned_interface + owned_item: Many[ItemUsage] = Many("ownedItem", "ItemUsage", ordered=True, derived=True) + "``Definition::ownedItem`` (many, ordered, derived)." + ownedItem = owned_item + owned_metadata: Many[MetadataUsage] = Many("ownedMetadata", "MetadataUsage", ordered=True, derived=True) + "``Definition::ownedMetadata`` (many, ordered, derived)." + ownedMetadata = owned_metadata + owned_occurrence: Many[OccurrenceUsage] = Many("ownedOccurrence", "OccurrenceUsage", ordered=True, derived=True) + "``Definition::ownedOccurrence`` (many, ordered, derived)." + ownedOccurrence = owned_occurrence + owned_part: Many[PartUsage] = Many("ownedPart", "PartUsage", ordered=True, derived=True) + "``Definition::ownedPart`` (many, ordered, derived)." + ownedPart = owned_part + owned_port: Many[PortUsage] = Many("ownedPort", "PortUsage", ordered=True, derived=True) + "``Definition::ownedPort`` (many, ordered, derived)." + ownedPort = owned_port + owned_reference: Many[ReferenceUsage] = Many("ownedReference", "ReferenceUsage", ordered=True, derived=True) + "``Definition::ownedReference`` (many, ordered, derived)." + ownedReference = owned_reference + owned_rendering: Many[RenderingUsage] = Many("ownedRendering", "RenderingUsage", ordered=True, derived=True) + "``Definition::ownedRendering`` (many, ordered, derived)." + ownedRendering = owned_rendering + owned_requirement: Many[RequirementUsage] = Many("ownedRequirement", "RequirementUsage", ordered=True, derived=True) + "``Definition::ownedRequirement`` (many, ordered, derived)." + ownedRequirement = owned_requirement + owned_state: Many[StateUsage] = Many("ownedState", "StateUsage", ordered=True, derived=True) + "``Definition::ownedState`` (many, ordered, derived)." + ownedState = owned_state + owned_transition: Many[TransitionUsage] = Many("ownedTransition", "TransitionUsage", ordered=False, derived=True) + "``Definition::ownedTransition`` (many, derived)." + ownedTransition = owned_transition + owned_usage: Many[Usage] = Many("ownedUsage", "Usage", ordered=True, derived=True) + "``Definition::ownedUsage`` (many, ordered, derived)." + ownedUsage = owned_usage + owned_use_case: Many[UseCaseUsage] = Many("ownedUseCase", "UseCaseUsage", ordered=True, derived=True) + "``Definition::ownedUseCase`` (many, ordered, derived)." + ownedUseCase = owned_use_case + owned_verification_case: Many[VerificationCaseUsage] = Many("ownedVerificationCase", "VerificationCaseUsage", ordered=True, derived=True) + "``Definition::ownedVerificationCase`` (many, ordered, derived)." + ownedVerificationCase = owned_verification_case + owned_view: Many[ViewUsage] = Many("ownedView", "ViewUsage", ordered=True, derived=True) + "``Definition::ownedView`` (many, ordered, derived)." + ownedView = owned_view + owned_viewpoint: Many[ViewpointUsage] = Many("ownedViewpoint", "ViewpointUsage", ordered=True, derived=True) + "``Definition::ownedViewpoint`` (many, ordered, derived)." + ownedViewpoint = owned_viewpoint + usage: Many[Usage] = Many("usage", "Usage", ordered=True, derived=True) + "``Definition::usage`` (many, ordered, derived)." + variant: Many[Usage] = Many("variant", "Usage", ordered=False, derived=True) + "``Definition::variant`` (many, derived)." + variant_membership: Many[VariantMembership] = Many("variantMembership", "VariantMembership", ordered=False, derived=True) + "``Definition::variantMembership`` (many, derived)." + variantMembership = variant_membership + + +class AttributeDefinition(DataType, Definition): + "Metaclass ``AttributeDefinition``." + __slots__ = () + METACLASS: ClassVar[str] = "AttributeDefinition" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Definition.JSON_KEYS, + **DataType.JSON_KEYS, + }) + + +class EnumerationDefinition(AttributeDefinition): + "Metaclass ``EnumerationDefinition``." + __slots__ = () + METACLASS: ClassVar[str] = "EnumerationDefinition" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **AttributeDefinition.JSON_KEYS, + "enumeratedValue": "enumerated_value", + }) + enumerated_value: Many[EnumerationUsage] = Many("enumeratedValue", "EnumerationUsage", ordered=True, derived=True) + "``EnumerationDefinition::enumeratedValue`` (many, ordered, derived). Redefines ``Definition::variant``." + enumeratedValue = enumerated_value + + +class Feature(Type): + "Metaclass ``Feature``." + __slots__ = () + METACLASS: ClassVar[str] = "Feature" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Type.JSON_KEYS, + "chainingFeature": "chaining_feature", + "crossFeature": "cross_feature", + "direction": "direction", + "endOwningType": "end_owning_type", + "featureTarget": "feature_target", + "featuringType": "featuring_type", + "isComposite": "is_composite", + "isConstant": "is_constant", + "isDerived": "is_derived", + "isEnd": "is_end", + "isOrdered": "is_ordered", + "isPortion": "is_portion", + "isUnique": "is_unique", + "isVariable": "is_variable", + "ownedCrossSubsetting": "owned_cross_subsetting", + "ownedFeatureChaining": "owned_feature_chaining", + "ownedFeatureInverting": "owned_feature_inverting", + "ownedRedefinition": "owned_redefinition", + "ownedReferenceSubsetting": "owned_reference_subsetting", + "ownedSubsetting": "owned_subsetting", + "ownedTypeFeaturing": "owned_type_featuring", + "ownedTyping": "owned_typing", + "owningFeatureMembership": "owning_feature_membership", + "owningType": "owning_type", + "type": "type", + }) + chaining_feature: Many[Feature] = Many("chainingFeature", "Feature", ordered=True, derived=True) + "``Feature::chainingFeature`` (many, ordered, derived)." + chainingFeature = chaining_feature + cross_feature: Opt[Feature] = Opt("crossFeature", "Feature", derived=True) + "``Feature::crossFeature`` (single, derived)." + crossFeature = cross_feature + direction: Opt[FeatureDirectionKind] = Opt("direction", "FeatureDirectionKind") + "``Feature::direction`` (single)." + end_owning_type: Opt[Type] = Opt("endOwningType", "Type", derived=True) + "``Feature::endOwningType`` (single, derived)." + endOwningType = end_owning_type + feature_target: Opt[Feature] = Opt("featureTarget", "Feature", derived=True) + "``Feature::featureTarget`` (single, derived)." + featureTarget = feature_target + featuring_type: Many[Type] = Many("featuringType", "Type", ordered=True, derived=True) + "``Feature::featuringType`` (many, ordered, derived)." + featuringType = featuring_type + is_composite: Opt[bool] = Opt("isComposite", "bool") + "``Feature::isComposite`` (single)." + isComposite = is_composite + is_constant: Opt[bool] = Opt("isConstant", "bool") + "``Feature::isConstant`` (single)." + isConstant = is_constant + is_derived: Opt[bool] = Opt("isDerived", "bool") + "``Feature::isDerived`` (single)." + isDerived = is_derived + is_end: Opt[bool] = Opt("isEnd", "bool") + "``Feature::isEnd`` (single)." + isEnd = is_end + is_ordered: Opt[bool] = Opt("isOrdered", "bool") + "``Feature::isOrdered`` (single)." + isOrdered = is_ordered + is_portion: Opt[bool] = Opt("isPortion", "bool") + "``Feature::isPortion`` (single)." + isPortion = is_portion + is_unique: Opt[bool] = Opt("isUnique", "bool") + "``Feature::isUnique`` (single)." + isUnique = is_unique + is_variable: Opt[bool] = Opt("isVariable", "bool") + "``Feature::isVariable`` (single)." + isVariable = is_variable + owned_cross_subsetting: Opt[CrossSubsetting] = Opt("ownedCrossSubsetting", "CrossSubsetting", derived=True) + "``Feature::ownedCrossSubsetting`` (single, derived)." + ownedCrossSubsetting = owned_cross_subsetting + owned_feature_chaining: Many[FeatureChaining] = Many("ownedFeatureChaining", "FeatureChaining", ordered=True, derived=True) + "``Feature::ownedFeatureChaining`` (many, ordered, derived)." + ownedFeatureChaining = owned_feature_chaining + owned_feature_inverting: Many[FeatureInverting] = Many("ownedFeatureInverting", "FeatureInverting", ordered=False, derived=True) + "``Feature::ownedFeatureInverting`` (many, derived)." + ownedFeatureInverting = owned_feature_inverting + owned_redefinition: Many[Redefinition] = Many("ownedRedefinition", "Redefinition", ordered=False, derived=True) + "``Feature::ownedRedefinition`` (many, derived)." + ownedRedefinition = owned_redefinition + owned_reference_subsetting: Opt[ReferenceSubsetting] = Opt("ownedReferenceSubsetting", "ReferenceSubsetting", derived=True) + "``Feature::ownedReferenceSubsetting`` (single, derived)." + ownedReferenceSubsetting = owned_reference_subsetting + owned_subsetting: Many[Subsetting] = Many("ownedSubsetting", "Subsetting", ordered=False, derived=True) + "``Feature::ownedSubsetting`` (many, derived)." + ownedSubsetting = owned_subsetting + owned_type_featuring: Many[TypeFeaturing] = Many("ownedTypeFeaturing", "TypeFeaturing", ordered=True, derived=True) + "``Feature::ownedTypeFeaturing`` (many, ordered, derived)." + ownedTypeFeaturing = owned_type_featuring + owned_typing: Many[FeatureTyping] = Many("ownedTyping", "FeatureTyping", ordered=True, derived=True) + "``Feature::ownedTyping`` (many, ordered, derived)." + ownedTyping = owned_typing + owning_feature_membership: Opt[FeatureMembership] = Opt("owningFeatureMembership", "FeatureMembership", derived=True) + "``Feature::owningFeatureMembership`` (single, derived)." + owningFeatureMembership = owning_feature_membership + owning_type: Opt[Type] = Opt("owningType", "Type", derived=True) + "``Feature::owningType`` (single, derived)." + owningType = owning_type + type: Many[Type] = Many("type", "Type", ordered=True, derived=True) + "``Feature::type`` (many, ordered, derived)." + + +class Connector(Feature, Relationship): + "Metaclass ``Connector``." + __slots__ = () + METACLASS: ClassVar[str] = "Connector" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Relationship.JSON_KEYS, + **Feature.JSON_KEYS, + "association": "association", + "connectorEnd": "connector_end", + "defaultFeaturingType": "default_featuring_type", + "relatedFeature": "related_feature", + "sourceFeature": "source_feature", + "targetFeature": "target_feature", + }) + association: Many[Association] = Many("association", "Association", ordered=True, derived=True) + "``Connector::association`` (many, ordered, derived). Redefines ``Feature::type``." + connector_end: Many[Feature] = Many("connectorEnd", "Feature", ordered=True, derived=True) + "``Connector::connectorEnd`` (many, ordered, derived). Redefines ``Type::endFeature``." + connectorEnd = connector_end + default_featuring_type: Opt[Type] = Opt("defaultFeaturingType", "Type", derived=True) + "``Connector::defaultFeaturingType`` (single, derived)." + defaultFeaturingType = default_featuring_type + related_feature: Many[Feature] = Many("relatedFeature", "Feature", ordered=True, derived=True) + "``Connector::relatedFeature`` (many, ordered, derived). Redefines ``Relationship::relatedElement``." + relatedFeature = related_feature + source_feature: Opt[Feature] = Opt("sourceFeature", "Feature", derived=True) + "``Connector::sourceFeature`` (single, derived). Redefines ``Relationship::source``." + sourceFeature = source_feature + target_feature: Many[Feature] = Many("targetFeature", "Feature", ordered=True, derived=True) + "``Connector::targetFeature`` (many, ordered, derived). Redefines ``Relationship::target``." + targetFeature = target_feature + + +class BindingConnector(Connector): + "Metaclass ``BindingConnector``." + __slots__ = () + METACLASS: ClassVar[str] = "BindingConnector" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Connector.JSON_KEYS, + }) + + +class FlowEnd(Feature): + "Metaclass ``FlowEnd``." + __slots__ = () + METACLASS: ClassVar[str] = "FlowEnd" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Feature.JSON_KEYS, + }) + + +class Function(Behavior): + "Metaclass ``Function``." + __slots__ = () + METACLASS: ClassVar[str] = "Function" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Behavior.JSON_KEYS, + "expression": "expression", + "isModelLevelEvaluable": "is_model_level_evaluable", + "result": "result", + }) + expression: Many[Expression] = Many("expression", "Expression", ordered=False, derived=True) + "``Function::expression`` (many, derived)." + is_model_level_evaluable: Opt[bool] = Opt("isModelLevelEvaluable", "bool", derived=True) + "``Function::isModelLevelEvaluable`` (single, derived)." + isModelLevelEvaluable = is_model_level_evaluable + result: Opt[Feature] = Opt("result", "Feature", derived=True) + "``Function::result`` (single, derived)." + + +class Interaction(Association, Behavior): + "Metaclass ``Interaction``." + __slots__ = () + METACLASS: ClassVar[str] = "Interaction" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Behavior.JSON_KEYS, + **Association.JSON_KEYS, + }) + + +class MetadataFeature(AnnotatingElement, Feature): + "Metaclass ``MetadataFeature``." + __slots__ = () + METACLASS: ClassVar[str] = "MetadataFeature" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Feature.JSON_KEYS, + **AnnotatingElement.JSON_KEYS, + "metaclass": "metaclass", + }) + metaclass: Opt[Metaclass] = Opt("metaclass", "Metaclass", derived=True) + "``MetadataFeature::metaclass`` (single, derived)." + + +class Multiplicity(Feature): + "Metaclass ``Multiplicity``." + __slots__ = () + METACLASS: ClassVar[str] = "Multiplicity" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Feature.JSON_KEYS, + }) + + +class MultiplicityRange(Multiplicity): + "Metaclass ``MultiplicityRange``." + __slots__ = () + METACLASS: ClassVar[str] = "MultiplicityRange" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Multiplicity.JSON_KEYS, + "bound": "bound", + "lowerBound": "lower_bound", + "upperBound": "upper_bound", + }) + bound: Many[Expression] = Many("bound", "Expression", ordered=True, derived=True) + "``MultiplicityRange::bound`` (many, ordered, derived)." + lower_bound: Opt[Expression] = Opt("lowerBound", "Expression", derived=True) + "``MultiplicityRange::lowerBound`` (single, derived)." + lowerBound = lower_bound + upper_bound: Opt[Expression] = Opt("upperBound", "Expression", derived=True) + "``MultiplicityRange::upperBound`` (single, derived)." + upperBound = upper_bound + + +class OccurrenceDefinition(Class, Definition): + "Metaclass ``OccurrenceDefinition``." + __slots__ = () + METACLASS: ClassVar[str] = "OccurrenceDefinition" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Definition.JSON_KEYS, + **Class.JSON_KEYS, + "isIndividual": "is_individual", + }) + is_individual: Opt[bool] = Opt("isIndividual", "bool") + "``OccurrenceDefinition::isIndividual`` (single)." + isIndividual = is_individual + + +class ActionDefinition(Behavior, OccurrenceDefinition): + "Metaclass ``ActionDefinition``." + __slots__ = () + METACLASS: ClassVar[str] = "ActionDefinition" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **OccurrenceDefinition.JSON_KEYS, + **Behavior.JSON_KEYS, + "action": "action", + }) + action: Many[ActionUsage] = Many("action", "ActionUsage", ordered=True, derived=True) + "``ActionDefinition::action`` (many, ordered, derived)." + + +class CalculationDefinition(ActionDefinition, Function): + "Metaclass ``CalculationDefinition``." + __slots__ = () + METACLASS: ClassVar[str] = "CalculationDefinition" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Function.JSON_KEYS, + **ActionDefinition.JSON_KEYS, + "calculation": "calculation", + }) + calculation: Many[CalculationUsage] = Many("calculation", "CalculationUsage", ordered=True, derived=True) + "``CalculationDefinition::calculation`` (many, ordered, derived)." + + +class CaseDefinition(CalculationDefinition): + "Metaclass ``CaseDefinition``." + __slots__ = () + METACLASS: ClassVar[str] = "CaseDefinition" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **CalculationDefinition.JSON_KEYS, + "actorParameter": "actor_parameter", + "objectiveRequirement": "objective_requirement", + "subjectParameter": "subject_parameter", + }) + actor_parameter: Many[PartUsage] = Many("actorParameter", "PartUsage", ordered=True, derived=True) + "``CaseDefinition::actorParameter`` (many, ordered, derived)." + actorParameter = actor_parameter + objective_requirement: Opt[RequirementUsage] = Opt("objectiveRequirement", "RequirementUsage", derived=True) + "``CaseDefinition::objectiveRequirement`` (single, derived)." + objectiveRequirement = objective_requirement + subject_parameter: Opt[Usage] = Opt("subjectParameter", "Usage", derived=True) + "``CaseDefinition::subjectParameter`` (single, derived)." + subjectParameter = subject_parameter + + +class AnalysisCaseDefinition(CaseDefinition): + "Metaclass ``AnalysisCaseDefinition``." + __slots__ = () + METACLASS: ClassVar[str] = "AnalysisCaseDefinition" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **CaseDefinition.JSON_KEYS, + "resultExpression": "result_expression", + }) + result_expression: Opt[Expression] = Opt("resultExpression", "Expression", derived=True) + "``AnalysisCaseDefinition::resultExpression`` (single, derived)." + resultExpression = result_expression + + +class FlowDefinition(ActionDefinition, Interaction): + "Metaclass ``FlowDefinition``." + __slots__ = () + METACLASS: ClassVar[str] = "FlowDefinition" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Interaction.JSON_KEYS, + **ActionDefinition.JSON_KEYS, + "flowEnd": "flow_end", + }) + flow_end: Many[Usage] = Many("flowEnd", "Usage", ordered=False, derived=True) + "``FlowDefinition::flowEnd`` (many, derived). Redefines ``Association::associationEnd``." + flowEnd = flow_end + + +class PayloadFeature(Feature): + "Metaclass ``PayloadFeature``." + __slots__ = () + METACLASS: ClassVar[str] = "PayloadFeature" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Feature.JSON_KEYS, + }) + + +class Predicate(Function): + "Metaclass ``Predicate``." + __slots__ = () + METACLASS: ClassVar[str] = "Predicate" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Function.JSON_KEYS, + }) + + +class ConstraintDefinition(OccurrenceDefinition, Predicate): + "Metaclass ``ConstraintDefinition``." + __slots__ = () + METACLASS: ClassVar[str] = "ConstraintDefinition" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Predicate.JSON_KEYS, + **OccurrenceDefinition.JSON_KEYS, + }) + + +class RequirementDefinition(ConstraintDefinition): + "Metaclass ``RequirementDefinition``." + __slots__ = () + METACLASS: ClassVar[str] = "RequirementDefinition" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **ConstraintDefinition.JSON_KEYS, + "actorParameter": "actor_parameter", + "assumedConstraint": "assumed_constraint", + "framedConcern": "framed_concern", + "reqId": "req_id", + "requiredConstraint": "required_constraint", + "stakeholderParameter": "stakeholder_parameter", + "subjectParameter": "subject_parameter", + "text": "text", + }) + actor_parameter: Many[PartUsage] = Many("actorParameter", "PartUsage", ordered=True, derived=True) + "``RequirementDefinition::actorParameter`` (many, ordered, derived)." + actorParameter = actor_parameter + assumed_constraint: Many[ConstraintUsage] = Many("assumedConstraint", "ConstraintUsage", ordered=True, derived=True) + "``RequirementDefinition::assumedConstraint`` (many, ordered, derived)." + assumedConstraint = assumed_constraint + framed_concern: Many[ConcernUsage] = Many("framedConcern", "ConcernUsage", ordered=True, derived=True) + "``RequirementDefinition::framedConcern`` (many, ordered, derived)." + framedConcern = framed_concern + req_id: Opt[str] = Opt("reqId", "str") + "``RequirementDefinition::reqId`` (single). Redefines ``Element::declaredShortName``." + reqId = req_id + required_constraint: Many[ConstraintUsage] = Many("requiredConstraint", "ConstraintUsage", ordered=True, derived=True) + "``RequirementDefinition::requiredConstraint`` (many, ordered, derived)." + requiredConstraint = required_constraint + stakeholder_parameter: Many[PartUsage] = Many("stakeholderParameter", "PartUsage", ordered=True, derived=True) + "``RequirementDefinition::stakeholderParameter`` (many, ordered, derived)." + stakeholderParameter = stakeholder_parameter + subject_parameter: Opt[Usage] = Opt("subjectParameter", "Usage", derived=True) + "``RequirementDefinition::subjectParameter`` (single, derived)." + subjectParameter = subject_parameter + text: Many[str] = Many("text", "str", ordered=False, derived=True) + "``RequirementDefinition::text`` (many, derived)." + + +class ConcernDefinition(RequirementDefinition): + "Metaclass ``ConcernDefinition``." + __slots__ = () + METACLASS: ClassVar[str] = "ConcernDefinition" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **RequirementDefinition.JSON_KEYS, + }) + + +class StateDefinition(ActionDefinition): + "Metaclass ``StateDefinition``." + __slots__ = () + METACLASS: ClassVar[str] = "StateDefinition" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **ActionDefinition.JSON_KEYS, + "doAction": "do_action", + "entryAction": "entry_action", + "exitAction": "exit_action", + "isParallel": "is_parallel", + "state": "state", + }) + do_action: Opt[ActionUsage] = Opt("doAction", "ActionUsage", derived=True) + "``StateDefinition::doAction`` (single, derived)." + doAction = do_action + entry_action: Opt[ActionUsage] = Opt("entryAction", "ActionUsage", derived=True) + "``StateDefinition::entryAction`` (single, derived)." + entryAction = entry_action + exit_action: Opt[ActionUsage] = Opt("exitAction", "ActionUsage", derived=True) + "``StateDefinition::exitAction`` (single, derived)." + exitAction = exit_action + is_parallel: Opt[bool] = Opt("isParallel", "bool") + "``StateDefinition::isParallel`` (single)." + isParallel = is_parallel + state: Many[StateUsage] = Many("state", "StateUsage", ordered=True, derived=True) + "``StateDefinition::state`` (many, ordered, derived)." + + +class Step(Feature): + "Metaclass ``Step``." + __slots__ = () + METACLASS: ClassVar[str] = "Step" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Feature.JSON_KEYS, + "behavior": "behavior", + "parameter": "parameter", + }) + behavior: Many[Behavior] = Many("behavior", "Behavior", ordered=True, derived=True) + "``Step::behavior`` (many, ordered, derived)." + parameter: Many[Feature] = Many("parameter", "Feature", ordered=True, derived=True) + "``Step::parameter`` (many, ordered, derived). Redefines ``Type::directedFeature``." + + +class Expression(Step): + "Metaclass ``Expression``." + __slots__ = () + METACLASS: ClassVar[str] = "Expression" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Step.JSON_KEYS, + "function": "function", + "isModelLevelEvaluable": "is_model_level_evaluable", + "result": "result", + }) + function: Opt[Function] = Opt("function", "Function", derived=True) + "``Expression::function`` (single, derived). Redefines ``Step::behavior``." + is_model_level_evaluable: Opt[bool] = Opt("isModelLevelEvaluable", "bool", derived=True) + "``Expression::isModelLevelEvaluable`` (single, derived)." + isModelLevelEvaluable = is_model_level_evaluable + result: Opt[Feature] = Opt("result", "Feature", derived=True) + "``Expression::result`` (single, derived)." + + +class BooleanExpression(Expression): + "Metaclass ``BooleanExpression``." + __slots__ = () + METACLASS: ClassVar[str] = "BooleanExpression" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Expression.JSON_KEYS, + "predicate": "predicate", + }) + predicate: Opt[Predicate] = Opt("predicate", "Predicate", derived=True) + "``BooleanExpression::predicate`` (single, derived). Redefines ``Expression::function``." + + +class FeatureReferenceExpression(Expression): + "Metaclass ``FeatureReferenceExpression``." + __slots__ = () + METACLASS: ClassVar[str] = "FeatureReferenceExpression" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Expression.JSON_KEYS, + "referent": "referent", + }) + referent: Opt[Feature] = Opt("referent", "Feature", derived=True) + "``FeatureReferenceExpression::referent`` (single, derived)." + + +class Flow(Connector, Step): + "Metaclass ``Flow``." + __slots__ = () + METACLASS: ClassVar[str] = "Flow" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Step.JSON_KEYS, + **Connector.JSON_KEYS, + "flowEnd": "flow_end", + "interaction": "interaction", + "payloadFeature": "payload_feature", + "payloadType": "payload_type", + "sourceOutputFeature": "source_output_feature", + "targetInputFeature": "target_input_feature", + }) + flow_end: Many[FlowEnd] = Many("flowEnd", "FlowEnd", ordered=True, derived=True) + "``Flow::flowEnd`` (many, ordered, derived)." + flowEnd = flow_end + interaction: Many[Interaction] = Many("interaction", "Interaction", ordered=True, derived=True) + "``Flow::interaction`` (many, ordered, derived). Redefines ``Connector::association``, ``Step::behavior``." + payload_feature: Opt[PayloadFeature] = Opt("payloadFeature", "PayloadFeature", derived=True) + "``Flow::payloadFeature`` (single, derived)." + payloadFeature = payload_feature + payload_type: Many[Classifier] = Many("payloadType", "Classifier", ordered=True, derived=True) + "``Flow::payloadType`` (many, ordered, derived)." + payloadType = payload_type + source_output_feature: Opt[Feature] = Opt("sourceOutputFeature", "Feature", derived=True) + "``Flow::sourceOutputFeature`` (single, derived)." + sourceOutputFeature = source_output_feature + target_input_feature: Opt[Feature] = Opt("targetInputFeature", "Feature", derived=True) + "``Flow::targetInputFeature`` (single, derived)." + targetInputFeature = target_input_feature + + +class InstantiationExpression(Expression): + "Abstract metaclass ``InstantiationExpression``." + __slots__ = () + METACLASS: ClassVar[str] = "InstantiationExpression" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Expression.JSON_KEYS, + "argument": "argument", + "instantiatedType": "instantiated_type", + }) + argument: Many[Expression] = Many("argument", "Expression", ordered=True, derived=True) + "``InstantiationExpression::argument`` (many, ordered, derived)." + instantiated_type: Opt[Type] = Opt("instantiatedType", "Type", derived=True) + "``InstantiationExpression::instantiatedType`` (single, derived)." + instantiatedType = instantiated_type + + +class ConstructorExpression(InstantiationExpression): + "Metaclass ``ConstructorExpression``." + __slots__ = () + METACLASS: ClassVar[str] = "ConstructorExpression" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **InstantiationExpression.JSON_KEYS, + }) + + +class Invariant(BooleanExpression): + "Metaclass ``Invariant``." + __slots__ = () + METACLASS: ClassVar[str] = "Invariant" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **BooleanExpression.JSON_KEYS, + "isNegated": "is_negated", + }) + is_negated: Opt[bool] = Opt("isNegated", "bool") + "``Invariant::isNegated`` (single)." + isNegated = is_negated + + +class InvocationExpression(InstantiationExpression): + "Metaclass ``InvocationExpression``." + __slots__ = () + METACLASS: ClassVar[str] = "InvocationExpression" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **InstantiationExpression.JSON_KEYS, + "operand": "operand", + }) + operand: Many[Expression] = Many("operand", "Expression", ordered=True, derived=True) + "``InvocationExpression::operand`` (many, ordered, derived)." + + +class LiteralExpression(Expression): + "Metaclass ``LiteralExpression``." + __slots__ = () + METACLASS: ClassVar[str] = "LiteralExpression" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Expression.JSON_KEYS, + }) + + +class LiteralBoolean(LiteralExpression): + "Metaclass ``LiteralBoolean``." + __slots__ = () + METACLASS: ClassVar[str] = "LiteralBoolean" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **LiteralExpression.JSON_KEYS, + "value": "value", + }) + value: Opt[bool] = Opt("value", "bool") + "``LiteralBoolean::value`` (single)." + + +class LiteralInfinity(LiteralExpression): + "Metaclass ``LiteralInfinity``." + __slots__ = () + METACLASS: ClassVar[str] = "LiteralInfinity" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **LiteralExpression.JSON_KEYS, + }) + + +class LiteralInteger(LiteralExpression): + "Metaclass ``LiteralInteger``." + __slots__ = () + METACLASS: ClassVar[str] = "LiteralInteger" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **LiteralExpression.JSON_KEYS, + "value": "value", + }) + value: Opt[int] = Opt("value", "int") + "``LiteralInteger::value`` (single)." + + +class LiteralRational(LiteralExpression): + "Metaclass ``LiteralRational``." + __slots__ = () + METACLASS: ClassVar[str] = "LiteralRational" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **LiteralExpression.JSON_KEYS, + "value": "value", + }) + value: Opt[float] = Opt("value", "float") + "``LiteralRational::value`` (single)." + + +class LiteralString(LiteralExpression): + "Metaclass ``LiteralString``." + __slots__ = () + METACLASS: ClassVar[str] = "LiteralString" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **LiteralExpression.JSON_KEYS, + "value": "value", + }) + value: Opt[str] = Opt("value", "str") + "``LiteralString::value`` (single)." + + +class MetadataAccessExpression(Expression): + "Metaclass ``MetadataAccessExpression``." + __slots__ = () + METACLASS: ClassVar[str] = "MetadataAccessExpression" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Expression.JSON_KEYS, + "referencedElement": "referenced_element", + }) + referenced_element: Opt[Element] = Opt("referencedElement", "Element", derived=True) + "``MetadataAccessExpression::referencedElement`` (single, derived)." + referencedElement = referenced_element + + +class NullExpression(Expression): + "Metaclass ``NullExpression``." + __slots__ = () + METACLASS: ClassVar[str] = "NullExpression" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Expression.JSON_KEYS, + }) + + +class OperatorExpression(InvocationExpression): + "Metaclass ``OperatorExpression``." + __slots__ = () + METACLASS: ClassVar[str] = "OperatorExpression" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **InvocationExpression.JSON_KEYS, + "operator": "operator", + }) + operator: Opt[str] = Opt("operator", "str") + "``OperatorExpression::operator`` (single)." + + +class CollectExpression(OperatorExpression): + "Metaclass ``CollectExpression``." + __slots__ = () + METACLASS: ClassVar[str] = "CollectExpression" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **OperatorExpression.JSON_KEYS, + }) + + +class FeatureChainExpression(OperatorExpression): + "Metaclass ``FeatureChainExpression``." + __slots__ = () + METACLASS: ClassVar[str] = "FeatureChainExpression" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **OperatorExpression.JSON_KEYS, + "targetFeature": "target_feature", + }) + target_feature: Opt[Feature] = Opt("targetFeature", "Feature", derived=True) + "``FeatureChainExpression::targetFeature`` (single, derived)." + targetFeature = target_feature + + +class IndexExpression(OperatorExpression): + "Metaclass ``IndexExpression``." + __slots__ = () + METACLASS: ClassVar[str] = "IndexExpression" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **OperatorExpression.JSON_KEYS, + }) + + +class SelectExpression(OperatorExpression): + "Metaclass ``SelectExpression``." + __slots__ = () + METACLASS: ClassVar[str] = "SelectExpression" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **OperatorExpression.JSON_KEYS, + }) + + +class Structure(Class): + "Metaclass ``Structure``." + __slots__ = () + METACLASS: ClassVar[str] = "Structure" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Class.JSON_KEYS, + }) + + +class AssociationStructure(Association, Structure): + "Metaclass ``AssociationStructure``." + __slots__ = () + METACLASS: ClassVar[str] = "AssociationStructure" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Structure.JSON_KEYS, + **Association.JSON_KEYS, + }) + + +class ItemDefinition(OccurrenceDefinition, Structure): + "Metaclass ``ItemDefinition``." + __slots__ = () + METACLASS: ClassVar[str] = "ItemDefinition" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Structure.JSON_KEYS, + **OccurrenceDefinition.JSON_KEYS, + }) + + +class Metaclass(Structure): + "Metaclass ``Metaclass``." + __slots__ = () + METACLASS: ClassVar[str] = "Metaclass" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Structure.JSON_KEYS, + }) + + +class MetadataDefinition(ItemDefinition, Metaclass): + "Metaclass ``MetadataDefinition``." + __slots__ = () + METACLASS: ClassVar[str] = "MetadataDefinition" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Metaclass.JSON_KEYS, + **ItemDefinition.JSON_KEYS, + }) + + +class PartDefinition(ItemDefinition): + "Metaclass ``PartDefinition``." + __slots__ = () + METACLASS: ClassVar[str] = "PartDefinition" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **ItemDefinition.JSON_KEYS, + }) + + +class ConnectionDefinition(AssociationStructure, PartDefinition): + "Metaclass ``ConnectionDefinition``." + __slots__ = () + METACLASS: ClassVar[str] = "ConnectionDefinition" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **PartDefinition.JSON_KEYS, + **AssociationStructure.JSON_KEYS, + "connectionEnd": "connection_end", + }) + connection_end: Many[Usage] = Many("connectionEnd", "Usage", ordered=True, derived=True) + "``ConnectionDefinition::connectionEnd`` (many, ordered, derived). Redefines ``Association::associationEnd``." + connectionEnd = connection_end + + +class AllocationDefinition(ConnectionDefinition): + "Metaclass ``AllocationDefinition``." + __slots__ = () + METACLASS: ClassVar[str] = "AllocationDefinition" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **ConnectionDefinition.JSON_KEYS, + "allocation": "allocation", + }) + allocation: Many[AllocationUsage] = Many("allocation", "AllocationUsage", ordered=True, derived=True) + "``AllocationDefinition::allocation`` (many, ordered, derived)." + + +class InterfaceDefinition(ConnectionDefinition): + "Metaclass ``InterfaceDefinition``." + __slots__ = () + METACLASS: ClassVar[str] = "InterfaceDefinition" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **ConnectionDefinition.JSON_KEYS, + "interfaceEnd": "interface_end", + }) + interface_end: Many[PortUsage] = Many("interfaceEnd", "PortUsage", ordered=True, derived=True) + "``InterfaceDefinition::interfaceEnd`` (many, ordered, derived). Redefines ``ConnectionDefinition::connectionEnd``." + interfaceEnd = interface_end + + +class PortDefinition(OccurrenceDefinition, Structure): + "Metaclass ``PortDefinition``." + __slots__ = () + METACLASS: ClassVar[str] = "PortDefinition" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Structure.JSON_KEYS, + **OccurrenceDefinition.JSON_KEYS, + "conjugatedPortDefinition": "conjugated_port_definition", + }) + conjugated_port_definition: Opt[ConjugatedPortDefinition] = Opt("conjugatedPortDefinition", "ConjugatedPortDefinition", derived=True) + "``PortDefinition::conjugatedPortDefinition`` (single, derived)." + conjugatedPortDefinition = conjugated_port_definition + + +class ConjugatedPortDefinition(PortDefinition): + "Metaclass ``ConjugatedPortDefinition``." + __slots__ = () + METACLASS: ClassVar[str] = "ConjugatedPortDefinition" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **PortDefinition.JSON_KEYS, + "originalPortDefinition": "original_port_definition", + "ownedPortConjugator": "owned_port_conjugator", + }) + original_port_definition: Opt[PortDefinition] = Opt("originalPortDefinition", "PortDefinition", derived=True) + "``ConjugatedPortDefinition::originalPortDefinition`` (single, derived). Redefines ``Element::owningNamespace``." + originalPortDefinition = original_port_definition + owned_port_conjugator: Opt[PortConjugation] = Opt("ownedPortConjugator", "PortConjugation", derived=True) + "``ConjugatedPortDefinition::ownedPortConjugator`` (single, derived). Redefines ``Type::ownedConjugator``." + ownedPortConjugator = owned_port_conjugator + + +class RenderingDefinition(PartDefinition): + "Metaclass ``RenderingDefinition``." + __slots__ = () + METACLASS: ClassVar[str] = "RenderingDefinition" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **PartDefinition.JSON_KEYS, + "rendering": "rendering", + }) + rendering: Many[RenderingUsage] = Many("rendering", "RenderingUsage", ordered=True, derived=True) + "``RenderingDefinition::rendering`` (many, ordered, derived)." + + +class Succession(Connector): + "Metaclass ``Succession``." + __slots__ = () + METACLASS: ClassVar[str] = "Succession" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Connector.JSON_KEYS, + }) + + +class SuccessionFlow(Flow, Succession): + "Metaclass ``SuccessionFlow``." + __slots__ = () + METACLASS: ClassVar[str] = "SuccessionFlow" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Succession.JSON_KEYS, + **Flow.JSON_KEYS, + }) + + +class TriggerInvocationExpression(InvocationExpression): + "Metaclass ``TriggerInvocationExpression``." + __slots__ = () + METACLASS: ClassVar[str] = "TriggerInvocationExpression" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **InvocationExpression.JSON_KEYS, + "kind": "kind", + }) + kind: Opt[TriggerKind] = Opt("kind", "TriggerKind") + "``TriggerInvocationExpression::kind`` (single)." + + +class TypeFeaturing(Relationship): + "Metaclass ``TypeFeaturing``." + __slots__ = () + METACLASS: ClassVar[str] = "TypeFeaturing" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Relationship.JSON_KEYS, + "featureOfType": "feature_of_type", + "featuringType": "featuring_type", + "owningFeatureOfType": "owning_feature_of_type", + }) + feature_of_type: Opt[Feature] = Opt("featureOfType", "Feature") + "``TypeFeaturing::featureOfType`` (single). Redefines ``Relationship::source``." + featureOfType = feature_of_type + featuring_type: Opt[Type] = Opt("featuringType", "Type") + "``TypeFeaturing::featuringType`` (single). Redefines ``Relationship::target``." + featuringType = featuring_type + owning_feature_of_type: Opt[Feature] = Opt("owningFeatureOfType", "Feature", derived=True) + "``TypeFeaturing::owningFeatureOfType`` (single, derived)." + owningFeatureOfType = owning_feature_of_type + + +class Unioning(Relationship): + "Metaclass ``Unioning``." + __slots__ = () + METACLASS: ClassVar[str] = "Unioning" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Relationship.JSON_KEYS, + "typeUnioned": "type_unioned", + "unioningType": "unioning_type", + }) + type_unioned: Opt[Type] = Opt("typeUnioned", "Type", derived=True) + "``Unioning::typeUnioned`` (single, derived). Redefines ``Relationship::source``." + typeUnioned = type_unioned + unioning_type: Opt[Type] = Opt("unioningType", "Type") + "``Unioning::unioningType`` (single). Redefines ``Relationship::target``." + unioningType = unioning_type + + +class Usage(Feature): + "Metaclass ``Usage``." + __slots__ = () + METACLASS: ClassVar[str] = "Usage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Feature.JSON_KEYS, + "definition": "definition", + "directedUsage": "directed_usage", + "isReference": "is_reference", + "isVariation": "is_variation", + "mayTimeVary": "may_time_vary", + "nestedAction": "nested_action", + "nestedAllocation": "nested_allocation", + "nestedAnalysisCase": "nested_analysis_case", + "nestedAttribute": "nested_attribute", + "nestedCalculation": "nested_calculation", + "nestedCase": "nested_case", + "nestedConcern": "nested_concern", + "nestedConnection": "nested_connection", + "nestedConstraint": "nested_constraint", + "nestedEnumeration": "nested_enumeration", + "nestedFlow": "nested_flow", + "nestedInterface": "nested_interface", + "nestedItem": "nested_item", + "nestedMetadata": "nested_metadata", + "nestedOccurrence": "nested_occurrence", + "nestedPart": "nested_part", + "nestedPort": "nested_port", + "nestedReference": "nested_reference", + "nestedRendering": "nested_rendering", + "nestedRequirement": "nested_requirement", + "nestedState": "nested_state", + "nestedTransition": "nested_transition", + "nestedUsage": "nested_usage", + "nestedUseCase": "nested_use_case", + "nestedVerificationCase": "nested_verification_case", + "nestedView": "nested_view", + "nestedViewpoint": "nested_viewpoint", + "owningDefinition": "owning_definition", + "owningUsage": "owning_usage", + "usage": "usage", + "variant": "variant", + "variantMembership": "variant_membership", + }) + definition: Many[Classifier] = Many("definition", "Classifier", ordered=True, derived=True) + "``Usage::definition`` (many, ordered, derived). Redefines ``Feature::type``." + directed_usage: Many[Usage] = Many("directedUsage", "Usage", ordered=True, derived=True) + "``Usage::directedUsage`` (many, ordered, derived)." + directedUsage = directed_usage + is_reference: Opt[bool] = Opt("isReference", "bool", derived=True) + "``Usage::isReference`` (single, derived)." + isReference = is_reference + is_variation: Opt[bool] = Opt("isVariation", "bool") + "``Usage::isVariation`` (single)." + isVariation = is_variation + may_time_vary: Opt[bool] = Opt("mayTimeVary", "bool", derived=True) + "``Usage::mayTimeVary`` (single, derived). Redefines ``Feature::isVariable``." + mayTimeVary = may_time_vary + nested_action: Many[ActionUsage] = Many("nestedAction", "ActionUsage", ordered=True, derived=True) + "``Usage::nestedAction`` (many, ordered, derived)." + nestedAction = nested_action + nested_allocation: Many[AllocationUsage] = Many("nestedAllocation", "AllocationUsage", ordered=True, derived=True) + "``Usage::nestedAllocation`` (many, ordered, derived)." + nestedAllocation = nested_allocation + nested_analysis_case: Many[AnalysisCaseUsage] = Many("nestedAnalysisCase", "AnalysisCaseUsage", ordered=True, derived=True) + "``Usage::nestedAnalysisCase`` (many, ordered, derived)." + nestedAnalysisCase = nested_analysis_case + nested_attribute: Many[AttributeUsage] = Many("nestedAttribute", "AttributeUsage", ordered=True, derived=True) + "``Usage::nestedAttribute`` (many, ordered, derived)." + nestedAttribute = nested_attribute + nested_calculation: Many[CalculationUsage] = Many("nestedCalculation", "CalculationUsage", ordered=True, derived=True) + "``Usage::nestedCalculation`` (many, ordered, derived)." + nestedCalculation = nested_calculation + nested_case: Many[CaseUsage] = Many("nestedCase", "CaseUsage", ordered=True, derived=True) + "``Usage::nestedCase`` (many, ordered, derived)." + nestedCase = nested_case + nested_concern: Many[ConcernUsage] = Many("nestedConcern", "ConcernUsage", ordered=False, derived=True) + "``Usage::nestedConcern`` (many, derived)." + nestedConcern = nested_concern + nested_connection: Many[ConnectorAsUsage] = Many("nestedConnection", "ConnectorAsUsage", ordered=True, derived=True) + "``Usage::nestedConnection`` (many, ordered, derived)." + nestedConnection = nested_connection + nested_constraint: Many[ConstraintUsage] = Many("nestedConstraint", "ConstraintUsage", ordered=True, derived=True) + "``Usage::nestedConstraint`` (many, ordered, derived)." + nestedConstraint = nested_constraint + nested_enumeration: Many[EnumerationUsage] = Many("nestedEnumeration", "EnumerationUsage", ordered=True, derived=True) + "``Usage::nestedEnumeration`` (many, ordered, derived)." + nestedEnumeration = nested_enumeration + nested_flow: Many[FlowUsage] = Many("nestedFlow", "FlowUsage", ordered=False, derived=True) + "``Usage::nestedFlow`` (many, derived)." + nestedFlow = nested_flow + nested_interface: Many[InterfaceUsage] = Many("nestedInterface", "InterfaceUsage", ordered=True, derived=True) + "``Usage::nestedInterface`` (many, ordered, derived)." + nestedInterface = nested_interface + nested_item: Many[ItemUsage] = Many("nestedItem", "ItemUsage", ordered=True, derived=True) + "``Usage::nestedItem`` (many, ordered, derived)." + nestedItem = nested_item + nested_metadata: Many[MetadataUsage] = Many("nestedMetadata", "MetadataUsage", ordered=True, derived=True) + "``Usage::nestedMetadata`` (many, ordered, derived)." + nestedMetadata = nested_metadata + nested_occurrence: Many[OccurrenceUsage] = Many("nestedOccurrence", "OccurrenceUsage", ordered=True, derived=True) + "``Usage::nestedOccurrence`` (many, ordered, derived)." + nestedOccurrence = nested_occurrence + nested_part: Many[PartUsage] = Many("nestedPart", "PartUsage", ordered=True, derived=True) + "``Usage::nestedPart`` (many, ordered, derived)." + nestedPart = nested_part + nested_port: Many[PortUsage] = Many("nestedPort", "PortUsage", ordered=True, derived=True) + "``Usage::nestedPort`` (many, ordered, derived)." + nestedPort = nested_port + nested_reference: Many[ReferenceUsage] = Many("nestedReference", "ReferenceUsage", ordered=True, derived=True) + "``Usage::nestedReference`` (many, ordered, derived)." + nestedReference = nested_reference + nested_rendering: Many[RenderingUsage] = Many("nestedRendering", "RenderingUsage", ordered=True, derived=True) + "``Usage::nestedRendering`` (many, ordered, derived)." + nestedRendering = nested_rendering + nested_requirement: Many[RequirementUsage] = Many("nestedRequirement", "RequirementUsage", ordered=True, derived=True) + "``Usage::nestedRequirement`` (many, ordered, derived)." + nestedRequirement = nested_requirement + nested_state: Many[StateUsage] = Many("nestedState", "StateUsage", ordered=True, derived=True) + "``Usage::nestedState`` (many, ordered, derived)." + nestedState = nested_state + nested_transition: Many[TransitionUsage] = Many("nestedTransition", "TransitionUsage", ordered=False, derived=True) + "``Usage::nestedTransition`` (many, derived)." + nestedTransition = nested_transition + nested_usage: Many[Usage] = Many("nestedUsage", "Usage", ordered=True, derived=True) + "``Usage::nestedUsage`` (many, ordered, derived)." + nestedUsage = nested_usage + nested_use_case: Many[UseCaseUsage] = Many("nestedUseCase", "UseCaseUsage", ordered=True, derived=True) + "``Usage::nestedUseCase`` (many, ordered, derived)." + nestedUseCase = nested_use_case + nested_verification_case: Many[VerificationCaseUsage] = Many("nestedVerificationCase", "VerificationCaseUsage", ordered=True, derived=True) + "``Usage::nestedVerificationCase`` (many, ordered, derived)." + nestedVerificationCase = nested_verification_case + nested_view: Many[ViewUsage] = Many("nestedView", "ViewUsage", ordered=True, derived=True) + "``Usage::nestedView`` (many, ordered, derived)." + nestedView = nested_view + nested_viewpoint: Many[ViewpointUsage] = Many("nestedViewpoint", "ViewpointUsage", ordered=True, derived=True) + "``Usage::nestedViewpoint`` (many, ordered, derived)." + nestedViewpoint = nested_viewpoint + owning_definition: Opt[Definition] = Opt("owningDefinition", "Definition", derived=True) + "``Usage::owningDefinition`` (single, derived)." + owningDefinition = owning_definition + owning_usage: Opt[Usage] = Opt("owningUsage", "Usage", derived=True) + "``Usage::owningUsage`` (single, derived)." + owningUsage = owning_usage + usage: Many[Usage] = Many("usage", "Usage", ordered=True, derived=True) + "``Usage::usage`` (many, ordered, derived)." + variant: Many[Usage] = Many("variant", "Usage", ordered=False, derived=True) + "``Usage::variant`` (many, derived)." + variant_membership: Many[VariantMembership] = Many("variantMembership", "VariantMembership", ordered=False, derived=True) + "``Usage::variantMembership`` (many, derived)." + variantMembership = variant_membership + + +class AttributeUsage(Usage): + "Metaclass ``AttributeUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "AttributeUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Usage.JSON_KEYS, + "attributeDefinition": "attribute_definition", + }) + attribute_definition: Many[DataType] = Many("attributeDefinition", "DataType", ordered=True, derived=True) + "``AttributeUsage::attributeDefinition`` (many, ordered, derived). Redefines ``Usage::definition``." + attributeDefinition = attribute_definition + + +class ConnectorAsUsage(Connector, Usage): + "Abstract metaclass ``ConnectorAsUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "ConnectorAsUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Usage.JSON_KEYS, + **Connector.JSON_KEYS, + }) + + +class BindingConnectorAsUsage(BindingConnector, ConnectorAsUsage): + "Metaclass ``BindingConnectorAsUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "BindingConnectorAsUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **ConnectorAsUsage.JSON_KEYS, + **BindingConnector.JSON_KEYS, + }) + + +class EnumerationUsage(AttributeUsage): + "Metaclass ``EnumerationUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "EnumerationUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **AttributeUsage.JSON_KEYS, + "enumerationDefinition": "enumeration_definition", + }) + enumeration_definition: Opt[EnumerationDefinition] = Opt("enumerationDefinition", "EnumerationDefinition", derived=True) + "``EnumerationUsage::enumerationDefinition`` (single, derived). Redefines ``AttributeUsage::attributeDefinition``." + enumerationDefinition = enumeration_definition + + +class OccurrenceUsage(Usage): + "Metaclass ``OccurrenceUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "OccurrenceUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Usage.JSON_KEYS, + "individualDefinition": "individual_definition", + "isIndividual": "is_individual", + "occurrenceDefinition": "occurrence_definition", + "portionKind": "portion_kind", + }) + individual_definition: Opt[OccurrenceDefinition] = Opt("individualDefinition", "OccurrenceDefinition", derived=True) + "``OccurrenceUsage::individualDefinition`` (single, derived)." + individualDefinition = individual_definition + is_individual: Opt[bool] = Opt("isIndividual", "bool") + "``OccurrenceUsage::isIndividual`` (single)." + isIndividual = is_individual + occurrence_definition: Many[Class] = Many("occurrenceDefinition", "Class", ordered=True, derived=True) + "``OccurrenceUsage::occurrenceDefinition`` (many, ordered, derived). Redefines ``Usage::definition``." + occurrenceDefinition = occurrence_definition + portion_kind: Opt[PortionKind] = Opt("portionKind", "PortionKind") + "``OccurrenceUsage::portionKind`` (single)." + portionKind = portion_kind + + +class ActionUsage(OccurrenceUsage, Step): + "Metaclass ``ActionUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "ActionUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Step.JSON_KEYS, + **OccurrenceUsage.JSON_KEYS, + "actionDefinition": "action_definition", + }) + action_definition: Many[Behavior] = Many("actionDefinition", "Behavior", ordered=True, derived=True) + "``ActionUsage::actionDefinition`` (many, ordered, derived). Redefines ``Step::behavior``, ``OccurrenceUsage::occurrenceDefinition``." + actionDefinition = action_definition + + +class AcceptActionUsage(ActionUsage): + "Metaclass ``AcceptActionUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "AcceptActionUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **ActionUsage.JSON_KEYS, + "payloadArgument": "payload_argument", + "payloadParameter": "payload_parameter", + "receiverArgument": "receiver_argument", + }) + payload_argument: Opt[Expression] = Opt("payloadArgument", "Expression", derived=True) + "``AcceptActionUsage::payloadArgument`` (single, derived)." + payloadArgument = payload_argument + payload_parameter: Opt[ReferenceUsage] = Opt("payloadParameter", "ReferenceUsage", derived=True) + "``AcceptActionUsage::payloadParameter`` (single, derived)." + payloadParameter = payload_parameter + receiver_argument: Opt[Expression] = Opt("receiverArgument", "Expression", derived=True) + "``AcceptActionUsage::receiverArgument`` (single, derived)." + receiverArgument = receiver_argument + + +class AssignmentActionUsage(ActionUsage): + "Metaclass ``AssignmentActionUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "AssignmentActionUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **ActionUsage.JSON_KEYS, + "referent": "referent", + "targetArgument": "target_argument", + "valueExpression": "value_expression", + }) + referent: Opt[Feature] = Opt("referent", "Feature", derived=True) + "``AssignmentActionUsage::referent`` (single, derived)." + target_argument: Opt[Expression] = Opt("targetArgument", "Expression", derived=True) + "``AssignmentActionUsage::targetArgument`` (single, derived)." + targetArgument = target_argument + value_expression: Opt[Expression] = Opt("valueExpression", "Expression", derived=True) + "``AssignmentActionUsage::valueExpression`` (single, derived)." + valueExpression = value_expression + + +class CalculationUsage(ActionUsage, Expression): + "Metaclass ``CalculationUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "CalculationUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Expression.JSON_KEYS, + **ActionUsage.JSON_KEYS, + "calculationDefinition": "calculation_definition", + }) + calculation_definition: Opt[Function] = Opt("calculationDefinition", "Function", derived=True) + "``CalculationUsage::calculationDefinition`` (single, derived). Redefines ``Expression::function``, ``ActionUsage::actionDefinition``." + calculationDefinition = calculation_definition + + +class CaseUsage(CalculationUsage): + "Metaclass ``CaseUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "CaseUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **CalculationUsage.JSON_KEYS, + "actorParameter": "actor_parameter", + "caseDefinition": "case_definition", + "objectiveRequirement": "objective_requirement", + "subjectParameter": "subject_parameter", + }) + actor_parameter: Many[PartUsage] = Many("actorParameter", "PartUsage", ordered=True, derived=True) + "``CaseUsage::actorParameter`` (many, ordered, derived)." + actorParameter = actor_parameter + case_definition: Opt[CaseDefinition] = Opt("caseDefinition", "CaseDefinition", derived=True) + "``CaseUsage::caseDefinition`` (single, derived). Redefines ``CalculationUsage::calculationDefinition``." + caseDefinition = case_definition + objective_requirement: Opt[RequirementUsage] = Opt("objectiveRequirement", "RequirementUsage", derived=True) + "``CaseUsage::objectiveRequirement`` (single, derived)." + objectiveRequirement = objective_requirement + subject_parameter: Opt[Usage] = Opt("subjectParameter", "Usage", derived=True) + "``CaseUsage::subjectParameter`` (single, derived)." + subjectParameter = subject_parameter + + +class AnalysisCaseUsage(CaseUsage): + "Metaclass ``AnalysisCaseUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "AnalysisCaseUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **CaseUsage.JSON_KEYS, + "analysisCaseDefinition": "analysis_case_definition", + "resultExpression": "result_expression", + }) + analysis_case_definition: Opt[AnalysisCaseDefinition] = Opt("analysisCaseDefinition", "AnalysisCaseDefinition", derived=True) + "``AnalysisCaseUsage::analysisCaseDefinition`` (single, derived). Redefines ``CaseUsage::caseDefinition``." + analysisCaseDefinition = analysis_case_definition + result_expression: Opt[Expression] = Opt("resultExpression", "Expression", derived=True) + "``AnalysisCaseUsage::resultExpression`` (single, derived)." + resultExpression = result_expression + + +class ConstraintUsage(BooleanExpression, OccurrenceUsage): + "Metaclass ``ConstraintUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "ConstraintUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **OccurrenceUsage.JSON_KEYS, + **BooleanExpression.JSON_KEYS, + "constraintDefinition": "constraint_definition", + }) + constraint_definition: Opt[Predicate] = Opt("constraintDefinition", "Predicate", derived=True) + "``ConstraintUsage::constraintDefinition`` (single, derived). Redefines ``BooleanExpression::predicate``." + constraintDefinition = constraint_definition + + +class AssertConstraintUsage(ConstraintUsage, Invariant): + "Metaclass ``AssertConstraintUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "AssertConstraintUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Invariant.JSON_KEYS, + **ConstraintUsage.JSON_KEYS, + "assertedConstraint": "asserted_constraint", + }) + asserted_constraint: Opt[ConstraintUsage] = Opt("assertedConstraint", "ConstraintUsage", derived=True) + "``AssertConstraintUsage::assertedConstraint`` (single, derived)." + assertedConstraint = asserted_constraint + + +class ControlNode(ActionUsage): + "Abstract metaclass ``ControlNode``." + __slots__ = () + METACLASS: ClassVar[str] = "ControlNode" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **ActionUsage.JSON_KEYS, + }) + + +class DecisionNode(ControlNode): + "Metaclass ``DecisionNode``." + __slots__ = () + METACLASS: ClassVar[str] = "DecisionNode" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **ControlNode.JSON_KEYS, + }) + + +class EventOccurrenceUsage(OccurrenceUsage): + "Metaclass ``EventOccurrenceUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "EventOccurrenceUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **OccurrenceUsage.JSON_KEYS, + "eventOccurrence": "event_occurrence", + }) + event_occurrence: Opt[OccurrenceUsage] = Opt("eventOccurrence", "OccurrenceUsage", derived=True) + "``EventOccurrenceUsage::eventOccurrence`` (single, derived)." + eventOccurrence = event_occurrence + + +class FlowUsage(ActionUsage, ConnectorAsUsage, Flow): + "Metaclass ``FlowUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "FlowUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Flow.JSON_KEYS, + **ConnectorAsUsage.JSON_KEYS, + **ActionUsage.JSON_KEYS, + "flowDefinition": "flow_definition", + }) + flow_definition: Many[Interaction] = Many("flowDefinition", "Interaction", ordered=True, derived=True) + "``FlowUsage::flowDefinition`` (many, ordered, derived). Redefines ``ActionUsage::actionDefinition``, ``Flow::interaction``." + flowDefinition = flow_definition + + +class ForkNode(ControlNode): + "Metaclass ``ForkNode``." + __slots__ = () + METACLASS: ClassVar[str] = "ForkNode" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **ControlNode.JSON_KEYS, + }) + + +class IfActionUsage(ActionUsage): + "Metaclass ``IfActionUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "IfActionUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **ActionUsage.JSON_KEYS, + "elseAction": "else_action", + "ifArgument": "if_argument", + "thenAction": "then_action", + }) + else_action: Opt[ActionUsage] = Opt("elseAction", "ActionUsage", derived=True) + "``IfActionUsage::elseAction`` (single, derived)." + elseAction = else_action + if_argument: Opt[Expression] = Opt("ifArgument", "Expression", derived=True) + "``IfActionUsage::ifArgument`` (single, derived)." + ifArgument = if_argument + then_action: Opt[ActionUsage] = Opt("thenAction", "ActionUsage", derived=True) + "``IfActionUsage::thenAction`` (single, derived)." + thenAction = then_action + + +class ItemUsage(OccurrenceUsage): + "Metaclass ``ItemUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "ItemUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **OccurrenceUsage.JSON_KEYS, + "itemDefinition": "item_definition", + }) + item_definition: Many[Structure] = Many("itemDefinition", "Structure", ordered=True, derived=True) + "``ItemUsage::itemDefinition`` (many, ordered, derived)." + itemDefinition = item_definition + + +class JoinNode(ControlNode): + "Metaclass ``JoinNode``." + __slots__ = () + METACLASS: ClassVar[str] = "JoinNode" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **ControlNode.JSON_KEYS, + }) + + +class LoopActionUsage(ActionUsage): + "Abstract metaclass ``LoopActionUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "LoopActionUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **ActionUsage.JSON_KEYS, + "bodyAction": "body_action", + }) + body_action: Opt[ActionUsage] = Opt("bodyAction", "ActionUsage", derived=True) + "``LoopActionUsage::bodyAction`` (single, derived)." + bodyAction = body_action + + +class ForLoopActionUsage(LoopActionUsage): + "Metaclass ``ForLoopActionUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "ForLoopActionUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **LoopActionUsage.JSON_KEYS, + "loopVariable": "loop_variable", + "seqArgument": "seq_argument", + }) + loop_variable: Opt[ReferenceUsage] = Opt("loopVariable", "ReferenceUsage", derived=True) + "``ForLoopActionUsage::loopVariable`` (single, derived)." + loopVariable = loop_variable + seq_argument: Opt[Expression] = Opt("seqArgument", "Expression", derived=True) + "``ForLoopActionUsage::seqArgument`` (single, derived)." + seqArgument = seq_argument + + +class MergeNode(ControlNode): + "Metaclass ``MergeNode``." + __slots__ = () + METACLASS: ClassVar[str] = "MergeNode" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **ControlNode.JSON_KEYS, + }) + + +class MetadataUsage(ItemUsage, MetadataFeature): + "Metaclass ``MetadataUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "MetadataUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **MetadataFeature.JSON_KEYS, + **ItemUsage.JSON_KEYS, + "metadataDefinition": "metadata_definition", + }) + metadata_definition: Opt[Metaclass] = Opt("metadataDefinition", "Metaclass", derived=True) + "``MetadataUsage::metadataDefinition`` (single, derived). Redefines ``ItemUsage::itemDefinition``, ``MetadataFeature::metaclass``." + metadataDefinition = metadata_definition + + +class PartUsage(ItemUsage): + "Metaclass ``PartUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "PartUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **ItemUsage.JSON_KEYS, + "partDefinition": "part_definition", + }) + part_definition: Many[PartDefinition] = Many("partDefinition", "PartDefinition", ordered=True, derived=True) + "``PartUsage::partDefinition`` (many, ordered, derived)." + partDefinition = part_definition + + +class ConnectionUsage(ConnectorAsUsage, PartUsage): + "Metaclass ``ConnectionUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "ConnectionUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **PartUsage.JSON_KEYS, + **ConnectorAsUsage.JSON_KEYS, + "connectionDefinition": "connection_definition", + }) + connection_definition: Many[AssociationStructure] = Many("connectionDefinition", "AssociationStructure", ordered=True, derived=True) + "``ConnectionUsage::connectionDefinition`` (many, ordered, derived). Redefines ``Connector::association``." + connectionDefinition = connection_definition + + +class AllocationUsage(ConnectionUsage): + "Metaclass ``AllocationUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "AllocationUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **ConnectionUsage.JSON_KEYS, + "allocationDefinition": "allocation_definition", + }) + allocation_definition: Many[AllocationDefinition] = Many("allocationDefinition", "AllocationDefinition", ordered=True, derived=True) + "``AllocationUsage::allocationDefinition`` (many, ordered, derived). Redefines ``ConnectionUsage::connectionDefinition``." + allocationDefinition = allocation_definition + + +class InterfaceUsage(ConnectionUsage): + "Metaclass ``InterfaceUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "InterfaceUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **ConnectionUsage.JSON_KEYS, + "interfaceDefinition": "interface_definition", + }) + interface_definition: Many[InterfaceDefinition] = Many("interfaceDefinition", "InterfaceDefinition", ordered=False, derived=True) + "``InterfaceUsage::interfaceDefinition`` (many, derived). Redefines ``ConnectionUsage::connectionDefinition``." + interfaceDefinition = interface_definition + + +class PerformActionUsage(ActionUsage, EventOccurrenceUsage): + "Metaclass ``PerformActionUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "PerformActionUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **EventOccurrenceUsage.JSON_KEYS, + **ActionUsage.JSON_KEYS, + "performedAction": "performed_action", + }) + performed_action: Opt[ActionUsage] = Opt("performedAction", "ActionUsage", derived=True) + "``PerformActionUsage::performedAction`` (single, derived). Redefines ``EventOccurrenceUsage::eventOccurrence``." + performedAction = performed_action + + +class PortUsage(OccurrenceUsage): + "Metaclass ``PortUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "PortUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **OccurrenceUsage.JSON_KEYS, + "portDefinition": "port_definition", + }) + port_definition: Many[PortDefinition] = Many("portDefinition", "PortDefinition", ordered=True, derived=True) + "``PortUsage::portDefinition`` (many, ordered, derived). Redefines ``OccurrenceUsage::occurrenceDefinition``." + portDefinition = port_definition + + +class ReferenceUsage(Usage): + "Metaclass ``ReferenceUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "ReferenceUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Usage.JSON_KEYS, + }) + + +class RenderingUsage(PartUsage): + "Metaclass ``RenderingUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "RenderingUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **PartUsage.JSON_KEYS, + "renderingDefinition": "rendering_definition", + }) + rendering_definition: Opt[RenderingDefinition] = Opt("renderingDefinition", "RenderingDefinition", derived=True) + "``RenderingUsage::renderingDefinition`` (single, derived). Redefines ``PartUsage::partDefinition``." + renderingDefinition = rendering_definition + + +class RequirementUsage(ConstraintUsage): + "Metaclass ``RequirementUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "RequirementUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **ConstraintUsage.JSON_KEYS, + "actorParameter": "actor_parameter", + "assumedConstraint": "assumed_constraint", + "framedConcern": "framed_concern", + "reqId": "req_id", + "requiredConstraint": "required_constraint", + "requirementDefinition": "requirement_definition", + "stakeholderParameter": "stakeholder_parameter", + "subjectParameter": "subject_parameter", + "text": "text", + }) + actor_parameter: Many[PartUsage] = Many("actorParameter", "PartUsage", ordered=True, derived=True) + "``RequirementUsage::actorParameter`` (many, ordered, derived)." + actorParameter = actor_parameter + assumed_constraint: Many[ConstraintUsage] = Many("assumedConstraint", "ConstraintUsage", ordered=True, derived=True) + "``RequirementUsage::assumedConstraint`` (many, ordered, derived)." + assumedConstraint = assumed_constraint + framed_concern: Many[ConcernUsage] = Many("framedConcern", "ConcernUsage", ordered=True, derived=True) + "``RequirementUsage::framedConcern`` (many, ordered, derived)." + framedConcern = framed_concern + req_id: Opt[str] = Opt("reqId", "str") + "``RequirementUsage::reqId`` (single). Redefines ``Element::declaredShortName``." + reqId = req_id + required_constraint: Many[ConstraintUsage] = Many("requiredConstraint", "ConstraintUsage", ordered=True, derived=True) + "``RequirementUsage::requiredConstraint`` (many, ordered, derived)." + requiredConstraint = required_constraint + requirement_definition: Opt[RequirementDefinition] = Opt("requirementDefinition", "RequirementDefinition", derived=True) + "``RequirementUsage::requirementDefinition`` (single, derived). Redefines ``ConstraintUsage::constraintDefinition``." + requirementDefinition = requirement_definition + stakeholder_parameter: Many[PartUsage] = Many("stakeholderParameter", "PartUsage", ordered=True, derived=True) + "``RequirementUsage::stakeholderParameter`` (many, ordered, derived)." + stakeholderParameter = stakeholder_parameter + subject_parameter: Opt[Usage] = Opt("subjectParameter", "Usage", derived=True) + "``RequirementUsage::subjectParameter`` (single, derived)." + subjectParameter = subject_parameter + text: Many[str] = Many("text", "str", ordered=False, derived=True) + "``RequirementUsage::text`` (many, derived)." + + +class ConcernUsage(RequirementUsage): + "Metaclass ``ConcernUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "ConcernUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **RequirementUsage.JSON_KEYS, + "concernDefinition": "concern_definition", + }) + concern_definition: Opt[ConcernDefinition] = Opt("concernDefinition", "ConcernDefinition", derived=True) + "``ConcernUsage::concernDefinition`` (single, derived). Redefines ``RequirementUsage::requirementDefinition``." + concernDefinition = concern_definition + + +class SatisfyRequirementUsage(AssertConstraintUsage, RequirementUsage): + "Metaclass ``SatisfyRequirementUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "SatisfyRequirementUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **RequirementUsage.JSON_KEYS, + **AssertConstraintUsage.JSON_KEYS, + "satisfiedRequirement": "satisfied_requirement", + "satisfyingFeature": "satisfying_feature", + }) + satisfied_requirement: Opt[RequirementUsage] = Opt("satisfiedRequirement", "RequirementUsage", derived=True) + "``SatisfyRequirementUsage::satisfiedRequirement`` (single, derived). Redefines ``AssertConstraintUsage::assertedConstraint``." + satisfiedRequirement = satisfied_requirement + satisfying_feature: Opt[Feature] = Opt("satisfyingFeature", "Feature", derived=True) + "``SatisfyRequirementUsage::satisfyingFeature`` (single, derived)." + satisfyingFeature = satisfying_feature + + +class SendActionUsage(ActionUsage): + "Metaclass ``SendActionUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "SendActionUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **ActionUsage.JSON_KEYS, + "payloadArgument": "payload_argument", + "receiverArgument": "receiver_argument", + "senderArgument": "sender_argument", + }) + payload_argument: Opt[Expression] = Opt("payloadArgument", "Expression", derived=True) + "``SendActionUsage::payloadArgument`` (single, derived)." + payloadArgument = payload_argument + receiver_argument: Opt[Expression] = Opt("receiverArgument", "Expression", derived=True) + "``SendActionUsage::receiverArgument`` (single, derived)." + receiverArgument = receiver_argument + sender_argument: Opt[Expression] = Opt("senderArgument", "Expression", derived=True) + "``SendActionUsage::senderArgument`` (single, derived)." + senderArgument = sender_argument + + +class StateUsage(ActionUsage): + "Metaclass ``StateUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "StateUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **ActionUsage.JSON_KEYS, + "doAction": "do_action", + "entryAction": "entry_action", + "exitAction": "exit_action", + "isParallel": "is_parallel", + "stateDefinition": "state_definition", + }) + do_action: Opt[ActionUsage] = Opt("doAction", "ActionUsage", derived=True) + "``StateUsage::doAction`` (single, derived)." + doAction = do_action + entry_action: Opt[ActionUsage] = Opt("entryAction", "ActionUsage", derived=True) + "``StateUsage::entryAction`` (single, derived)." + entryAction = entry_action + exit_action: Opt[ActionUsage] = Opt("exitAction", "ActionUsage", derived=True) + "``StateUsage::exitAction`` (single, derived)." + exitAction = exit_action + is_parallel: Opt[bool] = Opt("isParallel", "bool") + "``StateUsage::isParallel`` (single)." + isParallel = is_parallel + state_definition: Many[Behavior] = Many("stateDefinition", "Behavior", ordered=True, derived=True) + "``StateUsage::stateDefinition`` (many, ordered, derived). Redefines ``ActionUsage::actionDefinition``." + stateDefinition = state_definition + + +class ExhibitStateUsage(PerformActionUsage, StateUsage): + "Metaclass ``ExhibitStateUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "ExhibitStateUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **StateUsage.JSON_KEYS, + **PerformActionUsage.JSON_KEYS, + "exhibitedState": "exhibited_state", + }) + exhibited_state: Opt[StateUsage] = Opt("exhibitedState", "StateUsage", derived=True) + "``ExhibitStateUsage::exhibitedState`` (single, derived). Redefines ``PerformActionUsage::performedAction``." + exhibitedState = exhibited_state + + +class SuccessionAsUsage(ConnectorAsUsage, Succession): + "Metaclass ``SuccessionAsUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "SuccessionAsUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **Succession.JSON_KEYS, + **ConnectorAsUsage.JSON_KEYS, + }) + + +class SuccessionFlowUsage(FlowUsage, SuccessionFlow): + "Metaclass ``SuccessionFlowUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "SuccessionFlowUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **SuccessionFlow.JSON_KEYS, + **FlowUsage.JSON_KEYS, + }) + + +class TerminateActionUsage(ActionUsage): + "Metaclass ``TerminateActionUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "TerminateActionUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **ActionUsage.JSON_KEYS, + "terminatedOccurrenceArgument": "terminated_occurrence_argument", + }) + terminated_occurrence_argument: Opt[Expression] = Opt("terminatedOccurrenceArgument", "Expression", derived=True) + "``TerminateActionUsage::terminatedOccurrenceArgument`` (single, derived)." + terminatedOccurrenceArgument = terminated_occurrence_argument + + +class TransitionUsage(ActionUsage): + "Metaclass ``TransitionUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "TransitionUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **ActionUsage.JSON_KEYS, + "effectAction": "effect_action", + "guardExpression": "guard_expression", + "source": "source", + "succession": "succession", + "target": "target", + "triggerAction": "trigger_action", + }) + effect_action: Many[ActionUsage] = Many("effectAction", "ActionUsage", ordered=False, derived=True) + "``TransitionUsage::effectAction`` (many, derived)." + effectAction = effect_action + guard_expression: Many[Expression] = Many("guardExpression", "Expression", ordered=False, derived=True) + "``TransitionUsage::guardExpression`` (many, derived)." + guardExpression = guard_expression + source: Opt[ActionUsage] = Opt("source", "ActionUsage", derived=True) + "``TransitionUsage::source`` (single, derived)." + succession: Opt[Succession] = Opt("succession", "Succession", derived=True) + "``TransitionUsage::succession`` (single, derived)." + target: Opt[ActionUsage] = Opt("target", "ActionUsage", derived=True) + "``TransitionUsage::target`` (single, derived)." + trigger_action: Many[AcceptActionUsage] = Many("triggerAction", "AcceptActionUsage", ordered=False, derived=True) + "``TransitionUsage::triggerAction`` (many, derived)." + triggerAction = trigger_action + + +class UseCaseDefinition(CaseDefinition): + "Metaclass ``UseCaseDefinition``." + __slots__ = () + METACLASS: ClassVar[str] = "UseCaseDefinition" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **CaseDefinition.JSON_KEYS, + "includedUseCase": "included_use_case", + }) + included_use_case: Many[UseCaseUsage] = Many("includedUseCase", "UseCaseUsage", ordered=True, derived=True) + "``UseCaseDefinition::includedUseCase`` (many, ordered, derived)." + includedUseCase = included_use_case + + +class UseCaseUsage(CaseUsage): + "Metaclass ``UseCaseUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "UseCaseUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **CaseUsage.JSON_KEYS, + "includedUseCase": "included_use_case", + "useCaseDefinition": "use_case_definition", + }) + included_use_case: Many[UseCaseUsage] = Many("includedUseCase", "UseCaseUsage", ordered=True, derived=True) + "``UseCaseUsage::includedUseCase`` (many, ordered, derived)." + includedUseCase = included_use_case + use_case_definition: Opt[UseCaseDefinition] = Opt("useCaseDefinition", "UseCaseDefinition", derived=True) + "``UseCaseUsage::useCaseDefinition`` (single, derived). Redefines ``CaseUsage::caseDefinition``." + useCaseDefinition = use_case_definition + + +class IncludeUseCaseUsage(PerformActionUsage, UseCaseUsage): + "Metaclass ``IncludeUseCaseUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "IncludeUseCaseUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **UseCaseUsage.JSON_KEYS, + **PerformActionUsage.JSON_KEYS, + "useCaseIncluded": "use_case_included", + }) + use_case_included: Opt[UseCaseUsage] = Opt("useCaseIncluded", "UseCaseUsage", derived=True) + "``IncludeUseCaseUsage::useCaseIncluded`` (single, derived). Redefines ``PerformActionUsage::performedAction``." + useCaseIncluded = use_case_included + + +class VariantMembership(OwningMembership): + "Metaclass ``VariantMembership``." + __slots__ = () + METACLASS: ClassVar[str] = "VariantMembership" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **OwningMembership.JSON_KEYS, + "ownedVariantUsage": "owned_variant_usage", + }) + owned_variant_usage: Opt[Usage] = Opt("ownedVariantUsage", "Usage", derived=True) + "``VariantMembership::ownedVariantUsage`` (single, derived). Redefines ``OwningMembership::ownedMemberElement``." + ownedVariantUsage = owned_variant_usage + + +class VerificationCaseDefinition(CaseDefinition): + "Metaclass ``VerificationCaseDefinition``." + __slots__ = () + METACLASS: ClassVar[str] = "VerificationCaseDefinition" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **CaseDefinition.JSON_KEYS, + "verifiedRequirement": "verified_requirement", + }) + verified_requirement: Many[RequirementUsage] = Many("verifiedRequirement", "RequirementUsage", ordered=True, derived=True) + "``VerificationCaseDefinition::verifiedRequirement`` (many, ordered, derived)." + verifiedRequirement = verified_requirement + + +class VerificationCaseUsage(CaseUsage): + "Metaclass ``VerificationCaseUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "VerificationCaseUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **CaseUsage.JSON_KEYS, + "verificationCaseDefinition": "verification_case_definition", + "verifiedRequirement": "verified_requirement", + }) + verification_case_definition: Opt[VerificationCaseDefinition] = Opt("verificationCaseDefinition", "VerificationCaseDefinition", derived=True) + "``VerificationCaseUsage::verificationCaseDefinition`` (single, derived)." + verificationCaseDefinition = verification_case_definition + verified_requirement: Many[RequirementUsage] = Many("verifiedRequirement", "RequirementUsage", ordered=True, derived=True) + "``VerificationCaseUsage::verifiedRequirement`` (many, ordered, derived)." + verifiedRequirement = verified_requirement + + +class ViewDefinition(PartDefinition): + "Metaclass ``ViewDefinition``." + __slots__ = () + METACLASS: ClassVar[str] = "ViewDefinition" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **PartDefinition.JSON_KEYS, + "satisfiedViewpoint": "satisfied_viewpoint", + "view": "view", + "viewCondition": "view_condition", + "viewRendering": "view_rendering", + }) + satisfied_viewpoint: Many[ViewpointUsage] = Many("satisfiedViewpoint", "ViewpointUsage", ordered=True, derived=True) + "``ViewDefinition::satisfiedViewpoint`` (many, ordered, derived)." + satisfiedViewpoint = satisfied_viewpoint + view: Many[ViewUsage] = Many("view", "ViewUsage", ordered=True, derived=True) + "``ViewDefinition::view`` (many, ordered, derived)." + view_condition: Many[Expression] = Many("viewCondition", "Expression", ordered=True, derived=True) + "``ViewDefinition::viewCondition`` (many, ordered, derived)." + viewCondition = view_condition + view_rendering: Opt[RenderingUsage] = Opt("viewRendering", "RenderingUsage", derived=True) + "``ViewDefinition::viewRendering`` (single, derived)." + viewRendering = view_rendering + + +class ViewRenderingMembership(FeatureMembership): + "Metaclass ``ViewRenderingMembership``." + __slots__ = () + METACLASS: ClassVar[str] = "ViewRenderingMembership" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **FeatureMembership.JSON_KEYS, + "ownedRendering": "owned_rendering", + "referencedRendering": "referenced_rendering", + }) + owned_rendering: Opt[RenderingUsage] = Opt("ownedRendering", "RenderingUsage", derived=True) + "``ViewRenderingMembership::ownedRendering`` (single, derived). Redefines ``FeatureMembership::ownedMemberFeature``." + ownedRendering = owned_rendering + referenced_rendering: Opt[RenderingUsage] = Opt("referencedRendering", "RenderingUsage", derived=True) + "``ViewRenderingMembership::referencedRendering`` (single, derived)." + referencedRendering = referenced_rendering + + +class ViewUsage(PartUsage): + "Metaclass ``ViewUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "ViewUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **PartUsage.JSON_KEYS, + "exposedElement": "exposed_element", + "satisfiedViewpoint": "satisfied_viewpoint", + "viewCondition": "view_condition", + "viewDefinition": "view_definition", + "viewRendering": "view_rendering", + }) + exposed_element: Many[Element] = Many("exposedElement", "Element", ordered=True, derived=True) + "``ViewUsage::exposedElement`` (many, ordered, derived)." + exposedElement = exposed_element + satisfied_viewpoint: Many[ViewpointUsage] = Many("satisfiedViewpoint", "ViewpointUsage", ordered=True, derived=True) + "``ViewUsage::satisfiedViewpoint`` (many, ordered, derived)." + satisfiedViewpoint = satisfied_viewpoint + view_condition: Many[Expression] = Many("viewCondition", "Expression", ordered=True, derived=True) + "``ViewUsage::viewCondition`` (many, ordered, derived)." + viewCondition = view_condition + view_definition: Opt[ViewDefinition] = Opt("viewDefinition", "ViewDefinition", derived=True) + "``ViewUsage::viewDefinition`` (single, derived). Redefines ``PartUsage::partDefinition``." + viewDefinition = view_definition + view_rendering: Opt[RenderingUsage] = Opt("viewRendering", "RenderingUsage", derived=True) + "``ViewUsage::viewRendering`` (single, derived)." + viewRendering = view_rendering + + +class ViewpointDefinition(RequirementDefinition): + "Metaclass ``ViewpointDefinition``." + __slots__ = () + METACLASS: ClassVar[str] = "ViewpointDefinition" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **RequirementDefinition.JSON_KEYS, + "viewpointStakeholder": "viewpoint_stakeholder", + }) + viewpoint_stakeholder: Many[PartUsage] = Many("viewpointStakeholder", "PartUsage", ordered=True, derived=True) + "``ViewpointDefinition::viewpointStakeholder`` (many, ordered, derived)." + viewpointStakeholder = viewpoint_stakeholder + + +class ViewpointUsage(RequirementUsage): + "Metaclass ``ViewpointUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "ViewpointUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **RequirementUsage.JSON_KEYS, + "viewpointDefinition": "viewpoint_definition", + "viewpointStakeholder": "viewpoint_stakeholder", + }) + viewpoint_definition: Opt[ViewpointDefinition] = Opt("viewpointDefinition", "ViewpointDefinition", derived=True) + "``ViewpointUsage::viewpointDefinition`` (single, derived). Redefines ``RequirementUsage::requirementDefinition``." + viewpointDefinition = viewpoint_definition + viewpoint_stakeholder: Many[PartUsage] = Many("viewpointStakeholder", "PartUsage", ordered=True, derived=True) + "``ViewpointUsage::viewpointStakeholder`` (many, ordered, derived)." + viewpointStakeholder = viewpoint_stakeholder + + +class WhileLoopActionUsage(LoopActionUsage): + "Metaclass ``WhileLoopActionUsage``." + __slots__ = () + METACLASS: ClassVar[str] = "WhileLoopActionUsage" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({ + **LoopActionUsage.JSON_KEYS, + "untilArgument": "until_argument", + "whileArgument": "while_argument", + }) + until_argument: Opt[Expression] = Opt("untilArgument", "Expression", derived=True) + "``WhileLoopActionUsage::untilArgument`` (single, derived)." + untilArgument = until_argument + while_argument: Opt[Expression] = Opt("whileArgument", "Expression", derived=True) + "``WhileLoopActionUsage::whileArgument`` (single, derived)." + whileArgument = while_argument + + +REGISTRY: Mapping[str, builtins.type[Element]] = MappingProxyType({ + "Element": Element, + "AnnotatingElement": AnnotatingElement, + "Comment": Comment, + "Documentation": Documentation, + "Namespace": Namespace, + "Package": Package, + "LibraryPackage": LibraryPackage, + "Relationship": Relationship, + "Annotation": Annotation, + "Conjugation": Conjugation, + "Dependency": Dependency, + "Differencing": Differencing, + "Disjoining": Disjoining, + "FeatureChaining": FeatureChaining, + "FeatureInverting": FeatureInverting, + "Import": Import, + "Expose": Expose, + "Intersecting": Intersecting, + "Membership": Membership, + "MembershipImport": MembershipImport, + "MembershipExpose": MembershipExpose, + "NamespaceImport": NamespaceImport, + "NamespaceExpose": NamespaceExpose, + "OwningMembership": OwningMembership, + "ElementFilterMembership": ElementFilterMembership, + "FeatureMembership": FeatureMembership, + "EndFeatureMembership": EndFeatureMembership, + "FeatureValue": FeatureValue, + "ObjectiveMembership": ObjectiveMembership, + "ParameterMembership": ParameterMembership, + "ActorMembership": ActorMembership, + "PortConjugation": PortConjugation, + "RequirementConstraintMembership": RequirementConstraintMembership, + "FramedConcernMembership": FramedConcernMembership, + "RequirementVerificationMembership": RequirementVerificationMembership, + "ResultExpressionMembership": ResultExpressionMembership, + "ReturnParameterMembership": ReturnParameterMembership, + "Specialization": Specialization, + "FeatureTyping": FeatureTyping, + "ConjugatedPortTyping": ConjugatedPortTyping, + "StakeholderMembership": StakeholderMembership, + "StateSubactionMembership": StateSubactionMembership, + "Subclassification": Subclassification, + "SubjectMembership": SubjectMembership, + "Subsetting": Subsetting, + "CrossSubsetting": CrossSubsetting, + "Redefinition": Redefinition, + "ReferenceSubsetting": ReferenceSubsetting, + "TextualRepresentation": TextualRepresentation, + "TransitionFeatureMembership": TransitionFeatureMembership, + "Type": Type, + "Classifier": Classifier, + "Association": Association, + "Class": Class, + "Behavior": Behavior, + "DataType": DataType, + "Definition": Definition, + "AttributeDefinition": AttributeDefinition, + "EnumerationDefinition": EnumerationDefinition, + "Feature": Feature, + "Connector": Connector, + "BindingConnector": BindingConnector, + "FlowEnd": FlowEnd, + "Function": Function, + "Interaction": Interaction, + "MetadataFeature": MetadataFeature, + "Multiplicity": Multiplicity, + "MultiplicityRange": MultiplicityRange, + "OccurrenceDefinition": OccurrenceDefinition, + "ActionDefinition": ActionDefinition, + "CalculationDefinition": CalculationDefinition, + "CaseDefinition": CaseDefinition, + "AnalysisCaseDefinition": AnalysisCaseDefinition, + "FlowDefinition": FlowDefinition, + "PayloadFeature": PayloadFeature, + "Predicate": Predicate, + "ConstraintDefinition": ConstraintDefinition, + "RequirementDefinition": RequirementDefinition, + "ConcernDefinition": ConcernDefinition, + "StateDefinition": StateDefinition, + "Step": Step, + "Expression": Expression, + "BooleanExpression": BooleanExpression, + "FeatureReferenceExpression": FeatureReferenceExpression, + "Flow": Flow, + "InstantiationExpression": InstantiationExpression, + "ConstructorExpression": ConstructorExpression, + "Invariant": Invariant, + "InvocationExpression": InvocationExpression, + "LiteralExpression": LiteralExpression, + "LiteralBoolean": LiteralBoolean, + "LiteralInfinity": LiteralInfinity, + "LiteralInteger": LiteralInteger, + "LiteralRational": LiteralRational, + "LiteralString": LiteralString, + "MetadataAccessExpression": MetadataAccessExpression, + "NullExpression": NullExpression, + "OperatorExpression": OperatorExpression, + "CollectExpression": CollectExpression, + "FeatureChainExpression": FeatureChainExpression, + "IndexExpression": IndexExpression, + "SelectExpression": SelectExpression, + "Structure": Structure, + "AssociationStructure": AssociationStructure, + "ItemDefinition": ItemDefinition, + "Metaclass": Metaclass, + "MetadataDefinition": MetadataDefinition, + "PartDefinition": PartDefinition, + "ConnectionDefinition": ConnectionDefinition, + "AllocationDefinition": AllocationDefinition, + "InterfaceDefinition": InterfaceDefinition, + "PortDefinition": PortDefinition, + "ConjugatedPortDefinition": ConjugatedPortDefinition, + "RenderingDefinition": RenderingDefinition, + "Succession": Succession, + "SuccessionFlow": SuccessionFlow, + "TriggerInvocationExpression": TriggerInvocationExpression, + "TypeFeaturing": TypeFeaturing, + "Unioning": Unioning, + "Usage": Usage, + "AttributeUsage": AttributeUsage, + "ConnectorAsUsage": ConnectorAsUsage, + "BindingConnectorAsUsage": BindingConnectorAsUsage, + "EnumerationUsage": EnumerationUsage, + "OccurrenceUsage": OccurrenceUsage, + "ActionUsage": ActionUsage, + "AcceptActionUsage": AcceptActionUsage, + "AssignmentActionUsage": AssignmentActionUsage, + "CalculationUsage": CalculationUsage, + "CaseUsage": CaseUsage, + "AnalysisCaseUsage": AnalysisCaseUsage, + "ConstraintUsage": ConstraintUsage, + "AssertConstraintUsage": AssertConstraintUsage, + "ControlNode": ControlNode, + "DecisionNode": DecisionNode, + "EventOccurrenceUsage": EventOccurrenceUsage, + "FlowUsage": FlowUsage, + "ForkNode": ForkNode, + "IfActionUsage": IfActionUsage, + "ItemUsage": ItemUsage, + "JoinNode": JoinNode, + "LoopActionUsage": LoopActionUsage, + "ForLoopActionUsage": ForLoopActionUsage, + "MergeNode": MergeNode, + "MetadataUsage": MetadataUsage, + "PartUsage": PartUsage, + "ConnectionUsage": ConnectionUsage, + "AllocationUsage": AllocationUsage, + "InterfaceUsage": InterfaceUsage, + "PerformActionUsage": PerformActionUsage, + "PortUsage": PortUsage, + "ReferenceUsage": ReferenceUsage, + "RenderingUsage": RenderingUsage, + "RequirementUsage": RequirementUsage, + "ConcernUsage": ConcernUsage, + "SatisfyRequirementUsage": SatisfyRequirementUsage, + "SendActionUsage": SendActionUsage, + "StateUsage": StateUsage, + "ExhibitStateUsage": ExhibitStateUsage, + "SuccessionAsUsage": SuccessionAsUsage, + "SuccessionFlowUsage": SuccessionFlowUsage, + "TerminateActionUsage": TerminateActionUsage, + "TransitionUsage": TransitionUsage, + "UseCaseDefinition": UseCaseDefinition, + "UseCaseUsage": UseCaseUsage, + "IncludeUseCaseUsage": IncludeUseCaseUsage, + "VariantMembership": VariantMembership, + "VerificationCaseDefinition": VerificationCaseDefinition, + "VerificationCaseUsage": VerificationCaseUsage, + "ViewDefinition": ViewDefinition, + "ViewRenderingMembership": ViewRenderingMembership, + "ViewUsage": ViewUsage, + "ViewpointDefinition": ViewpointDefinition, + "ViewpointUsage": ViewpointUsage, + "WhileLoopActionUsage": WhileLoopActionUsage, +}) + +ENUMERATIONS: Mapping[str, builtins.type[Enum]] = MappingProxyType({ + "FeatureDirectionKind": FeatureDirectionKind, + "PortionKind": PortionKind, + "RequirementConstraintKind": RequirementConstraintKind, + "StateSubactionKind": StateSubactionKind, + "TransitionFeatureKind": TransitionFeatureKind, + "TriggerKind": TriggerKind, + "VisibilityKind": VisibilityKind, +}) + +RUNTIME_MEMBERS = frozenset({ + "METACLASS", + "JSON_KEYS", + "from_json_key", + "json_key", + "json_id", + "json_type", + "json_value", + "graph", + "metaclass_name", +}) + +__all__ = [ + "AcceptActionUsage", + "ActionDefinition", + "ActionUsage", + "ActorMembership", + "AllocationDefinition", + "AllocationUsage", + "AnalysisCaseDefinition", + "AnalysisCaseUsage", + "AnnotatingElement", + "Annotation", + "AssertConstraintUsage", + "AssignmentActionUsage", + "Association", + "AssociationStructure", + "AttributeDefinition", + "AttributeUsage", + "Behavior", + "BindingConnector", + "BindingConnectorAsUsage", + "BooleanExpression", + "CalculationDefinition", + "CalculationUsage", + "CaseDefinition", + "CaseUsage", + "Class", + "Classifier", + "CollectExpression", + "Comment", + "ConcernDefinition", + "ConcernUsage", + "ConjugatedPortDefinition", + "ConjugatedPortTyping", + "Conjugation", + "ConnectionDefinition", + "ConnectionUsage", + "Connector", + "ConnectorAsUsage", + "ConstraintDefinition", + "ConstraintUsage", + "ConstructorExpression", + "ControlNode", + "CrossSubsetting", + "DataType", + "DecisionNode", + "Definition", + "Dependency", + "Differencing", + "Disjoining", + "Documentation", + "ENUMERATIONS", + "Element", + "ElementFilterMembership", + "EndFeatureMembership", + "EnumerationDefinition", + "EnumerationUsage", + "EventOccurrenceUsage", + "ExhibitStateUsage", + "Expose", + "Expression", + "Feature", + "FeatureChainExpression", + "FeatureChaining", + "FeatureDirectionKind", + "FeatureInverting", + "FeatureMembership", + "FeatureReferenceExpression", + "FeatureTyping", + "FeatureValue", + "Flow", + "FlowDefinition", + "FlowEnd", + "FlowUsage", + "ForLoopActionUsage", + "ForkNode", + "FramedConcernMembership", + "Function", + "IfActionUsage", + "Import", + "IncludeUseCaseUsage", + "IndexExpression", + "InstantiationExpression", + "Interaction", + "InterfaceDefinition", + "InterfaceUsage", + "Intersecting", + "Invariant", + "InvocationExpression", + "ItemDefinition", + "ItemUsage", + "JoinNode", + "LibraryPackage", + "LiteralBoolean", + "LiteralExpression", + "LiteralInfinity", + "LiteralInteger", + "LiteralRational", + "LiteralString", + "LoopActionUsage", + "METAMODEL_VERSION", + "Membership", + "MembershipExpose", + "MembershipImport", + "MergeNode", + "Metaclass", + "MetadataAccessExpression", + "MetadataDefinition", + "MetadataFeature", + "MetadataUsage", + "Multiplicity", + "MultiplicityRange", + "Namespace", + "NamespaceExpose", + "NamespaceImport", + "NullExpression", + "ObjectiveMembership", + "OccurrenceDefinition", + "OccurrenceUsage", + "OperatorExpression", + "OwningMembership", + "Package", + "ParameterMembership", + "PartDefinition", + "PartUsage", + "PayloadFeature", + "PerformActionUsage", + "PortConjugation", + "PortDefinition", + "PortUsage", + "PortionKind", + "Predicate", + "REGISTRY", + "RUNTIME_MEMBERS", + "Redefinition", + "ReferenceSubsetting", + "ReferenceUsage", + "Relationship", + "RenderingDefinition", + "RenderingUsage", + "RequirementConstraintKind", + "RequirementConstraintMembership", + "RequirementDefinition", + "RequirementUsage", + "RequirementVerificationMembership", + "ResultExpressionMembership", + "ReturnParameterMembership", + "SOURCE_COMMIT", + "SOURCE_TAG", + "SatisfyRequirementUsage", + "SelectExpression", + "SendActionUsage", + "Specialization", + "StakeholderMembership", + "StateDefinition", + "StateSubactionKind", + "StateSubactionMembership", + "StateUsage", + "Step", + "Structure", + "Subclassification", + "SubjectMembership", + "Subsetting", + "Succession", + "SuccessionAsUsage", + "SuccessionFlow", + "SuccessionFlowUsage", + "TerminateActionUsage", + "TextualRepresentation", + "TransitionFeatureKind", + "TransitionFeatureMembership", + "TransitionUsage", + "TriggerInvocationExpression", + "TriggerKind", + "Type", + "TypeFeaturing", + "Unioning", + "Usage", + "UseCaseDefinition", + "UseCaseUsage", + "VariantMembership", + "VerificationCaseDefinition", + "VerificationCaseUsage", + "ViewDefinition", + "ViewRenderingMembership", + "ViewUsage", + "ViewpointDefinition", + "ViewpointUsage", + "VisibilityKind", + "WhileLoopActionUsage", +] diff --git a/client/python/opensysml/metamodel/_reader.py b/client/python/opensysml/metamodel/_reader.py new file mode 100644 index 0000000000..c533dfb75e --- /dev/null +++ b/client/python/opensysml/metamodel/_reader.py @@ -0,0 +1,227 @@ +"""Read exported API or toolkit JSON into a lazy element graph.""" + +from __future__ import annotations + +import json +import os +import re +from collections.abc import Iterator, Mapping, Sequence +from pathlib import Path +from typing import Any, TypeVar, cast, overload + +from ._generated import REGISTRY, Element, Namespace +from ._runtime import MalformedDocument + +_E = TypeVar("_E", bound=Element) +_VERSIONED_SYSML = re.compile(r"^https://www\.omg\.org/spec/SysML/\d{8}/") +_SYSML_BASE = "https://www.omg.org/spec/SysML#" + + +def read_json( + source: str | os.PathLike[str] | bytes | bytearray | memoryview + | Sequence[Mapping[str, Any]] | Mapping[str, Any], + *, + supertypes: Mapping[str, str] | None = None, + check_ranges: bool = True, +) -> ElementGraph: + """Read an exported JSON document; strings and paths name files, not JSON text.""" + value = _read_source(source) + if isinstance(value, Mapping): + document = cast(Mapping[str, Any], value) + changes = document.get("change") + if isinstance(changes, list): + items = _unwrap_items(cast(Sequence[Any], changes)) + else: + items = _unwrap_items([document]) + elif isinstance(value, Sequence) and not isinstance(value, (str, bytes, bytearray)): + items = _unwrap_items(_as_sequence(value)) + else: + raise MalformedDocument("document must be an object or an array of elements") + return ElementGraph(items, supertypes=supertypes, check_ranges=check_ranges) + + +def _read_source( + source: str | os.PathLike[str] | bytes | bytearray | memoryview + | Sequence[Mapping[str, Any]] | Mapping[str, Any], +) -> Any: + if isinstance(source, (str, os.PathLike)): + data = Path(source).read_bytes() + return _decode(data) + if isinstance(source, (bytes, bytearray, memoryview)): + return _decode(bytes(source)) + return source + + +def _decode(data: bytes) -> Any: + try: + return json.loads(data) + except (UnicodeDecodeError, json.JSONDecodeError) as error: + raise MalformedDocument(f"invalid JSON document: {error}") from error + + +def _as_sequence(value: Any) -> Sequence[Any]: + return cast(Sequence[Any], value) + + +def _unwrap_items(items: Sequence[Any]) -> list[dict[str, Any]]: + result: list[dict[str, Any]] = [] + for item in items: + if not isinstance(item, Mapping): + raise MalformedDocument("each document element must be an object") + document = cast(Mapping[str, Any], item) + if "identity" in document and "payload" in document: + payload = document["payload"] + if payload is None: + continue + if not isinstance(payload, Mapping): + raise MalformedDocument("envelope payload must be an object or null") + result.append(dict(cast(Mapping[str, Any], payload))) + else: + result.append(dict(document)) + return result + + +class ElementGraph: + """Indexed document elements with lazy, cached metaclass wrappers.""" + + __slots__ = ( + "_data_by_id", + "_order", + "_cache", + "_supertypes", + "_check_ranges", + "_roots", + ) + + def __init__( + self, + elements: Sequence[Mapping[str, Any]], + *, + supertypes: Mapping[str, str] | None = None, + check_ranges: bool = True, + ) -> None: + data_by_id: dict[str, dict[str, Any]] = {} + order: list[str] = [] + for element in elements: + element_id = element.get("@id") + element_type = element.get("@type") + if not isinstance(element_id, str): + raise MalformedDocument("element is missing a string @id") + if not isinstance(element_type, str): + raise MalformedDocument(f"element {element_id} is missing a string @type") + if element_id in data_by_id: + raise MalformedDocument(f"duplicate element @id {element_id!r}") + data_by_id[element_id] = dict(element) + order.append(element_id) + self._data_by_id = data_by_id + self._order = tuple(order) + self._cache: dict[str, Element] = {} + self._supertypes = supertypes or {} + self._check_ranges = check_ranges + self._roots: tuple[Namespace, ...] | None = None + + def __getitem__(self, element_id: str) -> Element: + if element_id not in self._data_by_id: + raise KeyError(element_id) + cached = self._cache.get(element_id) + if cached is not None: + return cached + data = self._data_by_id[element_id] + metaclass = _metaclass(data["@type"], self._supertypes) + element = metaclass(self, data) + self._cache[element_id] = element + return element + + def get(self, element_id: str, default: Any = None) -> Element | Any: + if element_id not in self._data_by_id: + return default + return self[element_id] + + def __contains__(self, element_id: object) -> bool: + return isinstance(element_id, str) and element_id in self._data_by_id + + def __len__(self) -> int: + return len(self._order) + + @property + def check_ranges(self) -> bool: + """Whether reference targets are checked against declared metaclass ranges.""" + return self._check_ranges + + def __iter__(self) -> Iterator[Element]: + for element_id in self._order: + yield self[element_id] + + @overload + def all(self) -> tuple[Element, ...]: ... + + @overload + def all(self, cls: type[_E]) -> tuple[_E, ...]: ... + + def all(self, cls: type[_E] | None = None) -> tuple[Element, ...] | tuple[_E, ...]: + elements = tuple(self[element_id] for element_id in self._order) + if cls is None: + return elements + return tuple(element for element in elements if isinstance(element, cls)) + + def roots(self) -> tuple[Namespace, ...]: + if self._roots is not None: + return self._roots + referenced: set[str] = set() + for data in self._data_by_id.values(): + for key in ("ownedRelationship", "ownedRelatedElement"): + referenced.update(_reference_ids(data.get(key))) + self._roots = tuple( + element + for element in self + if isinstance(element, Namespace) + and all( + self._data_by_id[element.json_id].get(key) is None + for key in ("owningRelationship", "owner", "owningNamespace") + ) + and element.json_id not in referenced + ) + return self._roots + + +def _metaclass( + written_type: str, supertypes: Mapping[str, str] +) -> type[Element]: + name = _normalize_type(written_type) + seen: set[str] = set() + while True: + if name in REGISTRY: + return REGISTRY[name] + if name in seen: + raise MalformedDocument(f"supertype cycle while resolving {written_type!r}") + seen.add(name) + parent = supertypes.get(name) + if parent is None: + return Element + name = _normalize_type(parent) + + +def _normalize_type(written_type: str) -> str: + if written_type.startswith("sysml:"): + return written_type[len("sysml:") :] + if written_type.startswith(_SYSML_BASE): + return written_type[len(_SYSML_BASE) :] + return _VERSIONED_SYSML.sub("", written_type, count=1) + + +def _reference_ids(value: Any) -> set[str]: + if isinstance(value, Mapping): + mapping = cast(Mapping[str, Any], value) + element_id = mapping.get("@id") + if isinstance(element_id, str): + return {element_id} + result: set[str] = set() + for child in mapping.values(): + result.update(_reference_ids(child)) + return result + if isinstance(value, list): + result = set() + for child in _as_sequence(value): + result.update(_reference_ids(child)) + return result + return set() diff --git a/client/python/opensysml/metamodel/_runtime.py b/client/python/opensysml/metamodel/_runtime.py new file mode 100644 index 0000000000..46103b3aa5 --- /dev/null +++ b/client/python/opensysml/metamodel/_runtime.py @@ -0,0 +1,367 @@ +"""Runtime descriptors and errors for generated metamodel classes.""" + +from __future__ import annotations + +import math +from inspect import getattr_static +from types import MappingProxyType +from typing import TYPE_CHECKING, Any, ClassVar, Generic, Mapping, TypeVar, cast, overload + +from opensysml.errors import OpenSysMLError + +if TYPE_CHECKING: + from ._reader import ElementGraph + +T = TypeVar("T") + + +def _as_json_list(value: Any) -> list[Any]: + return cast(list[Any], value) + + +class _UnresolvedExpectedRange: + pass + + +_UNRESOLVED_EXPECTED_RANGE = _UnresolvedExpectedRange() +_PRIMITIVE_RANGES = frozenset({"bool", "str", "int", "float"}) + + +class MetamodelError(OpenSysMLError): + """Base class for errors raised while reading metamodel JSON.""" + + +class NotSupplied(MetamodelError): + """A property is absent from the JSON document.""" + + def __init__(self, property: str, key: str, element_id: str, derived: bool) -> None: + self.property = property + self.key = key + self.element_id = element_id + self.derived = derived + message = f'document carries no "{key}" for element {element_id}' + if derived: + message += "; owned-only exports omit derived properties" + super().__init__(message) + + +class UnresolvedReference(MetamodelError): + """A JSON reference does not resolve to an element in the document.""" + + def __init__( + self, + id: str | None, + ref: str | None, + property: str, + element_id: str, + ) -> None: + self.id = id + self.ref = ref + self.property = property + self.element_id = element_id + target = f"@id {id!r}" if id is not None else f"@ref {ref!r}" + super().__init__(f"{property} on element {element_id} refers to unresolved {target}") + + +class MalformedValue(MetamodelError): + """A property value does not match its declared metamodel range.""" + + +class MalformedDocument(MetamodelError, ValueError): + """The JSON document does not contain a valid element graph.""" + + +class UnknownJSONKey(MetamodelError, KeyError): + """A JSON key is not declared for a metaclass.""" + + def __init__(self, metaclass: str, key: str) -> None: + self.metaclass = metaclass + self.key = key + super().__init__(f"{metaclass} has no JSON property {key!r}") + + +class _ElementBase: + __slots__ = ("_graph", "_id", "_data", "_type") + + METACLASS: ClassVar[str] = "Element" + JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({}) + + def __init__(self, graph: ElementGraph, data: Mapping[str, Any]) -> None: + self._graph = graph + self._id = cast(str, data["@id"]) + self._data = data + self._type = cast(str, data["@type"]) + + @property + def json_id(self) -> str: + return self._id + + @property + def json_type(self) -> str: + return self._type + + @property + def metaclass_name(self) -> str: + return type(self).METACLASS + + @property + def graph(self) -> ElementGraph: + return self._graph + + def json_value(self, key: str) -> Any: + try: + return self._data[key] + except KeyError: + name = type(self).JSON_KEYS.get(key) + descriptor = getattr_static(type(self), name, None) if name is not None else None + derived = descriptor.derived if isinstance(descriptor, _Property) else False + raise NotSupplied( + f"{self.metaclass_name}.{key}", key, self.json_id, derived + ) from None + + @classmethod + def from_json_key(cls, key: str) -> str: + try: + return cls.JSON_KEYS[key] + except KeyError: + raise UnknownJSONKey(cls.METACLASS, key) from None + + @classmethod + def json_key(cls, name: str) -> str: + if name in cls.JSON_KEYS: + return name + for key, snake in cls.JSON_KEYS.items(): + if snake == name: + return key + raise UnknownJSONKey(cls.METACLASS, name) + + def __eq__(self, other: object) -> bool: + if not isinstance(other, _ElementBase): + return NotImplemented + return self._graph is other._graph and self._id == other._id + + def __hash__(self) -> int: + return hash((id(self._graph), self._id)) + + def __repr__(self) -> str: + name = self._data.get("declaredName") + suffix = f" declaredName={name!r}" if isinstance(name, str) else "" + return f"<{self.metaclass_name} {self._id!r}{suffix}>" + + +class _Property(Generic[T]): + __slots__ = ( + "key", + "range", + "ordered", + "derived", + "many", + "owner", + "_name", + "_expected_range", + ) + + def __init__( + self, + key: str, + range: str, + *, + ordered: bool = False, + derived: bool = False, + many: bool, + ) -> None: + self.key = key + self.range = range + self.ordered = ordered + self.derived = derived + self.many = many + self.owner: type[_ElementBase] | None = None + self._name: str | None = None + self._expected_range: ( + type[_ElementBase] | None | _UnresolvedExpectedRange + ) = _UNRESOLVED_EXPECTED_RANGE + + def __set_name__(self, owner: type[_ElementBase], name: str) -> None: + if self.owner is None: + self.owner = owner + self._name = name + + def __get__( + self, instance: _ElementBase | None, owner: type[Any] | None = None + ) -> Any: + if instance is None: + return self + try: + raw = instance.json_value(self.key) + except NotSupplied: + raise NotSupplied( + self._property(instance), self.key, instance.json_id, self.derived + ) from None + if self.many: + if raw is None: + return () + if not isinstance(raw, list): + raise self._malformed(instance, f"expected an array, got {raw!r}") + values: list[T] = [] + for item in _as_json_list(raw): + if item is None: + raise self._malformed(instance, "array contains null") + values.append(self._convert(item, instance)) + return tuple(values) + if raw is None: + return None + if isinstance(raw, list): + raise self._malformed(instance, f"expected a scalar, got {raw!r}") + return self._convert(raw, instance) + + def __set__(self, instance: _ElementBase, value: T) -> None: + raise AttributeError("metamodel properties are read-only") + + def __delete__(self, instance: _ElementBase) -> None: + raise AttributeError("metamodel properties are read-only") + + def _convert(self, value: Any, instance: _ElementBase) -> T: + if not isinstance(value, Mapping): + return self._primitive(value, instance) + if self._scalar_range(): + raise self._malformed( + instance, f"expected {self.range}, got a reference object {value!r}" + ) + reference = cast(Mapping[str, Any], value) + if "@ref" in reference: + ref = reference["@ref"] + if not isinstance(ref, str): + raise self._malformed(instance, f"@ref must be a string, got {ref!r}") + raise UnresolvedReference(None, ref, self._property(instance), instance.json_id) + if "@id" in reference: + element_id = reference["@id"] + if not isinstance(element_id, str): + raise self._malformed(instance, f"@id must be a string, got {element_id!r}") + try: + target = instance.graph[element_id] + except KeyError: + raise UnresolvedReference( + element_id, None, self._property(instance), instance.json_id + ) from None + if not instance.graph.check_ranges: + return cast(T, target) + expected = self._expected_metaclass() + if expected is not None and not isinstance(target, expected): + raise self._malformed( + instance, + f"reference target @id {element_id!r} has json_type " + f"{target.json_type!r}; expected {expected.METACLASS}; " + "pass supertypes=... for unknown @types", + ) + return cast(T, target) + raise self._malformed(instance, f"expected a reference object, got {value!r}") + + def _expected_metaclass(self) -> type[_ElementBase] | None: + expected = self._expected_range + if isinstance(expected, _UnresolvedExpectedRange): + from ._generated import REGISTRY + + expected = cast(type[_ElementBase] | None, REGISTRY.get(self.range)) + self._expected_range = expected + return expected + + def _scalar_range(self) -> bool: + """Whether the range is a primitive or an enumeration rather than a metaclass.""" + from ._generated import ENUMERATIONS + + return self.range in _PRIMITIVE_RANGES or self.range in ENUMERATIONS + + def _primitive(self, value: Any, instance: _ElementBase) -> T: + if self.range == "bool": + if type(value) is not bool: + raise self._malformed(instance, f"expected bool, got {value!r}") + return cast(T, value) + if self.range == "str": + if not isinstance(value, str): + raise self._malformed(instance, f"expected str, got {value!r}") + return cast(T, value) + if self.range == "int": + if type(value) is not int: + raise self._malformed(instance, f"expected int, got {value!r}") + return cast(T, value) + if self.range == "float": + if type(value) not in (int, float): + raise self._malformed(instance, f"expected float, got {value!r}") + try: + converted = float(value) + except OverflowError: + raise self._malformed( + instance, f"expected a finite float, got {value!r}" + ) from None + if not math.isfinite(converted): + raise self._malformed( + instance, f"expected a finite float, got {value!r}" + ) + return cast(T, converted) + + from ._generated import ENUMERATIONS + + enum = ENUMERATIONS.get(self.range) + if enum is not None: + try: + return cast(T, enum(value)) + except (TypeError, ValueError): + raise self._malformed( + instance, f"{value!r} is not a {self.range} literal" + ) from None + raise self._malformed( + instance, f"expected a reference to {self.range}, got {value!r}" + ) + + def _property(self, instance: _ElementBase) -> str: + return f"{instance.metaclass_name}.{self.key}" + + def _malformed(self, instance: _ElementBase, reason: str) -> MalformedValue: + return MalformedValue(f"{self._property(instance)} on element {instance.json_id}: {reason}") + + +class Opt(_Property[T], Generic[T]): + """A read-only, optional single-valued metamodel property.""" + + def __init__(self, key: str, range: str, *, derived: bool = False) -> None: + super().__init__(key, range, derived=derived, many=False) + + @overload + def __get__(self, instance: None, owner: type[Any] | None = None) -> Opt[T]: ... + + @overload + def __get__( + self, instance: _ElementBase, owner: type[Any] | None = None + ) -> T | None: ... + + def __get__( + self, instance: _ElementBase | None, owner: type[Any] | None = None + ) -> Opt[T] | T | None: + return cast(Opt[T] | T | None, super().__get__(instance, owner)) + + +class Many(_Property[T], Generic[T]): + """A read-only, tuple-valued metamodel property.""" + + def __init__( + self, + key: str, + range: str, + *, + ordered: bool = False, + derived: bool = False, + ) -> None: + super().__init__(key, range, ordered=ordered, derived=derived, many=True) + + @overload + def __get__(self, instance: None, owner: type[Any] | None = None) -> Many[T]: ... + + @overload + def __get__( + self, instance: _ElementBase, owner: type[Any] | None = None + ) -> tuple[T, ...]: ... + + def __get__( + self, instance: _ElementBase | None, owner: type[Any] | None = None + ) -> Many[T] | tuple[T, ...]: + return cast(Many[T] | tuple[T, ...], super().__get__(instance, owner)) diff --git a/client/python/opensysml/proto/sysml_pb2.py b/client/python/opensysml/proto/sysml_pb2.py index c32ff0d405..d5b1ceffc1 100644 --- a/client/python/opensysml/proto/sysml_pb2.py +++ b/client/python/opensysml/proto/sysml_pb2.py @@ -24,7 +24,7 @@ -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0bsysml.proto\x12\x05sysml\"\x86\x03\n\x07Verdict\x12\x0c\n\x04kind\x18\x01 \x01(\t\x12\x12\n\nelement_id\x18\x02 \x01(\t\x12\x0f\n\x07\x65lement\x18\x03 \x01(\t\x12\r\n\x05holds\x18\x04 \x01(\x08\x12\x11\n\tcondition\x18\x05 \x01(\t\x12\x13\n\x0binstance_id\x18\x06 \x01(\x03\x12\x18\n\x10instance_type_id\x18\x07 \x01(\t\x12\r\n\x05\x65rror\x18\x08 \x01(\t\x12,\n\x0e\x66\x61ilure_reason\x18\t \x01(\x0e\x32\x14.sysml.FailureReason\x12\x16\n\x0erequirement_id\x18\n \x01(\t\x12\x0e\n\x06\x65ngine\x18\x0b \x01(\t\x12\x10\n\x08strength\x18\x0c \x01(\t\x12\x1c\n\x06\x62ounds\x18\r \x03(\x0b\x32\x0c.sysml.Bound\x12\x15\n\rinstance_path\x18\x0e \x01(\t\x12\x10\n\x08question\x18\x0f \x01(\t\x12\x0e\n\x06status\x18\x10 \x01(\t\x12)\n\x07witness\x18\x11 \x03(\x0b\x32\x18.sysml.WitnessAssignment\"^\n\x11WitnessAssignment\x12\x0f\n\x07\x66\x65\x61ture\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value\x12\x0c\n\x04unit\x18\x03 \x01(\t\x12\r\n\x05\x65xact\x18\x04 \x01(\t\"5\n\x05\x42ound\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05limit\x18\x02 \x01(\x03\x12\x0f\n\x07reached\x18\x03 \x01(\x08\"}\n\x17VerifyConstraintRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\x12\x19\n\x11subject_symbol_id\x18\x03 \x01(\t\x12\x0e\n\x06\x65ngine\x18\x04 \x01(\t\x12\x10\n\x08question\x18\x05 \x01(\t\"\x96\x01\n\x18VerifyConstraintResponse\x12\x1f\n\x07verdict\x18\x01 \x01(\x0b\x32\x0e.sysml.Verdict\x12\"\n\tinstances\x18\x02 \x03(\x0b\x32\x0f.sysml.Instance\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x04 \x03(\x0b\x32\x11.sysml.Diagnostic\"~\n\x18VerifyRequirementRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\x12\x19\n\x11subject_symbol_id\x18\x03 \x01(\t\x12\x0e\n\x06\x65ngine\x18\x04 \x01(\t\x12\x10\n\x08question\x18\x05 \x01(\t\"m\n\x13VerificationVerdict\x12\x0f\n\x07\x63\x61se_id\x18\x01 \x01(\t\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\x0e\n\x06\x64\x65tail\x18\x03 \x01(\t\x12\x0f\n\x07subcase\x18\x04 \x01(\x08\x12\x16\n\x0erequirement_id\x18\x05 \x01(\t\"\xd2\x01\n\x19VerifyRequirementResponse\x12\x1f\n\x07verdict\x18\x01 \x01(\x0b\x32\x0e.sysml.Verdict\x12\"\n\tinstances\x18\x02 \x03(\x0b\x32\x0f.sysml.Instance\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x04 \x03(\x0b\x32\x11.sysml.Diagnostic\x12\x39\n\x15verification_verdicts\x18\x05 \x03(\x0b\x32\x1a.sysml.VerificationVerdict\"d\n\x19VerifySatisfactionRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\x12\x0e\n\x06\x65ngine\x18\x03 \x01(\t\x12\x10\n\x08question\x18\x04 \x01(\t\"\x82\x02\n\x1aVerifySatisfactionResponse\x12 \n\x08verdicts\x18\x01 \x03(\x0b\x32\x0e.sysml.Verdict\x12\"\n\tinstances\x18\x02 \x03(\x0b\x32\x0f.sysml.Instance\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x04 \x03(\x0b\x32\x11.sysml.Diagnostic\x12,\n\x0e\x66\x61ilure_reason\x18\x05 \x01(\x0e\x32\x14.sysml.FailureReason\x12\x39\n\x15verification_verdicts\x18\x06 \x03(\x0b\x32\x1a.sysml.VerificationVerdict\"P\n\x17ValidateInstanceRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\x12\x0e\n\x06\x65ngine\x18\x03 \x01(\t\"\xb2\x02\n\x18ValidateInstanceResponse\x12 \n\x08verdicts\x18\x01 \x03(\x0b\x32\x0e.sysml.Verdict\x12\x1f\n\x07summary\x18\x02 \x01(\x0b\x32\x0e.sysml.Verdict\x12\"\n\tinstances\x18\x03 \x03(\x0b\x32\x0f.sysml.Instance\x12\r\n\x05\x65rror\x18\x04 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x05 \x03(\x0b\x32\x11.sysml.Diagnostic\x12,\n\x0e\x66\x61ilure_reason\x18\x06 \x01(\x0e\x32\x14.sysml.FailureReason\x12\x39\n\x15verification_verdicts\x18\x07 \x03(\x0b\x32\x1a.sysml.VerificationVerdict\x12\x0f\n\x07\x62ounded\x18\x08 \x01(\x08\"m\n\x13\x45valuateCalcRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\x12\x1f\n\targuments\x18\x03 \x03(\x0b\x32\x0c.sysml.Value\x12\x0e\n\x06\x65ngine\x18\x04 \x01(\t\"\xfd\x01\n\x14\x45valuateCalcResponse\x12\x1c\n\x06result\x18\x01 \x01(\x0b\x32\x0c.sysml.Value\x12\"\n\x07outputs\x18\x02 \x03(\x0b\x32\x11.sysml.CalcOutput\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x04 \x03(\x0b\x32\x11.sysml.Diagnostic\x12,\n\x0e\x66\x61ilure_reason\x18\x05 \x01(\x0e\x32\x14.sysml.FailureReason\x12\x0e\n\x06\x65ngine\x18\x06 \x01(\t\x12\x10\n\x08strength\x18\x07 \x01(\t\x12\x1c\n\x06\x62ounds\x18\x08 \x03(\x0b\x32\x0c.sysml.Bound\"7\n\nCalcOutput\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value\"\x93\x01\n\x0e\x43\x61seEvaluation\x12\x13\n\x0b\x66unction_id\x18\x01 \x01(\t\x12\x1f\n\targuments\x18\x02 \x03(\x0b\x32\x0c.sysml.Value\x12\x1c\n\x06result\x18\x03 \x01(\x0b\x32\x0c.sysml.Value\x12\r\n\x05\x65rror\x18\x04 \x01(\t\x12\x10\n\x08selected\x18\x05 \x01(\x08\x12\x0c\n\x04tied\x18\x06 \x01(\x08\"\xa6\x02\n\x12RunAnalysisRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\x12\x19\n\x11subject_symbol_id\x18\x03 \x01(\t\x12\x1f\n\targuments\x18\x04 \x03(\x0b\x32\x0c.sysml.Value\x12\x46\n\x0fnamed_arguments\x18\x05 \x03(\x0b\x32-.sysml.RunAnalysisRequest.NamedArgumentsEntry\x12\x10\n\x08schedule\x18\x06 \x01(\t\x12\x0e\n\x06\x65ngine\x18\x07 \x01(\t\x1a\x43\n\x13NamedArgumentsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\"\xdc\x03\n\x13RunAnalysisResponse\x12\"\n\x07outputs\x18\x01 \x03(\x0b\x32\x11.sysml.CalcOutput\x12 \n\x08verdicts\x18\x02 \x03(\x0b\x32\x0e.sysml.Verdict\x12\"\n\tinstances\x18\x03 \x03(\x0b\x32\x0f.sysml.Instance\x12\r\n\x05\x65rror\x18\x04 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x05 \x03(\x0b\x32\x11.sysml.Diagnostic\x12,\n\x0e\x66\x61ilure_reason\x18\x06 \x01(\x0e\x32\x14.sysml.FailureReason\x12\x39\n\x15verification_verdicts\x18\x07 \x03(\x0b\x32\x1a.sysml.VerificationVerdict\x12 \n\x08outcomes\x18\x08 \x03(\x0b\x32\x0e.sysml.Outcome\x12-\n\x0b\x65xploration\x18\t \x01(\x0b\x32\x18.sysml.ExplorationStatus\x12*\n\x0b\x65valuations\x18\n \x03(\x0b\x32\x15.sysml.CaseEvaluation\x12\x0e\n\x06\x65ngine\x18\x0b \x01(\t\x12\x10\n\x08strength\x18\x0c \x01(\t\x12\x1c\n\x06\x62ounds\x18\r \x03(\x0b\x32\x0c.sysml.Bound\"\x97\x02\n\x07Outcome\x12,\n\x07outputs\x18\x01 \x03(\x0b\x32\x1b.sysml.Outcome.OutputsEntry\x12\x13\n\x0b\x66inal_state\x18\x02 \x01(\t\x12\x16\n\x0estates_visited\x18\x03 \x03(\t\x12\r\n\x05\x65rror\x18\x04 \x01(\t\x12\x16\n\x0elinearizations\x18\x05 \x01(\x05\x12\x0f\n\x07witness\x18\x06 \x03(\t\x12&\n\x0b\x64iagnostics\x18\x07 \x03(\x0b\x32\x11.sysml.Diagnostic\x12\x13\n\x0bprobability\x18\x08 \x01(\x01\x1a<\n\x0cOutputsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\"\x96\x01\n\x11\x45xplorationStatus\x12\x10\n\x08\x63omplete\x18\x01 \x01(\x08\x12\x0c\n\x04runs\x18\x02 \x01(\x05\x12\x13\n\x0b\x62udgets_hit\x18\x03 \x03(\t\x12\x13\n\x0bruns_budget\x18\x04 \x01(\x05\x12\x14\n\x0c\x64\x65pth_budget\x18\x05 \x01(\x05\x12!\n\x19probabilities_lower_bound\x18\x06 \x01(\x08\"\x14\n\x12ListEnginesRequest\"\xfc\x01\n\nEngineInfo\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x11\n\tauthority\x18\x02 \x01(\t\x12\x0f\n\x07\x61nswers\x18\x03 \x03(\t\x12\x0e\n\x06\x62ounds\x18\x04 \x03(\t\x12\x0f\n\x07process\x18\x05 \x01(\t\x12\x15\n\rprocess_found\x18\x06 \x01(\t\x12\r\n\x05ready\x18\x07 \x01(\x08\x12\x13\n\x0bunavailable\x18\x08 \x01(\t\x12\x0c\n\x04kind\x18\t \x01(\t\x12\x10\n\x08protocol\x18\n \x01(\t\x12\x0e\n\x06source\x18\x0b \x01(\t\x12\x0f\n\x07\x63ommand\x18\x0c \x01(\t\x12\x0f\n\x07version\x18\r \x01(\t\x12\x0e\n\x06served\x18\x0e \x01(\x08\"9\n\x13ListEnginesResponse\x12\"\n\x07\x65ngines\x18\x01 \x03(\x0b\x32\x11.sysml.EngineInfo\"\x8c\x01\n\x10ParseFileRequest\x12\x13\n\tfile_path\x18\x01 \x01(\tH\x00\x12\x11\n\x07\x63ontent\x18\x02 \x01(\tH\x00\x12\x18\n\x0c\x63ontent_hash\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08language\x18\x04 \x01(\t\x12\x1a\n\x12strict_conformance\x18\x05 \x01(\x08\x42\x08\n\x06source\"b\n\x0eSourceDocument\x12\x13\n\tfile_path\x18\x01 \x01(\tH\x00\x12\x11\n\x07\x63ontent\x18\x02 \x01(\tH\x00\x12\x10\n\x08language\x18\x03 \x01(\t\x12\x0c\n\x04name\x18\x04 \x01(\tB\x08\n\x06source\"[\n\x13ParseSourcesRequest\x12(\n\tdocuments\x18\x01 \x03(\x0b\x32\x15.sysml.SourceDocument\x12\x1a\n\x12strict_conformance\x18\x02 \x01(\x08\"\x83\x01\n\x14ParseSourcesResponse\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12 \n\x05roots\x18\x02 \x03(\x0b\x32\x11.sysml.SymbolInfo\x12&\n\x0b\x64iagnostics\x18\x03 \x03(\x0b\x32\x11.sysml.Diagnostic\x12\r\n\x05\x65rror\x18\x04 \x01(\t\"\x7f\n\x11ParseFileResponse\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x1f\n\x04root\x18\x02 \x01(\x0b\x32\x11.sysml.SymbolInfo\x12&\n\x0b\x64iagnostics\x18\x03 \x03(\x0b\x32\x11.sysml.Diagnostic\x12\r\n\x05\x65rror\x18\x04 \x01(\t\"9\n\x10GetSymbolRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\"B\n\x0eSymbolResponse\x12!\n\x06symbol\x18\x01 \x01(\x0b\x32\x11.sysml.SymbolInfo\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"(\n\x12\x44iagnosticsRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\"L\n\x13\x44iagnosticsResponse\x12&\n\x0b\x64iagnostics\x18\x01 \x03(\x0b\x32\x11.sysml.Diagnostic\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"o\n\x0f\x45valuateRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x12\n\nexpression\x18\x02 \x01(\t\x12\x19\n\x11\x63ontext_symbol_id\x18\x03 \x01(\t\x12\x19\n\x11subject_symbol_id\x18\x04 \x01(\t\"g\n\x10\x45valuateResponse\x12\x1c\n\x06result\x18\x01 \x01(\x0b\x32\x0c.sysml.Value\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x03 \x03(\x0b\x32\x11.sysml.Diagnostic\"\xc2\x01\n\x08Instance\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x16\n\x0etype_symbol_id\x18\x02 \x01(\t\x12:\n\x0e\x66\x65\x61ture_values\x18\x04 \x03(\x0b\x32\".sysml.Instance.FeatureValuesEntry\x1aI\n\x12\x46\x65\x61tureValuesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\"\n\x05value\x18\x02 \x01(\x0b\x32\x13.sysml.FeatureValue:\x02\x38\x01J\x04\x08\x03\x10\x04R\x05slots\"\x84\x01\n\x0c\x46\x65\x61tureValue\x12\x14\n\x0c\x66\x65\x61ture_name\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value\x12\x1c\n\x06values\x18\x03 \x03(\x0b\x32\x0c.sysml.Value\x12\x14\n\x0cmaterialized\x18\x04 \x01(\x08\x12\r\n\x05\x65rror\x18\x05 \x01(\t\";\n\x12InstantiateRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\"\x93\x01\n\x13InstantiateResponse\x12!\n\x08instance\x18\x01 \x01(\x0b\x32\x0f.sysml.Instance\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x03 \x03(\x0b\x32\x11.sysml.Diagnostic\x12\"\n\tinstances\x18\x04 \x03(\x0b\x32\x0f.sysml.Instance\"\xe9\x01\n\x14\x45xecuteActionRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x18\n\x10\x61\x63tion_symbol_id\x18\x02 \x01(\t\x12\x37\n\x06inputs\x18\x03 \x03(\x0b\x32\'.sysml.ExecuteActionRequest.InputsEntry\x12\x10\n\x08schedule\x18\x04 \x01(\t\x12\x1b\n\x13performer_symbol_id\x18\x05 \x01(\t\x1a;\n\x0bInputsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\"\xcc\x03\n\x15\x45xecuteActionResponse\x12:\n\x07outputs\x18\x01 \x03(\x0b\x32).sysml.ExecuteActionResponse.OutputsEntry\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x03 \x03(\x0b\x32\x11.sysml.Diagnostic\x12 \n\x08outcomes\x18\x04 \x03(\x0b\x32\x0e.sysml.Outcome\x12-\n\x0b\x65xploration\x18\x05 \x01(\x0b\x32\x18.sysml.ExplorationStatus\x12\x12\n\nfinal_time\x18\x06 \x01(\x01\x12S\n\x14performer_attributes\x18\x07 \x03(\x0b\x32\x35.sysml.ExecuteActionResponse.PerformerAttributesEntry\x1a<\n\x0cOutputsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\x1aH\n\x18PerformerAttributesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\"\x89\x01\n\x13\x45xecuteStateRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x1f\n\x17state_machine_symbol_id\x18\x02 \x01(\t\x12\x0e\n\x06\x65vents\x18\x03 \x03(\t\x12\x10\n\x08schedule\x18\x04 \x01(\t\x12\x1b\n\x13performer_symbol_id\x18\x05 \x01(\t\"\xd3\x02\n\x14\x45xecuteStateResponse\x12\x16\n\x0estates_visited\x18\x01 \x03(\t\x12\x44\n\rfinal_context\x18\x02 \x03(\x0b\x32-.sysml.ExecuteStateResponse.FinalContextEntry\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x04 \x03(\x0b\x32\x11.sysml.Diagnostic\x12 \n\x08outcomes\x18\x05 \x03(\x0b\x32\x0e.sysml.Outcome\x12-\n\x0b\x65xploration\x18\x06 \x01(\x0b\x32\x18.sysml.ExplorationStatus\x12\x12\n\nfinal_time\x18\x07 \x01(\x01\x1a\x41\n\x11\x46inalContextEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\"\xa0\x01\n\x0e\x43onvertRequest\x12\x13\n\tfile_path\x18\x01 \x01(\tH\x00\x12\x11\n\x07\x63ontent\x18\x02 \x01(\tH\x00\x12\x14\n\nmodel_hash\x18\x06 \x01(\tH\x00\x12\x13\n\x0b\x66rom_format\x18\x03 \x01(\t\x12\x11\n\tto_format\x18\x04 \x01(\t\x12\x1e\n\x16tolerate_syntax_errors\x18\x05 \x01(\x08\x42\x08\n\x06source\"\xb4\x01\n\x0f\x43onvertResponse\x12\x0f\n\x07\x63ontent\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_format\x18\x02 \x01(\t\x12\x11\n\tto_format\x18\x03 \x01(\t\x12\r\n\x05\x65rror\x18\x04 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x05 \x03(\x0b\x32\x11.sysml.Diagnostic\x12\x14\n\x0c\x65xperimental\x18\x06 \x01(\x08\x12\x1b\n\x13\x65xperimental_notice\x18\x07 \x01(\t\"}\n\x11\x41pplyEditsRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12(\n\noperations\x18\x02 \x03(\x0b\x32\x14.sysml.EditOperation\x12\x10\n\x08\x64ocument\x18\x03 \x01(\t\x12\x18\n\x10\x61\x63\x63\x65pt_documents\x18\x04 \x01(\x08\"\xc3\x06\n\rEditOperation\x12(\n\tset_value\x18\x01 \x01(\x0b\x32\x13.sysml.SetValueEditH\x00\x12#\n\x06rename\x18\x02 \x01(\x0b\x32\x11.sysml.RenameEditH\x00\x12*\n\nadd_member\x18\x03 \x01(\x0b\x32\x14.sysml.AddMemberEditH\x00\x12#\n\x06\x64\x65lete\x18\x04 \x01(\x0b\x32\x11.sysml.DeleteEditH\x00\x12\x1f\n\x04move\x18\x05 \x01(\x0b\x32\x0f.sysml.MoveEditH\x00\x12\x32\n\x0e\x61\x64\x64_connection\x18\x06 \x01(\x0b\x32\x18.sysml.AddConnectionEditH\x00\x12,\n\x0b\x61\x64\x64_satisfy\x18\x07 \x01(\x0b\x32\x15.sysml.AddSatisfyEditH\x00\x12I\n\x1a\x61\x64\x64_requirement_constraint\x18\x08 \x01(\x0b\x32#.sysml.AddRequirementConstraintEditH\x00\x12\x32\n\x0e\x61\x64\x64_transition\x18\t \x01(\x0b\x32\x18.sysml.AddTransitionEditH\x00\x12*\n\nadd_import\x18\n \x01(\x0b\x32\x14.sysml.AddImportEditH\x00\x12\x38\n\x11\x61\x64\x64_documentation\x18\x0b \x01(\x0b\x32\x1b.sysml.AddDocumentationEditH\x00\x12*\n\nadd_verify\x18\x0c \x01(\x0b\x32\x14.sysml.AddVerifyEditH\x00\x12.\n\x0c\x61\x64\x64_metadata\x18\r \x01(\x0b\x32\x16.sysml.AddMetadataEditH\x00\x12.\n\x0c\x61\x64\x64_sequence\x18\x0e \x01(\x0b\x32\x16.sysml.AddSequenceEditH\x00\x12;\n\x13\x61\x64\x64_metadata_prefix\x18\x0f \x01(\x0b\x32\x1c.sysml.AddMetadataPrefixEditH\x00\x12,\n\x0b\x61\x64\x64_comment\x18\x10 \x01(\x0b\x32\x15.sysml.AddCommentEditH\x00\x12&\n\x08\x61\x64\x64_note\x18\x12 \x01(\x0b\x32\x12.sysml.AddNoteEditH\x00\x42\x0b\n\toperation\"\x92\x02\n\rAddMemberEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x0c\n\x04type\x18\x04 \x01(\t\x12\x14\n\x0cmultiplicity\x18\x05 \x01(\t\x12\r\n\x05value\x18\x06 \x01(\t\x12\x13\n\x0bspecializes\x18\x07 \x03(\t\x12\x13\n\x0bis_abstract\x18\x08 \x01(\x08\x12\x11\n\tredefines\x18\t \x03(\t\x12\x12\n\nis_default\x18\n \x01(\x08\x12\x11\n\tdirection\x18\x0b \x01(\t\x12\x19\n\x11metadata_prefixes\x18\x0e \x03(\t\x12\x0b\n\x03\x64oc\x18\x0c \x01(\t\x12\x17\n\x0f\x62ody_expression\x18\r \x01(\t\"y\n\x0e\x41\x64\x64SatisfyEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x13\n\x0brequirement\x18\x02 \x01(\t\x12\x1a\n\x12satisfying_feature\x18\x03 \x01(\t\x12\x13\n\x0bis_asserted\x18\x04 \x01(\x08\x12\x12\n\nis_negated\x18\x05 \x01(\x08\"]\n\x1c\x41\x64\x64RequirementConstraintEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\x12\n\nexpression\x18\x03 \x01(\t\x12\x0c\n\x04name\x18\x04 \x01(\t\"\x91\x01\n\x11\x41\x64\x64TransitionEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0e\n\x06source\x18\x03 \x01(\t\x12\x0e\n\x06target\x18\x04 \x01(\t\x12\x0f\n\x07trigger\x18\x05 \x01(\t\x12\r\n\x05guard\x18\x06 \x01(\t\x12\x0e\n\x06\x65\x66\x66\x65\x63t\x18\x07 \x01(\t\x12\x0f\n\x07initial\x18\x08 \x01(\x08\"3\n\rAddVerifyEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x13\n\x0brequirement\x18\x02 \x01(\t\"6\n\x14MetadataFeatureValue\x12\x0f\n\x07\x66\x65\x61ture\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"\x94\x01\n\x0f\x41\x64\x64MetadataEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x15\n\rmetadata_type\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\r\n\x05\x61\x62out\x18\x04 \x03(\t\x12+\n\x06values\x18\x05 \x03(\x0b\x32\x1b.sysml.MetadataFeatureValue\x12\x11\n\tshorthand\x18\x06 \x01(\x08\">\n\x15\x41\x64\x64MetadataPrefixEdit\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\x15\n\rmetadata_type\x18\x02 \x01(\t\"\x80\x01\n\rAddImportEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x12\n\nvisibility\x18\x02 \x01(\t\x12\x0e\n\x06target\x18\x03 \x01(\t\x12\x14\n\x0cis_recursive\x18\x04 \x01(\x08\x12\x15\n\ris_import_all\x18\x05 \x01(\x08\x12\x0f\n\x07\x66ilters\x18\x06 \x03(\t\"c\n\x14\x41\x64\x64\x44ocumentationEdit\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\x0c\n\x04\x62ody\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x0e\n\x06locale\x18\x04 \x01(\t\x12\x0f\n\x07replace\x18\x05 \x01(\x08\"Z\n\x0e\x41\x64\x64\x43ommentEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x0c\n\x04\x62ody\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\r\n\x05\x61\x62out\x18\x04 \x03(\t\x12\x0e\n\x06locale\x18\x05 \x01(\t\"+\n\x0b\x41\x64\x64NoteEdit\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\x0c\n\x04text\x18\x02 \x01(\t\"\xcd\x02\n\x0f\x41\x64\x64SequenceEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x0f\n\x07keyword\x18\x02 \x01(\t\x12\x0b\n\x03ref\x18\x03 \x01(\t\x12\x13\n\x0bmember_kind\x18\x04 \x01(\t\x12\x13\n\x0bmember_name\x18\x05 \x01(\t\x12\x0c\n\x04type\x18\x06 \x01(\t\x12\r\n\x05\x61\x66ter\x18\x07 \x01(\t\x12\x11\n\tcondition\x18\x08 \x01(\t\x12\r\n\x05value\x18\t \x01(\t\x12\x0e\n\x06target\x18\n \x01(\t\x12\x0b\n\x03via\x18\x0b \x01(\t\x12\r\n\x05until\x18\x0c \x01(\t\x12$\n\x04\x62ody\x18\r \x03(\x0b\x32\x16.sysml.AddSequenceEdit\x12)\n\telse_body\x18\x0e \x03(\x0b\x32\x16.sysml.AddSequenceEdit\x12\x14\n\x0cmultiplicity\x18\x0f \x01(\t\x12\x11\n\tparameter\x18\x10 \x01(\t\"n\n\x11\x41\x64\x64\x43onnectionEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\x10\n\x08\x66rom_end\x18\x03 \x01(\t\x12\x0e\n\x06to_end\x18\x04 \x01(\t\x12\x0c\n\x04name\x18\x05 \x01(\t\x12\x0c\n\x04type\x18\x06 \x01(\t\"-\n\nDeleteEdit\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\x0f\n\x07\x63\x61scade\x18\x02 \x01(\x08\")\n\x08MoveEdit\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\r\n\x05owner\x18\x02 \x01(\t\"-\n\x0cSetValueEdit\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\".\n\nRenameEdit\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\x10\n\x08new_name\x18\x02 \x01(\t\"\x90\x02\n\x12\x41pplyEditsResponse\x12\x0f\n\x07\x63ontent\x18\x01 \x01(\t\x12#\n\x07\x61pplied\x18\x02 \x03(\x0b\x32\x12.sysml.AppliedEdit\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12#\n\x07\x66\x61ilure\x18\x04 \x01(\x0e\x32\x12.sysml.EditFailure\x12&\n\x0b\x64iagnostics\x18\x05 \x03(\x0b\x32\x11.sysml.Diagnostic\x12\x1a\n\x12referring_elements\x18\x06 \x03(\t\x12(\n\tdocuments\x18\x07 \x03(\x0b\x32\x15.sysml.EditedDocument\x12\"\n\treferrers\x18\x08 \x03(\x0b\x32\x0f.sysml.Referrer\"/\n\x0e\x45\x64itedDocument\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\t\"*\n\x08Referrer\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x10\n\x08\x64ocument\x18\x02 \x01(\t\"\x8c\x01\n\x0b\x41ppliedEdit\x12\x17\n\x0foperation_index\x18\x01 \x01(\x05\x12\x0e\n\x06target\x18\x02 \x01(\t\x12\x0e\n\x06offset\x18\x03 \x01(\x05\x12\x0e\n\x06length\x18\x04 \x01(\x05\x12\x10\n\x08old_text\x18\x05 \x01(\t\x12\x10\n\x08new_text\x18\x06 \x01(\t\x12\x10\n\x08\x64ocument\x18\x07 \x01(\t\"\xfd\x02\n\nSymbolInfo\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0c\n\x04kind\x18\x03 \x01(\t\x12\x31\n\x08metadata\x18\x04 \x03(\x0b\x32\x1f.sysml.SymbolInfo.MetadataEntry\x12\x11\n\tchild_ids\x18\x05 \x03(\t\x12(\n\nattributes\x18\x06 \x03(\x0b\x32\x14.sysml.AttributeInfo\x12\"\n\ttype_info\x18\x07 \x01(\x0b\x32\x0f.sysml.TypeInfo\x12-\n\x0cmultiplicity\x18\x08 \x01(\x0b\x32\x17.sysml.MultiplicityInfo\x12.\n\x0fspecializations\x18\t \x03(\x0b\x32\x15.sysml.Specialization\x12#\n\x1bwithheld_library_attributes\x18\n \x01(\x05\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"X\n\x0eSpecialization\x12\x0c\n\x04kind\x18\x01 \x01(\t\x12\x10\n\x08\x64\x65\x63lared\x18\x02 \x01(\t\x12\x11\n\ttarget_id\x18\x03 \x01(\t\x12\x13\n\x0btarget_kind\x18\x04 \x01(\t\"\x95\x01\n\x08TypeInfo\x12\x10\n\x08\x64\x65\x63lared\x18\x01 \x01(\t\x12\x13\n\x0bresolved_id\x18\x02 \x01(\t\x12\x15\n\rresolved_kind\x18\x03 \x01(\t\x12\x11\n\tprimitive\x18\x04 \x01(\t\x12\x18\n\x10primitive_source\x18\x05 \x01(\t\x12\x10\n\x08quantity\x18\x06 \x01(\x08\x12\x0c\n\x04unit\x18\x07 \x01(\t\"0\n\x10MultiplicityInfo\x12\r\n\x05lower\x18\x01 \x01(\t\x12\r\n\x05upper\x18\x02 \x01(\t\"V\n\rAttributeInfo\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\x12\x1b\n\x05value\x18\x03 \x01(\x0b\x32\x0c.sysml.Value\x12\x0c\n\x04unit\x18\x04 \x01(\t\"\xc3\x05\n\x05Value\x12\x13\n\tint_value\x18\x01 \x01(\x03H\x00\x12\x14\n\nreal_value\x18\x02 \x01(\x01H\x00\x12\x14\n\nbool_value\x18\x03 \x01(\x08H\x00\x12\x16\n\x0cstring_value\x18\x04 \x01(\tH\x00\x12\x15\n\x0binstance_id\x18\x05 \x01(\x03H\x00\x12(\n\x08sequence\x18\x06 \x01(\x0b\x32\x14.sysml.ValueSequenceH\x00\x12\x0e\n\x04null\x18\x07 \x01(\tH\x00\x12#\n\x08quantity\x18\x08 \x01(\x0b\x32\x0f.sysml.QuantityH\x00\x12*\n\x0c\x65num_literal\x18\t \x01(\x0b\x32\x12.sysml.EnumLiteralH\x00\x12\x0f\n\x05unset\x18\n \x01(\x08H\x00\x12!\n\x07\x63omplex\x18\x0b \x01(\x0b\x32\x0e.sysml.ComplexH\x00\x12\x1d\n\x05\x61rray\x18\x0c \x01(\x0b\x32\x0c.sysml.ArrayH\x00\x12\x1f\n\x06vector\x18\r \x01(\x0b\x32\r.sysml.VectorH\x00\x12\x30\n\x0fvector_quantity\x18\x0e \x01(\x0b\x32\x15.sysml.VectorQuantityH\x00\x12\x30\n\x0fmeasurement_ref\x18\x0f \x01(\x0b\x32\x15.sysml.MeasurementRefH\x00\x12\x12\n\x08infinity\x18\x10 \x01(\x08H\x00\x12#\n\x08\x66unction\x18\x11 \x01(\x0b\x32\x0f.sysml.FunctionH\x00\x12\x1e\n\x03set\x18\x12 \x01(\x0b\x32\x0f.sysml.ValueSetH\x00\x12\x30\n\x0ftensor_quantity\x18\x13 \x01(\x0b\x32\x15.sysml.TensorQuantityH\x00\x12\'\n\nmetaobject\x18\x14 \x01(\x0b\x32\x11.sysml.MetaobjectH\x00\x12+\n\x0cundetermined\x18\x15 \x01(\x0b\x32\x13.sysml.UndeterminedH\x00\x42\x06\n\x04kind\"6\n\nMetaobject\x12\x12\n\nelement_id\x18\x01 \x01(\t\x12\x14\n\x0cmetaclass_id\x18\x02 \x01(\t\"F\n\x0cUndetermined\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12&\n\x05\x63ount\x18\x02 \x01(\x0b\x32\x17.sysml.MultiplicityInfo\",\n\x08\x46unction\x12\x0f\n\x07\x63\x61lc_id\x18\x01 \x01(\t\x12\x0f\n\x07self_id\x18\x02 \x01(\x03\"*\n\x08ValueSet\x12\x1e\n\x08\x65lements\x18\x01 \x03(\x0b\x32\x0c.sysml.Value\"I\n\x0eTensorQuantity\x12\x12\n\ndimensions\x18\x01 \x03(\x03\x12#\n\ncomponents\x18\x02 \x03(\x0b\x32\x0f.sysml.Quantity\";\n\x05\x41rray\x12\x12\n\ndimensions\x18\x01 \x03(\x03\x12\x1e\n\x08\x65lements\x18\x02 \x03(\x0b\x32\x0c.sysml.Value\"*\n\x06Vector\x12 \n\ncomponents\x18\x01 \x03(\x0b\x32\x0c.sysml.Value\"5\n\x0eVectorQuantity\x12#\n\ncomponents\x18\x01 \x03(\x0b\x32\x0f.sysml.Quantity\"*\n\x07\x43omplex\x12\x0c\n\x04real\x18\x01 \x01(\x01\x12\x11\n\timaginary\x18\x02 \x01(\x01\"d\n\x0b\x45numLiteral\x12\x12\n\nliteral_id\x18\x01 \x01(\t\x12\x16\n\x0e\x65numeration_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x1b\n\x05value\x18\x04 \x01(\x0b\x32\x0c.sysml.Value\"/\n\rValueSequence\x12\x1e\n\x08\x65lements\x18\x01 \x03(\x0b\x32\x0c.sysml.Value\"|\n\x08Quantity\x12\x17\n\rint_magnitude\x18\x01 \x01(\x03H\x00\x12\x18\n\x0ereal_magnitude\x18\x02 \x01(\x01H\x00\x12\x0c\n\x04unit\x18\x03 \x01(\t\x12\"\n\tunit_term\x18\x04 \x01(\x0b\x32\x0f.sysml.UnitTermB\x0b\n\tmagnitude\"S\n\x0eMeasurementRef\x12\x0c\n\x04unit\x18\x01 \x01(\t\x12\"\n\tunit_term\x18\x02 \x01(\x0b\x32\x0f.sysml.UnitTerm\x12\x0f\n\x07unit_id\x18\x03 \x01(\t\"T\n\x08UnitTerm\x12\x11\n\tscale_num\x18\x01 \x01(\x01\x12\x11\n\tscale_den\x18\x02 \x01(\x01\x12\"\n\x07\x66\x61\x63tors\x18\x03 \x03(\x0b\x32\x11.sysml.UnitFactor\"/\n\nUnitFactor\x12\x0f\n\x07unit_id\x18\x01 \x01(\t\x12\x10\n\x08\x65xponent\x18\x02 \x01(\x01\"X\n\nDiagnostic\x12\x10\n\x08severity\x18\x01 \x01(\t\x12\x0f\n\x07message\x18\x02 \x01(\t\x12\x19\n\x04span\x18\x03 \x01(\x0b\x32\x0b.sysml.Span\x12\x0c\n\x04\x63ode\x18\x04 \x01(\t\"^\n\x04Span\x12\x0c\n\x04\x66ile\x18\x01 \x01(\t\x12\x12\n\nstart_line\x18\x02 \x01(\x05\x12\x11\n\tstart_col\x18\x03 \x01(\x05\x12\x10\n\x08\x65nd_line\x18\x04 \x01(\x05\x12\x0f\n\x07\x65nd_col\x18\x05 \x01(\x05\"\x13\n\x11ServerInfoRequest\";\n\x12ServerInfoResponse\x12\x0f\n\x07version\x18\x01 \x01(\t\x12\x14\n\x0c\x63\x61pabilities\x18\x02 \x03(\t\"S\n\x0cQueryRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x1b\n\x05query\x18\x02 \x01(\x0b\x32\x0c.sysml.Query\x12\x12\n\noslc_query\x18\x03 \x01(\t\"<\n\rQueryResponse\x12+\n\x08\x65lements\x18\x01 \x03(\x0b\x32\x19.sysml.QueryResultElement\"H\n\x05Query\x12\r\n\x05scope\x18\x01 \x03(\t\x12\x0e\n\x06select\x18\x02 \x03(\t\x12 \n\x05where\x18\x03 \x01(\x0b\x32\x11.sysml.Constraint\"|\n\nConstraint\x12/\n\tprimitive\x18\x01 \x01(\x0b\x32\x1a.sysml.PrimitiveConstraintH\x00\x12/\n\tcomposite\x18\x02 \x01(\x0b\x32\x1a.sysml.CompositeConstraintH\x00\x42\x0c\n\nconstraint\"s\n\x13PrimitiveConstraint\x12\x0f\n\x07inverse\x18\x01 \x01(\x08\x12\x10\n\x08property\x18\x02 \x01(\t\x12*\n\x08operator\x18\x03 \x01(\x0e\x32\x18.sysml.PrimitiveOperator\x12\r\n\x05value\x18\x04 \x03(\t\"h\n\x13\x43ompositeConstraint\x12*\n\x08operator\x18\x01 \x01(\x0e\x32\x18.sysml.CompositeOperator\x12%\n\nconstraint\x18\x02 \x03(\x0b\x32\x11.sysml.Constraint\"\xa0\x01\n\x12QueryResultElement\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\x12=\n\nproperties\x18\x03 \x03(\x0b\x32).sysml.QueryResultElement.PropertiesEntry\x1a\x31\n\x0fPropertiesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"s\n\nSweepRange\x12\x11\n\tparameter\x18\x01 \x01(\t\x12\x1b\n\x05start\x18\x02 \x01(\x0b\x32\x0c.sysml.Value\x12\x19\n\x03\x65nd\x18\x03 \x01(\x0b\x32\x0c.sysml.Value\x12\x1a\n\x04step\x18\x04 \x01(\x0b\x32\x0c.sysml.Value\"\xd0\x02\n\x0fRunSweepRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\x12\x19\n\x11subject_symbol_id\x18\x03 \x01(\t\x12\x1f\n\targuments\x18\x04 \x03(\x0b\x32\x0c.sysml.Value\x12\x43\n\x0fnamed_arguments\x18\x05 \x03(\x0b\x32*.sysml.RunSweepRequest.NamedArgumentsEntry\x12!\n\x06ranges\x18\x06 \x03(\x0b\x32\x11.sysml.SweepRange\x12\x0f\n\x07samples\x18\x07 \x01(\x03\x12\x0c\n\x04seed\x18\x08 \x01(\x04\x12\x0e\n\x06\x65ngine\x18\t \x01(\t\x1a\x43\n\x13NamedArgumentsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\"\xf4\x01\n\x08SweepRow\x12!\n\x06inputs\x18\x01 \x03(\x0b\x32\x11.sysml.CalcOutput\x12\"\n\x07outputs\x18\x02 \x03(\x0b\x32\x11.sysml.CalcOutput\x12 \n\x08verdicts\x18\x03 \x03(\x0b\x32\x0e.sysml.Verdict\x12\x16\n\x0e\x65lapsed_micros\x18\x04 \x01(\x03\x12\r\n\x05\x65rror\x18\x05 \x01(\t\x12,\n\x0e\x66\x61ilure_reason\x18\x06 \x01(\x0e\x32\x14.sysml.FailureReason\x12*\n\x0b\x65valuations\x18\x07 \x03(\x0b\x32\x15.sysml.CaseEvaluation\"\xad\x02\n\x10RunSweepResponse\x12\x1d\n\x04rows\x18\x01 \x03(\x0b\x32\x0f.sysml.SweepRow\x12\x12\n\nparameters\x18\x02 \x03(\t\x12\x0f\n\x07sampled\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x04\x12\r\n\x05\x65rror\x18\x05 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x06 \x03(\x0b\x32\x11.sysml.Diagnostic\x12,\n\x0e\x66\x61ilure_reason\x18\x07 \x01(\x0e\x32\x14.sysml.FailureReason\x12\"\n\tinstances\x18\x08 \x03(\x0b\x32\x0f.sysml.Instance\x12\x0e\n\x06\x65ngine\x18\t \x01(\t\x12\x10\n\x08strength\x18\n \x01(\t\x12\x1c\n\x06\x62ounds\x18\x0b \x03(\x0b\x32\x0c.sysml.Bound\"n\n\x17RunDocumentQueryRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x10\n\x08query_id\x18\x02 \x01(\t\x12-\n\x08\x62indings\x18\x03 \x03(\x0b\x32\x1b.sysml.DocumentQueryBinding\"O\n\x14\x44ocumentQueryBinding\x12\x11\n\tparameter\x18\x01 \x01(\t\x12$\n\x06values\x18\x02 \x03(\x0b\x32\x14.sysml.DocumentValue\"\xf7\x02\n\rDocumentValue\x12\x14\n\nelement_id\x18\x01 \x01(\tH\x00\x12\x16\n\x0cstring_value\x18\x02 \x01(\tH\x00\x12\x13\n\tint_value\x18\x03 \x01(\x03H\x00\x12\x14\n\nreal_value\x18\x04 \x01(\x01H\x00\x12\x14\n\nbool_value\x18\x05 \x01(\x08H\x00\x12\x12\n\x08infinity\x18\x06 \x01(\x08H\x00\x12#\n\x08quantity\x18\x08 \x01(\x0b\x32\x0f.sysml.QuantityH\x00\x12)\n\x07verdict\x18\t \x01(\x0b\x32\x16.sysml.DocumentVerdictH\x00\x12\'\n\x06object\x18\n \x01(\x0b\x32\x15.sysml.DocumentObjectH\x00\x12%\n\x05state\x18\x0b \x01(\x0b\x32\x14.sysml.DocumentStateH\x00\x12%\n\x05\x65vent\x18\x0c \x01(\x0b\x32\x14.sysml.DocumentEventH\x00\x12\x14\n\x0c\x65lement_type\x18\x07 \x01(\tB\x06\n\x04kind\"Z\n\x0e\x44ocumentObject\x12\x13\n\x0binstance_id\x18\x01 \x01(\x03\x12\x0c\n\x04path\x18\x02 \x01(\t\x12%\n\x07\x65lement\x18\x03 \x01(\x0b\x32\x14.sysml.DocumentValue\"\xae\x01\n\x0f\x44ocumentVerdict\x12\'\n\tassertion\x18\x01 \x01(\x0b\x32\x14.sysml.DocumentValue\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t\x12\x0c\n\x04path\x18\x04 \x01(\t\x12\x0f\n\x07verdict\x18\x05 \x01(\t\x12\x11\n\tcondition\x18\x06 \x01(\t\x12\x0e\n\x06reason\x18\x07 \x01(\t\x12\x14\n\x0cverification\x18\x08 \x03(\t\"\xb1\x01\n\rDocumentState\x12%\n\x06object\x18\x01 \x01(\x0b\x32\x15.sysml.DocumentObject\x12\x0f\n\x07machine\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x12\n\nstate_path\x18\x04 \x01(\t\x12#\n\x05state\x18\x05 \x01(\x0b\x32\x14.sysml.DocumentValue\x12\x0e\n\x06region\x18\x06 \x01(\t\x12\x11\n\tenclosing\x18\x07 \x03(\t\"\x9c\x02\n\rDocumentEvent\x12\x0c\n\x04kind\x18\x01 \x01(\t\x12\"\n\x04time\x18\x02 \x01(\x0b\x32\x14.sysml.DocumentValue\x12%\n\x06object\x18\x03 \x01(\x0b\x32\x15.sysml.DocumentObject\x12\x0f\n\x07machine\x18\x04 \x01(\t\x12\r\n\x05state\x18\x05 \x01(\t\x12\x0c\n\x04\x66rom\x18\x06 \x01(\t\x12\n\n\x02to\x18\x07 \x01(\t\x12%\n\x06target\x18\x08 \x01(\x0b\x32\x15.sysml.DocumentObject\x12\r\n\x05\x65vent\x18\t \x01(\t\x12\x0f\n\x07payload\x18\n \x03(\t\x12\x14\n\x0c\x61lternatives\x18\x0b \x03(\t\x12\r\n\x05taken\x18\x0c \x01(\t\x12\x0c\n\x04text\x18\r \x01(\t\"#\n\x13\x44ocumentQueryColumn\x12\x0c\n\x04name\x18\x01 \x01(\t\"9\n\x11\x44ocumentQueryCell\x12$\n\x06values\x18\x01 \x03(\x0b\x32\x14.sysml.DocumentValue\"b\n\x10\x44ocumentQueryRow\x12%\n\x07\x65lement\x18\x01 \x01(\x0b\x32\x14.sysml.DocumentValue\x12\'\n\x05\x63\x65lls\x18\x02 \x03(\x0b\x32\x18.sysml.DocumentQueryCell\"n\n\x18RunDocumentQueryResponse\x12+\n\x07\x63olumns\x18\x01 \x03(\x0b\x32\x1a.sysml.DocumentQueryColumn\x12%\n\x04rows\x18\x02 \x03(\x0b\x32\x17.sysml.DocumentQueryRow\"N\n\x15RenderDocumentRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x13\n\x0b\x64ocument_id\x18\x02 \x01(\t\x12\x0c\n\x04\x66orm\x18\x03 \x01(\t\"8\n\x16RenderDocumentResponse\x12\x10\n\x08markdown\x18\x01 \x01(\t\x12\x0c\n\x04html\x18\x02 \x01(\t*\xb1\x01\n\rFailureReason\x12\x1e\n\x1a\x46\x41ILURE_REASON_UNSPECIFIED\x10\x00\x12\x1d\n\x19\x46\x41ILURE_REASON_EVALUATION\x10\x01\x12\x1d\n\x19\x46\x41ILURE_REASON_WRONG_KIND\x10\x02\x12$\n FAILURE_REASON_AMBIGUOUS_SUBJECT\x10\x03\x12\x1c\n\x18\x46\x41ILURE_REASON_UNDECIDED\x10\x04*\x8c\x05\n\x0b\x45\x64itFailure\x12\x1c\n\x18\x45\x44IT_FAILURE_UNSPECIFIED\x10\x00\x12\x1e\n\x1a\x45\x44IT_FAILURE_NO_OPERATIONS\x10\x01\x12\x1f\n\x1b\x45\x44IT_FAILURE_UNKNOWN_TARGET\x10\x02\x12!\n\x1d\x45\x44IT_FAILURE_AMBIGUOUS_TARGET\x10\x03\x12\x1b\n\x17\x45\x44IT_FAILURE_NOT_VALUED\x10\x04\x12\x1e\n\x1a\x45\x44IT_FAILURE_INVALID_VALUE\x10\x05\x12\x1d\n\x19\x45\x44IT_FAILURE_INVALID_NAME\x10\x06\x12\x1a\n\x16\x45\x44IT_FAILURE_NOT_NAMED\x10\x07\x12\"\n\x1e\x45\x44IT_FAILURE_RENAME_REFERENCED\x10\x08\x12\"\n\x1e\x45\x44IT_FAILURE_OVERLAPPING_EDITS\x10\t\x12\x1f\n\x1b\x45\x44IT_FAILURE_RESULT_INVALID\x10\n\x12\x1e\n\x1a\x45\x44IT_FAILURE_OWNER_UNKNOWN\x10\x0b\x12$\n EDIT_FAILURE_OWNER_NOT_NAMESPACE\x10\x0c\x12\x1d\n\x19\x45\x44IT_FAILURE_ILLEGAL_KIND\x10\r\x12\"\n\x1e\x45\x44IT_FAILURE_MEMBER_NAME_TAKEN\x10\x0e\x12\"\n\x1e\x45\x44IT_FAILURE_DELETE_REFERENCED\x10\x0f\x12$\n EDIT_FAILURE_OWNER_INSIDE_TARGET\x10\x10\x12 \n\x1c\x45\x44IT_FAILURE_MOVE_REFERENCED\x10\x11\x12%\n!EDIT_FAILURE_REFERENCED_ELSEWHERE\x10\x12*\x92\x01\n\x11PrimitiveOperator\x12\"\n\x1ePRIMITIVE_OPERATOR_UNSPECIFIED\x10\x00\x12\x1c\n\x18PRIMITIVE_OPERATOR_EQUAL\x10\x01\x12\x1e\n\x1aPRIMITIVE_OPERATOR_GREATER\x10\x02\x12\x1b\n\x17PRIMITIVE_OPERATOR_LESS\x10\x03*n\n\x11\x43ompositeOperator\x12\"\n\x1e\x43OMPOSITE_OPERATOR_UNSPECIFIED\x10\x00\x12\x1a\n\x16\x43OMPOSITE_OPERATOR_AND\x10\x01\x12\x19\n\x15\x43OMPOSITE_OPERATOR_OR\x10\x02\x32\xbf\x0c\n\x0cSysMLService\x12\x44\n\rGetServerInfo\x12\x18.sysml.ServerInfoRequest\x1a\x19.sysml.ServerInfoResponse\x12>\n\tParseFile\x12\x17.sysml.ParseFileRequest\x1a\x18.sysml.ParseFileResponse\x12G\n\x0cParseSources\x12\x1a.sysml.ParseSourcesRequest\x1a\x1b.sysml.ParseSourcesResponse\x12;\n\tGetSymbol\x12\x17.sysml.GetSymbolRequest\x1a\x15.sysml.SymbolResponse\x12G\n\x0eGetDiagnostics\x12\x19.sysml.DiagnosticsRequest\x1a\x1a.sysml.DiagnosticsResponse\x12;\n\x08\x45valuate\x12\x16.sysml.EvaluateRequest\x1a\x17.sysml.EvaluateResponse\x12\x44\n\x0bInstantiate\x12\x19.sysml.InstantiateRequest\x1a\x1a.sysml.InstantiateResponse\x12J\n\rExecuteAction\x12\x1b.sysml.ExecuteActionRequest\x1a\x1c.sysml.ExecuteActionResponse\x12G\n\x0c\x45xecuteState\x12\x1a.sysml.ExecuteStateRequest\x1a\x1b.sysml.ExecuteStateResponse\x12\x38\n\x07\x43onvert\x12\x15.sysml.ConvertRequest\x1a\x16.sysml.ConvertResponse\x12\x41\n\nApplyEdits\x12\x18.sysml.ApplyEditsRequest\x1a\x19.sysml.ApplyEditsResponse\x12S\n\x10VerifyConstraint\x12\x1e.sysml.VerifyConstraintRequest\x1a\x1f.sysml.VerifyConstraintResponse\x12V\n\x11VerifyRequirement\x12\x1f.sysml.VerifyRequirementRequest\x1a .sysml.VerifyRequirementResponse\x12Y\n\x12VerifySatisfaction\x12 .sysml.VerifySatisfactionRequest\x1a!.sysml.VerifySatisfactionResponse\x12S\n\x10ValidateInstance\x12\x1e.sysml.ValidateInstanceRequest\x1a\x1f.sysml.ValidateInstanceResponse\x12G\n\x0c\x45valuateCalc\x12\x1a.sysml.EvaluateCalcRequest\x1a\x1b.sysml.EvaluateCalcResponse\x12\x44\n\x0bRunAnalysis\x12\x19.sysml.RunAnalysisRequest\x1a\x1a.sysml.RunAnalysisResponse\x12;\n\x08RunSweep\x12\x16.sysml.RunSweepRequest\x1a\x17.sysml.RunSweepResponse\x12\x44\n\x0bListEngines\x12\x19.sysml.ListEnginesRequest\x1a\x1a.sysml.ListEnginesResponse\x12\x32\n\x05Query\x12\x13.sysml.QueryRequest\x1a\x14.sysml.QueryResponse\x12S\n\x10RunDocumentQuery\x12\x1e.sysml.RunDocumentQueryRequest\x1a\x1f.sysml.RunDocumentQueryResponse\x12M\n\x0eRenderDocument\x12\x1c.sysml.RenderDocumentRequest\x1a\x1d.sysml.RenderDocumentResponseB*Z(github.com/Open-MBEE/OpenSysML/api/protob\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0bsysml.proto\x12\x05sysml\"\x86\x03\n\x07Verdict\x12\x0c\n\x04kind\x18\x01 \x01(\t\x12\x12\n\nelement_id\x18\x02 \x01(\t\x12\x0f\n\x07\x65lement\x18\x03 \x01(\t\x12\r\n\x05holds\x18\x04 \x01(\x08\x12\x11\n\tcondition\x18\x05 \x01(\t\x12\x13\n\x0binstance_id\x18\x06 \x01(\x03\x12\x18\n\x10instance_type_id\x18\x07 \x01(\t\x12\r\n\x05\x65rror\x18\x08 \x01(\t\x12,\n\x0e\x66\x61ilure_reason\x18\t \x01(\x0e\x32\x14.sysml.FailureReason\x12\x16\n\x0erequirement_id\x18\n \x01(\t\x12\x0e\n\x06\x65ngine\x18\x0b \x01(\t\x12\x10\n\x08strength\x18\x0c \x01(\t\x12\x1c\n\x06\x62ounds\x18\r \x03(\x0b\x32\x0c.sysml.Bound\x12\x15\n\rinstance_path\x18\x0e \x01(\t\x12\x10\n\x08question\x18\x0f \x01(\t\x12\x0e\n\x06status\x18\x10 \x01(\t\x12)\n\x07witness\x18\x11 \x03(\x0b\x32\x18.sysml.WitnessAssignment\"^\n\x11WitnessAssignment\x12\x0f\n\x07\x66\x65\x61ture\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value\x12\x0c\n\x04unit\x18\x03 \x01(\t\x12\r\n\x05\x65xact\x18\x04 \x01(\t\"5\n\x05\x42ound\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05limit\x18\x02 \x01(\x03\x12\x0f\n\x07reached\x18\x03 \x01(\x08\"}\n\x17VerifyConstraintRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\x12\x19\n\x11subject_symbol_id\x18\x03 \x01(\t\x12\x0e\n\x06\x65ngine\x18\x04 \x01(\t\x12\x10\n\x08question\x18\x05 \x01(\t\"\x96\x01\n\x18VerifyConstraintResponse\x12\x1f\n\x07verdict\x18\x01 \x01(\x0b\x32\x0e.sysml.Verdict\x12\"\n\tinstances\x18\x02 \x03(\x0b\x32\x0f.sysml.Instance\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x04 \x03(\x0b\x32\x11.sysml.Diagnostic\"~\n\x18VerifyRequirementRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\x12\x19\n\x11subject_symbol_id\x18\x03 \x01(\t\x12\x0e\n\x06\x65ngine\x18\x04 \x01(\t\x12\x10\n\x08question\x18\x05 \x01(\t\"m\n\x13VerificationVerdict\x12\x0f\n\x07\x63\x61se_id\x18\x01 \x01(\t\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\x0e\n\x06\x64\x65tail\x18\x03 \x01(\t\x12\x0f\n\x07subcase\x18\x04 \x01(\x08\x12\x16\n\x0erequirement_id\x18\x05 \x01(\t\"\xd2\x01\n\x19VerifyRequirementResponse\x12\x1f\n\x07verdict\x18\x01 \x01(\x0b\x32\x0e.sysml.Verdict\x12\"\n\tinstances\x18\x02 \x03(\x0b\x32\x0f.sysml.Instance\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x04 \x03(\x0b\x32\x11.sysml.Diagnostic\x12\x39\n\x15verification_verdicts\x18\x05 \x03(\x0b\x32\x1a.sysml.VerificationVerdict\"d\n\x19VerifySatisfactionRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\x12\x0e\n\x06\x65ngine\x18\x03 \x01(\t\x12\x10\n\x08question\x18\x04 \x01(\t\"\x82\x02\n\x1aVerifySatisfactionResponse\x12 \n\x08verdicts\x18\x01 \x03(\x0b\x32\x0e.sysml.Verdict\x12\"\n\tinstances\x18\x02 \x03(\x0b\x32\x0f.sysml.Instance\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x04 \x03(\x0b\x32\x11.sysml.Diagnostic\x12,\n\x0e\x66\x61ilure_reason\x18\x05 \x01(\x0e\x32\x14.sysml.FailureReason\x12\x39\n\x15verification_verdicts\x18\x06 \x03(\x0b\x32\x1a.sysml.VerificationVerdict\"P\n\x17ValidateInstanceRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\x12\x0e\n\x06\x65ngine\x18\x03 \x01(\t\"\xb2\x02\n\x18ValidateInstanceResponse\x12 \n\x08verdicts\x18\x01 \x03(\x0b\x32\x0e.sysml.Verdict\x12\x1f\n\x07summary\x18\x02 \x01(\x0b\x32\x0e.sysml.Verdict\x12\"\n\tinstances\x18\x03 \x03(\x0b\x32\x0f.sysml.Instance\x12\r\n\x05\x65rror\x18\x04 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x05 \x03(\x0b\x32\x11.sysml.Diagnostic\x12,\n\x0e\x66\x61ilure_reason\x18\x06 \x01(\x0e\x32\x14.sysml.FailureReason\x12\x39\n\x15verification_verdicts\x18\x07 \x03(\x0b\x32\x1a.sysml.VerificationVerdict\x12\x0f\n\x07\x62ounded\x18\x08 \x01(\x08\"m\n\x13\x45valuateCalcRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\x12\x1f\n\targuments\x18\x03 \x03(\x0b\x32\x0c.sysml.Value\x12\x0e\n\x06\x65ngine\x18\x04 \x01(\t\"\xfd\x01\n\x14\x45valuateCalcResponse\x12\x1c\n\x06result\x18\x01 \x01(\x0b\x32\x0c.sysml.Value\x12\"\n\x07outputs\x18\x02 \x03(\x0b\x32\x11.sysml.CalcOutput\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x04 \x03(\x0b\x32\x11.sysml.Diagnostic\x12,\n\x0e\x66\x61ilure_reason\x18\x05 \x01(\x0e\x32\x14.sysml.FailureReason\x12\x0e\n\x06\x65ngine\x18\x06 \x01(\t\x12\x10\n\x08strength\x18\x07 \x01(\t\x12\x1c\n\x06\x62ounds\x18\x08 \x03(\x0b\x32\x0c.sysml.Bound\"7\n\nCalcOutput\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value\"\x93\x01\n\x0e\x43\x61seEvaluation\x12\x13\n\x0b\x66unction_id\x18\x01 \x01(\t\x12\x1f\n\targuments\x18\x02 \x03(\x0b\x32\x0c.sysml.Value\x12\x1c\n\x06result\x18\x03 \x01(\x0b\x32\x0c.sysml.Value\x12\r\n\x05\x65rror\x18\x04 \x01(\t\x12\x10\n\x08selected\x18\x05 \x01(\x08\x12\x0c\n\x04tied\x18\x06 \x01(\x08\"\xa6\x02\n\x12RunAnalysisRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\x12\x19\n\x11subject_symbol_id\x18\x03 \x01(\t\x12\x1f\n\targuments\x18\x04 \x03(\x0b\x32\x0c.sysml.Value\x12\x46\n\x0fnamed_arguments\x18\x05 \x03(\x0b\x32-.sysml.RunAnalysisRequest.NamedArgumentsEntry\x12\x10\n\x08schedule\x18\x06 \x01(\t\x12\x0e\n\x06\x65ngine\x18\x07 \x01(\t\x1a\x43\n\x13NamedArgumentsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\"\xdc\x03\n\x13RunAnalysisResponse\x12\"\n\x07outputs\x18\x01 \x03(\x0b\x32\x11.sysml.CalcOutput\x12 \n\x08verdicts\x18\x02 \x03(\x0b\x32\x0e.sysml.Verdict\x12\"\n\tinstances\x18\x03 \x03(\x0b\x32\x0f.sysml.Instance\x12\r\n\x05\x65rror\x18\x04 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x05 \x03(\x0b\x32\x11.sysml.Diagnostic\x12,\n\x0e\x66\x61ilure_reason\x18\x06 \x01(\x0e\x32\x14.sysml.FailureReason\x12\x39\n\x15verification_verdicts\x18\x07 \x03(\x0b\x32\x1a.sysml.VerificationVerdict\x12 \n\x08outcomes\x18\x08 \x03(\x0b\x32\x0e.sysml.Outcome\x12-\n\x0b\x65xploration\x18\t \x01(\x0b\x32\x18.sysml.ExplorationStatus\x12*\n\x0b\x65valuations\x18\n \x03(\x0b\x32\x15.sysml.CaseEvaluation\x12\x0e\n\x06\x65ngine\x18\x0b \x01(\t\x12\x10\n\x08strength\x18\x0c \x01(\t\x12\x1c\n\x06\x62ounds\x18\r \x03(\x0b\x32\x0c.sysml.Bound\"\x97\x02\n\x07Outcome\x12,\n\x07outputs\x18\x01 \x03(\x0b\x32\x1b.sysml.Outcome.OutputsEntry\x12\x13\n\x0b\x66inal_state\x18\x02 \x01(\t\x12\x16\n\x0estates_visited\x18\x03 \x03(\t\x12\r\n\x05\x65rror\x18\x04 \x01(\t\x12\x16\n\x0elinearizations\x18\x05 \x01(\x05\x12\x0f\n\x07witness\x18\x06 \x03(\t\x12&\n\x0b\x64iagnostics\x18\x07 \x03(\x0b\x32\x11.sysml.Diagnostic\x12\x13\n\x0bprobability\x18\x08 \x01(\x01\x1a<\n\x0cOutputsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\"\x96\x01\n\x11\x45xplorationStatus\x12\x10\n\x08\x63omplete\x18\x01 \x01(\x08\x12\x0c\n\x04runs\x18\x02 \x01(\x05\x12\x13\n\x0b\x62udgets_hit\x18\x03 \x03(\t\x12\x13\n\x0bruns_budget\x18\x04 \x01(\x05\x12\x14\n\x0c\x64\x65pth_budget\x18\x05 \x01(\x05\x12!\n\x19probabilities_lower_bound\x18\x06 \x01(\x08\"\x14\n\x12ListEnginesRequest\"\xfc\x01\n\nEngineInfo\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x11\n\tauthority\x18\x02 \x01(\t\x12\x0f\n\x07\x61nswers\x18\x03 \x03(\t\x12\x0e\n\x06\x62ounds\x18\x04 \x03(\t\x12\x0f\n\x07process\x18\x05 \x01(\t\x12\x15\n\rprocess_found\x18\x06 \x01(\t\x12\r\n\x05ready\x18\x07 \x01(\x08\x12\x13\n\x0bunavailable\x18\x08 \x01(\t\x12\x0c\n\x04kind\x18\t \x01(\t\x12\x10\n\x08protocol\x18\n \x01(\t\x12\x0e\n\x06source\x18\x0b \x01(\t\x12\x0f\n\x07\x63ommand\x18\x0c \x01(\t\x12\x0f\n\x07version\x18\r \x01(\t\x12\x0e\n\x06served\x18\x0e \x01(\x08\"9\n\x13ListEnginesResponse\x12\"\n\x07\x65ngines\x18\x01 \x03(\x0b\x32\x11.sysml.EngineInfo\"\x8c\x01\n\x10ParseFileRequest\x12\x13\n\tfile_path\x18\x01 \x01(\tH\x00\x12\x11\n\x07\x63ontent\x18\x02 \x01(\tH\x00\x12\x18\n\x0c\x63ontent_hash\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08language\x18\x04 \x01(\t\x12\x1a\n\x12strict_conformance\x18\x05 \x01(\x08\x42\x08\n\x06source\"b\n\x0eSourceDocument\x12\x13\n\tfile_path\x18\x01 \x01(\tH\x00\x12\x11\n\x07\x63ontent\x18\x02 \x01(\tH\x00\x12\x10\n\x08language\x18\x03 \x01(\t\x12\x0c\n\x04name\x18\x04 \x01(\tB\x08\n\x06source\"[\n\x13ParseSourcesRequest\x12(\n\tdocuments\x18\x01 \x03(\x0b\x32\x15.sysml.SourceDocument\x12\x1a\n\x12strict_conformance\x18\x02 \x01(\x08\"\x83\x01\n\x14ParseSourcesResponse\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12 \n\x05roots\x18\x02 \x03(\x0b\x32\x11.sysml.SymbolInfo\x12&\n\x0b\x64iagnostics\x18\x03 \x03(\x0b\x32\x11.sysml.Diagnostic\x12\r\n\x05\x65rror\x18\x04 \x01(\t\"\x7f\n\x11ParseFileResponse\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x1f\n\x04root\x18\x02 \x01(\x0b\x32\x11.sysml.SymbolInfo\x12&\n\x0b\x64iagnostics\x18\x03 \x03(\x0b\x32\x11.sysml.Diagnostic\x12\r\n\x05\x65rror\x18\x04 \x01(\t\"9\n\x10GetSymbolRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\"B\n\x0eSymbolResponse\x12!\n\x06symbol\x18\x01 \x01(\x0b\x32\x11.sysml.SymbolInfo\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"(\n\x12\x44iagnosticsRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\"L\n\x13\x44iagnosticsResponse\x12&\n\x0b\x64iagnostics\x18\x01 \x03(\x0b\x32\x11.sysml.Diagnostic\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"o\n\x0f\x45valuateRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x12\n\nexpression\x18\x02 \x01(\t\x12\x19\n\x11\x63ontext_symbol_id\x18\x03 \x01(\t\x12\x19\n\x11subject_symbol_id\x18\x04 \x01(\t\"g\n\x10\x45valuateResponse\x12\x1c\n\x06result\x18\x01 \x01(\x0b\x32\x0c.sysml.Value\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x03 \x03(\x0b\x32\x11.sysml.Diagnostic\"\xc2\x01\n\x08Instance\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x16\n\x0etype_symbol_id\x18\x02 \x01(\t\x12:\n\x0e\x66\x65\x61ture_values\x18\x04 \x03(\x0b\x32\".sysml.Instance.FeatureValuesEntry\x1aI\n\x12\x46\x65\x61tureValuesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\"\n\x05value\x18\x02 \x01(\x0b\x32\x13.sysml.FeatureValue:\x02\x38\x01J\x04\x08\x03\x10\x04R\x05slots\"\x84\x01\n\x0c\x46\x65\x61tureValue\x12\x14\n\x0c\x66\x65\x61ture_name\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value\x12\x1c\n\x06values\x18\x03 \x03(\x0b\x32\x0c.sysml.Value\x12\x14\n\x0cmaterialized\x18\x04 \x01(\x08\x12\r\n\x05\x65rror\x18\x05 \x01(\t\";\n\x12InstantiateRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\"\x93\x01\n\x13InstantiateResponse\x12!\n\x08instance\x18\x01 \x01(\x0b\x32\x0f.sysml.Instance\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x03 \x03(\x0b\x32\x11.sysml.Diagnostic\x12\"\n\tinstances\x18\x04 \x03(\x0b\x32\x0f.sysml.Instance\"\xe9\x01\n\x14\x45xecuteActionRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x18\n\x10\x61\x63tion_symbol_id\x18\x02 \x01(\t\x12\x37\n\x06inputs\x18\x03 \x03(\x0b\x32\'.sysml.ExecuteActionRequest.InputsEntry\x12\x10\n\x08schedule\x18\x04 \x01(\t\x12\x1b\n\x13performer_symbol_id\x18\x05 \x01(\t\x1a;\n\x0bInputsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\"\xcc\x03\n\x15\x45xecuteActionResponse\x12:\n\x07outputs\x18\x01 \x03(\x0b\x32).sysml.ExecuteActionResponse.OutputsEntry\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x03 \x03(\x0b\x32\x11.sysml.Diagnostic\x12 \n\x08outcomes\x18\x04 \x03(\x0b\x32\x0e.sysml.Outcome\x12-\n\x0b\x65xploration\x18\x05 \x01(\x0b\x32\x18.sysml.ExplorationStatus\x12\x12\n\nfinal_time\x18\x06 \x01(\x01\x12S\n\x14performer_attributes\x18\x07 \x03(\x0b\x32\x35.sysml.ExecuteActionResponse.PerformerAttributesEntry\x1a<\n\x0cOutputsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\x1aH\n\x18PerformerAttributesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\"\x89\x01\n\x13\x45xecuteStateRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x1f\n\x17state_machine_symbol_id\x18\x02 \x01(\t\x12\x0e\n\x06\x65vents\x18\x03 \x03(\t\x12\x10\n\x08schedule\x18\x04 \x01(\t\x12\x1b\n\x13performer_symbol_id\x18\x05 \x01(\t\"\xd3\x02\n\x14\x45xecuteStateResponse\x12\x16\n\x0estates_visited\x18\x01 \x03(\t\x12\x44\n\rfinal_context\x18\x02 \x03(\x0b\x32-.sysml.ExecuteStateResponse.FinalContextEntry\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x04 \x03(\x0b\x32\x11.sysml.Diagnostic\x12 \n\x08outcomes\x18\x05 \x03(\x0b\x32\x0e.sysml.Outcome\x12-\n\x0b\x65xploration\x18\x06 \x01(\x0b\x32\x18.sysml.ExplorationStatus\x12\x12\n\nfinal_time\x18\x07 \x01(\x01\x1a\x41\n\x11\x46inalContextEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\"\xb1\x01\n\x0e\x43onvertRequest\x12\x13\n\tfile_path\x18\x01 \x01(\tH\x00\x12\x11\n\x07\x63ontent\x18\x02 \x01(\tH\x00\x12\x14\n\nmodel_hash\x18\x06 \x01(\tH\x00\x12\x13\n\x0b\x66rom_format\x18\x03 \x01(\t\x12\x11\n\tto_format\x18\x04 \x01(\t\x12\x1e\n\x16tolerate_syntax_errors\x18\x05 \x01(\x08\x12\x0f\n\x07id_form\x18\x07 \x01(\tB\x08\n\x06source\"\xb4\x01\n\x0f\x43onvertResponse\x12\x0f\n\x07\x63ontent\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_format\x18\x02 \x01(\t\x12\x11\n\tto_format\x18\x03 \x01(\t\x12\r\n\x05\x65rror\x18\x04 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x05 \x03(\x0b\x32\x11.sysml.Diagnostic\x12\x14\n\x0c\x65xperimental\x18\x06 \x01(\x08\x12\x1b\n\x13\x65xperimental_notice\x18\x07 \x01(\t\"}\n\x11\x41pplyEditsRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12(\n\noperations\x18\x02 \x03(\x0b\x32\x14.sysml.EditOperation\x12\x10\n\x08\x64ocument\x18\x03 \x01(\t\x12\x18\n\x10\x61\x63\x63\x65pt_documents\x18\x04 \x01(\x08\"\xc3\x06\n\rEditOperation\x12(\n\tset_value\x18\x01 \x01(\x0b\x32\x13.sysml.SetValueEditH\x00\x12#\n\x06rename\x18\x02 \x01(\x0b\x32\x11.sysml.RenameEditH\x00\x12*\n\nadd_member\x18\x03 \x01(\x0b\x32\x14.sysml.AddMemberEditH\x00\x12#\n\x06\x64\x65lete\x18\x04 \x01(\x0b\x32\x11.sysml.DeleteEditH\x00\x12\x1f\n\x04move\x18\x05 \x01(\x0b\x32\x0f.sysml.MoveEditH\x00\x12\x32\n\x0e\x61\x64\x64_connection\x18\x06 \x01(\x0b\x32\x18.sysml.AddConnectionEditH\x00\x12,\n\x0b\x61\x64\x64_satisfy\x18\x07 \x01(\x0b\x32\x15.sysml.AddSatisfyEditH\x00\x12I\n\x1a\x61\x64\x64_requirement_constraint\x18\x08 \x01(\x0b\x32#.sysml.AddRequirementConstraintEditH\x00\x12\x32\n\x0e\x61\x64\x64_transition\x18\t \x01(\x0b\x32\x18.sysml.AddTransitionEditH\x00\x12*\n\nadd_import\x18\n \x01(\x0b\x32\x14.sysml.AddImportEditH\x00\x12\x38\n\x11\x61\x64\x64_documentation\x18\x0b \x01(\x0b\x32\x1b.sysml.AddDocumentationEditH\x00\x12*\n\nadd_verify\x18\x0c \x01(\x0b\x32\x14.sysml.AddVerifyEditH\x00\x12.\n\x0c\x61\x64\x64_metadata\x18\r \x01(\x0b\x32\x16.sysml.AddMetadataEditH\x00\x12.\n\x0c\x61\x64\x64_sequence\x18\x0e \x01(\x0b\x32\x16.sysml.AddSequenceEditH\x00\x12;\n\x13\x61\x64\x64_metadata_prefix\x18\x0f \x01(\x0b\x32\x1c.sysml.AddMetadataPrefixEditH\x00\x12,\n\x0b\x61\x64\x64_comment\x18\x10 \x01(\x0b\x32\x15.sysml.AddCommentEditH\x00\x12&\n\x08\x61\x64\x64_note\x18\x12 \x01(\x0b\x32\x12.sysml.AddNoteEditH\x00\x42\x0b\n\toperation\"\x92\x02\n\rAddMemberEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x0c\n\x04type\x18\x04 \x01(\t\x12\x14\n\x0cmultiplicity\x18\x05 \x01(\t\x12\r\n\x05value\x18\x06 \x01(\t\x12\x13\n\x0bspecializes\x18\x07 \x03(\t\x12\x13\n\x0bis_abstract\x18\x08 \x01(\x08\x12\x11\n\tredefines\x18\t \x03(\t\x12\x12\n\nis_default\x18\n \x01(\x08\x12\x11\n\tdirection\x18\x0b \x01(\t\x12\x19\n\x11metadata_prefixes\x18\x0e \x03(\t\x12\x0b\n\x03\x64oc\x18\x0c \x01(\t\x12\x17\n\x0f\x62ody_expression\x18\r \x01(\t\"y\n\x0e\x41\x64\x64SatisfyEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x13\n\x0brequirement\x18\x02 \x01(\t\x12\x1a\n\x12satisfying_feature\x18\x03 \x01(\t\x12\x13\n\x0bis_asserted\x18\x04 \x01(\x08\x12\x12\n\nis_negated\x18\x05 \x01(\x08\"]\n\x1c\x41\x64\x64RequirementConstraintEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\x12\n\nexpression\x18\x03 \x01(\t\x12\x0c\n\x04name\x18\x04 \x01(\t\"\x91\x01\n\x11\x41\x64\x64TransitionEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0e\n\x06source\x18\x03 \x01(\t\x12\x0e\n\x06target\x18\x04 \x01(\t\x12\x0f\n\x07trigger\x18\x05 \x01(\t\x12\r\n\x05guard\x18\x06 \x01(\t\x12\x0e\n\x06\x65\x66\x66\x65\x63t\x18\x07 \x01(\t\x12\x0f\n\x07initial\x18\x08 \x01(\x08\"3\n\rAddVerifyEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x13\n\x0brequirement\x18\x02 \x01(\t\"6\n\x14MetadataFeatureValue\x12\x0f\n\x07\x66\x65\x61ture\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"\x94\x01\n\x0f\x41\x64\x64MetadataEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x15\n\rmetadata_type\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\r\n\x05\x61\x62out\x18\x04 \x03(\t\x12+\n\x06values\x18\x05 \x03(\x0b\x32\x1b.sysml.MetadataFeatureValue\x12\x11\n\tshorthand\x18\x06 \x01(\x08\">\n\x15\x41\x64\x64MetadataPrefixEdit\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\x15\n\rmetadata_type\x18\x02 \x01(\t\"\x80\x01\n\rAddImportEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x12\n\nvisibility\x18\x02 \x01(\t\x12\x0e\n\x06target\x18\x03 \x01(\t\x12\x14\n\x0cis_recursive\x18\x04 \x01(\x08\x12\x15\n\ris_import_all\x18\x05 \x01(\x08\x12\x0f\n\x07\x66ilters\x18\x06 \x03(\t\"c\n\x14\x41\x64\x64\x44ocumentationEdit\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\x0c\n\x04\x62ody\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x0e\n\x06locale\x18\x04 \x01(\t\x12\x0f\n\x07replace\x18\x05 \x01(\x08\"Z\n\x0e\x41\x64\x64\x43ommentEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x0c\n\x04\x62ody\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\r\n\x05\x61\x62out\x18\x04 \x03(\t\x12\x0e\n\x06locale\x18\x05 \x01(\t\"+\n\x0b\x41\x64\x64NoteEdit\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\x0c\n\x04text\x18\x02 \x01(\t\"\xcd\x02\n\x0f\x41\x64\x64SequenceEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x0f\n\x07keyword\x18\x02 \x01(\t\x12\x0b\n\x03ref\x18\x03 \x01(\t\x12\x13\n\x0bmember_kind\x18\x04 \x01(\t\x12\x13\n\x0bmember_name\x18\x05 \x01(\t\x12\x0c\n\x04type\x18\x06 \x01(\t\x12\r\n\x05\x61\x66ter\x18\x07 \x01(\t\x12\x11\n\tcondition\x18\x08 \x01(\t\x12\r\n\x05value\x18\t \x01(\t\x12\x0e\n\x06target\x18\n \x01(\t\x12\x0b\n\x03via\x18\x0b \x01(\t\x12\r\n\x05until\x18\x0c \x01(\t\x12$\n\x04\x62ody\x18\r \x03(\x0b\x32\x16.sysml.AddSequenceEdit\x12)\n\telse_body\x18\x0e \x03(\x0b\x32\x16.sysml.AddSequenceEdit\x12\x14\n\x0cmultiplicity\x18\x0f \x01(\t\x12\x11\n\tparameter\x18\x10 \x01(\t\"n\n\x11\x41\x64\x64\x43onnectionEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\x10\n\x08\x66rom_end\x18\x03 \x01(\t\x12\x0e\n\x06to_end\x18\x04 \x01(\t\x12\x0c\n\x04name\x18\x05 \x01(\t\x12\x0c\n\x04type\x18\x06 \x01(\t\"-\n\nDeleteEdit\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\x0f\n\x07\x63\x61scade\x18\x02 \x01(\x08\")\n\x08MoveEdit\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\r\n\x05owner\x18\x02 \x01(\t\"-\n\x0cSetValueEdit\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\".\n\nRenameEdit\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\x10\n\x08new_name\x18\x02 \x01(\t\"\x90\x02\n\x12\x41pplyEditsResponse\x12\x0f\n\x07\x63ontent\x18\x01 \x01(\t\x12#\n\x07\x61pplied\x18\x02 \x03(\x0b\x32\x12.sysml.AppliedEdit\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12#\n\x07\x66\x61ilure\x18\x04 \x01(\x0e\x32\x12.sysml.EditFailure\x12&\n\x0b\x64iagnostics\x18\x05 \x03(\x0b\x32\x11.sysml.Diagnostic\x12\x1a\n\x12referring_elements\x18\x06 \x03(\t\x12(\n\tdocuments\x18\x07 \x03(\x0b\x32\x15.sysml.EditedDocument\x12\"\n\treferrers\x18\x08 \x03(\x0b\x32\x0f.sysml.Referrer\"/\n\x0e\x45\x64itedDocument\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\t\"*\n\x08Referrer\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x10\n\x08\x64ocument\x18\x02 \x01(\t\"\x8c\x01\n\x0b\x41ppliedEdit\x12\x17\n\x0foperation_index\x18\x01 \x01(\x05\x12\x0e\n\x06target\x18\x02 \x01(\t\x12\x0e\n\x06offset\x18\x03 \x01(\x05\x12\x0e\n\x06length\x18\x04 \x01(\x05\x12\x10\n\x08old_text\x18\x05 \x01(\t\x12\x10\n\x08new_text\x18\x06 \x01(\t\x12\x10\n\x08\x64ocument\x18\x07 \x01(\t\"\xfd\x02\n\nSymbolInfo\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0c\n\x04kind\x18\x03 \x01(\t\x12\x31\n\x08metadata\x18\x04 \x03(\x0b\x32\x1f.sysml.SymbolInfo.MetadataEntry\x12\x11\n\tchild_ids\x18\x05 \x03(\t\x12(\n\nattributes\x18\x06 \x03(\x0b\x32\x14.sysml.AttributeInfo\x12\"\n\ttype_info\x18\x07 \x01(\x0b\x32\x0f.sysml.TypeInfo\x12-\n\x0cmultiplicity\x18\x08 \x01(\x0b\x32\x17.sysml.MultiplicityInfo\x12.\n\x0fspecializations\x18\t \x03(\x0b\x32\x15.sysml.Specialization\x12#\n\x1bwithheld_library_attributes\x18\n \x01(\x05\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"X\n\x0eSpecialization\x12\x0c\n\x04kind\x18\x01 \x01(\t\x12\x10\n\x08\x64\x65\x63lared\x18\x02 \x01(\t\x12\x11\n\ttarget_id\x18\x03 \x01(\t\x12\x13\n\x0btarget_kind\x18\x04 \x01(\t\"\x95\x01\n\x08TypeInfo\x12\x10\n\x08\x64\x65\x63lared\x18\x01 \x01(\t\x12\x13\n\x0bresolved_id\x18\x02 \x01(\t\x12\x15\n\rresolved_kind\x18\x03 \x01(\t\x12\x11\n\tprimitive\x18\x04 \x01(\t\x12\x18\n\x10primitive_source\x18\x05 \x01(\t\x12\x10\n\x08quantity\x18\x06 \x01(\x08\x12\x0c\n\x04unit\x18\x07 \x01(\t\"0\n\x10MultiplicityInfo\x12\r\n\x05lower\x18\x01 \x01(\t\x12\r\n\x05upper\x18\x02 \x01(\t\"V\n\rAttributeInfo\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\x12\x1b\n\x05value\x18\x03 \x01(\x0b\x32\x0c.sysml.Value\x12\x0c\n\x04unit\x18\x04 \x01(\t\"\xc3\x05\n\x05Value\x12\x13\n\tint_value\x18\x01 \x01(\x03H\x00\x12\x14\n\nreal_value\x18\x02 \x01(\x01H\x00\x12\x14\n\nbool_value\x18\x03 \x01(\x08H\x00\x12\x16\n\x0cstring_value\x18\x04 \x01(\tH\x00\x12\x15\n\x0binstance_id\x18\x05 \x01(\x03H\x00\x12(\n\x08sequence\x18\x06 \x01(\x0b\x32\x14.sysml.ValueSequenceH\x00\x12\x0e\n\x04null\x18\x07 \x01(\tH\x00\x12#\n\x08quantity\x18\x08 \x01(\x0b\x32\x0f.sysml.QuantityH\x00\x12*\n\x0c\x65num_literal\x18\t \x01(\x0b\x32\x12.sysml.EnumLiteralH\x00\x12\x0f\n\x05unset\x18\n \x01(\x08H\x00\x12!\n\x07\x63omplex\x18\x0b \x01(\x0b\x32\x0e.sysml.ComplexH\x00\x12\x1d\n\x05\x61rray\x18\x0c \x01(\x0b\x32\x0c.sysml.ArrayH\x00\x12\x1f\n\x06vector\x18\r \x01(\x0b\x32\r.sysml.VectorH\x00\x12\x30\n\x0fvector_quantity\x18\x0e \x01(\x0b\x32\x15.sysml.VectorQuantityH\x00\x12\x30\n\x0fmeasurement_ref\x18\x0f \x01(\x0b\x32\x15.sysml.MeasurementRefH\x00\x12\x12\n\x08infinity\x18\x10 \x01(\x08H\x00\x12#\n\x08\x66unction\x18\x11 \x01(\x0b\x32\x0f.sysml.FunctionH\x00\x12\x1e\n\x03set\x18\x12 \x01(\x0b\x32\x0f.sysml.ValueSetH\x00\x12\x30\n\x0ftensor_quantity\x18\x13 \x01(\x0b\x32\x15.sysml.TensorQuantityH\x00\x12\'\n\nmetaobject\x18\x14 \x01(\x0b\x32\x11.sysml.MetaobjectH\x00\x12+\n\x0cundetermined\x18\x15 \x01(\x0b\x32\x13.sysml.UndeterminedH\x00\x42\x06\n\x04kind\"6\n\nMetaobject\x12\x12\n\nelement_id\x18\x01 \x01(\t\x12\x14\n\x0cmetaclass_id\x18\x02 \x01(\t\"F\n\x0cUndetermined\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12&\n\x05\x63ount\x18\x02 \x01(\x0b\x32\x17.sysml.MultiplicityInfo\",\n\x08\x46unction\x12\x0f\n\x07\x63\x61lc_id\x18\x01 \x01(\t\x12\x0f\n\x07self_id\x18\x02 \x01(\x03\"*\n\x08ValueSet\x12\x1e\n\x08\x65lements\x18\x01 \x03(\x0b\x32\x0c.sysml.Value\"I\n\x0eTensorQuantity\x12\x12\n\ndimensions\x18\x01 \x03(\x03\x12#\n\ncomponents\x18\x02 \x03(\x0b\x32\x0f.sysml.Quantity\";\n\x05\x41rray\x12\x12\n\ndimensions\x18\x01 \x03(\x03\x12\x1e\n\x08\x65lements\x18\x02 \x03(\x0b\x32\x0c.sysml.Value\"*\n\x06Vector\x12 \n\ncomponents\x18\x01 \x03(\x0b\x32\x0c.sysml.Value\"5\n\x0eVectorQuantity\x12#\n\ncomponents\x18\x01 \x03(\x0b\x32\x0f.sysml.Quantity\"*\n\x07\x43omplex\x12\x0c\n\x04real\x18\x01 \x01(\x01\x12\x11\n\timaginary\x18\x02 \x01(\x01\"d\n\x0b\x45numLiteral\x12\x12\n\nliteral_id\x18\x01 \x01(\t\x12\x16\n\x0e\x65numeration_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x1b\n\x05value\x18\x04 \x01(\x0b\x32\x0c.sysml.Value\"/\n\rValueSequence\x12\x1e\n\x08\x65lements\x18\x01 \x03(\x0b\x32\x0c.sysml.Value\"|\n\x08Quantity\x12\x17\n\rint_magnitude\x18\x01 \x01(\x03H\x00\x12\x18\n\x0ereal_magnitude\x18\x02 \x01(\x01H\x00\x12\x0c\n\x04unit\x18\x03 \x01(\t\x12\"\n\tunit_term\x18\x04 \x01(\x0b\x32\x0f.sysml.UnitTermB\x0b\n\tmagnitude\"S\n\x0eMeasurementRef\x12\x0c\n\x04unit\x18\x01 \x01(\t\x12\"\n\tunit_term\x18\x02 \x01(\x0b\x32\x0f.sysml.UnitTerm\x12\x0f\n\x07unit_id\x18\x03 \x01(\t\"T\n\x08UnitTerm\x12\x11\n\tscale_num\x18\x01 \x01(\x01\x12\x11\n\tscale_den\x18\x02 \x01(\x01\x12\"\n\x07\x66\x61\x63tors\x18\x03 \x03(\x0b\x32\x11.sysml.UnitFactor\"/\n\nUnitFactor\x12\x0f\n\x07unit_id\x18\x01 \x01(\t\x12\x10\n\x08\x65xponent\x18\x02 \x01(\x01\"X\n\nDiagnostic\x12\x10\n\x08severity\x18\x01 \x01(\t\x12\x0f\n\x07message\x18\x02 \x01(\t\x12\x19\n\x04span\x18\x03 \x01(\x0b\x32\x0b.sysml.Span\x12\x0c\n\x04\x63ode\x18\x04 \x01(\t\"^\n\x04Span\x12\x0c\n\x04\x66ile\x18\x01 \x01(\t\x12\x12\n\nstart_line\x18\x02 \x01(\x05\x12\x11\n\tstart_col\x18\x03 \x01(\x05\x12\x10\n\x08\x65nd_line\x18\x04 \x01(\x05\x12\x0f\n\x07\x65nd_col\x18\x05 \x01(\x05\"\x13\n\x11ServerInfoRequest\";\n\x12ServerInfoResponse\x12\x0f\n\x07version\x18\x01 \x01(\t\x12\x14\n\x0c\x63\x61pabilities\x18\x02 \x03(\t\"S\n\x0cQueryRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x1b\n\x05query\x18\x02 \x01(\x0b\x32\x0c.sysml.Query\x12\x12\n\noslc_query\x18\x03 \x01(\t\"<\n\rQueryResponse\x12+\n\x08\x65lements\x18\x01 \x03(\x0b\x32\x19.sysml.QueryResultElement\"H\n\x05Query\x12\r\n\x05scope\x18\x01 \x03(\t\x12\x0e\n\x06select\x18\x02 \x03(\t\x12 \n\x05where\x18\x03 \x01(\x0b\x32\x11.sysml.Constraint\"|\n\nConstraint\x12/\n\tprimitive\x18\x01 \x01(\x0b\x32\x1a.sysml.PrimitiveConstraintH\x00\x12/\n\tcomposite\x18\x02 \x01(\x0b\x32\x1a.sysml.CompositeConstraintH\x00\x42\x0c\n\nconstraint\"s\n\x13PrimitiveConstraint\x12\x0f\n\x07inverse\x18\x01 \x01(\x08\x12\x10\n\x08property\x18\x02 \x01(\t\x12*\n\x08operator\x18\x03 \x01(\x0e\x32\x18.sysml.PrimitiveOperator\x12\r\n\x05value\x18\x04 \x03(\t\"h\n\x13\x43ompositeConstraint\x12*\n\x08operator\x18\x01 \x01(\x0e\x32\x18.sysml.CompositeOperator\x12%\n\nconstraint\x18\x02 \x03(\x0b\x32\x11.sysml.Constraint\"\xa0\x01\n\x12QueryResultElement\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\x12=\n\nproperties\x18\x03 \x03(\x0b\x32).sysml.QueryResultElement.PropertiesEntry\x1a\x31\n\x0fPropertiesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"s\n\nSweepRange\x12\x11\n\tparameter\x18\x01 \x01(\t\x12\x1b\n\x05start\x18\x02 \x01(\x0b\x32\x0c.sysml.Value\x12\x19\n\x03\x65nd\x18\x03 \x01(\x0b\x32\x0c.sysml.Value\x12\x1a\n\x04step\x18\x04 \x01(\x0b\x32\x0c.sysml.Value\"\xd0\x02\n\x0fRunSweepRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\x12\x19\n\x11subject_symbol_id\x18\x03 \x01(\t\x12\x1f\n\targuments\x18\x04 \x03(\x0b\x32\x0c.sysml.Value\x12\x43\n\x0fnamed_arguments\x18\x05 \x03(\x0b\x32*.sysml.RunSweepRequest.NamedArgumentsEntry\x12!\n\x06ranges\x18\x06 \x03(\x0b\x32\x11.sysml.SweepRange\x12\x0f\n\x07samples\x18\x07 \x01(\x03\x12\x0c\n\x04seed\x18\x08 \x01(\x04\x12\x0e\n\x06\x65ngine\x18\t \x01(\t\x1a\x43\n\x13NamedArgumentsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\"\xf4\x01\n\x08SweepRow\x12!\n\x06inputs\x18\x01 \x03(\x0b\x32\x11.sysml.CalcOutput\x12\"\n\x07outputs\x18\x02 \x03(\x0b\x32\x11.sysml.CalcOutput\x12 \n\x08verdicts\x18\x03 \x03(\x0b\x32\x0e.sysml.Verdict\x12\x16\n\x0e\x65lapsed_micros\x18\x04 \x01(\x03\x12\r\n\x05\x65rror\x18\x05 \x01(\t\x12,\n\x0e\x66\x61ilure_reason\x18\x06 \x01(\x0e\x32\x14.sysml.FailureReason\x12*\n\x0b\x65valuations\x18\x07 \x03(\x0b\x32\x15.sysml.CaseEvaluation\"\xad\x02\n\x10RunSweepResponse\x12\x1d\n\x04rows\x18\x01 \x03(\x0b\x32\x0f.sysml.SweepRow\x12\x12\n\nparameters\x18\x02 \x03(\t\x12\x0f\n\x07sampled\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x04\x12\r\n\x05\x65rror\x18\x05 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x06 \x03(\x0b\x32\x11.sysml.Diagnostic\x12,\n\x0e\x66\x61ilure_reason\x18\x07 \x01(\x0e\x32\x14.sysml.FailureReason\x12\"\n\tinstances\x18\x08 \x03(\x0b\x32\x0f.sysml.Instance\x12\x0e\n\x06\x65ngine\x18\t \x01(\t\x12\x10\n\x08strength\x18\n \x01(\t\x12\x1c\n\x06\x62ounds\x18\x0b \x03(\x0b\x32\x0c.sysml.Bound\"n\n\x17RunDocumentQueryRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x10\n\x08query_id\x18\x02 \x01(\t\x12-\n\x08\x62indings\x18\x03 \x03(\x0b\x32\x1b.sysml.DocumentQueryBinding\"O\n\x14\x44ocumentQueryBinding\x12\x11\n\tparameter\x18\x01 \x01(\t\x12$\n\x06values\x18\x02 \x03(\x0b\x32\x14.sysml.DocumentValue\"\xf7\x02\n\rDocumentValue\x12\x14\n\nelement_id\x18\x01 \x01(\tH\x00\x12\x16\n\x0cstring_value\x18\x02 \x01(\tH\x00\x12\x13\n\tint_value\x18\x03 \x01(\x03H\x00\x12\x14\n\nreal_value\x18\x04 \x01(\x01H\x00\x12\x14\n\nbool_value\x18\x05 \x01(\x08H\x00\x12\x12\n\x08infinity\x18\x06 \x01(\x08H\x00\x12#\n\x08quantity\x18\x08 \x01(\x0b\x32\x0f.sysml.QuantityH\x00\x12)\n\x07verdict\x18\t \x01(\x0b\x32\x16.sysml.DocumentVerdictH\x00\x12\'\n\x06object\x18\n \x01(\x0b\x32\x15.sysml.DocumentObjectH\x00\x12%\n\x05state\x18\x0b \x01(\x0b\x32\x14.sysml.DocumentStateH\x00\x12%\n\x05\x65vent\x18\x0c \x01(\x0b\x32\x14.sysml.DocumentEventH\x00\x12\x14\n\x0c\x65lement_type\x18\x07 \x01(\tB\x06\n\x04kind\"Z\n\x0e\x44ocumentObject\x12\x13\n\x0binstance_id\x18\x01 \x01(\x03\x12\x0c\n\x04path\x18\x02 \x01(\t\x12%\n\x07\x65lement\x18\x03 \x01(\x0b\x32\x14.sysml.DocumentValue\"\xae\x01\n\x0f\x44ocumentVerdict\x12\'\n\tassertion\x18\x01 \x01(\x0b\x32\x14.sysml.DocumentValue\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t\x12\x0c\n\x04path\x18\x04 \x01(\t\x12\x0f\n\x07verdict\x18\x05 \x01(\t\x12\x11\n\tcondition\x18\x06 \x01(\t\x12\x0e\n\x06reason\x18\x07 \x01(\t\x12\x14\n\x0cverification\x18\x08 \x03(\t\"\xb1\x01\n\rDocumentState\x12%\n\x06object\x18\x01 \x01(\x0b\x32\x15.sysml.DocumentObject\x12\x0f\n\x07machine\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x12\n\nstate_path\x18\x04 \x01(\t\x12#\n\x05state\x18\x05 \x01(\x0b\x32\x14.sysml.DocumentValue\x12\x0e\n\x06region\x18\x06 \x01(\t\x12\x11\n\tenclosing\x18\x07 \x03(\t\"\x9c\x02\n\rDocumentEvent\x12\x0c\n\x04kind\x18\x01 \x01(\t\x12\"\n\x04time\x18\x02 \x01(\x0b\x32\x14.sysml.DocumentValue\x12%\n\x06object\x18\x03 \x01(\x0b\x32\x15.sysml.DocumentObject\x12\x0f\n\x07machine\x18\x04 \x01(\t\x12\r\n\x05state\x18\x05 \x01(\t\x12\x0c\n\x04\x66rom\x18\x06 \x01(\t\x12\n\n\x02to\x18\x07 \x01(\t\x12%\n\x06target\x18\x08 \x01(\x0b\x32\x15.sysml.DocumentObject\x12\r\n\x05\x65vent\x18\t \x01(\t\x12\x0f\n\x07payload\x18\n \x03(\t\x12\x14\n\x0c\x61lternatives\x18\x0b \x03(\t\x12\r\n\x05taken\x18\x0c \x01(\t\x12\x0c\n\x04text\x18\r \x01(\t\"#\n\x13\x44ocumentQueryColumn\x12\x0c\n\x04name\x18\x01 \x01(\t\"9\n\x11\x44ocumentQueryCell\x12$\n\x06values\x18\x01 \x03(\x0b\x32\x14.sysml.DocumentValue\"b\n\x10\x44ocumentQueryRow\x12%\n\x07\x65lement\x18\x01 \x01(\x0b\x32\x14.sysml.DocumentValue\x12\'\n\x05\x63\x65lls\x18\x02 \x03(\x0b\x32\x18.sysml.DocumentQueryCell\"n\n\x18RunDocumentQueryResponse\x12+\n\x07\x63olumns\x18\x01 \x03(\x0b\x32\x1a.sysml.DocumentQueryColumn\x12%\n\x04rows\x18\x02 \x03(\x0b\x32\x17.sysml.DocumentQueryRow\"N\n\x15RenderDocumentRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x13\n\x0b\x64ocument_id\x18\x02 \x01(\t\x12\x0c\n\x04\x66orm\x18\x03 \x01(\t\"8\n\x16RenderDocumentResponse\x12\x10\n\x08markdown\x18\x01 \x01(\t\x12\x0c\n\x04html\x18\x02 \x01(\t*\xb1\x01\n\rFailureReason\x12\x1e\n\x1a\x46\x41ILURE_REASON_UNSPECIFIED\x10\x00\x12\x1d\n\x19\x46\x41ILURE_REASON_EVALUATION\x10\x01\x12\x1d\n\x19\x46\x41ILURE_REASON_WRONG_KIND\x10\x02\x12$\n FAILURE_REASON_AMBIGUOUS_SUBJECT\x10\x03\x12\x1c\n\x18\x46\x41ILURE_REASON_UNDECIDED\x10\x04*\x8c\x05\n\x0b\x45\x64itFailure\x12\x1c\n\x18\x45\x44IT_FAILURE_UNSPECIFIED\x10\x00\x12\x1e\n\x1a\x45\x44IT_FAILURE_NO_OPERATIONS\x10\x01\x12\x1f\n\x1b\x45\x44IT_FAILURE_UNKNOWN_TARGET\x10\x02\x12!\n\x1d\x45\x44IT_FAILURE_AMBIGUOUS_TARGET\x10\x03\x12\x1b\n\x17\x45\x44IT_FAILURE_NOT_VALUED\x10\x04\x12\x1e\n\x1a\x45\x44IT_FAILURE_INVALID_VALUE\x10\x05\x12\x1d\n\x19\x45\x44IT_FAILURE_INVALID_NAME\x10\x06\x12\x1a\n\x16\x45\x44IT_FAILURE_NOT_NAMED\x10\x07\x12\"\n\x1e\x45\x44IT_FAILURE_RENAME_REFERENCED\x10\x08\x12\"\n\x1e\x45\x44IT_FAILURE_OVERLAPPING_EDITS\x10\t\x12\x1f\n\x1b\x45\x44IT_FAILURE_RESULT_INVALID\x10\n\x12\x1e\n\x1a\x45\x44IT_FAILURE_OWNER_UNKNOWN\x10\x0b\x12$\n EDIT_FAILURE_OWNER_NOT_NAMESPACE\x10\x0c\x12\x1d\n\x19\x45\x44IT_FAILURE_ILLEGAL_KIND\x10\r\x12\"\n\x1e\x45\x44IT_FAILURE_MEMBER_NAME_TAKEN\x10\x0e\x12\"\n\x1e\x45\x44IT_FAILURE_DELETE_REFERENCED\x10\x0f\x12$\n EDIT_FAILURE_OWNER_INSIDE_TARGET\x10\x10\x12 \n\x1c\x45\x44IT_FAILURE_MOVE_REFERENCED\x10\x11\x12%\n!EDIT_FAILURE_REFERENCED_ELSEWHERE\x10\x12*\x92\x01\n\x11PrimitiveOperator\x12\"\n\x1ePRIMITIVE_OPERATOR_UNSPECIFIED\x10\x00\x12\x1c\n\x18PRIMITIVE_OPERATOR_EQUAL\x10\x01\x12\x1e\n\x1aPRIMITIVE_OPERATOR_GREATER\x10\x02\x12\x1b\n\x17PRIMITIVE_OPERATOR_LESS\x10\x03*n\n\x11\x43ompositeOperator\x12\"\n\x1e\x43OMPOSITE_OPERATOR_UNSPECIFIED\x10\x00\x12\x1a\n\x16\x43OMPOSITE_OPERATOR_AND\x10\x01\x12\x19\n\x15\x43OMPOSITE_OPERATOR_OR\x10\x02\x32\xbf\x0c\n\x0cSysMLService\x12\x44\n\rGetServerInfo\x12\x18.sysml.ServerInfoRequest\x1a\x19.sysml.ServerInfoResponse\x12>\n\tParseFile\x12\x17.sysml.ParseFileRequest\x1a\x18.sysml.ParseFileResponse\x12G\n\x0cParseSources\x12\x1a.sysml.ParseSourcesRequest\x1a\x1b.sysml.ParseSourcesResponse\x12;\n\tGetSymbol\x12\x17.sysml.GetSymbolRequest\x1a\x15.sysml.SymbolResponse\x12G\n\x0eGetDiagnostics\x12\x19.sysml.DiagnosticsRequest\x1a\x1a.sysml.DiagnosticsResponse\x12;\n\x08\x45valuate\x12\x16.sysml.EvaluateRequest\x1a\x17.sysml.EvaluateResponse\x12\x44\n\x0bInstantiate\x12\x19.sysml.InstantiateRequest\x1a\x1a.sysml.InstantiateResponse\x12J\n\rExecuteAction\x12\x1b.sysml.ExecuteActionRequest\x1a\x1c.sysml.ExecuteActionResponse\x12G\n\x0c\x45xecuteState\x12\x1a.sysml.ExecuteStateRequest\x1a\x1b.sysml.ExecuteStateResponse\x12\x38\n\x07\x43onvert\x12\x15.sysml.ConvertRequest\x1a\x16.sysml.ConvertResponse\x12\x41\n\nApplyEdits\x12\x18.sysml.ApplyEditsRequest\x1a\x19.sysml.ApplyEditsResponse\x12S\n\x10VerifyConstraint\x12\x1e.sysml.VerifyConstraintRequest\x1a\x1f.sysml.VerifyConstraintResponse\x12V\n\x11VerifyRequirement\x12\x1f.sysml.VerifyRequirementRequest\x1a .sysml.VerifyRequirementResponse\x12Y\n\x12VerifySatisfaction\x12 .sysml.VerifySatisfactionRequest\x1a!.sysml.VerifySatisfactionResponse\x12S\n\x10ValidateInstance\x12\x1e.sysml.ValidateInstanceRequest\x1a\x1f.sysml.ValidateInstanceResponse\x12G\n\x0c\x45valuateCalc\x12\x1a.sysml.EvaluateCalcRequest\x1a\x1b.sysml.EvaluateCalcResponse\x12\x44\n\x0bRunAnalysis\x12\x19.sysml.RunAnalysisRequest\x1a\x1a.sysml.RunAnalysisResponse\x12;\n\x08RunSweep\x12\x16.sysml.RunSweepRequest\x1a\x17.sysml.RunSweepResponse\x12\x44\n\x0bListEngines\x12\x19.sysml.ListEnginesRequest\x1a\x1a.sysml.ListEnginesResponse\x12\x32\n\x05Query\x12\x13.sysml.QueryRequest\x1a\x14.sysml.QueryResponse\x12S\n\x10RunDocumentQuery\x12\x1e.sysml.RunDocumentQueryRequest\x1a\x1f.sysml.RunDocumentQueryResponse\x12M\n\x0eRenderDocument\x12\x1c.sysml.RenderDocumentRequest\x1a\x1d.sysml.RenderDocumentResponseB*Z(github.com/Open-MBEE/OpenSysML/api/protob\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -54,14 +54,14 @@ _globals['_QUERYRESULTELEMENT_PROPERTIESENTRY']._serialized_options = b'8\001' _globals['_RUNSWEEPREQUEST_NAMEDARGUMENTSENTRY']._loaded_options = None _globals['_RUNSWEEPREQUEST_NAMEDARGUMENTSENTRY']._serialized_options = b'8\001' - _globals['_FAILUREREASON']._serialized_start=16982 - _globals['_FAILUREREASON']._serialized_end=17159 - _globals['_EDITFAILURE']._serialized_start=17162 - _globals['_EDITFAILURE']._serialized_end=17814 - _globals['_PRIMITIVEOPERATOR']._serialized_start=17817 - _globals['_PRIMITIVEOPERATOR']._serialized_end=17963 - _globals['_COMPOSITEOPERATOR']._serialized_start=17965 - _globals['_COMPOSITEOPERATOR']._serialized_end=18075 + _globals['_FAILUREREASON']._serialized_start=16999 + _globals['_FAILUREREASON']._serialized_end=17176 + _globals['_EDITFAILURE']._serialized_start=17179 + _globals['_EDITFAILURE']._serialized_end=17831 + _globals['_PRIMITIVEOPERATOR']._serialized_start=17834 + _globals['_PRIMITIVEOPERATOR']._serialized_end=17980 + _globals['_COMPOSITEOPERATOR']._serialized_start=17982 + _globals['_COMPOSITEOPERATOR']._serialized_end=18092 _globals['_VERDICT']._serialized_start=23 _globals['_VERDICT']._serialized_end=413 _globals['_WITNESSASSIGNMENT']._serialized_start=415 @@ -161,161 +161,161 @@ _globals['_EXECUTESTATERESPONSE_FINALCONTEXTENTRY']._serialized_start=6894 _globals['_EXECUTESTATERESPONSE_FINALCONTEXTENTRY']._serialized_end=6959 _globals['_CONVERTREQUEST']._serialized_start=6962 - _globals['_CONVERTREQUEST']._serialized_end=7122 - _globals['_CONVERTRESPONSE']._serialized_start=7125 - _globals['_CONVERTRESPONSE']._serialized_end=7305 - _globals['_APPLYEDITSREQUEST']._serialized_start=7307 - _globals['_APPLYEDITSREQUEST']._serialized_end=7432 - _globals['_EDITOPERATION']._serialized_start=7435 - _globals['_EDITOPERATION']._serialized_end=8270 - _globals['_ADDMEMBEREDIT']._serialized_start=8273 - _globals['_ADDMEMBEREDIT']._serialized_end=8547 - _globals['_ADDSATISFYEDIT']._serialized_start=8549 - _globals['_ADDSATISFYEDIT']._serialized_end=8670 - _globals['_ADDREQUIREMENTCONSTRAINTEDIT']._serialized_start=8672 - _globals['_ADDREQUIREMENTCONSTRAINTEDIT']._serialized_end=8765 - _globals['_ADDTRANSITIONEDIT']._serialized_start=8768 - _globals['_ADDTRANSITIONEDIT']._serialized_end=8913 - _globals['_ADDVERIFYEDIT']._serialized_start=8915 - _globals['_ADDVERIFYEDIT']._serialized_end=8966 - _globals['_METADATAFEATUREVALUE']._serialized_start=8968 - _globals['_METADATAFEATUREVALUE']._serialized_end=9022 - _globals['_ADDMETADATAEDIT']._serialized_start=9025 - _globals['_ADDMETADATAEDIT']._serialized_end=9173 - _globals['_ADDMETADATAPREFIXEDIT']._serialized_start=9175 - _globals['_ADDMETADATAPREFIXEDIT']._serialized_end=9237 - _globals['_ADDIMPORTEDIT']._serialized_start=9240 - _globals['_ADDIMPORTEDIT']._serialized_end=9368 - _globals['_ADDDOCUMENTATIONEDIT']._serialized_start=9370 - _globals['_ADDDOCUMENTATIONEDIT']._serialized_end=9469 - _globals['_ADDCOMMENTEDIT']._serialized_start=9471 - _globals['_ADDCOMMENTEDIT']._serialized_end=9561 - _globals['_ADDNOTEEDIT']._serialized_start=9563 - _globals['_ADDNOTEEDIT']._serialized_end=9606 - _globals['_ADDSEQUENCEEDIT']._serialized_start=9609 - _globals['_ADDSEQUENCEEDIT']._serialized_end=9942 - _globals['_ADDCONNECTIONEDIT']._serialized_start=9944 - _globals['_ADDCONNECTIONEDIT']._serialized_end=10054 - _globals['_DELETEEDIT']._serialized_start=10056 - _globals['_DELETEEDIT']._serialized_end=10101 - _globals['_MOVEEDIT']._serialized_start=10103 - _globals['_MOVEEDIT']._serialized_end=10144 - _globals['_SETVALUEEDIT']._serialized_start=10146 - _globals['_SETVALUEEDIT']._serialized_end=10191 - _globals['_RENAMEEDIT']._serialized_start=10193 - _globals['_RENAMEEDIT']._serialized_end=10239 - _globals['_APPLYEDITSRESPONSE']._serialized_start=10242 - _globals['_APPLYEDITSRESPONSE']._serialized_end=10514 - _globals['_EDITEDDOCUMENT']._serialized_start=10516 - _globals['_EDITEDDOCUMENT']._serialized_end=10563 - _globals['_REFERRER']._serialized_start=10565 - _globals['_REFERRER']._serialized_end=10607 - _globals['_APPLIEDEDIT']._serialized_start=10610 - _globals['_APPLIEDEDIT']._serialized_end=10750 - _globals['_SYMBOLINFO']._serialized_start=10753 - _globals['_SYMBOLINFO']._serialized_end=11134 - _globals['_SYMBOLINFO_METADATAENTRY']._serialized_start=11087 - _globals['_SYMBOLINFO_METADATAENTRY']._serialized_end=11134 - _globals['_SPECIALIZATION']._serialized_start=11136 - _globals['_SPECIALIZATION']._serialized_end=11224 - _globals['_TYPEINFO']._serialized_start=11227 - _globals['_TYPEINFO']._serialized_end=11376 - _globals['_MULTIPLICITYINFO']._serialized_start=11378 - _globals['_MULTIPLICITYINFO']._serialized_end=11426 - _globals['_ATTRIBUTEINFO']._serialized_start=11428 - _globals['_ATTRIBUTEINFO']._serialized_end=11514 - _globals['_VALUE']._serialized_start=11517 - _globals['_VALUE']._serialized_end=12224 - _globals['_METAOBJECT']._serialized_start=12226 - _globals['_METAOBJECT']._serialized_end=12280 - _globals['_UNDETERMINED']._serialized_start=12282 - _globals['_UNDETERMINED']._serialized_end=12352 - _globals['_FUNCTION']._serialized_start=12354 - _globals['_FUNCTION']._serialized_end=12398 - _globals['_VALUESET']._serialized_start=12400 - _globals['_VALUESET']._serialized_end=12442 - _globals['_TENSORQUANTITY']._serialized_start=12444 - _globals['_TENSORQUANTITY']._serialized_end=12517 - _globals['_ARRAY']._serialized_start=12519 - _globals['_ARRAY']._serialized_end=12578 - _globals['_VECTOR']._serialized_start=12580 - _globals['_VECTOR']._serialized_end=12622 - _globals['_VECTORQUANTITY']._serialized_start=12624 - _globals['_VECTORQUANTITY']._serialized_end=12677 - _globals['_COMPLEX']._serialized_start=12679 - _globals['_COMPLEX']._serialized_end=12721 - _globals['_ENUMLITERAL']._serialized_start=12723 - _globals['_ENUMLITERAL']._serialized_end=12823 - _globals['_VALUESEQUENCE']._serialized_start=12825 - _globals['_VALUESEQUENCE']._serialized_end=12872 - _globals['_QUANTITY']._serialized_start=12874 - _globals['_QUANTITY']._serialized_end=12998 - _globals['_MEASUREMENTREF']._serialized_start=13000 - _globals['_MEASUREMENTREF']._serialized_end=13083 - _globals['_UNITTERM']._serialized_start=13085 - _globals['_UNITTERM']._serialized_end=13169 - _globals['_UNITFACTOR']._serialized_start=13171 - _globals['_UNITFACTOR']._serialized_end=13218 - _globals['_DIAGNOSTIC']._serialized_start=13220 - _globals['_DIAGNOSTIC']._serialized_end=13308 - _globals['_SPAN']._serialized_start=13310 - _globals['_SPAN']._serialized_end=13404 - _globals['_SERVERINFOREQUEST']._serialized_start=13406 - _globals['_SERVERINFOREQUEST']._serialized_end=13425 - _globals['_SERVERINFORESPONSE']._serialized_start=13427 - _globals['_SERVERINFORESPONSE']._serialized_end=13486 - _globals['_QUERYREQUEST']._serialized_start=13488 - _globals['_QUERYREQUEST']._serialized_end=13571 - _globals['_QUERYRESPONSE']._serialized_start=13573 - _globals['_QUERYRESPONSE']._serialized_end=13633 - _globals['_QUERY']._serialized_start=13635 - _globals['_QUERY']._serialized_end=13707 - _globals['_CONSTRAINT']._serialized_start=13709 - _globals['_CONSTRAINT']._serialized_end=13833 - _globals['_PRIMITIVECONSTRAINT']._serialized_start=13835 - _globals['_PRIMITIVECONSTRAINT']._serialized_end=13950 - _globals['_COMPOSITECONSTRAINT']._serialized_start=13952 - _globals['_COMPOSITECONSTRAINT']._serialized_end=14056 - _globals['_QUERYRESULTELEMENT']._serialized_start=14059 - _globals['_QUERYRESULTELEMENT']._serialized_end=14219 - _globals['_QUERYRESULTELEMENT_PROPERTIESENTRY']._serialized_start=14170 - _globals['_QUERYRESULTELEMENT_PROPERTIESENTRY']._serialized_end=14219 - _globals['_SWEEPRANGE']._serialized_start=14221 - _globals['_SWEEPRANGE']._serialized_end=14336 - _globals['_RUNSWEEPREQUEST']._serialized_start=14339 - _globals['_RUNSWEEPREQUEST']._serialized_end=14675 + _globals['_CONVERTREQUEST']._serialized_end=7139 + _globals['_CONVERTRESPONSE']._serialized_start=7142 + _globals['_CONVERTRESPONSE']._serialized_end=7322 + _globals['_APPLYEDITSREQUEST']._serialized_start=7324 + _globals['_APPLYEDITSREQUEST']._serialized_end=7449 + _globals['_EDITOPERATION']._serialized_start=7452 + _globals['_EDITOPERATION']._serialized_end=8287 + _globals['_ADDMEMBEREDIT']._serialized_start=8290 + _globals['_ADDMEMBEREDIT']._serialized_end=8564 + _globals['_ADDSATISFYEDIT']._serialized_start=8566 + _globals['_ADDSATISFYEDIT']._serialized_end=8687 + _globals['_ADDREQUIREMENTCONSTRAINTEDIT']._serialized_start=8689 + _globals['_ADDREQUIREMENTCONSTRAINTEDIT']._serialized_end=8782 + _globals['_ADDTRANSITIONEDIT']._serialized_start=8785 + _globals['_ADDTRANSITIONEDIT']._serialized_end=8930 + _globals['_ADDVERIFYEDIT']._serialized_start=8932 + _globals['_ADDVERIFYEDIT']._serialized_end=8983 + _globals['_METADATAFEATUREVALUE']._serialized_start=8985 + _globals['_METADATAFEATUREVALUE']._serialized_end=9039 + _globals['_ADDMETADATAEDIT']._serialized_start=9042 + _globals['_ADDMETADATAEDIT']._serialized_end=9190 + _globals['_ADDMETADATAPREFIXEDIT']._serialized_start=9192 + _globals['_ADDMETADATAPREFIXEDIT']._serialized_end=9254 + _globals['_ADDIMPORTEDIT']._serialized_start=9257 + _globals['_ADDIMPORTEDIT']._serialized_end=9385 + _globals['_ADDDOCUMENTATIONEDIT']._serialized_start=9387 + _globals['_ADDDOCUMENTATIONEDIT']._serialized_end=9486 + _globals['_ADDCOMMENTEDIT']._serialized_start=9488 + _globals['_ADDCOMMENTEDIT']._serialized_end=9578 + _globals['_ADDNOTEEDIT']._serialized_start=9580 + _globals['_ADDNOTEEDIT']._serialized_end=9623 + _globals['_ADDSEQUENCEEDIT']._serialized_start=9626 + _globals['_ADDSEQUENCEEDIT']._serialized_end=9959 + _globals['_ADDCONNECTIONEDIT']._serialized_start=9961 + _globals['_ADDCONNECTIONEDIT']._serialized_end=10071 + _globals['_DELETEEDIT']._serialized_start=10073 + _globals['_DELETEEDIT']._serialized_end=10118 + _globals['_MOVEEDIT']._serialized_start=10120 + _globals['_MOVEEDIT']._serialized_end=10161 + _globals['_SETVALUEEDIT']._serialized_start=10163 + _globals['_SETVALUEEDIT']._serialized_end=10208 + _globals['_RENAMEEDIT']._serialized_start=10210 + _globals['_RENAMEEDIT']._serialized_end=10256 + _globals['_APPLYEDITSRESPONSE']._serialized_start=10259 + _globals['_APPLYEDITSRESPONSE']._serialized_end=10531 + _globals['_EDITEDDOCUMENT']._serialized_start=10533 + _globals['_EDITEDDOCUMENT']._serialized_end=10580 + _globals['_REFERRER']._serialized_start=10582 + _globals['_REFERRER']._serialized_end=10624 + _globals['_APPLIEDEDIT']._serialized_start=10627 + _globals['_APPLIEDEDIT']._serialized_end=10767 + _globals['_SYMBOLINFO']._serialized_start=10770 + _globals['_SYMBOLINFO']._serialized_end=11151 + _globals['_SYMBOLINFO_METADATAENTRY']._serialized_start=11104 + _globals['_SYMBOLINFO_METADATAENTRY']._serialized_end=11151 + _globals['_SPECIALIZATION']._serialized_start=11153 + _globals['_SPECIALIZATION']._serialized_end=11241 + _globals['_TYPEINFO']._serialized_start=11244 + _globals['_TYPEINFO']._serialized_end=11393 + _globals['_MULTIPLICITYINFO']._serialized_start=11395 + _globals['_MULTIPLICITYINFO']._serialized_end=11443 + _globals['_ATTRIBUTEINFO']._serialized_start=11445 + _globals['_ATTRIBUTEINFO']._serialized_end=11531 + _globals['_VALUE']._serialized_start=11534 + _globals['_VALUE']._serialized_end=12241 + _globals['_METAOBJECT']._serialized_start=12243 + _globals['_METAOBJECT']._serialized_end=12297 + _globals['_UNDETERMINED']._serialized_start=12299 + _globals['_UNDETERMINED']._serialized_end=12369 + _globals['_FUNCTION']._serialized_start=12371 + _globals['_FUNCTION']._serialized_end=12415 + _globals['_VALUESET']._serialized_start=12417 + _globals['_VALUESET']._serialized_end=12459 + _globals['_TENSORQUANTITY']._serialized_start=12461 + _globals['_TENSORQUANTITY']._serialized_end=12534 + _globals['_ARRAY']._serialized_start=12536 + _globals['_ARRAY']._serialized_end=12595 + _globals['_VECTOR']._serialized_start=12597 + _globals['_VECTOR']._serialized_end=12639 + _globals['_VECTORQUANTITY']._serialized_start=12641 + _globals['_VECTORQUANTITY']._serialized_end=12694 + _globals['_COMPLEX']._serialized_start=12696 + _globals['_COMPLEX']._serialized_end=12738 + _globals['_ENUMLITERAL']._serialized_start=12740 + _globals['_ENUMLITERAL']._serialized_end=12840 + _globals['_VALUESEQUENCE']._serialized_start=12842 + _globals['_VALUESEQUENCE']._serialized_end=12889 + _globals['_QUANTITY']._serialized_start=12891 + _globals['_QUANTITY']._serialized_end=13015 + _globals['_MEASUREMENTREF']._serialized_start=13017 + _globals['_MEASUREMENTREF']._serialized_end=13100 + _globals['_UNITTERM']._serialized_start=13102 + _globals['_UNITTERM']._serialized_end=13186 + _globals['_UNITFACTOR']._serialized_start=13188 + _globals['_UNITFACTOR']._serialized_end=13235 + _globals['_DIAGNOSTIC']._serialized_start=13237 + _globals['_DIAGNOSTIC']._serialized_end=13325 + _globals['_SPAN']._serialized_start=13327 + _globals['_SPAN']._serialized_end=13421 + _globals['_SERVERINFOREQUEST']._serialized_start=13423 + _globals['_SERVERINFOREQUEST']._serialized_end=13442 + _globals['_SERVERINFORESPONSE']._serialized_start=13444 + _globals['_SERVERINFORESPONSE']._serialized_end=13503 + _globals['_QUERYREQUEST']._serialized_start=13505 + _globals['_QUERYREQUEST']._serialized_end=13588 + _globals['_QUERYRESPONSE']._serialized_start=13590 + _globals['_QUERYRESPONSE']._serialized_end=13650 + _globals['_QUERY']._serialized_start=13652 + _globals['_QUERY']._serialized_end=13724 + _globals['_CONSTRAINT']._serialized_start=13726 + _globals['_CONSTRAINT']._serialized_end=13850 + _globals['_PRIMITIVECONSTRAINT']._serialized_start=13852 + _globals['_PRIMITIVECONSTRAINT']._serialized_end=13967 + _globals['_COMPOSITECONSTRAINT']._serialized_start=13969 + _globals['_COMPOSITECONSTRAINT']._serialized_end=14073 + _globals['_QUERYRESULTELEMENT']._serialized_start=14076 + _globals['_QUERYRESULTELEMENT']._serialized_end=14236 + _globals['_QUERYRESULTELEMENT_PROPERTIESENTRY']._serialized_start=14187 + _globals['_QUERYRESULTELEMENT_PROPERTIESENTRY']._serialized_end=14236 + _globals['_SWEEPRANGE']._serialized_start=14238 + _globals['_SWEEPRANGE']._serialized_end=14353 + _globals['_RUNSWEEPREQUEST']._serialized_start=14356 + _globals['_RUNSWEEPREQUEST']._serialized_end=14692 _globals['_RUNSWEEPREQUEST_NAMEDARGUMENTSENTRY']._serialized_start=2854 _globals['_RUNSWEEPREQUEST_NAMEDARGUMENTSENTRY']._serialized_end=2921 - _globals['_SWEEPROW']._serialized_start=14678 - _globals['_SWEEPROW']._serialized_end=14922 - _globals['_RUNSWEEPRESPONSE']._serialized_start=14925 - _globals['_RUNSWEEPRESPONSE']._serialized_end=15226 - _globals['_RUNDOCUMENTQUERYREQUEST']._serialized_start=15228 - _globals['_RUNDOCUMENTQUERYREQUEST']._serialized_end=15338 - _globals['_DOCUMENTQUERYBINDING']._serialized_start=15340 - _globals['_DOCUMENTQUERYBINDING']._serialized_end=15419 - _globals['_DOCUMENTVALUE']._serialized_start=15422 - _globals['_DOCUMENTVALUE']._serialized_end=15797 - _globals['_DOCUMENTOBJECT']._serialized_start=15799 - _globals['_DOCUMENTOBJECT']._serialized_end=15889 - _globals['_DOCUMENTVERDICT']._serialized_start=15892 - _globals['_DOCUMENTVERDICT']._serialized_end=16066 - _globals['_DOCUMENTSTATE']._serialized_start=16069 - _globals['_DOCUMENTSTATE']._serialized_end=16246 - _globals['_DOCUMENTEVENT']._serialized_start=16249 - _globals['_DOCUMENTEVENT']._serialized_end=16533 - _globals['_DOCUMENTQUERYCOLUMN']._serialized_start=16535 - _globals['_DOCUMENTQUERYCOLUMN']._serialized_end=16570 - _globals['_DOCUMENTQUERYCELL']._serialized_start=16572 - _globals['_DOCUMENTQUERYCELL']._serialized_end=16629 - _globals['_DOCUMENTQUERYROW']._serialized_start=16631 - _globals['_DOCUMENTQUERYROW']._serialized_end=16729 - _globals['_RUNDOCUMENTQUERYRESPONSE']._serialized_start=16731 - _globals['_RUNDOCUMENTQUERYRESPONSE']._serialized_end=16841 - _globals['_RENDERDOCUMENTREQUEST']._serialized_start=16843 - _globals['_RENDERDOCUMENTREQUEST']._serialized_end=16921 - _globals['_RENDERDOCUMENTRESPONSE']._serialized_start=16923 - _globals['_RENDERDOCUMENTRESPONSE']._serialized_end=16979 - _globals['_SYSMLSERVICE']._serialized_start=18078 - _globals['_SYSMLSERVICE']._serialized_end=19677 + _globals['_SWEEPROW']._serialized_start=14695 + _globals['_SWEEPROW']._serialized_end=14939 + _globals['_RUNSWEEPRESPONSE']._serialized_start=14942 + _globals['_RUNSWEEPRESPONSE']._serialized_end=15243 + _globals['_RUNDOCUMENTQUERYREQUEST']._serialized_start=15245 + _globals['_RUNDOCUMENTQUERYREQUEST']._serialized_end=15355 + _globals['_DOCUMENTQUERYBINDING']._serialized_start=15357 + _globals['_DOCUMENTQUERYBINDING']._serialized_end=15436 + _globals['_DOCUMENTVALUE']._serialized_start=15439 + _globals['_DOCUMENTVALUE']._serialized_end=15814 + _globals['_DOCUMENTOBJECT']._serialized_start=15816 + _globals['_DOCUMENTOBJECT']._serialized_end=15906 + _globals['_DOCUMENTVERDICT']._serialized_start=15909 + _globals['_DOCUMENTVERDICT']._serialized_end=16083 + _globals['_DOCUMENTSTATE']._serialized_start=16086 + _globals['_DOCUMENTSTATE']._serialized_end=16263 + _globals['_DOCUMENTEVENT']._serialized_start=16266 + _globals['_DOCUMENTEVENT']._serialized_end=16550 + _globals['_DOCUMENTQUERYCOLUMN']._serialized_start=16552 + _globals['_DOCUMENTQUERYCOLUMN']._serialized_end=16587 + _globals['_DOCUMENTQUERYCELL']._serialized_start=16589 + _globals['_DOCUMENTQUERYCELL']._serialized_end=16646 + _globals['_DOCUMENTQUERYROW']._serialized_start=16648 + _globals['_DOCUMENTQUERYROW']._serialized_end=16746 + _globals['_RUNDOCUMENTQUERYRESPONSE']._serialized_start=16748 + _globals['_RUNDOCUMENTQUERYRESPONSE']._serialized_end=16858 + _globals['_RENDERDOCUMENTREQUEST']._serialized_start=16860 + _globals['_RENDERDOCUMENTREQUEST']._serialized_end=16938 + _globals['_RENDERDOCUMENTRESPONSE']._serialized_start=16940 + _globals['_RENDERDOCUMENTRESPONSE']._serialized_end=16996 + _globals['_SYSMLSERVICE']._serialized_start=18095 + _globals['_SYSMLSERVICE']._serialized_end=19694 # @@protoc_insertion_point(module_scope) diff --git a/client/python/opensysml/proto/sysml_pb2.pyi b/client/python/opensysml/proto/sysml_pb2.pyi index 7af5e8f3fa..8776eed866 100644 --- a/client/python/opensysml/proto/sysml_pb2.pyi +++ b/client/python/opensysml/proto/sysml_pb2.pyi @@ -717,20 +717,22 @@ class ExecuteStateResponse(_message.Message): def __init__(self, states_visited: _Optional[_Iterable[str]] = ..., final_context: _Optional[_Mapping[str, Value]] = ..., error: _Optional[str] = ..., diagnostics: _Optional[_Iterable[_Union[Diagnostic, _Mapping]]] = ..., outcomes: _Optional[_Iterable[_Union[Outcome, _Mapping]]] = ..., exploration: _Optional[_Union[ExplorationStatus, _Mapping]] = ..., final_time: _Optional[float] = ...) -> None: ... class ConvertRequest(_message.Message): - __slots__ = ("file_path", "content", "model_hash", "from_format", "to_format", "tolerate_syntax_errors") + __slots__ = ("file_path", "content", "model_hash", "from_format", "to_format", "tolerate_syntax_errors", "id_form") FILE_PATH_FIELD_NUMBER: _ClassVar[int] CONTENT_FIELD_NUMBER: _ClassVar[int] MODEL_HASH_FIELD_NUMBER: _ClassVar[int] FROM_FORMAT_FIELD_NUMBER: _ClassVar[int] TO_FORMAT_FIELD_NUMBER: _ClassVar[int] TOLERATE_SYNTAX_ERRORS_FIELD_NUMBER: _ClassVar[int] + ID_FORM_FIELD_NUMBER: _ClassVar[int] file_path: str content: str model_hash: str from_format: str to_format: str tolerate_syntax_errors: bool - def __init__(self, file_path: _Optional[str] = ..., content: _Optional[str] = ..., model_hash: _Optional[str] = ..., from_format: _Optional[str] = ..., to_format: _Optional[str] = ..., tolerate_syntax_errors: _Optional[bool] = ...) -> None: ... + id_form: str + def __init__(self, file_path: _Optional[str] = ..., content: _Optional[str] = ..., model_hash: _Optional[str] = ..., from_format: _Optional[str] = ..., to_format: _Optional[str] = ..., tolerate_syntax_errors: _Optional[bool] = ..., id_form: _Optional[str] = ...) -> None: ... class ConvertResponse(_message.Message): __slots__ = ("content", "from_format", "to_format", "error", "diagnostics", "experimental", "experimental_notice") diff --git a/client/python/opensysml/signing.py b/client/python/opensysml/signing.py index be5a003c92..9ea0057590 100644 --- a/client/python/opensysml/signing.py +++ b/client/python/opensysml/signing.py @@ -14,7 +14,11 @@ import re -from opensysml.errors import ManifestSignatureError, UnsignedReleaseError +from opensysml.errors import ( + ManifestSignatureError, + SigstoreUnavailableError, + UnsignedReleaseError, +) #: Manifest of every published artifact's digest, and its sigstore bundle. MANIFEST_ASSET = 'SHA256SUMS.txt' @@ -60,15 +64,22 @@ def _load_sigstore(): _Sigstore: The API this module verifies with Raises: - UnsignedReleaseError: If it cannot be imported, so nothing can be verified + SigstoreUnavailableError: If it cannot be imported, so nothing can be + verified; the message names the package that is missing (sigstore, + or a package it depends on) and how to install it """ try: return _Sigstore() except ImportError as e: - raise UnsignedReleaseError( - f"opensysml cannot verify the signature on {MANIFEST_ASSET}: {e}. " - f"Install opensysml's sigstore dependency, or ask for a release this " - f"opensysml pins a digest for with version=." + missing = (e.name or "sigstore").partition(".")[0] + package = ( + "the sigstore package" if missing == "sigstore" + else f"the {missing} package sigstore depends on" + ) + raise SigstoreUnavailableError( + f"opensysml cannot verify the signature on {MANIFEST_ASSET} because " + f"{package} is not installed ({e}); install it with " + f"{SigstoreUnavailableError.install_command}" ) diff --git a/client/python/pyproject.toml b/client/python/pyproject.toml index 219abee5ea..68ec4cf3ed 100644 --- a/client/python/pyproject.toml +++ b/client/python/pyproject.toml @@ -105,4 +105,3 @@ warn_unused_ignores = true [[tool.mypy.overrides]] module = ["fmpy", "fmpy.*"] ignore_missing_imports = true - diff --git a/client/python/scripts/pin_release_checksums.py b/client/python/scripts/pin_release_checksums.py index dab21b61a3..7770f9e1d9 100644 --- a/client/python/scripts/pin_release_checksums.py +++ b/client/python/scripts/pin_release_checksums.py @@ -19,6 +19,28 @@ The table lives in client/release-digests.json, and `--write` syncs it into every client that ships a copy (scripts/sync-release-digests.py). + +With `--from-manifest` or `--from-binaries`, stamping the shared table also +syncs client copies. An explicit `--table` for a package-local table stays +isolated. + +A release job can stamp the table a package ships without a GitHub token or +network access, from what the release has already produced. The Rust job +stamps its crate from the checksum manifest: + + python scripts/pin_release_checksums.py --version v0.9.1 \\ + --from-manifest dist/SHA256SUMS.txt \\ + --table client/rust/opensysml/release-digests.json + +The Python job builds the wheel before that manifest exists (the manifest lists +the wheel), so it stamps from the service binaries themselves, hashed here: + + python scripts/pin_release_checksums.py --version v0.9.1 \\ + --from-binaries dist/grpc \\ + --table client/python/opensysml/release-digests.json + +Both require all five service platforms, and a `.sha256` sidecar beside a +binary must agree with the digest hashed from it. """ import argparse @@ -26,6 +48,7 @@ import importlib.util import json import os +import re import sys import urllib.error import urllib.request @@ -36,7 +59,19 @@ DIGESTS_FILE = os.path.join(REPO_ROOT, "client", "release-digests.json") SYNC_SCRIPT = os.path.join(REPO_ROOT, "scripts", "sync-release-digests.py") DEFAULT_REPO = "Open-MBEE/OpenSysML" +#: The service binaries every release publishes; a package pin needs all of them. ASSET_PREFIX = "sysml-grpc-" +SIDECAR_SUFFIX = ".sha256" +SERVICE_ASSETS = frozenset( + ( + "sysml-grpc-darwin-amd64", + "sysml-grpc-darwin-arm64", + "sysml-grpc-linux-amd64", + "sysml-grpc-linux-arm64", + "sysml-grpc-windows-amd64.exe", + ) +) +SHA256_PATTERN = re.compile(r"[0-9a-f]{64}\Z") NETWORK_TIMEOUT = 60 @@ -136,7 +171,7 @@ def release_assets(repo, version): assets = { asset["name"]: asset["browser_download_url"] for asset in release.get("assets", []) - if asset["name"].startswith(ASSET_PREFIX) and not asset["name"].endswith(".sha256") + if asset["name"].startswith(ASSET_PREFIX) and not asset["name"].endswith(SIDECAR_SUFFIX) } if not assets: raise PinError(f"release {version} of {repo} publishes no {ASSET_PREFIX}* assets") @@ -175,7 +210,7 @@ def served_digest(url): str or None: The digest read from the sidecar, or None when absent """ try: - with urllib.request.urlopen(url + ".sha256", timeout=NETWORK_TIMEOUT) as response: + with urllib.request.urlopen(url + SIDECAR_SUFFIX, timeout=NETWORK_TIMEOUT) as response: return response.read().decode().split()[0].strip() except (urllib.error.URLError, IndexError, UnicodeDecodeError): return None @@ -221,6 +256,235 @@ def render_table(table): return json.dumps(table, indent=2, sort_keys=True) + "\n" +def manifest_service_digests(manifest_path): + """The service digests a release's checksum manifest lists. + + Args: + manifest_path (str): Path to the release's SHA256SUMS.txt + + Returns: + dict: asset name -> SHA-256 hex digest, all five service assets + + Raises: + PinError: If the manifest cannot be read, lists a malformed or duplicate + service entry, or lacks a service platform + """ + digests = {} + try: + with open(manifest_path, encoding="utf-8") as manifest: + lines = manifest.readlines() + except (OSError, UnicodeError) as e: + raise PinError(f"cannot read checksum manifest {manifest_path}: {e}") + + for line_number, line in enumerate(lines, start=1): + fields = line.split() + if not fields: + continue + asset = fields[1] if len(fields) > 1 else fields[0] + if asset.endswith(SIDECAR_SUFFIX) or not asset.startswith(ASSET_PREFIX): + continue + if len(fields) != 2: + raise PinError( + f"malformed checksum entry for {asset} on line {line_number} " + f"of {manifest_path}" + ) + digest, asset = fields + if SHA256_PATTERN.fullmatch(digest) is None: + raise PinError( + f"malformed SHA-256 digest for {asset} on line {line_number} " + f"of {manifest_path}" + ) + if asset in digests: + raise PinError(f"duplicate service asset {asset} in {manifest_path}") + digests[asset] = digest + + _require_every_service_platform(digests, f"checksum manifest {manifest_path}") + return digests + + +def binary_service_digests(binaries_dir): + """Hash the service binaries a release job has built, before any manifest exists. + + The manifest that lists them is written after the Python distribution they + are stamped into, so the Python job hashes the binaries it was handed. A + `.sha256` sidecar beside a binary is compared with the digest, never used + as one, exactly as with a published release. + + Args: + binaries_dir (str): Directory holding the sysml-grpc-* binaries + + Returns: + dict: asset name -> SHA-256 hex digest, all five service assets + + Raises: + PinError: If the directory cannot be read, a binary cannot be hashed, a + sidecar disagrees with its binary, or a service platform is absent + """ + try: + names = sorted(os.listdir(binaries_dir)) + except OSError as e: + raise PinError(f"cannot read the service binaries in {binaries_dir}: {e}") + + digests = {} + for asset in names: + if asset.endswith(SIDECAR_SUFFIX) or not asset.startswith(ASSET_PREFIX): + continue + path = os.path.join(binaries_dir, asset) + if not os.path.isfile(path): + continue + digests[asset] = _file_digest(path) + sidecar = _sidecar_digest(path + SIDECAR_SUFFIX) + if sidecar is not None and sidecar != digests[asset]: + raise PinError( + f"{asset} in {binaries_dir} hashes to {digests[asset]}, but its " + f".sha256 says {sidecar}; the build is inconsistent and was not pinned" + ) + _require_every_service_platform(digests, f"service binaries in {binaries_dir}") + return digests + + +def _file_digest(path): + """The SHA-256 of a file, hashed as it is read. + + Args: + path (str): File to hash + + Returns: + str: SHA-256 hex digest + + Raises: + PinError: If the file cannot be read + """ + digest = hashlib.sha256() + try: + with open(path, "rb") as f: + for chunk in iter(lambda: f.read(1024 * 256), b""): + digest.update(chunk) + except OSError as e: + raise PinError(f"cannot hash {path}: {e}") + return digest.hexdigest() + + +def _sidecar_digest(path): + """The digest a `.sha256` sidecar file records, if there is one. + + Args: + path (str): Path of the sidecar + + Returns: + str or None: The digest, or None when there is no sidecar + + Raises: + PinError: If there is a sidecar and it does not hold a SHA-256 digest + """ + try: + with open(path, encoding="utf-8") as f: + fields = f.read().split() + except FileNotFoundError: + return None + except (OSError, UnicodeError) as e: + raise PinError(f"cannot read the checksum sidecar {path}: {e}") + if not fields or SHA256_PATTERN.fullmatch(fields[0]) is None: + raise PinError(f"malformed SHA-256 digest in the checksum sidecar {path}") + return fields[0] + + +def _require_every_service_platform(digests, source): + """Fail unless a digest was found for each service asset a release publishes. + + Args: + digests (dict): asset name -> digest + source (str): Where the digests came from, for the message + + Raises: + PinError: Naming the service assets that are absent + """ + missing = sorted(SERVICE_ASSETS - digests.keys()) + if missing: + raise PinError(f"{source} is missing service assets: {', '.join(missing)}") + + +def stamp_from_manifest(manifest_path, version, repo=DEFAULT_REPO, table_path=None): + """Add one release's service digests from its already-produced checksum manifest. + + Args: + manifest_path (str): Path to the release's SHA256SUMS.txt + version (str): Release tag + repo (str): GitHub repository (owner/repo) + table_path (str, optional): Digest table to update; defaults to DIGESTS_FILE + + Returns: + bool: Whether a new pin was written + + Raises: + PinError: If the manifest is invalid or an existing pin conflicts + """ + return stamp(manifest_service_digests(manifest_path), version, repo, table_path) + + +def stamp_from_binaries(binaries_dir, version, repo=DEFAULT_REPO, table_path=None): + """Add one release's service digests, hashed from the binaries it built. + + Args: + binaries_dir (str): Directory holding the sysml-grpc-* binaries + version (str): Release tag + repo (str): GitHub repository (owner/repo) + table_path (str, optional): Digest table to update; defaults to DIGESTS_FILE + + Returns: + bool: Whether a new pin was written + + Raises: + PinError: If the binaries are incomplete or inconsistent, or an existing + pin conflicts + """ + return stamp(binary_service_digests(binaries_dir), version, repo, table_path) + + +def stamp(digests, version, repo=DEFAULT_REPO, table_path=None): + """Add one release's service digests to a table, refusing to change a pin. + + Stamping DIGESTS_FILE syncs the client copies; an explicit alternate table + (the one a package ships, in a release job) is updated alone. + + Args: + digests (dict): asset name -> SHA-256 hex digest, every service asset + version (str): Release tag + repo (str): GitHub repository (owner/repo) + table_path (str, optional): Digest table to update; defaults to DIGESTS_FILE + + Returns: + bool: Whether a new pin was written; False when the same pin is there + + Raises: + PinError: If the table cannot be read or written, or holds a different + pin for the release already + """ + table_path = table_path or DIGESTS_FILE + sync_shared_table = os.path.realpath(table_path) == os.path.realpath(DIGESTS_FILE) + if sync_shared_table: + table_path = DIGESTS_FILE + table = pinned_table(table_path) + versions = table.get(repo, {}) + if version in versions: + if versions[version] == digests: + return False + raise PinError( + f"a different digest pin already exists for {version} of {repo}; " + "refusing to replace it" + ) + + table.setdefault(repo, {})[version] = digests + try: + with open(table_path, "w", encoding="utf-8") as output: + output.write(render_table(table)) + except OSError as e: + raise PinError(f"cannot write digest table {table_path}: {e}") + if sync_shared_table: + sync_clients(table_path) + return True + + def write_table(table, digests_file=None): """Store a table, and sync it into every client that ships a copy. @@ -280,6 +544,24 @@ def main(argv=None): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--version", help="release tag to pin, e.g. v0.0.8") parser.add_argument("--repo", default=DEFAULT_REPO, help="GitHub repository (owner/repo)") + parser.add_argument( + "--from-manifest", + metavar="PATH", + help="stamp service asset digests from an existing checksum manifest", + ) + parser.add_argument( + "--from-binaries", + metavar="DIR", + help="stamp service asset digests hashed from the built binaries in DIR", + ) + parser.add_argument( + "--table", + default=DIGESTS_FILE, + help=( + "table to stamp; the shared source syncs client copies, " + "other tables stay isolated" + ), + ) parser.add_argument( "--write", action="store_true", @@ -292,7 +574,30 @@ def main(argv=None): ) args = parser.parse_args(argv) + stamping = args.from_manifest or args.from_binaries + if args.from_manifest and args.from_binaries: + parser.error("--from-manifest and --from-binaries are alternatives") + if stamping: + if args.check or args.write: + parser.error("--from-manifest/--from-binaries cannot be combined with --check or --write") + if not args.version: + parser.error("--version is required with --from-manifest/--from-binaries") + elif args.table != DIGESTS_FILE: + parser.error("--table can only be used with --from-manifest or --from-binaries") + try: + if stamping: + if args.from_manifest: + digests = manifest_service_digests(args.from_manifest) + else: + digests = binary_service_digests(args.from_binaries) + for asset, digest in sorted(digests.items()): + print(f"{asset} {digest}", file=sys.stderr) + changed = stamp(digests, args.version, args.repo, args.table) + action = "stamped" if changed else "already has" + print(f"{action} {args.version} of {args.repo} in {args.table}") + return 0 + table = pinned_table() if args.check: problems = check(table) diff --git a/client/python/tests/conftest.py b/client/python/tests/conftest.py index bdfeb1890e..703bc6d98e 100644 --- a/client/python/tests/conftest.py +++ b/client/python/tests/conftest.py @@ -5,6 +5,21 @@ from opensysml.proto import sysml_pb2 +@pytest.fixture(autouse=True) +def integration_uses_an_existing_binary(request, monkeypatch): + if request.node.get_closest_marker("integration") is None: + return + + from tests.service_gate import service_binary, skip_or_fail_without_service + + binary = service_binary() + if binary is None: + skip_or_fail_without_service( + "no executable sysml-grpc is available; integration tests do not download one" + ) + monkeypatch.setenv("OPENSYSML_BINARY", binary) + + @pytest.fixture def mock_pb_diagnostic(): """Create mock protobuf Diagnostic.""" diff --git a/client/python/tests/fixtures/metamodel/README.md b/client/python/tests/fixtures/metamodel/README.md new file mode 100644 index 0000000000..f09a18755a --- /dev/null +++ b/client/python/tests/fixtures/metamodel/README.md @@ -0,0 +1,9 @@ +# SysML toolkit JSON fixture + +`bigger.sysml` is copied from [Open-MBEE/sysml-sdk](https://github.com/Open-MBEE/sysml-sdk/blob/main/data/bigger.sysml), +which is distributed under the Apache License 2.0 (see that repository's `LICENSE`). +`bigger.full.json` was generated with sysmlv2 0.10.0: + +```sh +sysmlv2 convert bigger.sysml --to full-json -o bigger.full.json +``` diff --git a/client/python/tests/fixtures/metamodel/bigger.full.json b/client/python/tests/fixtures/metamodel/bigger.full.json new file mode 100644 index 0000000000..4cce052d03 --- /dev/null +++ b/client/python/tests/fixtures/metamodel/bigger.full.json @@ -0,0 +1,8722 @@ +[ + { + "@id": "285a9918-092d-5a42-a72b-91ee2bd95de0", + "@type": "Namespace", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "285a9918-092d-5a42-a72b-91ee2bd95de0", + "importedMembership": [], + "isImpliedIncluded": true, + "isLibraryElement": false, + "member": [ + { + "@id": "41ba6746-fd6d-54c7-bfbc-1519ed9a00cd" + } + ], + "membership": [ + { + "@id": "ed5cfe08-9915-5edf-b1fe-7681c2f83c1c" + } + ], + "name": null, + "ownedAnnotation": [], + "ownedElement": [ + { + "@id": "41ba6746-fd6d-54c7-bfbc-1519ed9a00cd" + } + ], + "ownedImport": [], + "ownedMember": [ + { + "@id": "41ba6746-fd6d-54c7-bfbc-1519ed9a00cd" + } + ], + "ownedMembership": [ + { + "@id": "ed5cfe08-9915-5edf-b1fe-7681c2f83c1c" + } + ], + "ownedRelationship": [ + { + "@id": "ed5cfe08-9915-5edf-b1fe-7681c2f83c1c" + } + ], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelationship": null, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [] + }, + { + "@id": "ed5cfe08-9915-5edf-b1fe-7681c2f83c1c", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "ed5cfe08-9915-5edf-b1fe-7681c2f83c1c", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "41ba6746-fd6d-54c7-bfbc-1519ed9a00cd" + }, + "memberElementId": "41ba6746-fd6d-54c7-bfbc-1519ed9a00cd", + "memberName": "Demo", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "285a9918-092d-5a42-a72b-91ee2bd95de0" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "41ba6746-fd6d-54c7-bfbc-1519ed9a00cd" + }, + "ownedMemberElementId": "41ba6746-fd6d-54c7-bfbc-1519ed9a00cd", + "ownedMemberName": "Demo", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "41ba6746-fd6d-54c7-bfbc-1519ed9a00cd" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "285a9918-092d-5a42-a72b-91ee2bd95de0" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "285a9918-092d-5a42-a72b-91ee2bd95de0" + }, + { + "@id": "41ba6746-fd6d-54c7-bfbc-1519ed9a00cd" + } + ], + "shortName": null, + "source": [ + { + "@id": "285a9918-092d-5a42-a72b-91ee2bd95de0" + } + ], + "target": [ + { + "@id": "41ba6746-fd6d-54c7-bfbc-1519ed9a00cd" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "41ba6746-fd6d-54c7-bfbc-1519ed9a00cd", + "@type": "Package", + "aliasIds": [], + "declaredName": "Demo", + "declaredShortName": null, + "documentation": [], + "elementId": "41ba6746-fd6d-54c7-bfbc-1519ed9a00cd", + "filterCondition": [], + "importedMembership": [], + "isImpliedIncluded": true, + "isLibraryElement": false, + "member": [ + { + "@id": "059144fc-05f1-5ebf-8bfb-e61df17a5344" + }, + { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + { + "@id": "e654e8fb-c916-5202-9fb8-31c07e907c29" + } + ], + "membership": [ + { + "@id": "096458d9-a7bd-58ed-b9d1-7f307928a556" + }, + { + "@id": "5f787fd2-287f-5f88-aca4-8ffbe85cd6d5" + }, + { + "@id": "6c7132c6-1869-51a7-bef2-17ba0aa84e41" + } + ], + "name": "Demo", + "ownedAnnotation": [], + "ownedElement": [ + { + "@id": "059144fc-05f1-5ebf-8bfb-e61df17a5344" + }, + { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + { + "@id": "e654e8fb-c916-5202-9fb8-31c07e907c29" + } + ], + "ownedImport": [], + "ownedMember": [ + { + "@id": "059144fc-05f1-5ebf-8bfb-e61df17a5344" + }, + { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + { + "@id": "e654e8fb-c916-5202-9fb8-31c07e907c29" + } + ], + "ownedMembership": [ + { + "@id": "096458d9-a7bd-58ed-b9d1-7f307928a556" + }, + { + "@id": "5f787fd2-287f-5f88-aca4-8ffbe85cd6d5" + }, + { + "@id": "6c7132c6-1869-51a7-bef2-17ba0aa84e41" + } + ], + "ownedRelationship": [ + { + "@id": "096458d9-a7bd-58ed-b9d1-7f307928a556" + }, + { + "@id": "5f787fd2-287f-5f88-aca4-8ffbe85cd6d5" + }, + { + "@id": "6c7132c6-1869-51a7-bef2-17ba0aa84e41" + } + ], + "owner": { + "@id": "285a9918-092d-5a42-a72b-91ee2bd95de0" + }, + "owningMembership": { + "@id": "ed5cfe08-9915-5edf-b1fe-7681c2f83c1c" + }, + "owningNamespace": { + "@id": "285a9918-092d-5a42-a72b-91ee2bd95de0" + }, + "owningRelationship": { + "@id": "ed5cfe08-9915-5edf-b1fe-7681c2f83c1c" + }, + "qualifiedName": "Demo", + "shortName": null, + "textualRepresentation": [] + }, + { + "@id": "096458d9-a7bd-58ed-b9d1-7f307928a556", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "096458d9-a7bd-58ed-b9d1-7f307928a556", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "059144fc-05f1-5ebf-8bfb-e61df17a5344" + }, + "memberElementId": "059144fc-05f1-5ebf-8bfb-e61df17a5344", + "memberName": "Base", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "41ba6746-fd6d-54c7-bfbc-1519ed9a00cd" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "059144fc-05f1-5ebf-8bfb-e61df17a5344" + }, + "ownedMemberElementId": "059144fc-05f1-5ebf-8bfb-e61df17a5344", + "ownedMemberName": "Base", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "059144fc-05f1-5ebf-8bfb-e61df17a5344" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "41ba6746-fd6d-54c7-bfbc-1519ed9a00cd" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "41ba6746-fd6d-54c7-bfbc-1519ed9a00cd" + }, + { + "@id": "059144fc-05f1-5ebf-8bfb-e61df17a5344" + } + ], + "shortName": null, + "source": [ + { + "@id": "41ba6746-fd6d-54c7-bfbc-1519ed9a00cd" + } + ], + "target": [ + { + "@id": "059144fc-05f1-5ebf-8bfb-e61df17a5344" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "059144fc-05f1-5ebf-8bfb-e61df17a5344", + "@type": "PartDefinition", + "aliasIds": [], + "declaredName": "Base", + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "documentation": [], + "elementId": "059144fc-05f1-5ebf-8bfb-e61df17a5344", + "endFeature": [], + "feature": [ + { + "@id": "e5e61b9e-98ea-51db-8790-5985464366aa" + } + ], + "featureMembership": [ + { + "@id": "2e318e4b-32c4-5a5a-a57b-d1bde5c34137" + } + ], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isConjugated": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isSufficient": false, + "isVariation": false, + "member": [ + { + "@id": "e5e61b9e-98ea-51db-8790-5985464366aa" + } + ], + "membership": [ + { + "@id": "2e318e4b-32c4-5a5a-a57b-d1bde5c34137" + } + ], + "multiplicity": null, + "name": "Base", + "output": [], + "ownedAction": [], + "ownedAllocation": [], + "ownedAnalysisCase": [], + "ownedAnnotation": [], + "ownedAttribute": [ + { + "@id": "e5e61b9e-98ea-51db-8790-5985464366aa" + } + ], + "ownedCalculation": [], + "ownedCase": [], + "ownedConcern": [], + "ownedConjugator": null, + "ownedConnection": [], + "ownedConstraint": [], + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "e5e61b9e-98ea-51db-8790-5985464366aa" + } + ], + "ownedEndFeature": [], + "ownedEnumeration": [], + "ownedFeature": [ + { + "@id": "e5e61b9e-98ea-51db-8790-5985464366aa" + } + ], + "ownedFeatureMembership": [ + { + "@id": "2e318e4b-32c4-5a5a-a57b-d1bde5c34137" + } + ], + "ownedFlow": [], + "ownedImport": [], + "ownedInterface": [], + "ownedIntersecting": [], + "ownedItem": [], + "ownedMember": [ + { + "@id": "e5e61b9e-98ea-51db-8790-5985464366aa" + } + ], + "ownedMembership": [ + { + "@id": "2e318e4b-32c4-5a5a-a57b-d1bde5c34137" + } + ], + "ownedMetadata": [], + "ownedOccurrence": [], + "ownedPart": [], + "ownedPort": [], + "ownedReference": [], + "ownedRelationship": [ + { + "@id": "2e318e4b-32c4-5a5a-a57b-d1bde5c34137" + } + ], + "ownedRendering": [], + "ownedRequirement": [], + "ownedSpecialization": [], + "ownedState": [], + "ownedSubclassification": [], + "ownedTransition": [], + "ownedUnioning": [], + "ownedUsage": [ + { + "@id": "e5e61b9e-98ea-51db-8790-5985464366aa" + } + ], + "ownedUseCase": [], + "ownedVerificationCase": [], + "ownedView": [], + "ownedViewpoint": [], + "owner": { + "@id": "41ba6746-fd6d-54c7-bfbc-1519ed9a00cd" + }, + "owningMembership": { + "@id": "096458d9-a7bd-58ed-b9d1-7f307928a556" + }, + "owningNamespace": { + "@id": "41ba6746-fd6d-54c7-bfbc-1519ed9a00cd" + }, + "owningRelationship": { + "@id": "096458d9-a7bd-58ed-b9d1-7f307928a556" + }, + "qualifiedName": "Demo::Base", + "shortName": null, + "textualRepresentation": [], + "unioningType": [], + "usage": [ + { + "@id": "e5e61b9e-98ea-51db-8790-5985464366aa" + } + ], + "variant": [], + "variantMembership": [] + }, + { + "@id": "2e318e4b-32c4-5a5a-a57b-d1bde5c34137", + "@type": "FeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "2e318e4b-32c4-5a5a-a57b-d1bde5c34137", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "e5e61b9e-98ea-51db-8790-5985464366aa" + }, + "memberElementId": "e5e61b9e-98ea-51db-8790-5985464366aa", + "memberName": "mass", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "059144fc-05f1-5ebf-8bfb-e61df17a5344" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "e5e61b9e-98ea-51db-8790-5985464366aa" + }, + "ownedMemberElementId": "e5e61b9e-98ea-51db-8790-5985464366aa", + "ownedMemberFeature": { + "@id": "e5e61b9e-98ea-51db-8790-5985464366aa" + }, + "ownedMemberName": "mass", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "e5e61b9e-98ea-51db-8790-5985464366aa" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "059144fc-05f1-5ebf-8bfb-e61df17a5344" + }, + "owningRelationship": null, + "owningType": { + "@id": "059144fc-05f1-5ebf-8bfb-e61df17a5344" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "059144fc-05f1-5ebf-8bfb-e61df17a5344" + }, + { + "@id": "e5e61b9e-98ea-51db-8790-5985464366aa" + } + ], + "shortName": null, + "source": [ + { + "@id": "059144fc-05f1-5ebf-8bfb-e61df17a5344" + } + ], + "target": [ + { + "@id": "e5e61b9e-98ea-51db-8790-5985464366aa" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "e5e61b9e-98ea-51db-8790-5985464366aa", + "@type": "AttributeUsage", + "aliasIds": [], + "attributeDefinition": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": "mass", + "declaredShortName": null, + "definition": [], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "e5e61b9e-98ea-51db-8790-5985464366aa", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "e5e61b9e-98ea-51db-8790-5985464366aa" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": true, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [], + "membership": [], + "multiplicity": null, + "name": "mass", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [], + "ownedSpecialization": [], + "ownedSubsetting": [], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "059144fc-05f1-5ebf-8bfb-e61df17a5344" + }, + "owningDefinition": { + "@id": "059144fc-05f1-5ebf-8bfb-e61df17a5344" + }, + "owningFeatureMembership": { + "@id": "2e318e4b-32c4-5a5a-a57b-d1bde5c34137" + }, + "owningMembership": { + "@id": "2e318e4b-32c4-5a5a-a57b-d1bde5c34137" + }, + "owningNamespace": { + "@id": "059144fc-05f1-5ebf-8bfb-e61df17a5344" + }, + "owningRelationship": { + "@id": "2e318e4b-32c4-5a5a-a57b-d1bde5c34137" + }, + "owningType": { + "@id": "059144fc-05f1-5ebf-8bfb-e61df17a5344" + }, + "owningUsage": null, + "qualifiedName": "Demo::Base::mass", + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "5f787fd2-287f-5f88-aca4-8ffbe85cd6d5", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "5f787fd2-287f-5f88-aca4-8ffbe85cd6d5", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "memberElementId": "ad6f1824-1aac-5411-9735-6059195938de", + "memberName": "Vehicle", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "41ba6746-fd6d-54c7-bfbc-1519ed9a00cd" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "ownedMemberElementId": "ad6f1824-1aac-5411-9735-6059195938de", + "ownedMemberName": "Vehicle", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "41ba6746-fd6d-54c7-bfbc-1519ed9a00cd" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "41ba6746-fd6d-54c7-bfbc-1519ed9a00cd" + }, + { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + } + ], + "shortName": null, + "source": [ + { + "@id": "41ba6746-fd6d-54c7-bfbc-1519ed9a00cd" + } + ], + "target": [ + { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "ad6f1824-1aac-5411-9735-6059195938de", + "@type": "PartDefinition", + "aliasIds": [], + "declaredName": "Vehicle", + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "documentation": [], + "elementId": "ad6f1824-1aac-5411-9735-6059195938de", + "endFeature": [], + "feature": [ + { + "@id": "97792196-6134-52ec-a21b-b518697e0ae9" + }, + { + "@id": "f0a07c31-c7fc-5354-8690-4087a409059a" + }, + { + "@id": "c9a6db9c-29da-5127-b186-e81f1e68924d" + }, + { + "@id": "8ddc80e4-36e2-5e09-897d-e33dd9d055ca" + }, + { + "@id": "c7f610e0-e0bb-5542-b121-88b40c159129" + }, + { + "@id": "404a82ff-0899-5719-bb15-8c04912dbc0b" + }, + { + "@id": "ad7ab666-b6f4-5e4a-844e-b24f68bcdcd0" + } + ], + "featureMembership": [ + { + "@id": "b1f6db7c-3a25-5710-80c3-e5b6c41318ef" + }, + { + "@id": "d4715362-5372-5d2c-9cd1-b1a1e4def3f3" + }, + { + "@id": "03b44cfd-826e-5bbe-ab94-41c547cb6e85" + }, + { + "@id": "291dc6c2-0ff7-5c3d-a382-24421fe7f366" + }, + { + "@id": "a1fd3155-f550-520d-922d-7364576a7c19" + }, + { + "@id": "dacb44f6-dce6-57a9-bd32-fe4fb7876f36" + }, + { + "@id": "eca34046-824d-57c3-a8a0-2db822304a82" + } + ], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isConjugated": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isSufficient": false, + "isVariation": false, + "member": [ + { + "@id": "97792196-6134-52ec-a21b-b518697e0ae9" + }, + { + "@id": "f0a07c31-c7fc-5354-8690-4087a409059a" + }, + { + "@id": "c9a6db9c-29da-5127-b186-e81f1e68924d" + }, + { + "@id": "8ddc80e4-36e2-5e09-897d-e33dd9d055ca" + }, + { + "@id": "c7f610e0-e0bb-5542-b121-88b40c159129" + }, + { + "@id": "404a82ff-0899-5719-bb15-8c04912dbc0b" + }, + { + "@id": "ad7ab666-b6f4-5e4a-844e-b24f68bcdcd0" + }, + { + "@id": "2912f365-4259-5157-b2b7-d52d94aa3274" + } + ], + "membership": [ + { + "@id": "b1f6db7c-3a25-5710-80c3-e5b6c41318ef" + }, + { + "@id": "d4715362-5372-5d2c-9cd1-b1a1e4def3f3" + }, + { + "@id": "03b44cfd-826e-5bbe-ab94-41c547cb6e85" + }, + { + "@id": "291dc6c2-0ff7-5c3d-a382-24421fe7f366" + }, + { + "@id": "a1fd3155-f550-520d-922d-7364576a7c19" + }, + { + "@id": "dacb44f6-dce6-57a9-bd32-fe4fb7876f36" + }, + { + "@id": "eca34046-824d-57c3-a8a0-2db822304a82" + }, + { + "@id": "5adae87a-b9b5-5fe6-9af7-b053274a8c24" + } + ], + "multiplicity": null, + "name": "Vehicle", + "output": [], + "ownedAction": [ + { + "@id": "c7f610e0-e0bb-5542-b121-88b40c159129" + }, + { + "@id": "ad7ab666-b6f4-5e4a-844e-b24f68bcdcd0" + } + ], + "ownedAllocation": [], + "ownedAnalysisCase": [], + "ownedAnnotation": [], + "ownedAttribute": [ + { + "@id": "97792196-6134-52ec-a21b-b518697e0ae9" + } + ], + "ownedCalculation": [], + "ownedCase": [], + "ownedConcern": [], + "ownedConjugator": null, + "ownedConnection": [], + "ownedConstraint": [ + { + "@id": "404a82ff-0899-5719-bb15-8c04912dbc0b" + } + ], + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "97792196-6134-52ec-a21b-b518697e0ae9" + }, + { + "@id": "f0a07c31-c7fc-5354-8690-4087a409059a" + }, + { + "@id": "c9a6db9c-29da-5127-b186-e81f1e68924d" + }, + { + "@id": "8ddc80e4-36e2-5e09-897d-e33dd9d055ca" + }, + { + "@id": "c7f610e0-e0bb-5542-b121-88b40c159129" + }, + { + "@id": "404a82ff-0899-5719-bb15-8c04912dbc0b" + }, + { + "@id": "ad7ab666-b6f4-5e4a-844e-b24f68bcdcd0" + }, + { + "@id": "2912f365-4259-5157-b2b7-d52d94aa3274" + } + ], + "ownedEndFeature": [], + "ownedEnumeration": [], + "ownedFeature": [ + { + "@id": "97792196-6134-52ec-a21b-b518697e0ae9" + }, + { + "@id": "f0a07c31-c7fc-5354-8690-4087a409059a" + }, + { + "@id": "c9a6db9c-29da-5127-b186-e81f1e68924d" + }, + { + "@id": "8ddc80e4-36e2-5e09-897d-e33dd9d055ca" + }, + { + "@id": "c7f610e0-e0bb-5542-b121-88b40c159129" + }, + { + "@id": "404a82ff-0899-5719-bb15-8c04912dbc0b" + }, + { + "@id": "ad7ab666-b6f4-5e4a-844e-b24f68bcdcd0" + } + ], + "ownedFeatureMembership": [ + { + "@id": "b1f6db7c-3a25-5710-80c3-e5b6c41318ef" + }, + { + "@id": "d4715362-5372-5d2c-9cd1-b1a1e4def3f3" + }, + { + "@id": "03b44cfd-826e-5bbe-ab94-41c547cb6e85" + }, + { + "@id": "291dc6c2-0ff7-5c3d-a382-24421fe7f366" + }, + { + "@id": "a1fd3155-f550-520d-922d-7364576a7c19" + }, + { + "@id": "dacb44f6-dce6-57a9-bd32-fe4fb7876f36" + }, + { + "@id": "eca34046-824d-57c3-a8a0-2db822304a82" + } + ], + "ownedFlow": [], + "ownedImport": [], + "ownedInterface": [], + "ownedIntersecting": [], + "ownedItem": [ + { + "@id": "f0a07c31-c7fc-5354-8690-4087a409059a" + }, + { + "@id": "8ddc80e4-36e2-5e09-897d-e33dd9d055ca" + } + ], + "ownedMember": [ + { + "@id": "97792196-6134-52ec-a21b-b518697e0ae9" + }, + { + "@id": "f0a07c31-c7fc-5354-8690-4087a409059a" + }, + { + "@id": "c9a6db9c-29da-5127-b186-e81f1e68924d" + }, + { + "@id": "8ddc80e4-36e2-5e09-897d-e33dd9d055ca" + }, + { + "@id": "c7f610e0-e0bb-5542-b121-88b40c159129" + }, + { + "@id": "404a82ff-0899-5719-bb15-8c04912dbc0b" + }, + { + "@id": "ad7ab666-b6f4-5e4a-844e-b24f68bcdcd0" + }, + { + "@id": "2912f365-4259-5157-b2b7-d52d94aa3274" + } + ], + "ownedMembership": [ + { + "@id": "b1f6db7c-3a25-5710-80c3-e5b6c41318ef" + }, + { + "@id": "d4715362-5372-5d2c-9cd1-b1a1e4def3f3" + }, + { + "@id": "03b44cfd-826e-5bbe-ab94-41c547cb6e85" + }, + { + "@id": "291dc6c2-0ff7-5c3d-a382-24421fe7f366" + }, + { + "@id": "a1fd3155-f550-520d-922d-7364576a7c19" + }, + { + "@id": "dacb44f6-dce6-57a9-bd32-fe4fb7876f36" + }, + { + "@id": "eca34046-824d-57c3-a8a0-2db822304a82" + }, + { + "@id": "5adae87a-b9b5-5fe6-9af7-b053274a8c24" + } + ], + "ownedMetadata": [], + "ownedOccurrence": [ + { + "@id": "f0a07c31-c7fc-5354-8690-4087a409059a" + }, + { + "@id": "c9a6db9c-29da-5127-b186-e81f1e68924d" + }, + { + "@id": "8ddc80e4-36e2-5e09-897d-e33dd9d055ca" + }, + { + "@id": "c7f610e0-e0bb-5542-b121-88b40c159129" + }, + { + "@id": "404a82ff-0899-5719-bb15-8c04912dbc0b" + }, + { + "@id": "ad7ab666-b6f4-5e4a-844e-b24f68bcdcd0" + } + ], + "ownedPart": [ + { + "@id": "f0a07c31-c7fc-5354-8690-4087a409059a" + } + ], + "ownedPort": [ + { + "@id": "c9a6db9c-29da-5127-b186-e81f1e68924d" + } + ], + "ownedReference": [], + "ownedRelationship": [ + { + "@id": "d44a140f-8dbb-5c21-851c-5f2bdf5d590d" + }, + { + "@id": "b1f6db7c-3a25-5710-80c3-e5b6c41318ef" + }, + { + "@id": "d4715362-5372-5d2c-9cd1-b1a1e4def3f3" + }, + { + "@id": "03b44cfd-826e-5bbe-ab94-41c547cb6e85" + }, + { + "@id": "291dc6c2-0ff7-5c3d-a382-24421fe7f366" + }, + { + "@id": "a1fd3155-f550-520d-922d-7364576a7c19" + }, + { + "@id": "dacb44f6-dce6-57a9-bd32-fe4fb7876f36" + }, + { + "@id": "eca34046-824d-57c3-a8a0-2db822304a82" + }, + { + "@id": "5adae87a-b9b5-5fe6-9af7-b053274a8c24" + } + ], + "ownedRendering": [], + "ownedRequirement": [], + "ownedSpecialization": [ + { + "@id": "d44a140f-8dbb-5c21-851c-5f2bdf5d590d" + } + ], + "ownedState": [ + { + "@id": "ad7ab666-b6f4-5e4a-844e-b24f68bcdcd0" + } + ], + "ownedSubclassification": [ + { + "@id": "d44a140f-8dbb-5c21-851c-5f2bdf5d590d" + } + ], + "ownedTransition": [], + "ownedUnioning": [], + "ownedUsage": [ + { + "@id": "97792196-6134-52ec-a21b-b518697e0ae9" + }, + { + "@id": "f0a07c31-c7fc-5354-8690-4087a409059a" + }, + { + "@id": "c9a6db9c-29da-5127-b186-e81f1e68924d" + }, + { + "@id": "8ddc80e4-36e2-5e09-897d-e33dd9d055ca" + }, + { + "@id": "c7f610e0-e0bb-5542-b121-88b40c159129" + }, + { + "@id": "404a82ff-0899-5719-bb15-8c04912dbc0b" + }, + { + "@id": "ad7ab666-b6f4-5e4a-844e-b24f68bcdcd0" + } + ], + "ownedUseCase": [], + "ownedVerificationCase": [], + "ownedView": [], + "ownedViewpoint": [], + "owner": { + "@id": "41ba6746-fd6d-54c7-bfbc-1519ed9a00cd" + }, + "owningMembership": { + "@id": "5f787fd2-287f-5f88-aca4-8ffbe85cd6d5" + }, + "owningNamespace": { + "@id": "41ba6746-fd6d-54c7-bfbc-1519ed9a00cd" + }, + "owningRelationship": { + "@id": "5f787fd2-287f-5f88-aca4-8ffbe85cd6d5" + }, + "qualifiedName": "Demo::Vehicle", + "shortName": null, + "textualRepresentation": [], + "unioningType": [], + "usage": [ + { + "@id": "97792196-6134-52ec-a21b-b518697e0ae9" + }, + { + "@id": "f0a07c31-c7fc-5354-8690-4087a409059a" + }, + { + "@id": "c9a6db9c-29da-5127-b186-e81f1e68924d" + }, + { + "@id": "8ddc80e4-36e2-5e09-897d-e33dd9d055ca" + }, + { + "@id": "c7f610e0-e0bb-5542-b121-88b40c159129" + }, + { + "@id": "404a82ff-0899-5719-bb15-8c04912dbc0b" + }, + { + "@id": "ad7ab666-b6f4-5e4a-844e-b24f68bcdcd0" + } + ], + "variant": [], + "variantMembership": [] + }, + { + "@id": "d44a140f-8dbb-5c21-851c-5f2bdf5d590d", + "@type": "Subclassification", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "d44a140f-8dbb-5c21-851c-5f2bdf5d590d", + "general": { + "@id": "059144fc-05f1-5ebf-8bfb-e61df17a5344" + }, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningClassifier": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningRelationship": null, + "owningType": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + { + "@id": "059144fc-05f1-5ebf-8bfb-e61df17a5344" + } + ], + "shortName": null, + "source": [ + { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + } + ], + "specific": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "subclassifier": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "superclassifier": { + "@id": "059144fc-05f1-5ebf-8bfb-e61df17a5344" + }, + "target": [ + { + "@id": "059144fc-05f1-5ebf-8bfb-e61df17a5344" + } + ], + "textualRepresentation": [] + }, + { + "@id": "b1f6db7c-3a25-5710-80c3-e5b6c41318ef", + "@type": "FeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "b1f6db7c-3a25-5710-80c3-e5b6c41318ef", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "97792196-6134-52ec-a21b-b518697e0ae9" + }, + "memberElementId": "97792196-6134-52ec-a21b-b518697e0ae9", + "memberName": "mass2", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "97792196-6134-52ec-a21b-b518697e0ae9" + }, + "ownedMemberElementId": "97792196-6134-52ec-a21b-b518697e0ae9", + "ownedMemberFeature": { + "@id": "97792196-6134-52ec-a21b-b518697e0ae9" + }, + "ownedMemberName": "mass2", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "97792196-6134-52ec-a21b-b518697e0ae9" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningRelationship": null, + "owningType": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + { + "@id": "97792196-6134-52ec-a21b-b518697e0ae9" + } + ], + "shortName": null, + "source": [ + { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + } + ], + "target": [ + { + "@id": "97792196-6134-52ec-a21b-b518697e0ae9" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "97792196-6134-52ec-a21b-b518697e0ae9", + "@type": "AttributeUsage", + "aliasIds": [], + "attributeDefinition": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": "mass2", + "declaredShortName": null, + "definition": [], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "97792196-6134-52ec-a21b-b518697e0ae9", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "97792196-6134-52ec-a21b-b518697e0ae9" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": true, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [], + "membership": [], + "multiplicity": null, + "name": "mass2", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [], + "ownedSpecialization": [], + "ownedSubsetting": [], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningDefinition": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningFeatureMembership": { + "@id": "b1f6db7c-3a25-5710-80c3-e5b6c41318ef" + }, + "owningMembership": { + "@id": "b1f6db7c-3a25-5710-80c3-e5b6c41318ef" + }, + "owningNamespace": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningRelationship": { + "@id": "b1f6db7c-3a25-5710-80c3-e5b6c41318ef" + }, + "owningType": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningUsage": null, + "qualifiedName": "Demo::Vehicle::mass2", + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "d4715362-5372-5d2c-9cd1-b1a1e4def3f3", + "@type": "FeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "d4715362-5372-5d2c-9cd1-b1a1e4def3f3", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "f0a07c31-c7fc-5354-8690-4087a409059a" + }, + "memberElementId": "f0a07c31-c7fc-5354-8690-4087a409059a", + "memberName": "wheel", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "f0a07c31-c7fc-5354-8690-4087a409059a" + }, + "ownedMemberElementId": "f0a07c31-c7fc-5354-8690-4087a409059a", + "ownedMemberFeature": { + "@id": "f0a07c31-c7fc-5354-8690-4087a409059a" + }, + "ownedMemberName": "wheel", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "f0a07c31-c7fc-5354-8690-4087a409059a" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningRelationship": null, + "owningType": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + { + "@id": "f0a07c31-c7fc-5354-8690-4087a409059a" + } + ], + "shortName": null, + "source": [ + { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + } + ], + "target": [ + { + "@id": "f0a07c31-c7fc-5354-8690-4087a409059a" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "f0a07c31-c7fc-5354-8690-4087a409059a", + "@type": "PartUsage", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": "wheel", + "declaredShortName": null, + "definition": [], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "f0a07c31-c7fc-5354-8690-4087a409059a", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "f0a07c31-c7fc-5354-8690-4087a409059a" + }, + "featuringType": [], + "importedMembership": [], + "individualDefinition": null, + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": true, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": false, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "itemDefinition": [], + "mayTimeVary": null, + "member": [ + { + "@id": "4bb1d6dc-7671-53d3-815d-da907bb6445c" + } + ], + "membership": [ + { + "@id": "94596295-c669-57ae-9bdb-80543d457de2" + } + ], + "multiplicity": { + "@id": "4bb1d6dc-7671-53d3-815d-da907bb6445c" + }, + "name": "wheel", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "occurrenceDefinition": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "4bb1d6dc-7671-53d3-815d-da907bb6445c" + } + ], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [ + { + "@id": "4bb1d6dc-7671-53d3-815d-da907bb6445c" + } + ], + "ownedMembership": [ + { + "@id": "94596295-c669-57ae-9bdb-80543d457de2" + } + ], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "94596295-c669-57ae-9bdb-80543d457de2" + } + ], + "ownedSpecialization": [], + "ownedSubsetting": [], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningDefinition": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningFeatureMembership": { + "@id": "d4715362-5372-5d2c-9cd1-b1a1e4def3f3" + }, + "owningMembership": { + "@id": "d4715362-5372-5d2c-9cd1-b1a1e4def3f3" + }, + "owningNamespace": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningRelationship": { + "@id": "d4715362-5372-5d2c-9cd1-b1a1e4def3f3" + }, + "owningType": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningUsage": null, + "partDefinition": [], + "portionKind": null, + "qualifiedName": "Demo::Vehicle::wheel", + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "94596295-c669-57ae-9bdb-80543d457de2", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "94596295-c669-57ae-9bdb-80543d457de2", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "4bb1d6dc-7671-53d3-815d-da907bb6445c" + }, + "memberElementId": "4bb1d6dc-7671-53d3-815d-da907bb6445c", + "memberName": null, + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "f0a07c31-c7fc-5354-8690-4087a409059a" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "4bb1d6dc-7671-53d3-815d-da907bb6445c" + }, + "ownedMemberElementId": "4bb1d6dc-7671-53d3-815d-da907bb6445c", + "ownedMemberName": null, + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "4bb1d6dc-7671-53d3-815d-da907bb6445c" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "f0a07c31-c7fc-5354-8690-4087a409059a" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "f0a07c31-c7fc-5354-8690-4087a409059a" + }, + { + "@id": "4bb1d6dc-7671-53d3-815d-da907bb6445c" + } + ], + "shortName": null, + "source": [ + { + "@id": "f0a07c31-c7fc-5354-8690-4087a409059a" + } + ], + "target": [ + { + "@id": "4bb1d6dc-7671-53d3-815d-da907bb6445c" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "4bb1d6dc-7671-53d3-815d-da907bb6445c", + "@type": "MultiplicityRange", + "aliasIds": [], + "bound": [ + { + "@id": "62b51846-59f5-5351-8dac-529d799485bf" + } + ], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "direction": null, + "documentation": [], + "elementId": "4bb1d6dc-7671-53d3-815d-da907bb6445c", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "4bb1d6dc-7671-53d3-815d-da907bb6445c" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isSufficient": false, + "isUnique": true, + "isVariable": false, + "lowerBound": null, + "member": [ + { + "@id": "62b51846-59f5-5351-8dac-529d799485bf" + } + ], + "membership": [ + { + "@id": "854c254a-ad1c-5d31-88bc-405ea5405212" + } + ], + "multiplicity": null, + "name": null, + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "62b51846-59f5-5351-8dac-529d799485bf" + } + ], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [ + { + "@id": "62b51846-59f5-5351-8dac-529d799485bf" + } + ], + "ownedMembership": [ + { + "@id": "854c254a-ad1c-5d31-88bc-405ea5405212" + } + ], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "854c254a-ad1c-5d31-88bc-405ea5405212" + } + ], + "ownedSpecialization": [], + "ownedSubsetting": [], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "f0a07c31-c7fc-5354-8690-4087a409059a" + }, + "owningFeatureMembership": null, + "owningMembership": { + "@id": "94596295-c669-57ae-9bdb-80543d457de2" + }, + "owningNamespace": { + "@id": "f0a07c31-c7fc-5354-8690-4087a409059a" + }, + "owningRelationship": { + "@id": "94596295-c669-57ae-9bdb-80543d457de2" + }, + "owningType": null, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [], + "upperBound": { + "@id": "62b51846-59f5-5351-8dac-529d799485bf" + } + }, + { + "@id": "854c254a-ad1c-5d31-88bc-405ea5405212", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "854c254a-ad1c-5d31-88bc-405ea5405212", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "62b51846-59f5-5351-8dac-529d799485bf" + }, + "memberElementId": "62b51846-59f5-5351-8dac-529d799485bf", + "memberName": null, + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "4bb1d6dc-7671-53d3-815d-da907bb6445c" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "62b51846-59f5-5351-8dac-529d799485bf" + }, + "ownedMemberElementId": "62b51846-59f5-5351-8dac-529d799485bf", + "ownedMemberName": null, + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "62b51846-59f5-5351-8dac-529d799485bf" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "4bb1d6dc-7671-53d3-815d-da907bb6445c" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "4bb1d6dc-7671-53d3-815d-da907bb6445c" + }, + { + "@id": "62b51846-59f5-5351-8dac-529d799485bf" + } + ], + "shortName": null, + "source": [ + { + "@id": "4bb1d6dc-7671-53d3-815d-da907bb6445c" + } + ], + "target": [ + { + "@id": "62b51846-59f5-5351-8dac-529d799485bf" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "62b51846-59f5-5351-8dac-529d799485bf", + "@type": "LiteralInteger", + "aliasIds": [], + "behavior": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "direction": null, + "documentation": [], + "elementId": "62b51846-59f5-5351-8dac-529d799485bf", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "62b51846-59f5-5351-8dac-529d799485bf" + }, + "featuringType": [], + "function": null, + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isModelLevelEvaluable": true, + "isOrdered": false, + "isPortion": false, + "isSufficient": false, + "isUnique": true, + "isVariable": false, + "member": [], + "membership": [], + "multiplicity": null, + "name": null, + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [], + "ownedSpecialization": [], + "ownedSubsetting": [], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "4bb1d6dc-7671-53d3-815d-da907bb6445c" + }, + "owningFeatureMembership": null, + "owningMembership": { + "@id": "854c254a-ad1c-5d31-88bc-405ea5405212" + }, + "owningNamespace": { + "@id": "4bb1d6dc-7671-53d3-815d-da907bb6445c" + }, + "owningRelationship": { + "@id": "854c254a-ad1c-5d31-88bc-405ea5405212" + }, + "owningType": null, + "parameter": [], + "qualifiedName": null, + "result": { + "@id": "62b51846-59f5-5351-8dac-529d799485bf" + }, + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [], + "value": 4 + }, + { + "@id": "03b44cfd-826e-5bbe-ab94-41c547cb6e85", + "@type": "FeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "03b44cfd-826e-5bbe-ab94-41c547cb6e85", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "c9a6db9c-29da-5127-b186-e81f1e68924d" + }, + "memberElementId": "c9a6db9c-29da-5127-b186-e81f1e68924d", + "memberName": "p", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "c9a6db9c-29da-5127-b186-e81f1e68924d" + }, + "ownedMemberElementId": "c9a6db9c-29da-5127-b186-e81f1e68924d", + "ownedMemberFeature": { + "@id": "c9a6db9c-29da-5127-b186-e81f1e68924d" + }, + "ownedMemberName": "p", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "c9a6db9c-29da-5127-b186-e81f1e68924d" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningRelationship": null, + "owningType": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + { + "@id": "c9a6db9c-29da-5127-b186-e81f1e68924d" + } + ], + "shortName": null, + "source": [ + { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + } + ], + "target": [ + { + "@id": "c9a6db9c-29da-5127-b186-e81f1e68924d" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "c9a6db9c-29da-5127-b186-e81f1e68924d", + "@type": "PortUsage", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": "p", + "declaredShortName": null, + "definition": [], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "c9a6db9c-29da-5127-b186-e81f1e68924d", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "c9a6db9c-29da-5127-b186-e81f1e68924d" + }, + "featuringType": [], + "importedMembership": [], + "individualDefinition": null, + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": true, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [], + "membership": [], + "multiplicity": null, + "name": "p", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "occurrenceDefinition": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [], + "ownedSpecialization": [], + "ownedSubsetting": [], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningDefinition": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningFeatureMembership": { + "@id": "03b44cfd-826e-5bbe-ab94-41c547cb6e85" + }, + "owningMembership": { + "@id": "03b44cfd-826e-5bbe-ab94-41c547cb6e85" + }, + "owningNamespace": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningRelationship": { + "@id": "03b44cfd-826e-5bbe-ab94-41c547cb6e85" + }, + "owningType": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningUsage": null, + "portDefinition": [], + "portionKind": null, + "qualifiedName": "Demo::Vehicle::p", + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "291dc6c2-0ff7-5c3d-a382-24421fe7f366", + "@type": "FeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "291dc6c2-0ff7-5c3d-a382-24421fe7f366", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "8ddc80e4-36e2-5e09-897d-e33dd9d055ca" + }, + "memberElementId": "8ddc80e4-36e2-5e09-897d-e33dd9d055ca", + "memberName": "cargo", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "8ddc80e4-36e2-5e09-897d-e33dd9d055ca" + }, + "ownedMemberElementId": "8ddc80e4-36e2-5e09-897d-e33dd9d055ca", + "ownedMemberFeature": { + "@id": "8ddc80e4-36e2-5e09-897d-e33dd9d055ca" + }, + "ownedMemberName": "cargo", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "8ddc80e4-36e2-5e09-897d-e33dd9d055ca" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningRelationship": null, + "owningType": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + { + "@id": "8ddc80e4-36e2-5e09-897d-e33dd9d055ca" + } + ], + "shortName": null, + "source": [ + { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + } + ], + "target": [ + { + "@id": "8ddc80e4-36e2-5e09-897d-e33dd9d055ca" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "8ddc80e4-36e2-5e09-897d-e33dd9d055ca", + "@type": "ItemUsage", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": "cargo", + "declaredShortName": null, + "definition": [], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "8ddc80e4-36e2-5e09-897d-e33dd9d055ca", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "8ddc80e4-36e2-5e09-897d-e33dd9d055ca" + }, + "featuringType": [], + "importedMembership": [], + "individualDefinition": null, + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": true, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "itemDefinition": [], + "mayTimeVary": null, + "member": [], + "membership": [], + "multiplicity": null, + "name": "cargo", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "occurrenceDefinition": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [], + "ownedSpecialization": [], + "ownedSubsetting": [], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningDefinition": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningFeatureMembership": { + "@id": "291dc6c2-0ff7-5c3d-a382-24421fe7f366" + }, + "owningMembership": { + "@id": "291dc6c2-0ff7-5c3d-a382-24421fe7f366" + }, + "owningNamespace": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningRelationship": { + "@id": "291dc6c2-0ff7-5c3d-a382-24421fe7f366" + }, + "owningType": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningUsage": null, + "portionKind": null, + "qualifiedName": "Demo::Vehicle::cargo", + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "a1fd3155-f550-520d-922d-7364576a7c19", + "@type": "FeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "a1fd3155-f550-520d-922d-7364576a7c19", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "c7f610e0-e0bb-5542-b121-88b40c159129" + }, + "memberElementId": "c7f610e0-e0bb-5542-b121-88b40c159129", + "memberName": "a", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "c7f610e0-e0bb-5542-b121-88b40c159129" + }, + "ownedMemberElementId": "c7f610e0-e0bb-5542-b121-88b40c159129", + "ownedMemberFeature": { + "@id": "c7f610e0-e0bb-5542-b121-88b40c159129" + }, + "ownedMemberName": "a", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "c7f610e0-e0bb-5542-b121-88b40c159129" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningRelationship": null, + "owningType": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + { + "@id": "c7f610e0-e0bb-5542-b121-88b40c159129" + } + ], + "shortName": null, + "source": [ + { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + } + ], + "target": [ + { + "@id": "c7f610e0-e0bb-5542-b121-88b40c159129" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "c7f610e0-e0bb-5542-b121-88b40c159129", + "@type": "ActionUsage", + "actionDefinition": [], + "aliasIds": [], + "behavior": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": "a", + "declaredShortName": null, + "definition": [], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "c7f610e0-e0bb-5542-b121-88b40c159129", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "c7f610e0-e0bb-5542-b121-88b40c159129" + }, + "featuringType": [], + "importedMembership": [], + "individualDefinition": null, + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": true, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": false, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [], + "membership": [], + "multiplicity": null, + "name": "a", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "occurrenceDefinition": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [], + "ownedSpecialization": [], + "ownedSubsetting": [], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningDefinition": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningFeatureMembership": { + "@id": "a1fd3155-f550-520d-922d-7364576a7c19" + }, + "owningMembership": { + "@id": "a1fd3155-f550-520d-922d-7364576a7c19" + }, + "owningNamespace": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningRelationship": { + "@id": "a1fd3155-f550-520d-922d-7364576a7c19" + }, + "owningType": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningUsage": null, + "parameter": [], + "portionKind": null, + "qualifiedName": "Demo::Vehicle::a", + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "dacb44f6-dce6-57a9-bd32-fe4fb7876f36", + "@type": "FeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "dacb44f6-dce6-57a9-bd32-fe4fb7876f36", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "404a82ff-0899-5719-bb15-8c04912dbc0b" + }, + "memberElementId": "404a82ff-0899-5719-bb15-8c04912dbc0b", + "memberName": "c", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "404a82ff-0899-5719-bb15-8c04912dbc0b" + }, + "ownedMemberElementId": "404a82ff-0899-5719-bb15-8c04912dbc0b", + "ownedMemberFeature": { + "@id": "404a82ff-0899-5719-bb15-8c04912dbc0b" + }, + "ownedMemberName": "c", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "404a82ff-0899-5719-bb15-8c04912dbc0b" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningRelationship": null, + "owningType": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + { + "@id": "404a82ff-0899-5719-bb15-8c04912dbc0b" + } + ], + "shortName": null, + "source": [ + { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + } + ], + "target": [ + { + "@id": "404a82ff-0899-5719-bb15-8c04912dbc0b" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "404a82ff-0899-5719-bb15-8c04912dbc0b", + "@type": "ConstraintUsage", + "aliasIds": [], + "behavior": [], + "chainingFeature": [], + "constraintDefinition": null, + "crossFeature": null, + "declaredName": "c", + "declaredShortName": null, + "definition": [], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "404a82ff-0899-5719-bb15-8c04912dbc0b", + "endFeature": [], + "endOwningType": null, + "feature": [ + { + "@id": "4f9afd4a-5f0a-5b53-aea9-11bf1f41765d" + } + ], + "featureMembership": [ + { + "@id": "45764250-7503-5815-abfa-dc553954a6a7" + } + ], + "featureTarget": { + "@id": "404a82ff-0899-5719-bb15-8c04912dbc0b" + }, + "featuringType": [], + "function": null, + "importedMembership": [], + "individualDefinition": null, + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": true, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isModelLevelEvaluable": false, + "isOrdered": false, + "isPortion": false, + "isReference": false, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [ + { + "@id": "4f9afd4a-5f0a-5b53-aea9-11bf1f41765d" + } + ], + "membership": [ + { + "@id": "45764250-7503-5815-abfa-dc553954a6a7" + } + ], + "multiplicity": null, + "name": "c", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "occurrenceDefinition": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "4f9afd4a-5f0a-5b53-aea9-11bf1f41765d" + } + ], + "ownedEndFeature": [], + "ownedFeature": [ + { + "@id": "4f9afd4a-5f0a-5b53-aea9-11bf1f41765d" + } + ], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [ + { + "@id": "45764250-7503-5815-abfa-dc553954a6a7" + } + ], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [ + { + "@id": "4f9afd4a-5f0a-5b53-aea9-11bf1f41765d" + } + ], + "ownedMembership": [ + { + "@id": "45764250-7503-5815-abfa-dc553954a6a7" + } + ], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "45764250-7503-5815-abfa-dc553954a6a7" + } + ], + "ownedSpecialization": [], + "ownedSubsetting": [], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningDefinition": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningFeatureMembership": { + "@id": "dacb44f6-dce6-57a9-bd32-fe4fb7876f36" + }, + "owningMembership": { + "@id": "dacb44f6-dce6-57a9-bd32-fe4fb7876f36" + }, + "owningNamespace": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningRelationship": { + "@id": "dacb44f6-dce6-57a9-bd32-fe4fb7876f36" + }, + "owningType": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningUsage": null, + "parameter": [], + "portionKind": null, + "predicate": null, + "qualifiedName": "Demo::Vehicle::c", + "result": { + "@id": "404a82ff-0899-5719-bb15-8c04912dbc0b" + }, + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "45764250-7503-5815-abfa-dc553954a6a7", + "@type": "ResultExpressionMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "45764250-7503-5815-abfa-dc553954a6a7", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "4f9afd4a-5f0a-5b53-aea9-11bf1f41765d" + }, + "memberElementId": "4f9afd4a-5f0a-5b53-aea9-11bf1f41765d", + "memberName": null, + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "404a82ff-0899-5719-bb15-8c04912dbc0b" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "4f9afd4a-5f0a-5b53-aea9-11bf1f41765d" + }, + "ownedMemberElementId": "4f9afd4a-5f0a-5b53-aea9-11bf1f41765d", + "ownedMemberFeature": { + "@id": "4f9afd4a-5f0a-5b53-aea9-11bf1f41765d" + }, + "ownedMemberName": null, + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "4f9afd4a-5f0a-5b53-aea9-11bf1f41765d" + } + ], + "ownedRelationship": [], + "ownedResultExpression": { + "@id": "4f9afd4a-5f0a-5b53-aea9-11bf1f41765d" + }, + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "404a82ff-0899-5719-bb15-8c04912dbc0b" + }, + "owningRelationship": null, + "owningType": { + "@id": "404a82ff-0899-5719-bb15-8c04912dbc0b" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "404a82ff-0899-5719-bb15-8c04912dbc0b" + }, + { + "@id": "4f9afd4a-5f0a-5b53-aea9-11bf1f41765d" + } + ], + "shortName": null, + "source": [ + { + "@id": "404a82ff-0899-5719-bb15-8c04912dbc0b" + } + ], + "target": [ + { + "@id": "4f9afd4a-5f0a-5b53-aea9-11bf1f41765d" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "4f9afd4a-5f0a-5b53-aea9-11bf1f41765d", + "@type": "OperatorExpression", + "aliasIds": [], + "argument": [ + { + "@id": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95" + }, + { + "@id": "6fb2ae58-ee0d-5d2a-aae0-1160e3b7ff8b" + } + ], + "behavior": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "differencingType": [], + "directedFeature": [ + { + "@id": "ba278114-75c8-511d-930c-1fbf03b380f7" + }, + { + "@id": "f466beff-5e1e-58d4-9f60-aa8e5395989f" + } + ], + "direction": null, + "documentation": [], + "elementId": "4f9afd4a-5f0a-5b53-aea9-11bf1f41765d", + "endFeature": [], + "endOwningType": null, + "feature": [ + { + "@id": "ba278114-75c8-511d-930c-1fbf03b380f7" + }, + { + "@id": "f466beff-5e1e-58d4-9f60-aa8e5395989f" + } + ], + "featureMembership": [ + { + "@id": "b304e8b5-8b4b-5df3-89b9-12e4356497c7" + }, + { + "@id": "f2400c4e-84c2-5fb1-a9fd-57e5a2755df3" + } + ], + "featureTarget": { + "@id": "4f9afd4a-5f0a-5b53-aea9-11bf1f41765d" + }, + "featuringType": [], + "function": null, + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [ + { + "@id": "ba278114-75c8-511d-930c-1fbf03b380f7" + }, + { + "@id": "f466beff-5e1e-58d4-9f60-aa8e5395989f" + } + ], + "instantiatedType": { + "@id": "4f9afd4a-5f0a-5b53-aea9-11bf1f41765d" + }, + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isModelLevelEvaluable": false, + "isOrdered": false, + "isPortion": false, + "isSufficient": false, + "isUnique": true, + "isVariable": false, + "member": [ + { + "@id": "ba278114-75c8-511d-930c-1fbf03b380f7" + }, + { + "@id": "f466beff-5e1e-58d4-9f60-aa8e5395989f" + } + ], + "membership": [ + { + "@id": "b304e8b5-8b4b-5df3-89b9-12e4356497c7" + }, + { + "@id": "f2400c4e-84c2-5fb1-a9fd-57e5a2755df3" + } + ], + "multiplicity": null, + "name": null, + "operator": ">", + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "ba278114-75c8-511d-930c-1fbf03b380f7" + }, + { + "@id": "f466beff-5e1e-58d4-9f60-aa8e5395989f" + } + ], + "ownedEndFeature": [], + "ownedFeature": [ + { + "@id": "ba278114-75c8-511d-930c-1fbf03b380f7" + }, + { + "@id": "f466beff-5e1e-58d4-9f60-aa8e5395989f" + } + ], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [ + { + "@id": "b304e8b5-8b4b-5df3-89b9-12e4356497c7" + }, + { + "@id": "f2400c4e-84c2-5fb1-a9fd-57e5a2755df3" + } + ], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [ + { + "@id": "ba278114-75c8-511d-930c-1fbf03b380f7" + }, + { + "@id": "f466beff-5e1e-58d4-9f60-aa8e5395989f" + } + ], + "ownedMembership": [ + { + "@id": "b304e8b5-8b4b-5df3-89b9-12e4356497c7" + }, + { + "@id": "f2400c4e-84c2-5fb1-a9fd-57e5a2755df3" + } + ], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "b304e8b5-8b4b-5df3-89b9-12e4356497c7" + }, + { + "@id": "f2400c4e-84c2-5fb1-a9fd-57e5a2755df3" + } + ], + "ownedSpecialization": [], + "ownedSubsetting": [], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "404a82ff-0899-5719-bb15-8c04912dbc0b" + }, + "owningFeatureMembership": { + "@id": "45764250-7503-5815-abfa-dc553954a6a7" + }, + "owningMembership": { + "@id": "45764250-7503-5815-abfa-dc553954a6a7" + }, + "owningNamespace": { + "@id": "404a82ff-0899-5719-bb15-8c04912dbc0b" + }, + "owningRelationship": { + "@id": "45764250-7503-5815-abfa-dc553954a6a7" + }, + "owningType": { + "@id": "404a82ff-0899-5719-bb15-8c04912dbc0b" + }, + "parameter": [ + { + "@id": "ba278114-75c8-511d-930c-1fbf03b380f7" + }, + { + "@id": "f466beff-5e1e-58d4-9f60-aa8e5395989f" + } + ], + "qualifiedName": null, + "result": { + "@id": "4f9afd4a-5f0a-5b53-aea9-11bf1f41765d" + }, + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [] + }, + { + "@id": "b304e8b5-8b4b-5df3-89b9-12e4356497c7", + "@type": "ParameterMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "b304e8b5-8b4b-5df3-89b9-12e4356497c7", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "ba278114-75c8-511d-930c-1fbf03b380f7" + }, + "memberElementId": "ba278114-75c8-511d-930c-1fbf03b380f7", + "memberName": null, + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "4f9afd4a-5f0a-5b53-aea9-11bf1f41765d" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "ba278114-75c8-511d-930c-1fbf03b380f7" + }, + "ownedMemberElementId": "ba278114-75c8-511d-930c-1fbf03b380f7", + "ownedMemberFeature": { + "@id": "ba278114-75c8-511d-930c-1fbf03b380f7" + }, + "ownedMemberName": null, + "ownedMemberParameter": { + "@id": "ba278114-75c8-511d-930c-1fbf03b380f7" + }, + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "ba278114-75c8-511d-930c-1fbf03b380f7" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "4f9afd4a-5f0a-5b53-aea9-11bf1f41765d" + }, + "owningRelationship": null, + "owningType": { + "@id": "4f9afd4a-5f0a-5b53-aea9-11bf1f41765d" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "4f9afd4a-5f0a-5b53-aea9-11bf1f41765d" + }, + { + "@id": "ba278114-75c8-511d-930c-1fbf03b380f7" + } + ], + "shortName": null, + "source": [ + { + "@id": "4f9afd4a-5f0a-5b53-aea9-11bf1f41765d" + } + ], + "target": [ + { + "@id": "ba278114-75c8-511d-930c-1fbf03b380f7" + } + ], + "textualRepresentation": [], + "visibility": "private" + }, + { + "@id": "ba278114-75c8-511d-930c-1fbf03b380f7", + "@type": "Feature", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "direction": "in", + "documentation": [], + "elementId": "ba278114-75c8-511d-930c-1fbf03b380f7", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "ba278114-75c8-511d-930c-1fbf03b380f7" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isSufficient": false, + "isUnique": true, + "isVariable": false, + "member": [ + { + "@id": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95" + } + ], + "membership": [ + { + "@id": "fc840ceb-1ac6-5f74-bd0a-c76d5c1b402a" + } + ], + "multiplicity": null, + "name": null, + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95" + } + ], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [ + { + "@id": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95" + } + ], + "ownedMembership": [ + { + "@id": "fc840ceb-1ac6-5f74-bd0a-c76d5c1b402a" + } + ], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "fc840ceb-1ac6-5f74-bd0a-c76d5c1b402a" + } + ], + "ownedSpecialization": [], + "ownedSubsetting": [], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "4f9afd4a-5f0a-5b53-aea9-11bf1f41765d" + }, + "owningFeatureMembership": { + "@id": "b304e8b5-8b4b-5df3-89b9-12e4356497c7" + }, + "owningMembership": { + "@id": "b304e8b5-8b4b-5df3-89b9-12e4356497c7" + }, + "owningNamespace": { + "@id": "4f9afd4a-5f0a-5b53-aea9-11bf1f41765d" + }, + "owningRelationship": { + "@id": "b304e8b5-8b4b-5df3-89b9-12e4356497c7" + }, + "owningType": { + "@id": "4f9afd4a-5f0a-5b53-aea9-11bf1f41765d" + }, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [] + }, + { + "@id": "fc840ceb-1ac6-5f74-bd0a-c76d5c1b402a", + "@type": "FeatureValue", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "fc840ceb-1ac6-5f74-bd0a-c76d5c1b402a", + "featureWithValue": { + "@id": "ba278114-75c8-511d-930c-1fbf03b380f7" + }, + "isDefault": false, + "isImplied": false, + "isImpliedIncluded": true, + "isInitial": false, + "isLibraryElement": false, + "memberElement": { + "@id": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95" + }, + "memberElementId": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95", + "memberName": null, + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "ba278114-75c8-511d-930c-1fbf03b380f7" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95" + }, + "ownedMemberElementId": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95", + "ownedMemberName": null, + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "ba278114-75c8-511d-930c-1fbf03b380f7" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "ba278114-75c8-511d-930c-1fbf03b380f7" + }, + { + "@id": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95" + } + ], + "shortName": null, + "source": [ + { + "@id": "ba278114-75c8-511d-930c-1fbf03b380f7" + } + ], + "target": [ + { + "@id": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95" + } + ], + "textualRepresentation": [], + "value": { + "@id": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95" + }, + "visibility": "public" + }, + { + "@id": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95", + "@type": "FeatureReferenceExpression", + "aliasIds": [], + "behavior": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "differencingType": [], + "directedFeature": [ + { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + } + ], + "direction": null, + "documentation": [], + "elementId": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95", + "endFeature": [], + "endOwningType": null, + "feature": [ + { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + } + ], + "featureMembership": [ + { + "@id": "a15430f8-7da3-5c52-96a9-e7d5c6b17995" + } + ], + "featureTarget": { + "@id": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95" + }, + "featuringType": [], + "function": null, + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isModelLevelEvaluable": false, + "isOrdered": false, + "isPortion": false, + "isSufficient": false, + "isUnique": true, + "isVariable": false, + "member": [ + { + "@id": "97792196-6134-52ec-a21b-b518697e0ae9" + }, + { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + }, + { + "@id": "b2c73881-e0c8-561c-942c-e501beb0caad" + } + ], + "membership": [ + { + "@id": "94ed74ea-624f-5487-8428-0bf2bc0ae73e" + }, + { + "@id": "a15430f8-7da3-5c52-96a9-e7d5c6b17995" + }, + { + "@id": "c407a02c-8f34-5850-8210-ffce76da2658" + } + ], + "multiplicity": null, + "name": null, + "output": [ + { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + } + ], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + }, + { + "@id": "b2c73881-e0c8-561c-942c-e501beb0caad" + } + ], + "ownedEndFeature": [], + "ownedFeature": [ + { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + } + ], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [ + { + "@id": "a15430f8-7da3-5c52-96a9-e7d5c6b17995" + } + ], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [ + { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + }, + { + "@id": "b2c73881-e0c8-561c-942c-e501beb0caad" + } + ], + "ownedMembership": [ + { + "@id": "94ed74ea-624f-5487-8428-0bf2bc0ae73e" + }, + { + "@id": "a15430f8-7da3-5c52-96a9-e7d5c6b17995" + }, + { + "@id": "c407a02c-8f34-5850-8210-ffce76da2658" + } + ], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "94ed74ea-624f-5487-8428-0bf2bc0ae73e" + }, + { + "@id": "a15430f8-7da3-5c52-96a9-e7d5c6b17995" + }, + { + "@id": "c407a02c-8f34-5850-8210-ffce76da2658" + } + ], + "ownedSpecialization": [], + "ownedSubsetting": [], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "ba278114-75c8-511d-930c-1fbf03b380f7" + }, + "owningFeatureMembership": null, + "owningMembership": { + "@id": "fc840ceb-1ac6-5f74-bd0a-c76d5c1b402a" + }, + "owningNamespace": { + "@id": "ba278114-75c8-511d-930c-1fbf03b380f7" + }, + "owningRelationship": { + "@id": "fc840ceb-1ac6-5f74-bd0a-c76d5c1b402a" + }, + "owningType": null, + "parameter": [ + { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + } + ], + "qualifiedName": null, + "referent": { + "@id": "97792196-6134-52ec-a21b-b518697e0ae9" + }, + "result": { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + }, + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [] + }, + { + "@id": "94ed74ea-624f-5487-8428-0bf2bc0ae73e", + "@type": "Membership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "94ed74ea-624f-5487-8428-0bf2bc0ae73e", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "97792196-6134-52ec-a21b-b518697e0ae9" + }, + "memberElementId": "97792196-6134-52ec-a21b-b518697e0ae9", + "memberName": "mass2", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95" + }, + { + "@id": "97792196-6134-52ec-a21b-b518697e0ae9" + } + ], + "shortName": null, + "source": [ + { + "@id": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95" + } + ], + "target": [ + { + "@id": "97792196-6134-52ec-a21b-b518697e0ae9" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "f2400c4e-84c2-5fb1-a9fd-57e5a2755df3", + "@type": "ParameterMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "f2400c4e-84c2-5fb1-a9fd-57e5a2755df3", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "f466beff-5e1e-58d4-9f60-aa8e5395989f" + }, + "memberElementId": "f466beff-5e1e-58d4-9f60-aa8e5395989f", + "memberName": null, + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "4f9afd4a-5f0a-5b53-aea9-11bf1f41765d" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "f466beff-5e1e-58d4-9f60-aa8e5395989f" + }, + "ownedMemberElementId": "f466beff-5e1e-58d4-9f60-aa8e5395989f", + "ownedMemberFeature": { + "@id": "f466beff-5e1e-58d4-9f60-aa8e5395989f" + }, + "ownedMemberName": null, + "ownedMemberParameter": { + "@id": "f466beff-5e1e-58d4-9f60-aa8e5395989f" + }, + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "f466beff-5e1e-58d4-9f60-aa8e5395989f" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "4f9afd4a-5f0a-5b53-aea9-11bf1f41765d" + }, + "owningRelationship": null, + "owningType": { + "@id": "4f9afd4a-5f0a-5b53-aea9-11bf1f41765d" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "4f9afd4a-5f0a-5b53-aea9-11bf1f41765d" + }, + { + "@id": "f466beff-5e1e-58d4-9f60-aa8e5395989f" + } + ], + "shortName": null, + "source": [ + { + "@id": "4f9afd4a-5f0a-5b53-aea9-11bf1f41765d" + } + ], + "target": [ + { + "@id": "f466beff-5e1e-58d4-9f60-aa8e5395989f" + } + ], + "textualRepresentation": [], + "visibility": "private" + }, + { + "@id": "f466beff-5e1e-58d4-9f60-aa8e5395989f", + "@type": "Feature", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "direction": "in", + "documentation": [], + "elementId": "f466beff-5e1e-58d4-9f60-aa8e5395989f", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "f466beff-5e1e-58d4-9f60-aa8e5395989f" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isSufficient": false, + "isUnique": true, + "isVariable": false, + "member": [ + { + "@id": "6fb2ae58-ee0d-5d2a-aae0-1160e3b7ff8b" + } + ], + "membership": [ + { + "@id": "11d8c607-cfae-537d-858a-4e3b3c1e58e1" + } + ], + "multiplicity": null, + "name": null, + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "6fb2ae58-ee0d-5d2a-aae0-1160e3b7ff8b" + } + ], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [ + { + "@id": "6fb2ae58-ee0d-5d2a-aae0-1160e3b7ff8b" + } + ], + "ownedMembership": [ + { + "@id": "11d8c607-cfae-537d-858a-4e3b3c1e58e1" + } + ], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "11d8c607-cfae-537d-858a-4e3b3c1e58e1" + } + ], + "ownedSpecialization": [], + "ownedSubsetting": [], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "4f9afd4a-5f0a-5b53-aea9-11bf1f41765d" + }, + "owningFeatureMembership": { + "@id": "f2400c4e-84c2-5fb1-a9fd-57e5a2755df3" + }, + "owningMembership": { + "@id": "f2400c4e-84c2-5fb1-a9fd-57e5a2755df3" + }, + "owningNamespace": { + "@id": "4f9afd4a-5f0a-5b53-aea9-11bf1f41765d" + }, + "owningRelationship": { + "@id": "f2400c4e-84c2-5fb1-a9fd-57e5a2755df3" + }, + "owningType": { + "@id": "4f9afd4a-5f0a-5b53-aea9-11bf1f41765d" + }, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [] + }, + { + "@id": "11d8c607-cfae-537d-858a-4e3b3c1e58e1", + "@type": "FeatureValue", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "11d8c607-cfae-537d-858a-4e3b3c1e58e1", + "featureWithValue": { + "@id": "f466beff-5e1e-58d4-9f60-aa8e5395989f" + }, + "isDefault": false, + "isImplied": false, + "isImpliedIncluded": true, + "isInitial": false, + "isLibraryElement": false, + "memberElement": { + "@id": "6fb2ae58-ee0d-5d2a-aae0-1160e3b7ff8b" + }, + "memberElementId": "6fb2ae58-ee0d-5d2a-aae0-1160e3b7ff8b", + "memberName": null, + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "f466beff-5e1e-58d4-9f60-aa8e5395989f" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "6fb2ae58-ee0d-5d2a-aae0-1160e3b7ff8b" + }, + "ownedMemberElementId": "6fb2ae58-ee0d-5d2a-aae0-1160e3b7ff8b", + "ownedMemberName": null, + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "6fb2ae58-ee0d-5d2a-aae0-1160e3b7ff8b" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "f466beff-5e1e-58d4-9f60-aa8e5395989f" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "f466beff-5e1e-58d4-9f60-aa8e5395989f" + }, + { + "@id": "6fb2ae58-ee0d-5d2a-aae0-1160e3b7ff8b" + } + ], + "shortName": null, + "source": [ + { + "@id": "f466beff-5e1e-58d4-9f60-aa8e5395989f" + } + ], + "target": [ + { + "@id": "6fb2ae58-ee0d-5d2a-aae0-1160e3b7ff8b" + } + ], + "textualRepresentation": [], + "value": { + "@id": "6fb2ae58-ee0d-5d2a-aae0-1160e3b7ff8b" + }, + "visibility": "public" + }, + { + "@id": "6fb2ae58-ee0d-5d2a-aae0-1160e3b7ff8b", + "@type": "LiteralInteger", + "aliasIds": [], + "behavior": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "direction": null, + "documentation": [], + "elementId": "6fb2ae58-ee0d-5d2a-aae0-1160e3b7ff8b", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "6fb2ae58-ee0d-5d2a-aae0-1160e3b7ff8b" + }, + "featuringType": [], + "function": null, + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isModelLevelEvaluable": true, + "isOrdered": false, + "isPortion": false, + "isSufficient": false, + "isUnique": true, + "isVariable": false, + "member": [], + "membership": [], + "multiplicity": null, + "name": null, + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [], + "ownedSpecialization": [], + "ownedSubsetting": [], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "f466beff-5e1e-58d4-9f60-aa8e5395989f" + }, + "owningFeatureMembership": null, + "owningMembership": { + "@id": "11d8c607-cfae-537d-858a-4e3b3c1e58e1" + }, + "owningNamespace": { + "@id": "f466beff-5e1e-58d4-9f60-aa8e5395989f" + }, + "owningRelationship": { + "@id": "11d8c607-cfae-537d-858a-4e3b3c1e58e1" + }, + "owningType": null, + "parameter": [], + "qualifiedName": null, + "result": { + "@id": "6fb2ae58-ee0d-5d2a-aae0-1160e3b7ff8b" + }, + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [], + "value": 0 + }, + { + "@id": "eca34046-824d-57c3-a8a0-2db822304a82", + "@type": "FeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "eca34046-824d-57c3-a8a0-2db822304a82", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "ad7ab666-b6f4-5e4a-844e-b24f68bcdcd0" + }, + "memberElementId": "ad7ab666-b6f4-5e4a-844e-b24f68bcdcd0", + "memberName": "s", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "ad7ab666-b6f4-5e4a-844e-b24f68bcdcd0" + }, + "ownedMemberElementId": "ad7ab666-b6f4-5e4a-844e-b24f68bcdcd0", + "ownedMemberFeature": { + "@id": "ad7ab666-b6f4-5e4a-844e-b24f68bcdcd0" + }, + "ownedMemberName": "s", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "ad7ab666-b6f4-5e4a-844e-b24f68bcdcd0" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningRelationship": null, + "owningType": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + { + "@id": "ad7ab666-b6f4-5e4a-844e-b24f68bcdcd0" + } + ], + "shortName": null, + "source": [ + { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + } + ], + "target": [ + { + "@id": "ad7ab666-b6f4-5e4a-844e-b24f68bcdcd0" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "ad7ab666-b6f4-5e4a-844e-b24f68bcdcd0", + "@type": "StateUsage", + "actionDefinition": [], + "aliasIds": [], + "behavior": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": "s", + "declaredShortName": null, + "definition": [], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "doAction": null, + "documentation": [], + "elementId": "ad7ab666-b6f4-5e4a-844e-b24f68bcdcd0", + "endFeature": [], + "endOwningType": null, + "entryAction": null, + "exitAction": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "ad7ab666-b6f4-5e4a-844e-b24f68bcdcd0" + }, + "featuringType": [], + "importedMembership": [], + "individualDefinition": null, + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": true, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isOrdered": false, + "isParallel": false, + "isPortion": false, + "isReference": false, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [], + "membership": [], + "multiplicity": null, + "name": "s", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "occurrenceDefinition": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [], + "ownedSpecialization": [], + "ownedSubsetting": [], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningDefinition": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningFeatureMembership": { + "@id": "eca34046-824d-57c3-a8a0-2db822304a82" + }, + "owningMembership": { + "@id": "eca34046-824d-57c3-a8a0-2db822304a82" + }, + "owningNamespace": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningRelationship": { + "@id": "eca34046-824d-57c3-a8a0-2db822304a82" + }, + "owningType": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningUsage": null, + "parameter": [], + "portionKind": null, + "qualifiedName": "Demo::Vehicle::s", + "shortName": null, + "stateDefinition": [], + "textualRepresentation": [], + "type": [], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "5adae87a-b9b5-5fe6-9af7-b053274a8c24", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "5adae87a-b9b5-5fe6-9af7-b053274a8c24", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "2912f365-4259-5157-b2b7-d52d94aa3274" + }, + "memberElementId": "2912f365-4259-5157-b2b7-d52d94aa3274", + "memberName": "K", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "2912f365-4259-5157-b2b7-d52d94aa3274" + }, + "ownedMemberElementId": "2912f365-4259-5157-b2b7-d52d94aa3274", + "ownedMemberName": "K", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "2912f365-4259-5157-b2b7-d52d94aa3274" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + { + "@id": "2912f365-4259-5157-b2b7-d52d94aa3274" + } + ], + "shortName": null, + "source": [ + { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + } + ], + "target": [ + { + "@id": "2912f365-4259-5157-b2b7-d52d94aa3274" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "2912f365-4259-5157-b2b7-d52d94aa3274", + "@type": "CalculationDefinition", + "action": [], + "aliasIds": [], + "calculation": [], + "declaredName": "K", + "declaredShortName": null, + "differencingType": [], + "directedFeature": [ + { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + }, + { + "@id": "90d04899-eacb-53cc-b8f3-cc954c5715f2" + } + ], + "directedUsage": [ + { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + }, + { + "@id": "90d04899-eacb-53cc-b8f3-cc954c5715f2" + } + ], + "documentation": [], + "elementId": "2912f365-4259-5157-b2b7-d52d94aa3274", + "endFeature": [], + "expression": [], + "feature": [ + { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + }, + { + "@id": "90d04899-eacb-53cc-b8f3-cc954c5715f2" + } + ], + "featureMembership": [ + { + "@id": "a355397c-11f9-5058-a508-82c04de10f2c" + }, + { + "@id": "71413f5f-b749-5c39-b364-d36fef32d3cd" + } + ], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [ + { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + } + ], + "intersectingType": [], + "isAbstract": false, + "isConjugated": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isModelLevelEvaluable": false, + "isSufficient": false, + "isVariation": false, + "member": [ + { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + }, + { + "@id": "90d04899-eacb-53cc-b8f3-cc954c5715f2" + } + ], + "membership": [ + { + "@id": "a355397c-11f9-5058-a508-82c04de10f2c" + }, + { + "@id": "71413f5f-b749-5c39-b364-d36fef32d3cd" + } + ], + "multiplicity": null, + "name": "K", + "output": [ + { + "@id": "90d04899-eacb-53cc-b8f3-cc954c5715f2" + } + ], + "ownedAction": [], + "ownedAllocation": [], + "ownedAnalysisCase": [], + "ownedAnnotation": [], + "ownedAttribute": [], + "ownedCalculation": [], + "ownedCase": [], + "ownedConcern": [], + "ownedConjugator": null, + "ownedConnection": [], + "ownedConstraint": [], + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + }, + { + "@id": "90d04899-eacb-53cc-b8f3-cc954c5715f2" + } + ], + "ownedEndFeature": [], + "ownedEnumeration": [], + "ownedFeature": [ + { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + }, + { + "@id": "90d04899-eacb-53cc-b8f3-cc954c5715f2" + } + ], + "ownedFeatureMembership": [ + { + "@id": "a355397c-11f9-5058-a508-82c04de10f2c" + }, + { + "@id": "71413f5f-b749-5c39-b364-d36fef32d3cd" + } + ], + "ownedFlow": [], + "ownedImport": [], + "ownedInterface": [], + "ownedIntersecting": [], + "ownedItem": [], + "ownedMember": [ + { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + }, + { + "@id": "90d04899-eacb-53cc-b8f3-cc954c5715f2" + } + ], + "ownedMembership": [ + { + "@id": "a355397c-11f9-5058-a508-82c04de10f2c" + }, + { + "@id": "71413f5f-b749-5c39-b364-d36fef32d3cd" + } + ], + "ownedMetadata": [], + "ownedOccurrence": [], + "ownedPart": [], + "ownedPort": [], + "ownedReference": [ + { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + }, + { + "@id": "90d04899-eacb-53cc-b8f3-cc954c5715f2" + } + ], + "ownedRelationship": [ + { + "@id": "a355397c-11f9-5058-a508-82c04de10f2c" + }, + { + "@id": "71413f5f-b749-5c39-b364-d36fef32d3cd" + } + ], + "ownedRendering": [], + "ownedRequirement": [], + "ownedSpecialization": [], + "ownedState": [], + "ownedSubclassification": [], + "ownedTransition": [], + "ownedUnioning": [], + "ownedUsage": [ + { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + }, + { + "@id": "90d04899-eacb-53cc-b8f3-cc954c5715f2" + } + ], + "ownedUseCase": [], + "ownedVerificationCase": [], + "ownedView": [], + "ownedViewpoint": [], + "owner": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningMembership": { + "@id": "5adae87a-b9b5-5fe6-9af7-b053274a8c24" + }, + "owningNamespace": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "owningRelationship": { + "@id": "5adae87a-b9b5-5fe6-9af7-b053274a8c24" + }, + "parameter": [ + { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + }, + { + "@id": "90d04899-eacb-53cc-b8f3-cc954c5715f2" + } + ], + "qualifiedName": "Demo::Vehicle::K", + "result": { + "@id": "90d04899-eacb-53cc-b8f3-cc954c5715f2" + }, + "shortName": null, + "step": [], + "textualRepresentation": [], + "unioningType": [], + "usage": [ + { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + }, + { + "@id": "90d04899-eacb-53cc-b8f3-cc954c5715f2" + } + ], + "variant": [], + "variantMembership": [] + }, + { + "@id": "a355397c-11f9-5058-a508-82c04de10f2c", + "@type": "FeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "a355397c-11f9-5058-a508-82c04de10f2c", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + }, + "memberElementId": "4d296856-56cf-54fe-af9d-f911a1632d55", + "memberName": "x", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "2912f365-4259-5157-b2b7-d52d94aa3274" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + }, + "ownedMemberElementId": "4d296856-56cf-54fe-af9d-f911a1632d55", + "ownedMemberFeature": { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + }, + "ownedMemberName": "x", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "2912f365-4259-5157-b2b7-d52d94aa3274" + }, + "owningRelationship": null, + "owningType": { + "@id": "2912f365-4259-5157-b2b7-d52d94aa3274" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "2912f365-4259-5157-b2b7-d52d94aa3274" + }, + { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + } + ], + "shortName": null, + "source": [ + { + "@id": "2912f365-4259-5157-b2b7-d52d94aa3274" + } + ], + "target": [ + { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55", + "@type": "ReferenceUsage", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": "x", + "declaredShortName": null, + "definition": [], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": "in", + "documentation": [], + "elementId": "4d296856-56cf-54fe-af9d-f911a1632d55", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": true, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [], + "membership": [], + "multiplicity": null, + "name": "x", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [], + "ownedSpecialization": [], + "ownedSubsetting": [], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "2912f365-4259-5157-b2b7-d52d94aa3274" + }, + "owningDefinition": { + "@id": "2912f365-4259-5157-b2b7-d52d94aa3274" + }, + "owningFeatureMembership": { + "@id": "a355397c-11f9-5058-a508-82c04de10f2c" + }, + "owningMembership": { + "@id": "a355397c-11f9-5058-a508-82c04de10f2c" + }, + "owningNamespace": { + "@id": "2912f365-4259-5157-b2b7-d52d94aa3274" + }, + "owningRelationship": { + "@id": "a355397c-11f9-5058-a508-82c04de10f2c" + }, + "owningType": { + "@id": "2912f365-4259-5157-b2b7-d52d94aa3274" + }, + "owningUsage": null, + "qualifiedName": "Demo::Vehicle::K::x", + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "71413f5f-b749-5c39-b364-d36fef32d3cd", + "@type": "ReturnParameterMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "71413f5f-b749-5c39-b364-d36fef32d3cd", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "90d04899-eacb-53cc-b8f3-cc954c5715f2" + }, + "memberElementId": "90d04899-eacb-53cc-b8f3-cc954c5715f2", + "memberName": "y", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "2912f365-4259-5157-b2b7-d52d94aa3274" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "90d04899-eacb-53cc-b8f3-cc954c5715f2" + }, + "ownedMemberElementId": "90d04899-eacb-53cc-b8f3-cc954c5715f2", + "ownedMemberFeature": { + "@id": "90d04899-eacb-53cc-b8f3-cc954c5715f2" + }, + "ownedMemberName": "y", + "ownedMemberParameter": { + "@id": "90d04899-eacb-53cc-b8f3-cc954c5715f2" + }, + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "90d04899-eacb-53cc-b8f3-cc954c5715f2" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "2912f365-4259-5157-b2b7-d52d94aa3274" + }, + "owningRelationship": null, + "owningType": { + "@id": "2912f365-4259-5157-b2b7-d52d94aa3274" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "2912f365-4259-5157-b2b7-d52d94aa3274" + }, + { + "@id": "90d04899-eacb-53cc-b8f3-cc954c5715f2" + } + ], + "shortName": null, + "source": [ + { + "@id": "2912f365-4259-5157-b2b7-d52d94aa3274" + } + ], + "target": [ + { + "@id": "90d04899-eacb-53cc-b8f3-cc954c5715f2" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "90d04899-eacb-53cc-b8f3-cc954c5715f2", + "@type": "ReferenceUsage", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": "y", + "declaredShortName": null, + "definition": [], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": "out", + "documentation": [], + "elementId": "90d04899-eacb-53cc-b8f3-cc954c5715f2", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "90d04899-eacb-53cc-b8f3-cc954c5715f2" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": true, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [ + { + "@id": "069d6128-4cea-50ad-871e-0be8f61eab28" + } + ], + "membership": [ + { + "@id": "5cec300f-0798-5eeb-ab2e-4bd12958c6fb" + } + ], + "multiplicity": null, + "name": "y", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "069d6128-4cea-50ad-871e-0be8f61eab28" + } + ], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [ + { + "@id": "069d6128-4cea-50ad-871e-0be8f61eab28" + } + ], + "ownedMembership": [ + { + "@id": "5cec300f-0798-5eeb-ab2e-4bd12958c6fb" + } + ], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "5cec300f-0798-5eeb-ab2e-4bd12958c6fb" + } + ], + "ownedSpecialization": [], + "ownedSubsetting": [], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "2912f365-4259-5157-b2b7-d52d94aa3274" + }, + "owningDefinition": { + "@id": "2912f365-4259-5157-b2b7-d52d94aa3274" + }, + "owningFeatureMembership": { + "@id": "71413f5f-b749-5c39-b364-d36fef32d3cd" + }, + "owningMembership": { + "@id": "71413f5f-b749-5c39-b364-d36fef32d3cd" + }, + "owningNamespace": { + "@id": "2912f365-4259-5157-b2b7-d52d94aa3274" + }, + "owningRelationship": { + "@id": "71413f5f-b749-5c39-b364-d36fef32d3cd" + }, + "owningType": { + "@id": "2912f365-4259-5157-b2b7-d52d94aa3274" + }, + "owningUsage": null, + "qualifiedName": "Demo::Vehicle::K::y", + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "5cec300f-0798-5eeb-ab2e-4bd12958c6fb", + "@type": "FeatureValue", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "5cec300f-0798-5eeb-ab2e-4bd12958c6fb", + "featureWithValue": { + "@id": "90d04899-eacb-53cc-b8f3-cc954c5715f2" + }, + "isDefault": false, + "isImplied": false, + "isImpliedIncluded": true, + "isInitial": false, + "isLibraryElement": false, + "memberElement": { + "@id": "069d6128-4cea-50ad-871e-0be8f61eab28" + }, + "memberElementId": "069d6128-4cea-50ad-871e-0be8f61eab28", + "memberName": null, + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "90d04899-eacb-53cc-b8f3-cc954c5715f2" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "069d6128-4cea-50ad-871e-0be8f61eab28" + }, + "ownedMemberElementId": "069d6128-4cea-50ad-871e-0be8f61eab28", + "ownedMemberName": null, + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "069d6128-4cea-50ad-871e-0be8f61eab28" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "90d04899-eacb-53cc-b8f3-cc954c5715f2" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "90d04899-eacb-53cc-b8f3-cc954c5715f2" + }, + { + "@id": "069d6128-4cea-50ad-871e-0be8f61eab28" + } + ], + "shortName": null, + "source": [ + { + "@id": "90d04899-eacb-53cc-b8f3-cc954c5715f2" + } + ], + "target": [ + { + "@id": "069d6128-4cea-50ad-871e-0be8f61eab28" + } + ], + "textualRepresentation": [], + "value": { + "@id": "069d6128-4cea-50ad-871e-0be8f61eab28" + }, + "visibility": "public" + }, + { + "@id": "069d6128-4cea-50ad-871e-0be8f61eab28", + "@type": "OperatorExpression", + "aliasIds": [], + "argument": [ + { + "@id": "194e4d05-8812-5619-aaa2-06d4a3680e3a" + }, + { + "@id": "6c377fd8-df1a-520c-b72e-1a679b73a73e" + } + ], + "behavior": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "differencingType": [], + "directedFeature": [ + { + "@id": "b2f4906d-c847-56e8-8697-a577ca5c0f24" + }, + { + "@id": "145eda2a-410f-5b86-ab8b-a296ce4d56bf" + } + ], + "direction": null, + "documentation": [], + "elementId": "069d6128-4cea-50ad-871e-0be8f61eab28", + "endFeature": [], + "endOwningType": null, + "feature": [ + { + "@id": "b2f4906d-c847-56e8-8697-a577ca5c0f24" + }, + { + "@id": "145eda2a-410f-5b86-ab8b-a296ce4d56bf" + } + ], + "featureMembership": [ + { + "@id": "4b76481f-dd9f-590e-9fe6-e4dca46ff217" + }, + { + "@id": "b4a2c714-b418-5f2f-86fc-26e2d0a68919" + } + ], + "featureTarget": { + "@id": "069d6128-4cea-50ad-871e-0be8f61eab28" + }, + "featuringType": [], + "function": null, + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [ + { + "@id": "b2f4906d-c847-56e8-8697-a577ca5c0f24" + }, + { + "@id": "145eda2a-410f-5b86-ab8b-a296ce4d56bf" + } + ], + "instantiatedType": { + "@id": "069d6128-4cea-50ad-871e-0be8f61eab28" + }, + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isModelLevelEvaluable": false, + "isOrdered": false, + "isPortion": false, + "isSufficient": false, + "isUnique": true, + "isVariable": false, + "member": [ + { + "@id": "b2f4906d-c847-56e8-8697-a577ca5c0f24" + }, + { + "@id": "145eda2a-410f-5b86-ab8b-a296ce4d56bf" + } + ], + "membership": [ + { + "@id": "4b76481f-dd9f-590e-9fe6-e4dca46ff217" + }, + { + "@id": "b4a2c714-b418-5f2f-86fc-26e2d0a68919" + } + ], + "multiplicity": null, + "name": null, + "operator": "+", + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "b2f4906d-c847-56e8-8697-a577ca5c0f24" + }, + { + "@id": "145eda2a-410f-5b86-ab8b-a296ce4d56bf" + } + ], + "ownedEndFeature": [], + "ownedFeature": [ + { + "@id": "b2f4906d-c847-56e8-8697-a577ca5c0f24" + }, + { + "@id": "145eda2a-410f-5b86-ab8b-a296ce4d56bf" + } + ], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [ + { + "@id": "4b76481f-dd9f-590e-9fe6-e4dca46ff217" + }, + { + "@id": "b4a2c714-b418-5f2f-86fc-26e2d0a68919" + } + ], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [ + { + "@id": "b2f4906d-c847-56e8-8697-a577ca5c0f24" + }, + { + "@id": "145eda2a-410f-5b86-ab8b-a296ce4d56bf" + } + ], + "ownedMembership": [ + { + "@id": "4b76481f-dd9f-590e-9fe6-e4dca46ff217" + }, + { + "@id": "b4a2c714-b418-5f2f-86fc-26e2d0a68919" + } + ], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "4b76481f-dd9f-590e-9fe6-e4dca46ff217" + }, + { + "@id": "b4a2c714-b418-5f2f-86fc-26e2d0a68919" + } + ], + "ownedSpecialization": [], + "ownedSubsetting": [], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "90d04899-eacb-53cc-b8f3-cc954c5715f2" + }, + "owningFeatureMembership": null, + "owningMembership": { + "@id": "5cec300f-0798-5eeb-ab2e-4bd12958c6fb" + }, + "owningNamespace": { + "@id": "90d04899-eacb-53cc-b8f3-cc954c5715f2" + }, + "owningRelationship": { + "@id": "5cec300f-0798-5eeb-ab2e-4bd12958c6fb" + }, + "owningType": null, + "parameter": [ + { + "@id": "b2f4906d-c847-56e8-8697-a577ca5c0f24" + }, + { + "@id": "145eda2a-410f-5b86-ab8b-a296ce4d56bf" + } + ], + "qualifiedName": null, + "result": { + "@id": "069d6128-4cea-50ad-871e-0be8f61eab28" + }, + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [] + }, + { + "@id": "4b76481f-dd9f-590e-9fe6-e4dca46ff217", + "@type": "ParameterMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "4b76481f-dd9f-590e-9fe6-e4dca46ff217", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "b2f4906d-c847-56e8-8697-a577ca5c0f24" + }, + "memberElementId": "b2f4906d-c847-56e8-8697-a577ca5c0f24", + "memberName": null, + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "069d6128-4cea-50ad-871e-0be8f61eab28" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "b2f4906d-c847-56e8-8697-a577ca5c0f24" + }, + "ownedMemberElementId": "b2f4906d-c847-56e8-8697-a577ca5c0f24", + "ownedMemberFeature": { + "@id": "b2f4906d-c847-56e8-8697-a577ca5c0f24" + }, + "ownedMemberName": null, + "ownedMemberParameter": { + "@id": "b2f4906d-c847-56e8-8697-a577ca5c0f24" + }, + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "b2f4906d-c847-56e8-8697-a577ca5c0f24" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "069d6128-4cea-50ad-871e-0be8f61eab28" + }, + "owningRelationship": null, + "owningType": { + "@id": "069d6128-4cea-50ad-871e-0be8f61eab28" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "069d6128-4cea-50ad-871e-0be8f61eab28" + }, + { + "@id": "b2f4906d-c847-56e8-8697-a577ca5c0f24" + } + ], + "shortName": null, + "source": [ + { + "@id": "069d6128-4cea-50ad-871e-0be8f61eab28" + } + ], + "target": [ + { + "@id": "b2f4906d-c847-56e8-8697-a577ca5c0f24" + } + ], + "textualRepresentation": [], + "visibility": "private" + }, + { + "@id": "b2f4906d-c847-56e8-8697-a577ca5c0f24", + "@type": "Feature", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "direction": "in", + "documentation": [], + "elementId": "b2f4906d-c847-56e8-8697-a577ca5c0f24", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "b2f4906d-c847-56e8-8697-a577ca5c0f24" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isSufficient": false, + "isUnique": true, + "isVariable": false, + "member": [ + { + "@id": "194e4d05-8812-5619-aaa2-06d4a3680e3a" + } + ], + "membership": [ + { + "@id": "2fd5c8e2-d257-5bda-9e78-890f278e7b5a" + } + ], + "multiplicity": null, + "name": null, + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "194e4d05-8812-5619-aaa2-06d4a3680e3a" + } + ], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [ + { + "@id": "194e4d05-8812-5619-aaa2-06d4a3680e3a" + } + ], + "ownedMembership": [ + { + "@id": "2fd5c8e2-d257-5bda-9e78-890f278e7b5a" + } + ], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "2fd5c8e2-d257-5bda-9e78-890f278e7b5a" + } + ], + "ownedSpecialization": [], + "ownedSubsetting": [], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "069d6128-4cea-50ad-871e-0be8f61eab28" + }, + "owningFeatureMembership": { + "@id": "4b76481f-dd9f-590e-9fe6-e4dca46ff217" + }, + "owningMembership": { + "@id": "4b76481f-dd9f-590e-9fe6-e4dca46ff217" + }, + "owningNamespace": { + "@id": "069d6128-4cea-50ad-871e-0be8f61eab28" + }, + "owningRelationship": { + "@id": "4b76481f-dd9f-590e-9fe6-e4dca46ff217" + }, + "owningType": { + "@id": "069d6128-4cea-50ad-871e-0be8f61eab28" + }, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [] + }, + { + "@id": "2fd5c8e2-d257-5bda-9e78-890f278e7b5a", + "@type": "FeatureValue", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "2fd5c8e2-d257-5bda-9e78-890f278e7b5a", + "featureWithValue": { + "@id": "b2f4906d-c847-56e8-8697-a577ca5c0f24" + }, + "isDefault": false, + "isImplied": false, + "isImpliedIncluded": true, + "isInitial": false, + "isLibraryElement": false, + "memberElement": { + "@id": "194e4d05-8812-5619-aaa2-06d4a3680e3a" + }, + "memberElementId": "194e4d05-8812-5619-aaa2-06d4a3680e3a", + "memberName": null, + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "b2f4906d-c847-56e8-8697-a577ca5c0f24" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "194e4d05-8812-5619-aaa2-06d4a3680e3a" + }, + "ownedMemberElementId": "194e4d05-8812-5619-aaa2-06d4a3680e3a", + "ownedMemberName": null, + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "194e4d05-8812-5619-aaa2-06d4a3680e3a" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "b2f4906d-c847-56e8-8697-a577ca5c0f24" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "b2f4906d-c847-56e8-8697-a577ca5c0f24" + }, + { + "@id": "194e4d05-8812-5619-aaa2-06d4a3680e3a" + } + ], + "shortName": null, + "source": [ + { + "@id": "b2f4906d-c847-56e8-8697-a577ca5c0f24" + } + ], + "target": [ + { + "@id": "194e4d05-8812-5619-aaa2-06d4a3680e3a" + } + ], + "textualRepresentation": [], + "value": { + "@id": "194e4d05-8812-5619-aaa2-06d4a3680e3a" + }, + "visibility": "public" + }, + { + "@id": "194e4d05-8812-5619-aaa2-06d4a3680e3a", + "@type": "FeatureReferenceExpression", + "aliasIds": [], + "behavior": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "differencingType": [], + "directedFeature": [ + { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + } + ], + "direction": null, + "documentation": [], + "elementId": "194e4d05-8812-5619-aaa2-06d4a3680e3a", + "endFeature": [], + "endOwningType": null, + "feature": [ + { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + } + ], + "featureMembership": [ + { + "@id": "38930d49-5a3f-5436-a749-5ea0ee8668ef" + } + ], + "featureTarget": { + "@id": "194e4d05-8812-5619-aaa2-06d4a3680e3a" + }, + "featuringType": [], + "function": null, + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isModelLevelEvaluable": false, + "isOrdered": false, + "isPortion": false, + "isSufficient": false, + "isUnique": true, + "isVariable": false, + "member": [ + { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + }, + { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + }, + { + "@id": "3212075d-1f66-5781-aba0-bc1ae2fb36ff" + } + ], + "membership": [ + { + "@id": "0ad33a22-158c-56e2-bc96-931d9b999e86" + }, + { + "@id": "38930d49-5a3f-5436-a749-5ea0ee8668ef" + }, + { + "@id": "d8724770-1f07-5b54-83e6-f7ebc56ada57" + } + ], + "multiplicity": null, + "name": null, + "output": [ + { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + } + ], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + }, + { + "@id": "3212075d-1f66-5781-aba0-bc1ae2fb36ff" + } + ], + "ownedEndFeature": [], + "ownedFeature": [ + { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + } + ], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [ + { + "@id": "38930d49-5a3f-5436-a749-5ea0ee8668ef" + } + ], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [ + { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + }, + { + "@id": "3212075d-1f66-5781-aba0-bc1ae2fb36ff" + } + ], + "ownedMembership": [ + { + "@id": "0ad33a22-158c-56e2-bc96-931d9b999e86" + }, + { + "@id": "38930d49-5a3f-5436-a749-5ea0ee8668ef" + }, + { + "@id": "d8724770-1f07-5b54-83e6-f7ebc56ada57" + } + ], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "0ad33a22-158c-56e2-bc96-931d9b999e86" + }, + { + "@id": "38930d49-5a3f-5436-a749-5ea0ee8668ef" + }, + { + "@id": "d8724770-1f07-5b54-83e6-f7ebc56ada57" + } + ], + "ownedSpecialization": [], + "ownedSubsetting": [], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "b2f4906d-c847-56e8-8697-a577ca5c0f24" + }, + "owningFeatureMembership": null, + "owningMembership": { + "@id": "2fd5c8e2-d257-5bda-9e78-890f278e7b5a" + }, + "owningNamespace": { + "@id": "b2f4906d-c847-56e8-8697-a577ca5c0f24" + }, + "owningRelationship": { + "@id": "2fd5c8e2-d257-5bda-9e78-890f278e7b5a" + }, + "owningType": null, + "parameter": [ + { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + } + ], + "qualifiedName": null, + "referent": { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + }, + "result": { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + }, + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [] + }, + { + "@id": "0ad33a22-158c-56e2-bc96-931d9b999e86", + "@type": "Membership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "0ad33a22-158c-56e2-bc96-931d9b999e86", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + }, + "memberElementId": "4d296856-56cf-54fe-af9d-f911a1632d55", + "memberName": "x", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "194e4d05-8812-5619-aaa2-06d4a3680e3a" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "194e4d05-8812-5619-aaa2-06d4a3680e3a" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "194e4d05-8812-5619-aaa2-06d4a3680e3a" + }, + { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + } + ], + "shortName": null, + "source": [ + { + "@id": "194e4d05-8812-5619-aaa2-06d4a3680e3a" + } + ], + "target": [ + { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "b4a2c714-b418-5f2f-86fc-26e2d0a68919", + "@type": "ParameterMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "b4a2c714-b418-5f2f-86fc-26e2d0a68919", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "145eda2a-410f-5b86-ab8b-a296ce4d56bf" + }, + "memberElementId": "145eda2a-410f-5b86-ab8b-a296ce4d56bf", + "memberName": null, + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "069d6128-4cea-50ad-871e-0be8f61eab28" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "145eda2a-410f-5b86-ab8b-a296ce4d56bf" + }, + "ownedMemberElementId": "145eda2a-410f-5b86-ab8b-a296ce4d56bf", + "ownedMemberFeature": { + "@id": "145eda2a-410f-5b86-ab8b-a296ce4d56bf" + }, + "ownedMemberName": null, + "ownedMemberParameter": { + "@id": "145eda2a-410f-5b86-ab8b-a296ce4d56bf" + }, + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "145eda2a-410f-5b86-ab8b-a296ce4d56bf" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "069d6128-4cea-50ad-871e-0be8f61eab28" + }, + "owningRelationship": null, + "owningType": { + "@id": "069d6128-4cea-50ad-871e-0be8f61eab28" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "069d6128-4cea-50ad-871e-0be8f61eab28" + }, + { + "@id": "145eda2a-410f-5b86-ab8b-a296ce4d56bf" + } + ], + "shortName": null, + "source": [ + { + "@id": "069d6128-4cea-50ad-871e-0be8f61eab28" + } + ], + "target": [ + { + "@id": "145eda2a-410f-5b86-ab8b-a296ce4d56bf" + } + ], + "textualRepresentation": [], + "visibility": "private" + }, + { + "@id": "145eda2a-410f-5b86-ab8b-a296ce4d56bf", + "@type": "Feature", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "direction": "in", + "documentation": [], + "elementId": "145eda2a-410f-5b86-ab8b-a296ce4d56bf", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "145eda2a-410f-5b86-ab8b-a296ce4d56bf" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isSufficient": false, + "isUnique": true, + "isVariable": false, + "member": [ + { + "@id": "6c377fd8-df1a-520c-b72e-1a679b73a73e" + } + ], + "membership": [ + { + "@id": "0c9c3218-19fa-55b0-b863-e41bb8ad26f8" + } + ], + "multiplicity": null, + "name": null, + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "6c377fd8-df1a-520c-b72e-1a679b73a73e" + } + ], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [ + { + "@id": "6c377fd8-df1a-520c-b72e-1a679b73a73e" + } + ], + "ownedMembership": [ + { + "@id": "0c9c3218-19fa-55b0-b863-e41bb8ad26f8" + } + ], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "0c9c3218-19fa-55b0-b863-e41bb8ad26f8" + } + ], + "ownedSpecialization": [], + "ownedSubsetting": [], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "069d6128-4cea-50ad-871e-0be8f61eab28" + }, + "owningFeatureMembership": { + "@id": "b4a2c714-b418-5f2f-86fc-26e2d0a68919" + }, + "owningMembership": { + "@id": "b4a2c714-b418-5f2f-86fc-26e2d0a68919" + }, + "owningNamespace": { + "@id": "069d6128-4cea-50ad-871e-0be8f61eab28" + }, + "owningRelationship": { + "@id": "b4a2c714-b418-5f2f-86fc-26e2d0a68919" + }, + "owningType": { + "@id": "069d6128-4cea-50ad-871e-0be8f61eab28" + }, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [] + }, + { + "@id": "0c9c3218-19fa-55b0-b863-e41bb8ad26f8", + "@type": "FeatureValue", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "0c9c3218-19fa-55b0-b863-e41bb8ad26f8", + "featureWithValue": { + "@id": "145eda2a-410f-5b86-ab8b-a296ce4d56bf" + }, + "isDefault": false, + "isImplied": false, + "isImpliedIncluded": true, + "isInitial": false, + "isLibraryElement": false, + "memberElement": { + "@id": "6c377fd8-df1a-520c-b72e-1a679b73a73e" + }, + "memberElementId": "6c377fd8-df1a-520c-b72e-1a679b73a73e", + "memberName": null, + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "145eda2a-410f-5b86-ab8b-a296ce4d56bf" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "6c377fd8-df1a-520c-b72e-1a679b73a73e" + }, + "ownedMemberElementId": "6c377fd8-df1a-520c-b72e-1a679b73a73e", + "ownedMemberName": null, + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "6c377fd8-df1a-520c-b72e-1a679b73a73e" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "145eda2a-410f-5b86-ab8b-a296ce4d56bf" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "145eda2a-410f-5b86-ab8b-a296ce4d56bf" + }, + { + "@id": "6c377fd8-df1a-520c-b72e-1a679b73a73e" + } + ], + "shortName": null, + "source": [ + { + "@id": "145eda2a-410f-5b86-ab8b-a296ce4d56bf" + } + ], + "target": [ + { + "@id": "6c377fd8-df1a-520c-b72e-1a679b73a73e" + } + ], + "textualRepresentation": [], + "value": { + "@id": "6c377fd8-df1a-520c-b72e-1a679b73a73e" + }, + "visibility": "public" + }, + { + "@id": "6c377fd8-df1a-520c-b72e-1a679b73a73e", + "@type": "LiteralInteger", + "aliasIds": [], + "behavior": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "direction": null, + "documentation": [], + "elementId": "6c377fd8-df1a-520c-b72e-1a679b73a73e", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "6c377fd8-df1a-520c-b72e-1a679b73a73e" + }, + "featuringType": [], + "function": null, + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isModelLevelEvaluable": true, + "isOrdered": false, + "isPortion": false, + "isSufficient": false, + "isUnique": true, + "isVariable": false, + "member": [], + "membership": [], + "multiplicity": null, + "name": null, + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [], + "ownedSpecialization": [], + "ownedSubsetting": [], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "145eda2a-410f-5b86-ab8b-a296ce4d56bf" + }, + "owningFeatureMembership": null, + "owningMembership": { + "@id": "0c9c3218-19fa-55b0-b863-e41bb8ad26f8" + }, + "owningNamespace": { + "@id": "145eda2a-410f-5b86-ab8b-a296ce4d56bf" + }, + "owningRelationship": { + "@id": "0c9c3218-19fa-55b0-b863-e41bb8ad26f8" + }, + "owningType": null, + "parameter": [], + "qualifiedName": null, + "result": { + "@id": "6c377fd8-df1a-520c-b72e-1a679b73a73e" + }, + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [], + "value": 1 + }, + { + "@id": "6c7132c6-1869-51a7-bef2-17ba0aa84e41", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "6c7132c6-1869-51a7-bef2-17ba0aa84e41", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "e654e8fb-c916-5202-9fb8-31c07e907c29" + }, + "memberElementId": "e654e8fb-c916-5202-9fb8-31c07e907c29", + "memberName": "v", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "41ba6746-fd6d-54c7-bfbc-1519ed9a00cd" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "e654e8fb-c916-5202-9fb8-31c07e907c29" + }, + "ownedMemberElementId": "e654e8fb-c916-5202-9fb8-31c07e907c29", + "ownedMemberName": "v", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "e654e8fb-c916-5202-9fb8-31c07e907c29" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "41ba6746-fd6d-54c7-bfbc-1519ed9a00cd" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "41ba6746-fd6d-54c7-bfbc-1519ed9a00cd" + }, + { + "@id": "e654e8fb-c916-5202-9fb8-31c07e907c29" + } + ], + "shortName": null, + "source": [ + { + "@id": "41ba6746-fd6d-54c7-bfbc-1519ed9a00cd" + } + ], + "target": [ + { + "@id": "e654e8fb-c916-5202-9fb8-31c07e907c29" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "e654e8fb-c916-5202-9fb8-31c07e907c29", + "@type": "PartUsage", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": "v", + "declaredShortName": null, + "definition": [ + { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + } + ], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "e654e8fb-c916-5202-9fb8-31c07e907c29", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "e654e8fb-c916-5202-9fb8-31c07e907c29" + }, + "featuringType": [], + "importedMembership": [], + "individualDefinition": null, + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": true, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "itemDefinition": [ + { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + } + ], + "mayTimeVary": null, + "member": [], + "membership": [], + "multiplicity": null, + "name": "v", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "occurrenceDefinition": [ + { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + } + ], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "81ac951c-13b9-5ca8-ae2f-514103df420b" + } + ], + "ownedSpecialization": [ + { + "@id": "81ac951c-13b9-5ca8-ae2f-514103df420b" + } + ], + "ownedSubsetting": [], + "ownedTypeFeaturing": [], + "ownedTyping": [ + { + "@id": "81ac951c-13b9-5ca8-ae2f-514103df420b" + } + ], + "ownedUnioning": [], + "owner": { + "@id": "41ba6746-fd6d-54c7-bfbc-1519ed9a00cd" + }, + "owningDefinition": null, + "owningFeatureMembership": null, + "owningMembership": { + "@id": "6c7132c6-1869-51a7-bef2-17ba0aa84e41" + }, + "owningNamespace": { + "@id": "41ba6746-fd6d-54c7-bfbc-1519ed9a00cd" + }, + "owningRelationship": { + "@id": "6c7132c6-1869-51a7-bef2-17ba0aa84e41" + }, + "owningType": null, + "owningUsage": null, + "partDefinition": [ + { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + } + ], + "portionKind": null, + "qualifiedName": "Demo::v", + "shortName": null, + "textualRepresentation": [], + "type": [ + { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + } + ], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "81ac951c-13b9-5ca8-ae2f-514103df420b", + "@type": "FeatureTyping", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "81ac951c-13b9-5ca8-ae2f-514103df420b", + "general": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "e654e8fb-c916-5202-9fb8-31c07e907c29" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "e654e8fb-c916-5202-9fb8-31c07e907c29" + }, + "owningRelationship": null, + "owningType": { + "@id": "e654e8fb-c916-5202-9fb8-31c07e907c29" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "e654e8fb-c916-5202-9fb8-31c07e907c29" + }, + { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + } + ], + "shortName": null, + "source": [ + { + "@id": "e654e8fb-c916-5202-9fb8-31c07e907c29" + } + ], + "specific": { + "@id": "e654e8fb-c916-5202-9fb8-31c07e907c29" + }, + "target": [ + { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + } + ], + "textualRepresentation": [], + "type": { + "@id": "ad6f1824-1aac-5411-9735-6059195938de" + }, + "typedFeature": { + "@id": "e654e8fb-c916-5202-9fb8-31c07e907c29" + } + }, + { + "@id": "a15430f8-7da3-5c52-96a9-e7d5c6b17995", + "@type": "ReturnParameterMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "a15430f8-7da3-5c52-96a9-e7d5c6b17995", + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + }, + "memberElementId": "33290348-f6bd-5855-89fc-cfdd6ff953ea", + "memberName": "result", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + }, + "ownedMemberElementId": "33290348-f6bd-5855-89fc-cfdd6ff953ea", + "ownedMemberFeature": { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + }, + "ownedMemberName": "result", + "ownedMemberParameter": { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + }, + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95" + }, + "owningRelationship": null, + "owningType": { + "@id": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95" + }, + { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + } + ], + "shortName": null, + "source": [ + { + "@id": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95" + } + ], + "target": [ + { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea", + "@type": "Feature", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "direction": "out", + "documentation": [], + "elementId": "33290348-f6bd-5855-89fc-cfdd6ff953ea", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isSufficient": false, + "isUnique": true, + "isVariable": false, + "member": [], + "membership": [], + "multiplicity": null, + "name": "result", + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "a2dcc83d-bfea-5766-bbe2-72d10e37be6b" + }, + { + "@id": "ed7e1240-40b7-51d5-b8ef-4cdbbe8053d3" + } + ], + "ownedSpecialization": [ + { + "@id": "a2dcc83d-bfea-5766-bbe2-72d10e37be6b" + } + ], + "ownedSubsetting": [ + { + "@id": "a2dcc83d-bfea-5766-bbe2-72d10e37be6b" + } + ], + "ownedTypeFeaturing": [ + { + "@id": "ed7e1240-40b7-51d5-b8ef-4cdbbe8053d3" + } + ], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95" + }, + "owningFeatureMembership": { + "@id": "a15430f8-7da3-5c52-96a9-e7d5c6b17995" + }, + "owningMembership": { + "@id": "a15430f8-7da3-5c52-96a9-e7d5c6b17995" + }, + "owningNamespace": { + "@id": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95" + }, + "owningRelationship": { + "@id": "a15430f8-7da3-5c52-96a9-e7d5c6b17995" + }, + "owningType": { + "@id": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95" + }, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [] + }, + { + "@id": "a2dcc83d-bfea-5766-bbe2-72d10e37be6b", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "a2dcc83d-bfea-5766-bbe2-72d10e37be6b", + "general": { + "@id": "97792196-6134-52ec-a21b-b518697e0ae9" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + }, + "owningRelationship": null, + "owningType": { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + }, + { + "@id": "97792196-6134-52ec-a21b-b518697e0ae9" + } + ], + "shortName": null, + "source": [ + { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + } + ], + "specific": { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + }, + "subsettedFeature": { + "@id": "97792196-6134-52ec-a21b-b518697e0ae9" + }, + "subsettingFeature": { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + }, + "target": [ + { + "@id": "97792196-6134-52ec-a21b-b518697e0ae9" + } + ], + "textualRepresentation": [] + }, + { + "@id": "ed7e1240-40b7-51d5-b8ef-4cdbbe8053d3", + "@type": "TypeFeaturing", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "ed7e1240-40b7-51d5-b8ef-4cdbbe8053d3", + "featureOfType": { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + }, + "featuringType": { + "@id": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeatureOfType": { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + }, + { + "@id": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95" + } + ], + "shortName": null, + "source": [ + { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + } + ], + "target": [ + { + "@id": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95" + } + ], + "textualRepresentation": [] + }, + { + "@id": "c407a02c-8f34-5850-8210-ffce76da2658", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "c407a02c-8f34-5850-8210-ffce76da2658", + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "b2c73881-e0c8-561c-942c-e501beb0caad" + }, + "memberElementId": "b2c73881-e0c8-561c-942c-e501beb0caad", + "memberName": null, + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "b2c73881-e0c8-561c-942c-e501beb0caad" + }, + "ownedMemberElementId": "b2c73881-e0c8-561c-942c-e501beb0caad", + "ownedMemberName": null, + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "b2c73881-e0c8-561c-942c-e501beb0caad" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95" + }, + { + "@id": "b2c73881-e0c8-561c-942c-e501beb0caad" + } + ], + "shortName": null, + "source": [ + { + "@id": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95" + } + ], + "target": [ + { + "@id": "b2c73881-e0c8-561c-942c-e501beb0caad" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "b2c73881-e0c8-561c-942c-e501beb0caad", + "@type": "BindingConnector", + "aliasIds": [], + "association": [], + "chainingFeature": [], + "connectorEnd": [ + { + "@id": "5741743d-ad5b-59b9-ac2b-bbc53899270d" + }, + { + "@id": "18e9ab29-df75-560e-84d9-14a6679b93c7" + } + ], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "defaultFeaturingType": null, + "differencingType": [], + "directedFeature": [], + "direction": null, + "documentation": [], + "elementId": "b2c73881-e0c8-561c-942c-e501beb0caad", + "endFeature": [ + { + "@id": "5741743d-ad5b-59b9-ac2b-bbc53899270d" + }, + { + "@id": "18e9ab29-df75-560e-84d9-14a6679b93c7" + } + ], + "endOwningType": null, + "feature": [ + { + "@id": "5741743d-ad5b-59b9-ac2b-bbc53899270d" + }, + { + "@id": "18e9ab29-df75-560e-84d9-14a6679b93c7" + } + ], + "featureMembership": [ + { + "@id": "1453274a-3586-5f98-95fb-cae84f792294" + }, + { + "@id": "c7697452-a2c5-5676-99fb-3e8cfc808608" + } + ], + "featureTarget": { + "@id": "b2c73881-e0c8-561c-942c-e501beb0caad" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isSufficient": false, + "isUnique": true, + "isVariable": false, + "member": [ + { + "@id": "5741743d-ad5b-59b9-ac2b-bbc53899270d" + }, + { + "@id": "18e9ab29-df75-560e-84d9-14a6679b93c7" + } + ], + "membership": [ + { + "@id": "1453274a-3586-5f98-95fb-cae84f792294" + }, + { + "@id": "c7697452-a2c5-5676-99fb-3e8cfc808608" + } + ], + "multiplicity": null, + "name": null, + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "5741743d-ad5b-59b9-ac2b-bbc53899270d" + }, + { + "@id": "18e9ab29-df75-560e-84d9-14a6679b93c7" + } + ], + "ownedEndFeature": [ + { + "@id": "5741743d-ad5b-59b9-ac2b-bbc53899270d" + }, + { + "@id": "18e9ab29-df75-560e-84d9-14a6679b93c7" + } + ], + "ownedFeature": [ + { + "@id": "5741743d-ad5b-59b9-ac2b-bbc53899270d" + }, + { + "@id": "18e9ab29-df75-560e-84d9-14a6679b93c7" + } + ], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [ + { + "@id": "1453274a-3586-5f98-95fb-cae84f792294" + }, + { + "@id": "c7697452-a2c5-5676-99fb-3e8cfc808608" + } + ], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [ + { + "@id": "5741743d-ad5b-59b9-ac2b-bbc53899270d" + }, + { + "@id": "18e9ab29-df75-560e-84d9-14a6679b93c7" + } + ], + "ownedMembership": [ + { + "@id": "1453274a-3586-5f98-95fb-cae84f792294" + }, + { + "@id": "c7697452-a2c5-5676-99fb-3e8cfc808608" + } + ], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelatedElement": [], + "ownedRelationship": [ + { + "@id": "1453274a-3586-5f98-95fb-cae84f792294" + }, + { + "@id": "c7697452-a2c5-5676-99fb-3e8cfc808608" + } + ], + "ownedSpecialization": [], + "ownedSubsetting": [], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95" + }, + "owningFeatureMembership": null, + "owningMembership": { + "@id": "c407a02c-8f34-5850-8210-ffce76da2658" + }, + "owningNamespace": { + "@id": "2fd0b7b3-d1b6-57bd-ab70-9dbccc816c95" + }, + "owningRelatedElement": null, + "owningRelationship": { + "@id": "c407a02c-8f34-5850-8210-ffce76da2658" + }, + "owningType": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "97792196-6134-52ec-a21b-b518697e0ae9" + }, + { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + } + ], + "relatedFeature": [ + { + "@id": "97792196-6134-52ec-a21b-b518697e0ae9" + }, + { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + } + ], + "shortName": null, + "source": [ + { + "@id": "97792196-6134-52ec-a21b-b518697e0ae9" + } + ], + "sourceFeature": { + "@id": "97792196-6134-52ec-a21b-b518697e0ae9" + }, + "target": [ + { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + } + ], + "targetFeature": [ + { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + } + ], + "textualRepresentation": [], + "type": [], + "unioningType": [] + }, + { + "@id": "1453274a-3586-5f98-95fb-cae84f792294", + "@type": "EndFeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "1453274a-3586-5f98-95fb-cae84f792294", + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "5741743d-ad5b-59b9-ac2b-bbc53899270d" + }, + "memberElementId": "5741743d-ad5b-59b9-ac2b-bbc53899270d", + "memberName": "thisThing", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "b2c73881-e0c8-561c-942c-e501beb0caad" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "5741743d-ad5b-59b9-ac2b-bbc53899270d" + }, + "ownedMemberElementId": "5741743d-ad5b-59b9-ac2b-bbc53899270d", + "ownedMemberFeature": { + "@id": "5741743d-ad5b-59b9-ac2b-bbc53899270d" + }, + "ownedMemberName": "thisThing", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "5741743d-ad5b-59b9-ac2b-bbc53899270d" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "b2c73881-e0c8-561c-942c-e501beb0caad" + }, + "owningRelationship": null, + "owningType": { + "@id": "b2c73881-e0c8-561c-942c-e501beb0caad" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "b2c73881-e0c8-561c-942c-e501beb0caad" + }, + { + "@id": "5741743d-ad5b-59b9-ac2b-bbc53899270d" + } + ], + "shortName": null, + "source": [ + { + "@id": "b2c73881-e0c8-561c-942c-e501beb0caad" + } + ], + "target": [ + { + "@id": "5741743d-ad5b-59b9-ac2b-bbc53899270d" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "5741743d-ad5b-59b9-ac2b-bbc53899270d", + "@type": "Feature", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "direction": null, + "documentation": [], + "elementId": "5741743d-ad5b-59b9-ac2b-bbc53899270d", + "endFeature": [], + "endOwningType": { + "@id": "b2c73881-e0c8-561c-942c-e501beb0caad" + }, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "5741743d-ad5b-59b9-ac2b-bbc53899270d" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isSufficient": false, + "isUnique": true, + "isVariable": false, + "member": [], + "membership": [], + "multiplicity": null, + "name": "thisThing", + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": { + "@id": "3941ce64-d7b3-5cd0-ba1b-e5010f00d415" + }, + "ownedRelationship": [ + { + "@id": "3941ce64-d7b3-5cd0-ba1b-e5010f00d415" + }, + { + "@id": "5967a1b5-b760-5328-aa11-f34325255159" + } + ], + "ownedSpecialization": [ + { + "@id": "3941ce64-d7b3-5cd0-ba1b-e5010f00d415" + } + ], + "ownedSubsetting": [ + { + "@id": "3941ce64-d7b3-5cd0-ba1b-e5010f00d415" + } + ], + "ownedTypeFeaturing": [ + { + "@id": "5967a1b5-b760-5328-aa11-f34325255159" + } + ], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "b2c73881-e0c8-561c-942c-e501beb0caad" + }, + "owningFeatureMembership": { + "@id": "1453274a-3586-5f98-95fb-cae84f792294" + }, + "owningMembership": { + "@id": "1453274a-3586-5f98-95fb-cae84f792294" + }, + "owningNamespace": { + "@id": "b2c73881-e0c8-561c-942c-e501beb0caad" + }, + "owningRelationship": { + "@id": "1453274a-3586-5f98-95fb-cae84f792294" + }, + "owningType": { + "@id": "b2c73881-e0c8-561c-942c-e501beb0caad" + }, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [] + }, + { + "@id": "3941ce64-d7b3-5cd0-ba1b-e5010f00d415", + "@type": "ReferenceSubsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "3941ce64-d7b3-5cd0-ba1b-e5010f00d415", + "general": { + "@id": "97792196-6134-52ec-a21b-b518697e0ae9" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "5741743d-ad5b-59b9-ac2b-bbc53899270d" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "5741743d-ad5b-59b9-ac2b-bbc53899270d" + }, + "owningRelationship": null, + "owningType": { + "@id": "5741743d-ad5b-59b9-ac2b-bbc53899270d" + }, + "qualifiedName": null, + "referencedFeature": { + "@id": "97792196-6134-52ec-a21b-b518697e0ae9" + }, + "referencingFeature": { + "@id": "5741743d-ad5b-59b9-ac2b-bbc53899270d" + }, + "relatedElement": [ + { + "@id": "5741743d-ad5b-59b9-ac2b-bbc53899270d" + }, + { + "@id": "97792196-6134-52ec-a21b-b518697e0ae9" + } + ], + "shortName": null, + "source": [ + { + "@id": "5741743d-ad5b-59b9-ac2b-bbc53899270d" + } + ], + "specific": { + "@id": "5741743d-ad5b-59b9-ac2b-bbc53899270d" + }, + "subsettedFeature": { + "@id": "97792196-6134-52ec-a21b-b518697e0ae9" + }, + "subsettingFeature": { + "@id": "5741743d-ad5b-59b9-ac2b-bbc53899270d" + }, + "target": [ + { + "@id": "97792196-6134-52ec-a21b-b518697e0ae9" + } + ], + "textualRepresentation": [] + }, + { + "@id": "5967a1b5-b760-5328-aa11-f34325255159", + "@type": "TypeFeaturing", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "5967a1b5-b760-5328-aa11-f34325255159", + "featureOfType": { + "@id": "5741743d-ad5b-59b9-ac2b-bbc53899270d" + }, + "featuringType": { + "@id": "b2c73881-e0c8-561c-942c-e501beb0caad" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeatureOfType": { + "@id": "5741743d-ad5b-59b9-ac2b-bbc53899270d" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "5741743d-ad5b-59b9-ac2b-bbc53899270d" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "5741743d-ad5b-59b9-ac2b-bbc53899270d" + }, + { + "@id": "b2c73881-e0c8-561c-942c-e501beb0caad" + } + ], + "shortName": null, + "source": [ + { + "@id": "5741743d-ad5b-59b9-ac2b-bbc53899270d" + } + ], + "target": [ + { + "@id": "b2c73881-e0c8-561c-942c-e501beb0caad" + } + ], + "textualRepresentation": [] + }, + { + "@id": "c7697452-a2c5-5676-99fb-3e8cfc808608", + "@type": "EndFeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "c7697452-a2c5-5676-99fb-3e8cfc808608", + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "18e9ab29-df75-560e-84d9-14a6679b93c7" + }, + "memberElementId": "18e9ab29-df75-560e-84d9-14a6679b93c7", + "memberName": "sameThing", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "b2c73881-e0c8-561c-942c-e501beb0caad" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "18e9ab29-df75-560e-84d9-14a6679b93c7" + }, + "ownedMemberElementId": "18e9ab29-df75-560e-84d9-14a6679b93c7", + "ownedMemberFeature": { + "@id": "18e9ab29-df75-560e-84d9-14a6679b93c7" + }, + "ownedMemberName": "sameThing", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "18e9ab29-df75-560e-84d9-14a6679b93c7" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "b2c73881-e0c8-561c-942c-e501beb0caad" + }, + "owningRelationship": null, + "owningType": { + "@id": "b2c73881-e0c8-561c-942c-e501beb0caad" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "b2c73881-e0c8-561c-942c-e501beb0caad" + }, + { + "@id": "18e9ab29-df75-560e-84d9-14a6679b93c7" + } + ], + "shortName": null, + "source": [ + { + "@id": "b2c73881-e0c8-561c-942c-e501beb0caad" + } + ], + "target": [ + { + "@id": "18e9ab29-df75-560e-84d9-14a6679b93c7" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "18e9ab29-df75-560e-84d9-14a6679b93c7", + "@type": "Feature", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "direction": null, + "documentation": [], + "elementId": "18e9ab29-df75-560e-84d9-14a6679b93c7", + "endFeature": [], + "endOwningType": { + "@id": "b2c73881-e0c8-561c-942c-e501beb0caad" + }, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "18e9ab29-df75-560e-84d9-14a6679b93c7" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isSufficient": false, + "isUnique": true, + "isVariable": false, + "member": [], + "membership": [], + "multiplicity": null, + "name": "sameThing", + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": { + "@id": "f9c66178-3639-503f-97de-4b77f5eafe4e" + }, + "ownedRelationship": [ + { + "@id": "f9c66178-3639-503f-97de-4b77f5eafe4e" + }, + { + "@id": "f02bd7bb-0f9a-574a-a68c-27012130f739" + } + ], + "ownedSpecialization": [ + { + "@id": "f9c66178-3639-503f-97de-4b77f5eafe4e" + } + ], + "ownedSubsetting": [ + { + "@id": "f9c66178-3639-503f-97de-4b77f5eafe4e" + } + ], + "ownedTypeFeaturing": [ + { + "@id": "f02bd7bb-0f9a-574a-a68c-27012130f739" + } + ], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "b2c73881-e0c8-561c-942c-e501beb0caad" + }, + "owningFeatureMembership": { + "@id": "c7697452-a2c5-5676-99fb-3e8cfc808608" + }, + "owningMembership": { + "@id": "c7697452-a2c5-5676-99fb-3e8cfc808608" + }, + "owningNamespace": { + "@id": "b2c73881-e0c8-561c-942c-e501beb0caad" + }, + "owningRelationship": { + "@id": "c7697452-a2c5-5676-99fb-3e8cfc808608" + }, + "owningType": { + "@id": "b2c73881-e0c8-561c-942c-e501beb0caad" + }, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [] + }, + { + "@id": "f9c66178-3639-503f-97de-4b77f5eafe4e", + "@type": "ReferenceSubsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "f9c66178-3639-503f-97de-4b77f5eafe4e", + "general": { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "18e9ab29-df75-560e-84d9-14a6679b93c7" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "18e9ab29-df75-560e-84d9-14a6679b93c7" + }, + "owningRelationship": null, + "owningType": { + "@id": "18e9ab29-df75-560e-84d9-14a6679b93c7" + }, + "qualifiedName": null, + "referencedFeature": { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + }, + "referencingFeature": { + "@id": "18e9ab29-df75-560e-84d9-14a6679b93c7" + }, + "relatedElement": [ + { + "@id": "18e9ab29-df75-560e-84d9-14a6679b93c7" + }, + { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + } + ], + "shortName": null, + "source": [ + { + "@id": "18e9ab29-df75-560e-84d9-14a6679b93c7" + } + ], + "specific": { + "@id": "18e9ab29-df75-560e-84d9-14a6679b93c7" + }, + "subsettedFeature": { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + }, + "subsettingFeature": { + "@id": "18e9ab29-df75-560e-84d9-14a6679b93c7" + }, + "target": [ + { + "@id": "33290348-f6bd-5855-89fc-cfdd6ff953ea" + } + ], + "textualRepresentation": [] + }, + { + "@id": "f02bd7bb-0f9a-574a-a68c-27012130f739", + "@type": "TypeFeaturing", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "f02bd7bb-0f9a-574a-a68c-27012130f739", + "featureOfType": { + "@id": "18e9ab29-df75-560e-84d9-14a6679b93c7" + }, + "featuringType": { + "@id": "b2c73881-e0c8-561c-942c-e501beb0caad" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeatureOfType": { + "@id": "18e9ab29-df75-560e-84d9-14a6679b93c7" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "18e9ab29-df75-560e-84d9-14a6679b93c7" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "18e9ab29-df75-560e-84d9-14a6679b93c7" + }, + { + "@id": "b2c73881-e0c8-561c-942c-e501beb0caad" + } + ], + "shortName": null, + "source": [ + { + "@id": "18e9ab29-df75-560e-84d9-14a6679b93c7" + } + ], + "target": [ + { + "@id": "b2c73881-e0c8-561c-942c-e501beb0caad" + } + ], + "textualRepresentation": [] + }, + { + "@id": "38930d49-5a3f-5436-a749-5ea0ee8668ef", + "@type": "ReturnParameterMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "38930d49-5a3f-5436-a749-5ea0ee8668ef", + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + }, + "memberElementId": "d1c72cc5-6726-548c-a08f-8c856be64f71", + "memberName": "result", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "194e4d05-8812-5619-aaa2-06d4a3680e3a" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + }, + "ownedMemberElementId": "d1c72cc5-6726-548c-a08f-8c856be64f71", + "ownedMemberFeature": { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + }, + "ownedMemberName": "result", + "ownedMemberParameter": { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + }, + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "194e4d05-8812-5619-aaa2-06d4a3680e3a" + }, + "owningRelationship": null, + "owningType": { + "@id": "194e4d05-8812-5619-aaa2-06d4a3680e3a" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "194e4d05-8812-5619-aaa2-06d4a3680e3a" + }, + { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + } + ], + "shortName": null, + "source": [ + { + "@id": "194e4d05-8812-5619-aaa2-06d4a3680e3a" + } + ], + "target": [ + { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71", + "@type": "Feature", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "direction": "out", + "documentation": [], + "elementId": "d1c72cc5-6726-548c-a08f-8c856be64f71", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isSufficient": false, + "isUnique": true, + "isVariable": false, + "member": [], + "membership": [], + "multiplicity": null, + "name": "result", + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "4c9cac68-9b27-5319-965a-4834c76619c7" + }, + { + "@id": "810d3723-3350-54bb-b11d-4448cd2e6be7" + } + ], + "ownedSpecialization": [ + { + "@id": "4c9cac68-9b27-5319-965a-4834c76619c7" + } + ], + "ownedSubsetting": [ + { + "@id": "4c9cac68-9b27-5319-965a-4834c76619c7" + } + ], + "ownedTypeFeaturing": [ + { + "@id": "810d3723-3350-54bb-b11d-4448cd2e6be7" + } + ], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "194e4d05-8812-5619-aaa2-06d4a3680e3a" + }, + "owningFeatureMembership": { + "@id": "38930d49-5a3f-5436-a749-5ea0ee8668ef" + }, + "owningMembership": { + "@id": "38930d49-5a3f-5436-a749-5ea0ee8668ef" + }, + "owningNamespace": { + "@id": "194e4d05-8812-5619-aaa2-06d4a3680e3a" + }, + "owningRelationship": { + "@id": "38930d49-5a3f-5436-a749-5ea0ee8668ef" + }, + "owningType": { + "@id": "194e4d05-8812-5619-aaa2-06d4a3680e3a" + }, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [] + }, + { + "@id": "4c9cac68-9b27-5319-965a-4834c76619c7", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "4c9cac68-9b27-5319-965a-4834c76619c7", + "general": { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + }, + "owningRelationship": null, + "owningType": { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + }, + { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + } + ], + "shortName": null, + "source": [ + { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + } + ], + "specific": { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + }, + "subsettedFeature": { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + }, + "subsettingFeature": { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + }, + "target": [ + { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + } + ], + "textualRepresentation": [] + }, + { + "@id": "810d3723-3350-54bb-b11d-4448cd2e6be7", + "@type": "TypeFeaturing", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "810d3723-3350-54bb-b11d-4448cd2e6be7", + "featureOfType": { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + }, + "featuringType": { + "@id": "194e4d05-8812-5619-aaa2-06d4a3680e3a" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeatureOfType": { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + }, + { + "@id": "194e4d05-8812-5619-aaa2-06d4a3680e3a" + } + ], + "shortName": null, + "source": [ + { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + } + ], + "target": [ + { + "@id": "194e4d05-8812-5619-aaa2-06d4a3680e3a" + } + ], + "textualRepresentation": [] + }, + { + "@id": "d8724770-1f07-5b54-83e6-f7ebc56ada57", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "d8724770-1f07-5b54-83e6-f7ebc56ada57", + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "3212075d-1f66-5781-aba0-bc1ae2fb36ff" + }, + "memberElementId": "3212075d-1f66-5781-aba0-bc1ae2fb36ff", + "memberName": null, + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "194e4d05-8812-5619-aaa2-06d4a3680e3a" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "3212075d-1f66-5781-aba0-bc1ae2fb36ff" + }, + "ownedMemberElementId": "3212075d-1f66-5781-aba0-bc1ae2fb36ff", + "ownedMemberName": null, + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "3212075d-1f66-5781-aba0-bc1ae2fb36ff" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "194e4d05-8812-5619-aaa2-06d4a3680e3a" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "194e4d05-8812-5619-aaa2-06d4a3680e3a" + }, + { + "@id": "3212075d-1f66-5781-aba0-bc1ae2fb36ff" + } + ], + "shortName": null, + "source": [ + { + "@id": "194e4d05-8812-5619-aaa2-06d4a3680e3a" + } + ], + "target": [ + { + "@id": "3212075d-1f66-5781-aba0-bc1ae2fb36ff" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "3212075d-1f66-5781-aba0-bc1ae2fb36ff", + "@type": "BindingConnector", + "aliasIds": [], + "association": [], + "chainingFeature": [], + "connectorEnd": [ + { + "@id": "abf74499-4cb9-58d2-a324-1624000dc9ab" + }, + { + "@id": "f77edfbc-6d87-5106-ad4f-f1d43f0af7c9" + } + ], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "defaultFeaturingType": null, + "differencingType": [], + "directedFeature": [], + "direction": null, + "documentation": [], + "elementId": "3212075d-1f66-5781-aba0-bc1ae2fb36ff", + "endFeature": [ + { + "@id": "abf74499-4cb9-58d2-a324-1624000dc9ab" + }, + { + "@id": "f77edfbc-6d87-5106-ad4f-f1d43f0af7c9" + } + ], + "endOwningType": null, + "feature": [ + { + "@id": "abf74499-4cb9-58d2-a324-1624000dc9ab" + }, + { + "@id": "f77edfbc-6d87-5106-ad4f-f1d43f0af7c9" + } + ], + "featureMembership": [ + { + "@id": "5e81e92c-1411-596f-987c-880d9ea3e26a" + }, + { + "@id": "6a94b723-e9b9-599c-acde-e82b94e950c6" + } + ], + "featureTarget": { + "@id": "3212075d-1f66-5781-aba0-bc1ae2fb36ff" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isSufficient": false, + "isUnique": true, + "isVariable": false, + "member": [ + { + "@id": "abf74499-4cb9-58d2-a324-1624000dc9ab" + }, + { + "@id": "f77edfbc-6d87-5106-ad4f-f1d43f0af7c9" + } + ], + "membership": [ + { + "@id": "5e81e92c-1411-596f-987c-880d9ea3e26a" + }, + { + "@id": "6a94b723-e9b9-599c-acde-e82b94e950c6" + } + ], + "multiplicity": null, + "name": null, + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "abf74499-4cb9-58d2-a324-1624000dc9ab" + }, + { + "@id": "f77edfbc-6d87-5106-ad4f-f1d43f0af7c9" + } + ], + "ownedEndFeature": [ + { + "@id": "abf74499-4cb9-58d2-a324-1624000dc9ab" + }, + { + "@id": "f77edfbc-6d87-5106-ad4f-f1d43f0af7c9" + } + ], + "ownedFeature": [ + { + "@id": "abf74499-4cb9-58d2-a324-1624000dc9ab" + }, + { + "@id": "f77edfbc-6d87-5106-ad4f-f1d43f0af7c9" + } + ], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [ + { + "@id": "5e81e92c-1411-596f-987c-880d9ea3e26a" + }, + { + "@id": "6a94b723-e9b9-599c-acde-e82b94e950c6" + } + ], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [ + { + "@id": "abf74499-4cb9-58d2-a324-1624000dc9ab" + }, + { + "@id": "f77edfbc-6d87-5106-ad4f-f1d43f0af7c9" + } + ], + "ownedMembership": [ + { + "@id": "5e81e92c-1411-596f-987c-880d9ea3e26a" + }, + { + "@id": "6a94b723-e9b9-599c-acde-e82b94e950c6" + } + ], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelatedElement": [], + "ownedRelationship": [ + { + "@id": "5e81e92c-1411-596f-987c-880d9ea3e26a" + }, + { + "@id": "6a94b723-e9b9-599c-acde-e82b94e950c6" + } + ], + "ownedSpecialization": [], + "ownedSubsetting": [], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "194e4d05-8812-5619-aaa2-06d4a3680e3a" + }, + "owningFeatureMembership": null, + "owningMembership": { + "@id": "d8724770-1f07-5b54-83e6-f7ebc56ada57" + }, + "owningNamespace": { + "@id": "194e4d05-8812-5619-aaa2-06d4a3680e3a" + }, + "owningRelatedElement": null, + "owningRelationship": { + "@id": "d8724770-1f07-5b54-83e6-f7ebc56ada57" + }, + "owningType": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + }, + { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + } + ], + "relatedFeature": [ + { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + }, + { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + } + ], + "shortName": null, + "source": [ + { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + } + ], + "sourceFeature": { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + }, + "target": [ + { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + } + ], + "targetFeature": [ + { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + } + ], + "textualRepresentation": [], + "type": [], + "unioningType": [] + }, + { + "@id": "5e81e92c-1411-596f-987c-880d9ea3e26a", + "@type": "EndFeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "5e81e92c-1411-596f-987c-880d9ea3e26a", + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "abf74499-4cb9-58d2-a324-1624000dc9ab" + }, + "memberElementId": "abf74499-4cb9-58d2-a324-1624000dc9ab", + "memberName": "thisThing", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "3212075d-1f66-5781-aba0-bc1ae2fb36ff" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "abf74499-4cb9-58d2-a324-1624000dc9ab" + }, + "ownedMemberElementId": "abf74499-4cb9-58d2-a324-1624000dc9ab", + "ownedMemberFeature": { + "@id": "abf74499-4cb9-58d2-a324-1624000dc9ab" + }, + "ownedMemberName": "thisThing", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "abf74499-4cb9-58d2-a324-1624000dc9ab" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "3212075d-1f66-5781-aba0-bc1ae2fb36ff" + }, + "owningRelationship": null, + "owningType": { + "@id": "3212075d-1f66-5781-aba0-bc1ae2fb36ff" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "3212075d-1f66-5781-aba0-bc1ae2fb36ff" + }, + { + "@id": "abf74499-4cb9-58d2-a324-1624000dc9ab" + } + ], + "shortName": null, + "source": [ + { + "@id": "3212075d-1f66-5781-aba0-bc1ae2fb36ff" + } + ], + "target": [ + { + "@id": "abf74499-4cb9-58d2-a324-1624000dc9ab" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "abf74499-4cb9-58d2-a324-1624000dc9ab", + "@type": "Feature", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "direction": null, + "documentation": [], + "elementId": "abf74499-4cb9-58d2-a324-1624000dc9ab", + "endFeature": [], + "endOwningType": { + "@id": "3212075d-1f66-5781-aba0-bc1ae2fb36ff" + }, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "abf74499-4cb9-58d2-a324-1624000dc9ab" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isSufficient": false, + "isUnique": true, + "isVariable": false, + "member": [], + "membership": [], + "multiplicity": null, + "name": "thisThing", + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": { + "@id": "6de4760d-28f8-5ae2-8146-63a89fe58c16" + }, + "ownedRelationship": [ + { + "@id": "6de4760d-28f8-5ae2-8146-63a89fe58c16" + }, + { + "@id": "03fbb103-3063-568b-9798-7162a1cef90c" + } + ], + "ownedSpecialization": [ + { + "@id": "6de4760d-28f8-5ae2-8146-63a89fe58c16" + } + ], + "ownedSubsetting": [ + { + "@id": "6de4760d-28f8-5ae2-8146-63a89fe58c16" + } + ], + "ownedTypeFeaturing": [ + { + "@id": "03fbb103-3063-568b-9798-7162a1cef90c" + } + ], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "3212075d-1f66-5781-aba0-bc1ae2fb36ff" + }, + "owningFeatureMembership": { + "@id": "5e81e92c-1411-596f-987c-880d9ea3e26a" + }, + "owningMembership": { + "@id": "5e81e92c-1411-596f-987c-880d9ea3e26a" + }, + "owningNamespace": { + "@id": "3212075d-1f66-5781-aba0-bc1ae2fb36ff" + }, + "owningRelationship": { + "@id": "5e81e92c-1411-596f-987c-880d9ea3e26a" + }, + "owningType": { + "@id": "3212075d-1f66-5781-aba0-bc1ae2fb36ff" + }, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [] + }, + { + "@id": "6de4760d-28f8-5ae2-8146-63a89fe58c16", + "@type": "ReferenceSubsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "6de4760d-28f8-5ae2-8146-63a89fe58c16", + "general": { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "abf74499-4cb9-58d2-a324-1624000dc9ab" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "abf74499-4cb9-58d2-a324-1624000dc9ab" + }, + "owningRelationship": null, + "owningType": { + "@id": "abf74499-4cb9-58d2-a324-1624000dc9ab" + }, + "qualifiedName": null, + "referencedFeature": { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + }, + "referencingFeature": { + "@id": "abf74499-4cb9-58d2-a324-1624000dc9ab" + }, + "relatedElement": [ + { + "@id": "abf74499-4cb9-58d2-a324-1624000dc9ab" + }, + { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + } + ], + "shortName": null, + "source": [ + { + "@id": "abf74499-4cb9-58d2-a324-1624000dc9ab" + } + ], + "specific": { + "@id": "abf74499-4cb9-58d2-a324-1624000dc9ab" + }, + "subsettedFeature": { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + }, + "subsettingFeature": { + "@id": "abf74499-4cb9-58d2-a324-1624000dc9ab" + }, + "target": [ + { + "@id": "4d296856-56cf-54fe-af9d-f911a1632d55" + } + ], + "textualRepresentation": [] + }, + { + "@id": "03fbb103-3063-568b-9798-7162a1cef90c", + "@type": "TypeFeaturing", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "03fbb103-3063-568b-9798-7162a1cef90c", + "featureOfType": { + "@id": "abf74499-4cb9-58d2-a324-1624000dc9ab" + }, + "featuringType": { + "@id": "3212075d-1f66-5781-aba0-bc1ae2fb36ff" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeatureOfType": { + "@id": "abf74499-4cb9-58d2-a324-1624000dc9ab" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "abf74499-4cb9-58d2-a324-1624000dc9ab" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "abf74499-4cb9-58d2-a324-1624000dc9ab" + }, + { + "@id": "3212075d-1f66-5781-aba0-bc1ae2fb36ff" + } + ], + "shortName": null, + "source": [ + { + "@id": "abf74499-4cb9-58d2-a324-1624000dc9ab" + } + ], + "target": [ + { + "@id": "3212075d-1f66-5781-aba0-bc1ae2fb36ff" + } + ], + "textualRepresentation": [] + }, + { + "@id": "6a94b723-e9b9-599c-acde-e82b94e950c6", + "@type": "EndFeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "6a94b723-e9b9-599c-acde-e82b94e950c6", + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "f77edfbc-6d87-5106-ad4f-f1d43f0af7c9" + }, + "memberElementId": "f77edfbc-6d87-5106-ad4f-f1d43f0af7c9", + "memberName": "sameThing", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "3212075d-1f66-5781-aba0-bc1ae2fb36ff" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "f77edfbc-6d87-5106-ad4f-f1d43f0af7c9" + }, + "ownedMemberElementId": "f77edfbc-6d87-5106-ad4f-f1d43f0af7c9", + "ownedMemberFeature": { + "@id": "f77edfbc-6d87-5106-ad4f-f1d43f0af7c9" + }, + "ownedMemberName": "sameThing", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "f77edfbc-6d87-5106-ad4f-f1d43f0af7c9" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "3212075d-1f66-5781-aba0-bc1ae2fb36ff" + }, + "owningRelationship": null, + "owningType": { + "@id": "3212075d-1f66-5781-aba0-bc1ae2fb36ff" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "3212075d-1f66-5781-aba0-bc1ae2fb36ff" + }, + { + "@id": "f77edfbc-6d87-5106-ad4f-f1d43f0af7c9" + } + ], + "shortName": null, + "source": [ + { + "@id": "3212075d-1f66-5781-aba0-bc1ae2fb36ff" + } + ], + "target": [ + { + "@id": "f77edfbc-6d87-5106-ad4f-f1d43f0af7c9" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "f77edfbc-6d87-5106-ad4f-f1d43f0af7c9", + "@type": "Feature", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "direction": null, + "documentation": [], + "elementId": "f77edfbc-6d87-5106-ad4f-f1d43f0af7c9", + "endFeature": [], + "endOwningType": { + "@id": "3212075d-1f66-5781-aba0-bc1ae2fb36ff" + }, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "f77edfbc-6d87-5106-ad4f-f1d43f0af7c9" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isSufficient": false, + "isUnique": true, + "isVariable": false, + "member": [], + "membership": [], + "multiplicity": null, + "name": "sameThing", + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": { + "@id": "9d94f423-cc8d-5397-b293-bf12dc90130e" + }, + "ownedRelationship": [ + { + "@id": "9d94f423-cc8d-5397-b293-bf12dc90130e" + }, + { + "@id": "b1985c15-7422-5945-81d8-0279c483d126" + } + ], + "ownedSpecialization": [ + { + "@id": "9d94f423-cc8d-5397-b293-bf12dc90130e" + } + ], + "ownedSubsetting": [ + { + "@id": "9d94f423-cc8d-5397-b293-bf12dc90130e" + } + ], + "ownedTypeFeaturing": [ + { + "@id": "b1985c15-7422-5945-81d8-0279c483d126" + } + ], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "3212075d-1f66-5781-aba0-bc1ae2fb36ff" + }, + "owningFeatureMembership": { + "@id": "6a94b723-e9b9-599c-acde-e82b94e950c6" + }, + "owningMembership": { + "@id": "6a94b723-e9b9-599c-acde-e82b94e950c6" + }, + "owningNamespace": { + "@id": "3212075d-1f66-5781-aba0-bc1ae2fb36ff" + }, + "owningRelationship": { + "@id": "6a94b723-e9b9-599c-acde-e82b94e950c6" + }, + "owningType": { + "@id": "3212075d-1f66-5781-aba0-bc1ae2fb36ff" + }, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [] + }, + { + "@id": "9d94f423-cc8d-5397-b293-bf12dc90130e", + "@type": "ReferenceSubsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "9d94f423-cc8d-5397-b293-bf12dc90130e", + "general": { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "f77edfbc-6d87-5106-ad4f-f1d43f0af7c9" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "f77edfbc-6d87-5106-ad4f-f1d43f0af7c9" + }, + "owningRelationship": null, + "owningType": { + "@id": "f77edfbc-6d87-5106-ad4f-f1d43f0af7c9" + }, + "qualifiedName": null, + "referencedFeature": { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + }, + "referencingFeature": { + "@id": "f77edfbc-6d87-5106-ad4f-f1d43f0af7c9" + }, + "relatedElement": [ + { + "@id": "f77edfbc-6d87-5106-ad4f-f1d43f0af7c9" + }, + { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + } + ], + "shortName": null, + "source": [ + { + "@id": "f77edfbc-6d87-5106-ad4f-f1d43f0af7c9" + } + ], + "specific": { + "@id": "f77edfbc-6d87-5106-ad4f-f1d43f0af7c9" + }, + "subsettedFeature": { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + }, + "subsettingFeature": { + "@id": "f77edfbc-6d87-5106-ad4f-f1d43f0af7c9" + }, + "target": [ + { + "@id": "d1c72cc5-6726-548c-a08f-8c856be64f71" + } + ], + "textualRepresentation": [] + }, + { + "@id": "b1985c15-7422-5945-81d8-0279c483d126", + "@type": "TypeFeaturing", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "b1985c15-7422-5945-81d8-0279c483d126", + "featureOfType": { + "@id": "f77edfbc-6d87-5106-ad4f-f1d43f0af7c9" + }, + "featuringType": { + "@id": "3212075d-1f66-5781-aba0-bc1ae2fb36ff" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeatureOfType": { + "@id": "f77edfbc-6d87-5106-ad4f-f1d43f0af7c9" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "f77edfbc-6d87-5106-ad4f-f1d43f0af7c9" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "f77edfbc-6d87-5106-ad4f-f1d43f0af7c9" + }, + { + "@id": "3212075d-1f66-5781-aba0-bc1ae2fb36ff" + } + ], + "shortName": null, + "source": [ + { + "@id": "f77edfbc-6d87-5106-ad4f-f1d43f0af7c9" + } + ], + "target": [ + { + "@id": "3212075d-1f66-5781-aba0-bc1ae2fb36ff" + } + ], + "textualRepresentation": [] + } +] diff --git a/client/python/tests/fixtures/metamodel/bigger.sysml b/client/python/tests/fixtures/metamodel/bigger.sysml new file mode 100644 index 0000000000..a287faf647 --- /dev/null +++ b/client/python/tests/fixtures/metamodel/bigger.sysml @@ -0,0 +1,14 @@ +package Demo { + part def Base { attribute mass; } + part def Vehicle :> Base { + attribute mass2; + part wheel[4]; + port p; + ref item cargo; + action a; + constraint c { mass2 > 0 } + state s; + calc def K { in x; return y = x + 1; } + } + part v : Vehicle; +} diff --git a/client/python/tests/service_gate.py b/client/python/tests/service_gate.py index b7d5873376..19b2c12486 100644 --- a/client/python/tests/service_gate.py +++ b/client/python/tests/service_gate.py @@ -94,13 +94,16 @@ def service_binary(): Returns: str or None: An executable binary, from the cache or a local build """ - from opensysml.binary import get_binary_path + from opensysml.binary import binary_on_path, get_binary_path, named_binary + named = named_binary() repo_build = os.path.join( os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))), 'bin', 'sysml-grpc', ) - for path in (get_binary_path(), repo_build): + for path in (named, get_binary_path(), repo_build, binary_on_path()): + if path is None: + continue if os.path.exists(path) and os.access(path, os.X_OK): return path return None diff --git a/client/python/tests/test_binary.py b/client/python/tests/test_binary.py index 6ddef2bbce..a37968151b 100644 --- a/client/python/tests/test_binary.py +++ b/client/python/tests/test_binary.py @@ -16,6 +16,7 @@ from opensysml.binary import ( PINNED_SHA256, binary_on_path, + built_against_releases, cache_lock, cached_release, default_github_repo, @@ -232,11 +233,14 @@ def test_ensure_binary_downloads(): mock_download.assert_called_once_with(version='v0.1.0', github_repo=None) -def test_ensure_binary_raises_without_version(): - """Test ensure_binary raises ConnectionError when binary missing and no version.""" - from opensysml.errors import ConnectionError - with patch('os.path.exists', return_value=False): - with pytest.raises(ConnectionError, match="Binary not found.*auto-download disabled"): +def test_ensure_binary_raises_without_version(cache): + """An unavailable implicit release names what was tried and how to fix it.""" + with patch('opensysml.binary.download_binary', + side_effect=OpenSysMLConnectionError('404 Not Found')): + with pytest.raises( + OpenSysMLConnectionError, + match=f"{built_against_releases()[0]}.*404.*unreleased checkout", + ): ensure_binary() @@ -294,8 +298,11 @@ def test_ensure_binary_starts_a_service_installed_on_path(cache, tmp_path, monke on_path = executable(directory / 'sysml-grpc') monkeypatch.setenv('PATH', str(directory)) - # As it is found: its own path, not a digest-named link into the cache. - assert ensure_binary() == on_path + # An unavailable default release falls back to the unverified PATH build. + with patch('opensysml.binary.download_binary', + side_effect=OpenSysMLConnectionError('offline')): + with pytest.warns(UserWarning, match='using .* from \\$PATH'): + assert ensure_binary() == on_path def test_path_is_scanned_in_order_past_what_cannot_be_executed(tmp_path, monkeypatch): @@ -314,7 +321,7 @@ def test_path_is_scanned_in_order_past_what_cannot_be_executed(tmp_path, monkeyp def test_the_cache_beats_a_service_on_path(cache, tmp_path, monkeypatch): """Test the cache, whose release is known, is preferred to an unknown one on $PATH.""" - cache(version='v0.0.7') + cache() # A hand-installed binary is not replaced by the implicit default. directory = tmp_path / 'usr-local-bin' directory.mkdir() executable(directory / 'sysml-grpc') @@ -339,14 +346,15 @@ def test_a_download_that_fails_is_not_answered_from_path(cache, tmp_path, monkey def test_a_download_with_no_release_to_download_is_not_answered_from_path( cache, tmp_path, monkeypatch ): - """Test asking for a download without a release is an error, not a $PATH binary.""" + """A forced download without an explicit release requests the built-against release.""" directory = tmp_path / 'usr-local-bin' directory.mkdir() executable(directory / 'sysml-grpc') monkeypatch.setenv('PATH', str(directory)) - with pytest.raises(OpenSysMLConnectionError, match='without a release'): - ensure_binary(force_download=True) + with patch('opensysml.binary.download_binary', return_value='/downloaded/sysml-grpc') as download: + assert ensure_binary(force_download=True) == '/downloaded/sysml-grpc' + download.assert_called_once_with(version=built_against_releases()[0], github_repo=None) def test_a_local_build_answers_on_a_platform_no_release_is_published_for( @@ -358,7 +366,10 @@ def test_a_local_build_answers_on_a_platform_no_release_is_published_for( directory.mkdir() on_path = executable(directory / 'sysml-grpc') monkeypatch.setenv('PATH', str(directory)) - assert ensure_binary() == on_path + with patch('opensysml.binary.download_binary', + side_effect=OpenSysMLConnectionError('offline')): + with pytest.warns(UserWarning, match='using .* from \\$PATH'): + assert ensure_binary() == on_path named = executable(tmp_path / 'my-build') monkeypatch.setenv('OPENSYSML_BINARY', named) @@ -369,8 +380,10 @@ def test_ensure_binary_reports_everywhere_it_looked(cache): """Test the refusal names each place a binary could have come from.""" import opensysml.binary - with pytest.raises(OpenSysMLConnectionError) as raised: - ensure_binary() + with patch('opensysml.binary.download_binary', + side_effect=OpenSysMLConnectionError('offline')): + with pytest.raises(OpenSysMLConnectionError) as raised: + ensure_binary() message = str(raised.value) assert '$OPENSYSML_BINARY' in message assert opensysml.binary.get_binary_path() in message @@ -675,7 +688,7 @@ def test_ensure_binary_replaces_a_cache_from_another_release(cache): def test_ensure_binary_keeps_a_cache_when_no_version_is_asked_for(cache): - """Test a locally built binary is left alone when nothing names a release.""" + """An executable cache without release metadata is a hand-installed build.""" cache() with patch('opensysml.binary.download_binary') as mock_download: assert ensure_binary() == linked() @@ -725,6 +738,170 @@ def test_a_cache_survives_a_replacement_that_cannot_be_downloaded(cache): assert cached_release() == 'v0.0.5' +def test_implicit_release_download_records_the_built_against_release(cache): + content = b'implicit release binary' + expected = built_against_releases()[0] + + def install(version, github_repo=None): + assert version == expected + return cache(content, version=version) + + with patch('opensysml.binary.download_binary', side_effect=install) as download: + ensure_binary() + + download.assert_called_once_with(version=expected, github_repo=None) + assert cached_release() == expected + + +def test_implicit_release_keeps_a_hand_installed_cache(cache): + binary_path = cache() + with patch('opensysml.binary.download_binary') as download: + assert ensure_binary() == linked() + download.assert_not_called() + assert cached_release() is None + with open(binary_path, 'rb') as cached_file: + assert cached_file.read() == b'cached binary' + + +def test_implicit_release_replaces_a_cache_from_another_release(cache): + content = b'implicit replacement' + cache(b'old release', version='v0.0.5') + expected = built_against_releases()[0] + + def install(version, github_repo=None): + assert version == expected + return cache(content, version=version) + + with patch('opensysml.binary.download_binary', side_effect=install) as download: + with pytest.warns(UserWarning, match='v0.0.5'): + ensure_binary() + + download.assert_called_once_with(version=expected, github_repo=None) + assert cached_release() == expected + + +def test_unavailable_implicit_release_falls_back_to_path_with_warning( + cache, tmp_path, monkeypatch +): + directory = tmp_path / 'usr-local-bin' + directory.mkdir() + on_path = executable(directory / 'sysml-grpc') + monkeypatch.setenv('PATH', str(directory)) + with patch('opensysml.binary.download_binary', + side_effect=OpenSysMLConnectionError('offline')) as download: + with pytest.warns(UserWarning, match='using .* from \\$PATH'): + assert ensure_binary() == on_path + download.assert_called_once_with(version=built_against_releases()[0], github_repo=None) + + +def test_unavailable_implicit_release_without_path_names_the_release(cache): + with patch('opensysml.binary.download_binary', + side_effect=OpenSysMLConnectionError('release not found')): + with pytest.raises(OpenSysMLConnectionError) as raised: + ensure_binary() + for candidate in built_against_releases(): + assert candidate in str(raised.value) + assert 'release not found' in str(raised.value) + + +def test_implicit_checksum_mismatch_never_falls_back_to_path( + cache, tmp_path, monkeypatch +): + directory = tmp_path / 'usr-local-bin' + directory.mkdir() + executable(directory / 'sysml-grpc') + monkeypatch.setenv('PATH', str(directory)) + with patch('opensysml.binary.download_binary', + side_effect=ChecksumMismatchError('tampered')) as download: + with pytest.raises(ChecksumMismatchError, match='tampered'): + ensure_binary() + download.assert_called_once_with(version=built_against_releases()[0], github_repo=None) + + +def test_explicit_environment_release_precedes_the_built_against_default(monkeypatch): + monkeypatch.setenv('OPENSYSML_GRPC_VERSION', 'v0.0.7') + with patch('opensysml.binary.download_binary', return_value='/downloaded/sysml-grpc') as download: + assert ensure_binary() == '/downloaded/sysml-grpc' + download.assert_called_once_with(version='v0.0.7', github_repo=None) + + +@pytest.mark.parametrize( + ('version', 'expected'), + [ + ('0.9.1', ('v0.9.1',)), + ('0.9.0rc1', ('v0.9.0-rc1', 'v0.9.0-rc.1')), + ('0.9.0a2', ('v0.9.0-alpha2', 'v0.9.0-alpha.2')), + ('0.9.0b3', ('v0.9.0-beta3', 'v0.9.0-beta.3')), + ], +) +def test_built_against_release_candidates_follow_the_pep440_version( + version, expected, monkeypatch +): + monkeypatch.setattr('opensysml.binary.VERSION', version) + assert built_against_releases() == expected + + +def test_implicit_release_accepts_a_cache_with_the_second_candidate(cache, monkeypatch): + monkeypatch.setattr('opensysml.binary.VERSION', '0.9.0rc1') + candidates = built_against_releases() + cache(version=candidates[1]) + + with patch('opensysml.binary.download_binary') as download: + assert ensure_binary() == linked() + + download.assert_not_called() + + +def test_implicit_release_retries_the_second_candidate_after_a_404(cache, monkeypatch): + monkeypatch.setattr('opensysml.binary.VERSION', '0.9.0rc1') + candidates = built_against_releases() + content = b'pre-release release binary' + + def install(version, github_repo=None): + if version == candidates[0]: + raise OpenSysMLConnectionError('404 Not Found') + assert version == candidates[1] + return cache(content, version=version) + + with patch('opensysml.binary.download_binary', side_effect=install) as download: + ensure_binary() + + assert [call.kwargs['version'] for call in download.call_args_list] == list(candidates) + assert cached_release() == candidates[1] + + +def test_implicit_release_retries_after_an_unpinned_candidate(cache, monkeypatch): + monkeypatch.setattr('opensysml.binary.VERSION', '0.9.0rc1') + candidates = built_against_releases() + content = b'pinned pre-release binary' + + def install(version, github_repo=None): + if version == candidates[0]: + raise UnpinnedReleaseError('no trusted digest') + assert version == candidates[1] + return cache(content, version=version) + + with patch('opensysml.binary.download_binary', side_effect=install) as download: + ensure_binary() + + assert [call.kwargs['version'] for call in download.call_args_list] == list(candidates) + assert cached_release() == candidates[1] + + +def test_implicit_checksum_mismatch_does_not_try_the_second_candidate( + cache, monkeypatch +): + monkeypatch.setattr('opensysml.binary.VERSION', '0.9.0rc1') + first = built_against_releases()[0] + with patch( + 'opensysml.binary.download_binary', + side_effect=ChecksumMismatchError('tampered'), + ) as download: + with pytest.raises(ChecksumMismatchError, match='tampered'): + ensure_binary() + download.assert_called_once_with(version=first, github_repo=None) + + def test_a_tampered_download_is_not_answered_from_the_cache(cache): """Test an integrity failure refuses to start rather than serving the old binary.""" cache(version='v0.0.5') diff --git a/client/python/tests/test_generate_golden.py b/client/python/tests/test_generate_golden.py index 8ed9c34c5c..cc10f82ce1 100644 --- a/client/python/tests/test_generate_golden.py +++ b/client/python/tests/test_generate_golden.py @@ -313,6 +313,7 @@ def test_generated_classes_read_a_live_instance(tmp_path): assert vehicle.engine.power == 300.0 +@pytest.mark.integration def test_generated_class_reads_an_enum_typed_slot(tmp_path): """An enum-typed feature is generated as the literal it holds, not as a class.""" from opensysml import Connection, EnumLiteral diff --git a/client/python/tests/test_lifecycle.py b/client/python/tests/test_lifecycle.py index f851650db7..9621eaedc5 100644 --- a/client/python/tests/test_lifecycle.py +++ b/client/python/tests/test_lifecycle.py @@ -21,7 +21,6 @@ import pytest import opensysml -from opensysml.binary import ensure_binary, get_binary_path from opensysml.connection import _private_services from tests.service_gate import ( service_binary, @@ -96,16 +95,11 @@ def _holder(body, env=None): class TestBinaryIsAvailable: """The binary a private service is started from.""" - def test_binary_exists_or_download(self): - """Verify binary exists or can be downloaded.""" - binary_path = get_binary_path() - if os.path.exists(binary_path): - pytest.skip("Binary already exists - manual install detected") - - try: - result = ensure_binary() - except Exception as e: - pytest.skip(f"Binary download not available yet: {e}") + def test_binary_is_available_without_downloading(self): + """Verify an existing binary can be found without a network request.""" + result = service_binary() + if result is None: + skip_or_fail_without_service("no sysml-grpc binary is available") assert os.path.exists(result) assert os.access(result, os.X_OK) diff --git a/client/python/tests/test_metamodel.py b/client/python/tests/test_metamodel.py new file mode 100644 index 0000000000..5977d17bfa --- /dev/null +++ b/client/python/tests/test_metamodel.py @@ -0,0 +1,99 @@ +import inspect +from types import MappingProxyType + +import pytest + +from opensysml.errors import OpenSysMLError +from opensysml.metamodel import ( + REGISTRY, + RUNTIME_MEMBERS, + Element, + ActionUsage, + Feature, + FeatureDirectionKind, + Many, + MetamodelError, + Namespace, + OccurrenceUsage, + Opt, + PartUsage, + Step, + Type, + UnknownJSONKey, + read_json, +) +from opensysml.metamodel._runtime import _ElementBase + + +def test_registry_contains_every_table_class(): + assert len(REGISTRY) == 175 + assert REGISTRY["Element"] is Element + assert issubclass(PartUsage, Feature) + assert issubclass(Feature, Type) + assert issubclass(Type, Namespace) + assert issubclass(Namespace, Element) + assert issubclass(PartUsage, Element) + assert issubclass(ActionUsage, Step) + assert issubclass(ActionUsage, OccurrenceUsage) + assert issubclass(MetamodelError, OpenSysMLError) + + +def test_aliases_and_json_key_mappings_are_consistent(): + for metaclass in REGISTRY.values(): + for key, snake in metaclass.JSON_KEYS.items(): + assert inspect.getattr_static(metaclass, key) is inspect.getattr_static( + metaclass, snake + ) + assert metaclass.json_key(metaclass.from_json_key(key)) == key + + +def test_every_descriptor_is_declared_once(): + class_owners = {} + for metaclass in REGISTRY.values(): + for value in vars(metaclass).values(): + if isinstance(value, (Many, Opt)): + class_owners.setdefault(id(value), set()).add(metaclass) + assert all(len(owners) == 1 for owners in class_owners.values()) + + +def test_runtime_members_do_not_collide_with_json_keys(): + assert isinstance(_ElementBase.JSON_KEYS, MappingProxyType) + with pytest.raises(TypeError): + _ElementBase.JSON_KEYS["unexpected"] = "unexpected" + + public = { + name + for name in set(dir(_ElementBase)) - set(dir(object)) + if not name.startswith("_") + } + assert RUNTIME_MEMBERS == public + for metaclass in REGISTRY.values(): + assert not (RUNTIME_MEMBERS & set(metaclass.JSON_KEYS)) + assert not (RUNTIME_MEMBERS & set(metaclass.JSON_KEYS.values())) + + +def test_json_key_lookup_rejects_unknown_names(): + with pytest.raises(UnknownJSONKey, match="Element.*@id"): + Element.from_json_key("@id") + with pytest.raises(UnknownJSONKey, match="Element.*bogus"): + Element.json_key("bogus") + + +def test_descriptor_metadata_and_read_only_properties(): + owned_feature = inspect.getattr_static(Type, "owned_feature") + assert isinstance(owned_feature, Many) + assert owned_feature.key == "ownedFeature" + assert owned_feature.range == "Feature" + assert owned_feature.many is True + assert owned_feature.ordered is True + assert owned_feature.derived is True + + assert Element.declared_name.derived is False + assert Type.is_abstract.range == "bool" + assert FeatureDirectionKind.IN == "in" + + element = read_json( + [{"@id": "e", "@type": "Element", "declaredName": "x"}] + )["e"] + with pytest.raises(AttributeError, match="read-only"): + element.declared_name = "y" diff --git a/client/python/tests/test_metamodel_reader.py b/client/python/tests/test_metamodel_reader.py new file mode 100644 index 0000000000..d6f4b2d1aa --- /dev/null +++ b/client/python/tests/test_metamodel_reader.py @@ -0,0 +1,383 @@ +import json +import subprocess +import time + +import grpc +import pytest + +from opensysml.connection import Connection +from opensysml.conversion import ExperimentalFeatureWarning +from opensysml.metamodel import ( + Element, + FeatureDirectionKind, + LiteralInteger, + LiteralRational, + MalformedDocument, + MalformedValue, + Namespace, + NotSupplied, + PartDefinition, + PartUsage, + UnresolvedReference, + read_json, +) + + +def element(element_id="e", element_type="PartUsage", **properties): + return {"@id": element_id, "@type": element_type, **properties} + + +@pytest.fixture(scope="module") +def real_service(): + from tests.service_gate import free_port, service_binary, skip_or_fail_without_service + + binary = service_binary() + if binary is None: + skip_or_fail_without_service("no executable sysml-grpc is available; run: make build-grpc") + port = free_port() + process = subprocess.Popen( + [binary, "-port", str(port)], + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + ) + try: + deadline = time.time() + 10 + while time.time() < deadline: + with grpc.insecure_channel(f"localhost:{port}") as channel: + try: + grpc.channel_ready_future(channel).result(timeout=0.5) + break + except grpc.FutureTimeoutError: + continue + else: + pytest.fail("sysml-grpc did not start") + yield port + finally: + process.terminate() + process.wait(timeout=10) + + +def test_reads_single_objects_bytes_and_path_inputs(tmp_path): + document = element(declaredName="engine") + graph = read_json(document) + assert graph["e"].declared_name == "engine" + assert read_json([document]).all(PartUsage)[0].json_id == "e" + encoded = json.dumps(document).encode() + assert read_json(encoded)["e"].json_type == "PartUsage" + assert read_json(bytearray(encoded))["e"].declared_name == "engine" + assert read_json(memoryview(encoded))["e"].declared_name == "engine" + + path = tmp_path / "elements.json" + path.write_text(json.dumps([document])) + assert read_json(str(path))["e"].declared_name == "engine" + assert read_json(path)["e"].declared_name == "engine" + + +def test_unwraps_data_version_and_commit_envelopes(): + first = element("first", declaredName="one") + second = element("second", declaredName="two") + data_version = [ + {"identity": {"@id": "identity-one"}, "payload": first}, + {"identity": {"@id": "identity-null"}, "payload": None}, + ] + assert read_json(data_version).all()[0].json_id == "first" + assert len(read_json(data_version)) == 1 + + commit = {"@type": "Commit", "change": [ + {"identity": {"@id": "identity-two"}, "payload": second} + ]} + assert read_json(commit)["second"].declared_name == "two" + + +def test_unwraps_standalone_data_version_envelopes(): + payload = element("p", declaredName="standalone") + envelope = {"identity": {"@id": "identity"}, "payload": payload} + assert read_json(envelope)["p"].declared_name == "standalone" + assert len(read_json({"identity": {"@id": "identity"}, "payload": None})) == 0 + + +def test_normalizes_known_types_and_preserves_written_type(): + for written in ( + "sysml:PartUsage", + "https://www.omg.org/spec/SysML#PartUsage", + "https://www.omg.org/spec/SysML/20250201/PartUsage", + ): + item = read_json(element(element_type=written))["e"] + assert isinstance(item, PartUsage) + assert item.json_type == written + + +def test_unknown_types_fall_back_or_follow_supertypes(): + fallback = read_json(element(element_type="vendor:SpecialPart"))["e"] + assert isinstance(fallback, Element) + assert fallback.json_type == "vendor:SpecialPart" + + specialized = read_json( + element(element_type="vendor:SpecialPart"), + supertypes={"vendor:SpecialPart": "Intermediate", "Intermediate": "sysml:PartUsage"}, + )["e"] + assert isinstance(specialized, PartUsage) + assert specialized.json_type == "vendor:SpecialPart" + + cyclic = read_json( + element(element_type="VendorTypeA"), + supertypes={"VendorTypeA": "VendorTypeB", "VendorTypeB": "VendorTypeA"}, + ) + with pytest.raises(MalformedDocument, match="supertype cycle"): + cyclic["e"] + + +def test_reference_resolution_is_lazy_and_cached(): + document = [ + element("usage", partDefinition=[{"@id": "definition"}]), + element("definition", "PartDefinition", declaredName="Engine"), + ] + graph = read_json(document) + usage = graph["usage"] + assert graph["usage"] is usage + assert usage.part_definition == (graph["definition"],) + assert isinstance(usage.part_definition[0], PartDefinition) + + dangling = read_json(element(partDefinition=[{"@id": "missing"}]))["e"] + with pytest.raises(UnresolvedReference) as excinfo: + dangling.part_definition + assert excinfo.value.id == "missing" + assert excinfo.value.ref is None + assert excinfo.value.property == "PartUsage.partDefinition" + + named_reference = read_json(element(partDefinition=[{"@ref": "Engine"}]))["e"] + with pytest.raises(UnresolvedReference) as excinfo: + named_reference.part_definition + assert excinfo.value.id is None + assert excinfo.value.ref == "Engine" + + +def test_reference_ranges_require_the_declared_metaclass(): + usage = element("usage", "PartUsage", partDefinition=[{"@id": "literal"}]) + literal = element("literal", "LiteralInteger", value=1) + graph = read_json([usage, literal]) + with pytest.raises( + MalformedValue, + match=r"@id 'literal'.*json_type 'LiteralInteger'.*expected PartDefinition", + ): + graph["usage"].part_definition + + usage = element("usage", "PartUsage", partDefinition=[{"@id": "custom"}]) + custom = element("custom", "vendor:SpecialPartDefinition") + fallback = read_json([usage, custom]) + with pytest.raises(MalformedValue, match="supertypes="): + fallback["usage"].part_definition + + specialized = read_json( + [usage, custom], + supertypes={"vendor:SpecialPartDefinition": "PartDefinition"}, + ) + assert isinstance(specialized["custom"], PartDefinition) + assert specialized["usage"].part_definition == (specialized["custom"],) + + +def test_many_reference_ranges_are_checked_per_item(): + definition = element( + "definition", + "PartDefinition", + ownedFeature=[{"@id": "feature"}, {"@id": "namespace"}], + ) + feature = element("feature", "Feature") + namespace = element("namespace", "Namespace") + graph = read_json([definition, feature, namespace]) + + with pytest.raises(MalformedValue, match=r"@id 'namespace'.*expected Feature"): + graph["definition"].owned_feature + + +def test_range_checks_can_be_disabled_for_derived_references(): + document = [ + element( + "requirement", + "RequirementDefinition", + ownedInterface=[{"@id": "reference"}], + result={"@id": "requirement"}, + ), + element("reference", "ReferenceUsage"), + ] + + checked = read_json(document) + assert checked.check_ranges is True + with pytest.raises(MalformedValue): + checked["requirement"].owned_interface + with pytest.raises(MalformedValue): + checked["requirement"].result + + unchecked = read_json(document, check_ranges=False) + assert unchecked.check_ranges is False + assert unchecked["requirement"].owned_interface == (unchecked["reference"],) + assert unchecked["requirement"].result is unchecked["requirement"] + with pytest.raises(AttributeError): + unchecked.check_ranges = True + + +def test_missing_and_null_properties_preserve_cardinality(): + usage = read_json(element())["e"] + with pytest.raises(NotSupplied) as excinfo: + usage.declared_name + assert excinfo.value.property == "PartUsage.declaredName" + assert excinfo.value.key == "declaredName" + assert excinfo.value.element_id == "e" + assert excinfo.value.derived is False + + with pytest.raises(NotSupplied) as excinfo: + usage.feature + assert excinfo.value.derived is True + with pytest.raises(NotSupplied) as excinfo: + usage.json_value("feature") + assert excinfo.value.derived is True + with pytest.raises(NotSupplied): + hasattr(usage, "feature") + + feature = read_json(element(direction=None, feature=None))["e"] + assert feature.direction is None + assert feature.feature == () + assert read_json(element(feature=[]))["e"].feature == () + + +def test_enum_and_primitive_values_and_malformed_values(): + assert read_json(element(direction="in"))["e"].direction is FeatureDirectionKind.IN + assert read_json(element("t", "Type", isAbstract=True))["t"].is_abstract is True + + for malformed, attribute in ( + (element(partDefinition="definition"), "part_definition"), + (element(partDefinition=[None]), "part_definition"), + (element(partDefinition=["definition"]), "part_definition"), + (element(direction=["in"]), "direction"), + (element(direction="sideways"), "direction"), + (element("t", "Type", isAbstract="true"), "is_abstract"), + ): + read = read_json(malformed)[malformed["@id"]] + with pytest.raises(MalformedValue): + getattr(read, attribute) + + referenced = read_json( + [element(declaredName={"@id": "q"}, direction={"@id": "q"}), element("q")] + )["e"] + with pytest.raises(MalformedValue, match="expected str, got a reference object"): + referenced.declared_name + with pytest.raises( + MalformedValue, match="expected FeatureDirectionKind, got a reference object" + ): + referenced.direction + + boolean_integer = read_json(element("i", "LiteralInteger", value=True))["i"] + assert isinstance(boolean_integer, LiteralInteger) + with pytest.raises(MalformedValue): + boolean_integer.value + integer = read_json(element("valid-integer", "LiteralInteger", value=3))["valid-integer"] + assert integer.value == 3 + + rational = read_json(element("r", "LiteralRational", value=3))["r"] + assert isinstance(rational, LiteralRational) + assert rational.value == 3.0 + + +@pytest.mark.parametrize( + "value", [10**400, float("inf"), float("-inf"), float("nan")] +) +def test_rational_values_must_be_finite(value): + document = json.dumps( + element("r", "LiteralRational", value=value), allow_nan=True + ).encode() + rational = read_json(document)["r"] + + with pytest.raises(MalformedValue, match="finite"): + rational.value + + +@pytest.mark.parametrize( + "document", + [ + b"null", + b"42", + b'"text"', + b"{", + [{"@type": "Element"}], + [{"@id": "missing-type"}], + [element(element_id=3)], + [element(element_type=3)], + [element(), element()], + ], +) +def test_malformed_documents_fail_eagerly(document): + with pytest.raises(MalformedDocument): + read_json(document) + + +def test_graph_collection_behavior_and_roots(): + namespace = element("root", "Namespace") + child = element("child", "Namespace") + reference = element("owner", "Element", ownedRelationship=[{"@id": "child"}]) + graph = read_json([namespace, child, reference]) + + assert len(graph) == 3 + assert [item.json_id for item in graph] == ["root", "child", "owner"] + assert "root" in graph + assert "absent" not in graph + assert graph.get("absent") is None + assert graph.get("absent", "fallback") == "fallback" + with pytest.raises(KeyError): + graph["absent"] + assert graph.all(Namespace) == (graph["root"], graph["child"]) + assert graph.roots() == (graph["root"],) + assert graph.roots() is graph.roots() + + +@pytest.mark.parametrize("key", ["owner", "owningNamespace"]) +@pytest.mark.parametrize("owner_id", ["root", "outside"]) +def test_roots_excludes_namespaces_with_owner_metadata(key, owner_id): + root = element("root", "Namespace") + nested = element("nested", "Namespace", **{key: {"@id": owner_id}}) + graph = read_json([root, nested]) + + assert graph.roots() == (graph["root"],) + + +def test_elements_compare_by_graph_identity_and_id(): + first_graph = read_json(element(declaredName="engine")) + second_graph = read_json(element(declaredName="engine")) + first = first_graph["e"] + same = first_graph["e"] + other = second_graph["e"] + + assert first == same + assert hash(first) == hash(same) + assert first != other + assert len({first, same, other}) == 2 + + +@pytest.mark.integration +def test_reads_api_json_from_the_open_sysml_service(real_service): + source = """package ReaderDemo { + part def Engine { + attribute power : Real = 300.0; + } + part engine : Engine; +} +""" + with Connection(port=real_service, auto_start=False) as connection: + model = connection.load_from_content(source) + with pytest.warns(ExperimentalFeatureWarning): + exported = model.to_api_json() + + graph = read_json(json.loads(str(exported))) + usage = next(part for part in graph.all(PartUsage) if part.declared_name == "engine") + assert usage.declared_name == "engine" + for name in ("feature", "inherited_feature", "definition"): + with pytest.raises(NotSupplied) as excinfo: + getattr(usage, name) + assert excinfo.value.derived is True + + definition = next( + item for item in graph.all(PartDefinition) if item.declared_name == "Engine" + ) + assert usage.type == (definition,) + assert definition.owned_feature + assert all(isinstance(feature, Element) for feature in definition.owned_feature) + assert all(feature in graph.all() for feature in definition.owned_feature) diff --git a/client/python/tests/test_metamodel_toolkit.py b/client/python/tests/test_metamodel_toolkit.py new file mode 100644 index 0000000000..bb589e325b --- /dev/null +++ b/client/python/tests/test_metamodel_toolkit.py @@ -0,0 +1,65 @@ +import json +from pathlib import Path + +import pytest + +from opensysml.metamodel import ( + Feature, + MultiplicityRange, + Namespace, + NotSupplied, + PartDefinition, + PartUsage, + Type, + read_json, +) + + +FIXTURE = Path(__file__).parent / "fixtures" / "metamodel" / "bigger.full.json" + + +def test_reads_toolkit_full_json_fixture(): + document = json.loads(FIXTURE.read_text()) + graph = read_json(FIXTURE) + assert len(graph) == 87 + + parts = graph.all(PartUsage) + assert [part.declared_name for part in parts] == ["wheel", "v"] + assert all(isinstance(part, Feature) for part in parts) + + vehicle = next(item for item in graph.all(PartDefinition) if item.declared_name == "Vehicle") + assert isinstance(vehicle, Type) + raw_vehicle = next( + raw + for raw in document + if raw.get("@type") == "PartDefinition" and raw.get("declaredName") == "Vehicle" + ) + assert vehicle.owned_feature == tuple( + graph[element["@id"]] for element in raw_vehicle["ownedFeature"] + ) + assert [feature.declared_name for feature in vehicle.owned_feature] == [ + "mass2", "wheel", "p", "cargo", "a", "c", "s" + ] + assert len(vehicle.feature) == 7 + assert all(isinstance(feature, Feature) for feature in vehicle.feature) + assert all(feature.json_id in graph for feature in vehicle.feature) + + bounded_range = next( + item + for item in graph.all(MultiplicityRange) + if any(raw.get("@id") == item.json_id and "bound" in raw for raw in document) + ) + assert isinstance(bounded_range.bound, tuple) + + usage = next(part for part in parts if part.declared_name == "v") + assert usage.type == (vehicle,) + assert usage.type[0] is graph[vehicle.json_id] + assert len(graph.roots()) == 1 + assert isinstance(graph.roots()[0], Namespace) + + missing_name = dict(raw_vehicle) + del missing_name["qualifiedName"] + incomplete = read_json([missing_name])[missing_name["@id"]] + with pytest.raises(NotSupplied) as excinfo: + incomplete.qualified_name + assert excinfo.value.derived is True diff --git a/client/python/tests/test_metamodel_typing.py b/client/python/tests/test_metamodel_typing.py new file mode 100644 index 0000000000..40a523c2f2 --- /dev/null +++ b/client/python/tests/test_metamodel_typing.py @@ -0,0 +1,57 @@ +import importlib.util +import os +import shutil +import subprocess +import sys +from pathlib import Path + +import pytest + + +PYTHON_ROOT = Path(__file__).resolve().parents[1] +TYPECHECK_SOURCE = Path(__file__).parent / "typecheck" / "metamodel_usage.py" +TYPECHECK_DIR = TYPECHECK_SOURCE.parent + + +def test_metamodel_types_with_mypy_and_pyright(): + missing = [] + if importlib.util.find_spec("mypy") is None: + missing.append("mypy") + if shutil.which("pyright") is None: + missing.append("pyright") + if missing: + message = "missing type checker(s): " + ", ".join(missing) + if os.environ.get("OPENSYSML_REQUIRE_TYPECHECKERS", "").strip().lower() not in ( + "", + "0", + "false", + "no", + ): + pytest.fail(message) + pytest.skip(message) + + package = PYTHON_ROOT / "opensysml" / "metamodel" + mypy = subprocess.run( + [ + sys.executable, + "-m", + "mypy", + "--strict", + "--config-file", + str(TYPECHECK_DIR / "mypy.ini"), + str(TYPECHECK_SOURCE), + str(package), + ], + cwd=PYTHON_ROOT, + text=True, + capture_output=True, + ) + assert mypy.returncode == 0, mypy.stdout + mypy.stderr + + pyright = subprocess.run( + ["pyright", "-p", str(TYPECHECK_DIR)], + cwd=PYTHON_ROOT, + text=True, + capture_output=True, + ) + assert pyright.returncode == 0, pyright.stdout + pyright.stderr diff --git a/client/python/tests/test_parse_sources.py b/client/python/tests/test_parse_sources.py index 16487da97f..5918eeecea 100644 --- a/client/python/tests/test_parse_sources.py +++ b/client/python/tests/test_parse_sources.py @@ -45,7 +45,7 @@ TOP = """ package Top { - import Lib::*; + private import Lib::*; part def Car { part engine : Engine; } @@ -55,7 +55,7 @@ BROKEN = """ package Broken { - import Lib::*; + private import Lib::*; part def Boat { part motor : Missing; } diff --git a/client/python/tests/test_parser_warnings.py b/client/python/tests/test_parser_warnings.py new file mode 100644 index 0000000000..beca14a0c3 --- /dev/null +++ b/client/python/tests/test_parser_warnings.py @@ -0,0 +1,48 @@ +"""The service reports what the parser warns about, as the command line does. + +A reserved keyword written where the grammar admits only a name is an error +on ``sysml -validate`` (code ``reserved-keyword-name``); a model loaded over +gRPC must report the same, so ``Model.ok`` and ``strict=True`` judge it as the +command line would. +""" + +import pytest + +from opensysml.connection import Connection +from opensysml.errors import ModelError +from tests.service_gate import fail_if_service_promised, is_server_available + +KEYWORD_AS_NAME = "package P { part def X; part def M { part filter : X; } }" +QUOTED_KEYWORD_NAME = "package P { part def X; part def M { part 'filter' : X; } }" + +_AVAILABLE = is_server_available() +fail_if_service_promised(_AVAILABLE) + + +@pytest.mark.integration +@pytest.mark.skipif(not _AVAILABLE, reason="sysml-grpc server not running on localhost:50051") +class TestReservedKeywordNameAgainstRealService: + @pytest.mark.parametrize("strict_conformance", [False, True]) + def test_a_keyword_written_as_a_name_is_an_error(self, strict_conformance): + with Connection(auto_start=False) as conn: + model = conn.load_from_content( + KEYWORD_AS_NAME, strict_conformance=strict_conformance + ) + assert not model.ok + (diagnostic,) = model.diagnostics + assert diagnostic.severity == "error" + assert diagnostic.code == "reserved-keyword-name" + assert "reserved keyword" in diagnostic.message + + def test_strict_raises_for_a_keyword_written_as_a_name(self): + with Connection(auto_start=False) as conn: + with pytest.raises(ModelError) as raised: + conn.load_from_content(KEYWORD_AS_NAME, strict=True) + assert not raised.value.model.ok + assert any("reserved keyword" in d.message for d in raised.value.diagnostics) + + def test_the_quoted_name_is_clean(self): + with Connection(auto_start=False) as conn: + model = conn.load_from_content(QUOTED_KEYWORD_NAME, strict=True) + assert model.ok + assert model.diagnostics == [] diff --git a/client/python/tests/test_pin_release_checksums.py b/client/python/tests/test_pin_release_checksums.py index 9b0fa56016..dcbb45cc08 100644 --- a/client/python/tests/test_pin_release_checksums.py +++ b/client/python/tests/test_pin_release_checksums.py @@ -6,6 +6,7 @@ that ships a copy. """ +import hashlib import importlib.util import json import os @@ -218,6 +219,338 @@ def test_checking_passes_when_every_pin_still_holds(monkeypatch): assert pin.check(table) == [] +RUST_SERVICE_ASSETS = ( + "sysml-grpc-darwin-amd64", + "sysml-grpc-darwin-arm64", + "sysml-grpc-linux-amd64", + "sysml-grpc-linux-arm64", + "sysml-grpc-windows-amd64.exe", +) + + +def _release_manifest(tmp_path, assets=RUST_SERVICE_ASSETS, digest_overrides=None): + digests = {asset: f"{index + 1:064x}" for index, asset in enumerate(assets)} + digests.update(digest_overrides or {}) + lines = [f"{digest} {asset}" for asset, digest in digests.items()] + lines.extend( + ( + f"{'a' * 64} opensysml-0.9.1-linux-amd64.tar.gz", + f"{'b' * 64} opensysml-0.9.1-py3-none-any.whl", + f"{'c' * 64} sysml-grpc-linux-amd64.sha256", + ) + ) + manifest = tmp_path / "SHA256SUMS.txt" + manifest.write_text("\n".join(lines) + "\n", encoding="utf-8") + return manifest, digests + + +def _temporary_table(tmp_path): + table = tmp_path / "release-digests.json" + table.write_text(pin.render_table(pin.pinned_table()), encoding="utf-8") + return table + + +def _shared_table(tmp_path, monkeypatch): + table = tmp_path / "shared-release-digests.json" + table.write_text(pin.render_table({}), encoding="utf-8") + monkeypatch.setattr(pin, "DIGESTS_FILE", str(table)) + return table + + +def _client_digest_snapshot(): + paths = (sync.SOURCE,) + tuple( + os.path.join(sync.REPO_ROOT, relative) for relative in sync.COPIES + ) + snapshot = {} + for path in paths: + with open(path, "rb") as table: + snapshot[path] = table.read() + return snapshot + + +def test_manifest_stamps_only_service_assets_and_uses_rendered_table(tmp_path): + manifest, digests = _release_manifest(tmp_path) + table_path = _temporary_table(tmp_path) + before_copies = _client_digest_snapshot() + table = pin.pinned_table(str(table_path)) + table.setdefault(pin.DEFAULT_REPO, {})["v0.9.1"] = digests + + assert pin.stamp_from_manifest(manifest, "v0.9.1", table_path=table_path) + + assert pin.pinned_table(str(table_path))[pin.DEFAULT_REPO]["v0.9.1"] == digests + assert table_path.read_text(encoding="utf-8") == pin.render_table(table) + assert _client_digest_snapshot() == before_copies + + +def test_manifest_stamping_requires_every_service_platform(tmp_path): + manifest, _ = _release_manifest(tmp_path, assets=RUST_SERVICE_ASSETS[:-1]) + table_path = _temporary_table(tmp_path) + + with pytest.raises(pin.PinError, match="sysml-grpc-windows-amd64.exe"): + pin.stamp_from_manifest(manifest, "v0.9.1", table_path=table_path) + + +def test_manifest_stamping_rejects_malformed_service_digest(tmp_path): + asset = "sysml-grpc-linux-amd64" + manifest, _ = _release_manifest(tmp_path, digest_overrides={asset: "A" * 64}) + table_path = _temporary_table(tmp_path) + + with pytest.raises(pin.PinError, match=f"malformed SHA-256 digest for {asset}"): + pin.stamp_from_manifest(manifest, "v0.9.1", table_path=table_path) + + +def test_manifest_restamp_is_byte_identical(tmp_path): + manifest, _ = _release_manifest(tmp_path) + table_path = _temporary_table(tmp_path) + assert pin.stamp_from_manifest(manifest, "v0.9.1", table_path=table_path) + stamped = table_path.read_bytes() + + assert not pin.stamp_from_manifest(manifest, "v0.9.1", table_path=table_path) + assert table_path.read_bytes() == stamped + + +def test_manifest_stamping_refuses_conflicting_pin_without_writing(tmp_path): + manifest, _ = _release_manifest(tmp_path) + table_path = _temporary_table(tmp_path) + table = pin.pinned_table(str(table_path)) + table.setdefault(pin.DEFAULT_REPO, {})["v0.9.1"] = { + asset: "f" * 64 for asset in RUST_SERVICE_ASSETS + } + table_path.write_text(pin.render_table(table), encoding="utf-8") + original = table_path.read_bytes() + + with pytest.raises(pin.PinError, match="different digest pin already exists"): + pin.stamp_from_manifest(manifest, "v0.9.1", table_path=table_path) + + assert table_path.read_bytes() == original + + +def test_default_manifest_stamp_syncs_shared_table_once(tmp_path, monkeypatch): + manifest, _ = _release_manifest(tmp_path) + table_path = _shared_table(tmp_path, monkeypatch) + sync_calls = [] + monkeypatch.setattr( + pin, "sync_clients", lambda digests_file=None: sync_calls.append(digests_file) + ) + + assert pin.stamp_from_manifest(manifest, "v0.9.1") + + assert sync_calls == [str(table_path)] + + +def test_identical_shared_manifest_restamp_does_not_sync(tmp_path, monkeypatch): + manifest, _ = _release_manifest(tmp_path) + table_path = _shared_table(tmp_path, monkeypatch) + sync_calls = [] + monkeypatch.setattr( + pin, "sync_clients", lambda digests_file=None: sync_calls.append(digests_file) + ) + assert pin.stamp_from_manifest(manifest, "v0.9.1") + sync_calls.clear() + + assert not pin.stamp_from_manifest(manifest, "v0.9.1") + + assert sync_calls == [] + + +def test_manifest_stamp_to_explicit_table_does_not_sync(tmp_path, monkeypatch): + manifest, _ = _release_manifest(tmp_path) + _shared_table(tmp_path, monkeypatch) + table_path = tmp_path / "crate-release-digests.json" + table_path.write_text(pin.render_table({}), encoding="utf-8") + sync_calls = [] + monkeypatch.setattr( + pin, "sync_clients", lambda digests_file=None: sync_calls.append(digests_file) + ) + + assert pin.stamp_from_manifest(manifest, "v0.9.1", table_path=table_path) + + assert sync_calls == [] + + +def test_manifest_cli_needs_no_token_and_uses_the_selected_table(tmp_path, monkeypatch): + manifest, digests = _release_manifest(tmp_path) + table_path = _temporary_table(tmp_path) + monkeypatch.delenv("GITHUB_TOKEN", raising=False) + monkeypatch.delenv("GH_TOKEN", raising=False) + + assert pin.main( + [ + "--version", + "v0.9.1", + "--from-manifest", + str(manifest), + "--table", + str(table_path), + ] + ) == 0 + + assert pin.pinned_table(str(table_path))[pin.DEFAULT_REPO]["v0.9.1"] == digests + + +def _built_binaries(tmp_path, assets=RUST_SERVICE_ASSETS, sidecars=True): + """The dist/grpc directory a release job hands the Python job, with digests.""" + binaries = tmp_path / "grpc" + binaries.mkdir(parents=True) + digests = {} + for index, asset in enumerate(assets): + content = f"sysml-grpc build {index}".encode() + (binaries / asset).write_bytes(content) + digests[asset] = hashlib.sha256(content).hexdigest() + if sidecars: + (binaries / f"{asset}.sha256").write_text( + f"{digests[asset]} {asset}\n", encoding="utf-8" + ) + return binaries, digests + + +def test_binaries_are_hashed_and_stamped_into_the_selected_table(tmp_path): + """The Python job stamps from the binaries it was handed: hashed, not served.""" + binaries, digests = _built_binaries(tmp_path) + (binaries / "README").write_text("not a binary", encoding="utf-8") + table_path = _temporary_table(tmp_path) + + assert pin.stamp_from_binaries(binaries, "v0.9.1", table_path=table_path) + + table = pin.pinned_table(str(table_path)) + assert table[pin.DEFAULT_REPO]["v0.9.1"] == digests + assert set(table[pin.DEFAULT_REPO]["v0.9.1"]) == set(RUST_SERVICE_ASSETS) + assert table_path.read_text(encoding="utf-8") == pin.render_table(table) + + +def test_binaries_without_sidecars_are_still_stamped(tmp_path): + """The sidecar is build-release-binaries' output too; its absence proves nothing.""" + binaries, digests = _built_binaries(tmp_path, sidecars=False) + assert pin.binary_service_digests(binaries) == digests + + +def test_a_binary_whose_sidecar_disagrees_is_not_stamped(tmp_path): + """A build whose sidecar contradicts the binary is inconsistent, not a pin.""" + binaries, _ = _built_binaries(tmp_path) + (binaries / "sysml-grpc-linux-arm64.sha256").write_text( + f"{'0' * 64} sysml-grpc-linux-arm64\n", encoding="utf-8" + ) + table_path = _temporary_table(tmp_path) + before = table_path.read_bytes() + + with pytest.raises(pin.PinError, match="sysml-grpc-linux-arm64 .* but its .sha256 says"): + pin.stamp_from_binaries(binaries, "v0.9.1", table_path=table_path) + + assert table_path.read_bytes() == before + + +def test_a_sidecar_that_is_not_a_digest_is_an_error(tmp_path): + binaries, _ = _built_binaries(tmp_path) + (binaries / "sysml-grpc-linux-amd64.sha256").write_text("garbage\n", encoding="utf-8") + with pytest.raises(pin.PinError, match="malformed SHA-256 digest in the checksum sidecar"): + pin.binary_service_digests(binaries) + + +def test_binaries_for_every_service_platform_are_required(tmp_path): + """A platform the job did not build fails the stamp, as for a crate.""" + binaries, _ = _built_binaries(tmp_path, assets=RUST_SERVICE_ASSETS[:-1]) + table_path = _temporary_table(tmp_path) + with pytest.raises(pin.PinError, match="missing service assets: sysml-grpc-windows-amd64.exe"): + pin.stamp_from_binaries(binaries, "v0.9.1", table_path=table_path) + + +def test_a_directory_without_binaries_is_an_error(tmp_path): + with pytest.raises(pin.PinError, match="cannot read the service binaries"): + pin.binary_service_digests(tmp_path / "absent") + + +def test_binaries_and_manifest_stamp_the_same_pin(tmp_path): + """Both sources describe the same bytes, so build-release can compare them.""" + binaries, digests = _built_binaries(tmp_path) + manifest, _ = _release_manifest(tmp_path, digest_overrides=digests) + from_binaries = _temporary_table(tmp_path) + from_manifest = tmp_path / "from-manifest.json" + from_manifest.write_bytes(from_binaries.read_bytes()) + + pin.stamp_from_binaries(binaries, "v0.9.1", table_path=from_binaries) + pin.stamp_from_manifest(manifest, "v0.9.1", table_path=from_manifest) + + assert from_binaries.read_bytes() == from_manifest.read_bytes() + assert not pin.stamp_from_manifest(manifest, "v0.9.1", table_path=from_binaries) + + +def test_binaries_restamp_is_byte_identical(tmp_path): + binaries, _ = _built_binaries(tmp_path) + table_path = _temporary_table(tmp_path) + assert pin.stamp_from_binaries(binaries, "v0.9.1", table_path=table_path) + stamped = table_path.read_bytes() + assert not pin.stamp_from_binaries(binaries, "v0.9.1", table_path=table_path) + assert table_path.read_bytes() == stamped + + +def test_binaries_refuse_to_replace_a_different_pin(tmp_path): + binaries, _ = _built_binaries(tmp_path) + table_path = _temporary_table(tmp_path) + pin.stamp_from_binaries(binaries, "v0.9.1", table_path=table_path) + rebuilt, _ = _built_binaries(tmp_path / "rebuilt", sidecars=False) + (rebuilt / "sysml-grpc-linux-amd64").write_bytes(b"another build") + with pytest.raises(pin.PinError, match="different digest pin already exists"): + pin.stamp_from_binaries(rebuilt, "v0.9.1", table_path=table_path) + + +def test_binaries_stamp_to_the_package_table_does_not_sync(tmp_path, monkeypatch): + """The wheel's table is stamped alone; the committed tables are back-filled later.""" + binaries, _ = _built_binaries(tmp_path) + _shared_table(tmp_path, monkeypatch) + table_path = tmp_path / "package-release-digests.json" + table_path.write_text(pin.render_table({}), encoding="utf-8") + sync_calls = [] + monkeypatch.setattr( + pin, "sync_clients", lambda digests_file=None: sync_calls.append(digests_file) + ) + + assert pin.stamp_from_binaries(binaries, "v0.9.1", table_path=table_path) + + assert sync_calls == [] + + +def test_binaries_cli_stamps_the_table_the_wheel_ships(tmp_path, monkeypatch, capsys): + """The command the release job runs, against a copy of the package's table.""" + binaries, digests = _built_binaries(tmp_path) + table_path = tmp_path / "release-digests.json" + table_path.write_bytes(open(PINNED_DIGESTS_FILE, "rb").read()) + monkeypatch.delenv("GITHUB_TOKEN", raising=False) + monkeypatch.delenv("GH_TOKEN", raising=False) + + assert pin.main( + [ + "--version", + "v0.9.1", + "--from-binaries", + str(binaries), + "--table", + str(table_path), + ] + ) == 0 + + table = pin.pinned_table(str(table_path)) + assert table[pin.DEFAULT_REPO]["v0.9.1"] == digests + for version, pinned in PINNED_SHA256[pin.DEFAULT_REPO].items(): + assert table[pin.DEFAULT_REPO][version] == pinned + out = capsys.readouterr() + assert "stamped v0.9.1" in out.out + for asset, digest in digests.items(): + assert f"{asset} {digest}" in out.err + + +def test_the_two_stamp_sources_are_alternatives(tmp_path): + binaries, _ = _built_binaries(tmp_path) + manifest, _ = _release_manifest(tmp_path) + with pytest.raises(SystemExit): + pin.main( + [ + "--version", "v0.9.1", + "--from-binaries", str(binaries), + "--from-manifest", str(manifest), + ] + ) + + class TestGitHubToken: """The release API is read authenticated, and says so when it cannot be.""" diff --git a/client/python/tests/test_signing.py b/client/python/tests/test_signing.py index 1d8c30d4f8..b9d33a33b3 100644 --- a/client/python/tests/test_signing.py +++ b/client/python/tests/test_signing.py @@ -26,6 +26,7 @@ from opensysml.errors import ( ChecksumMismatchError, ManifestSignatureError, + SigstoreUnavailableError, UnpinnedReleaseError, UnsignedReleaseError, ) @@ -304,8 +305,26 @@ def test_sigstore_being_unavailable_verifies_nothing( ): """An install without the verifier refuses rather than skipping the check.""" monkeypatch.setitem(sys.modules, 'sigstore.models', None) - with pytest.raises(UnsignedReleaseError, match='cannot verify the signature'): + with pytest.raises(UnsignedReleaseError, match='cannot verify the signature') as exc: verify_manifest(manifest, bundle, signer) + # The refusal names the package that is missing and how to install it. + assert isinstance(exc.value, SigstoreUnavailableError) + assert 'the sigstore package is not installed' in str(exc.value) + assert exc.value.install_command in str(exc.value) + assert "pip install 'sigstore>=4.5.0,<5'" in str(exc.value) + + def test_a_missing_sigstore_dependency_is_named_as_the_one_missing( + self, signer, manifest, bundle, monkeypatch + ): + """sigstore present but cryptography absent: the refusal names cryptography.""" + monkeypatch.setitem(sys.modules, 'cryptography.x509', None) + with pytest.raises(SigstoreUnavailableError) as exc: + verify_manifest(manifest, bundle, signer) + message = str(exc.value) + assert 'the cryptography package sigstore depends on is not installed' in message + assert 'the sigstore package is not installed' not in message + # Installing sigstore brings its dependencies with it, so the remedy holds. + assert exc.value.install_command in message def test_an_asset_the_manifest_does_not_cover_is_refused( self, signer, manifest, bundle @@ -397,6 +416,26 @@ def test_nothing_verified_and_nothing_pinned_says_why(self, monkeypatch): ) assert 'pins no SHA-256 digest' in str(exc.value) assert 'publishes no readable SHA256SUMS.txt.bundle' in str(exc.value) + assert 'sigstore' not in str(exc.value) + + def test_sigstore_being_unavailable_names_the_package_as_the_remedy(self, monkeypatch): + """A signed release this install cannot check: the fix is the package, not the release.""" + monkeypatch.setattr('opensysml.binary.PINNED_SHA256', {}) + monkeypatch.delenv('OPENSYSML_ALLOW_UNPINNED_DOWNLOAD', raising=False) + reason = SigstoreUnavailableError( + 'opensysml cannot verify the signature on SHA256SUMS.txt because the ' + 'sigstore package is not installed (No module named sigstore)' + ) + with pytest.raises(UnpinnedReleaseError) as exc: + expected_digest(VERSION, BINARY_ASSET, 'ab' * 32, unverified_reason=reason) + message = str(exc.value) + assert 'pins no SHA-256 digest' in message + assert 'the sigstore package is not installed' in message + assert "install the sigstore package (python -m pip install 'sigstore>=4.5.0,<5')" in message + assert 'ships the digests of its own core release' in message + assert f'another release or for an opensysml older than {VERSION}' in message + assert 'it was not downloaded' in message + assert 'OPENSYSML_ALLOW_UNPINNED_DOWNLOAD' in message class TestDownloadingAnUnpinnedRelease: @@ -439,6 +478,23 @@ def test_a_binary_whose_sidecar_agrees_with_it_is_still_refused( with pytest.raises(ChecksumMismatchError, match='Checksum mismatch'): download_binary(version=VERSION) + def test_a_signed_release_is_refused_without_sigstore_and_says_what_to_install( + self, signer, release, monkeypatch, tmp_path + ): + """No verifier, no download; the error names the package and the install.""" + assets = served_release(manifest=fixture(MANIFEST_ASSET), bundle=fixture(BUNDLE_ASSET)) + release(assets) + monkeypatch.setitem(sys.modules, 'sigstore.models', None) + with pytest.raises(UnpinnedReleaseError) as exc: + download_binary(version=VERSION) + message = str(exc.value) + assert 'pins no SHA-256 digest' in message + assert 'the sigstore package is not installed' in message + assert "python -m pip install 'sigstore>=4.5.0,<5'" in message + assert 'ships the digests of its own core release' in message + assert 'it was not downloaded' in message + assert not (tmp_path / 'sysml-grpc').exists() + def test_a_release_without_a_bundle_is_refused(self, signer, release): """An old release, published before the pipeline signed anything.""" release(served_release(manifest=fixture(MANIFEST_ASSET))) diff --git a/client/python/tests/typecheck/metamodel_usage.py b/client/python/tests/typecheck/metamodel_usage.py new file mode 100644 index 0000000000..4a4099a436 --- /dev/null +++ b/client/python/tests/typecheck/metamodel_usage.py @@ -0,0 +1,43 @@ +import builtins + +from opensysml.metamodel import ( + Element, + Feature, + FeatureDirectionKind, + PartDefinition, + PartUsage, + REGISTRY, + Type, + read_json, +) + + +def check_usage() -> None: + graph = read_json([{"@id": "part", "@type": "PartUsage"}]) + parts: tuple[PartUsage, ...] = graph.all(PartUsage) + part = parts[0] + name: str | None = part.declared_name + features: tuple[Feature, ...] = part.feature + camel_alias: tuple[Feature, ...] = part.ownedFeature + part_types: tuple[Type, ...] = part.type + abstract: bool | None = part.is_abstract + direction: FeatureDirectionKind | None = part.direction + part_class: builtins.type[Element] = REGISTRY["PartUsage"] + element: Element = graph.all()[0] + if isinstance(element, PartUsage): + narrowed_name: str | None = element.declared_name + assert narrowed_name == name + assert features == part.feature + assert camel_alias == part.owned_feature + assert part_types == part.type + assert abstract is None + assert direction is None + assert part_class is PartUsage + + misspelled: object = part.ownedFeatur # type: ignore[attr-defined] # pyright: ignore[reportAttributeAccessIssue, reportUnknownMemberType, reportUnknownVariableType] + wrong_parts: tuple[PartDefinition, ...] = graph.all(PartUsage) # type: ignore[arg-type] # pyright: ignore[reportAssignmentType] + part.declared_name = 1 # type: ignore[assignment] # pyright: ignore[reportAttributeAccessIssue] + wrong_owned: list[Feature] = part.owned_feature # type: ignore[assignment] # pyright: ignore[reportAssignmentType] + assert misspelled + assert wrong_parts + assert wrong_owned diff --git a/client/python/tests/typecheck/mypy.ini b/client/python/tests/typecheck/mypy.ini new file mode 100644 index 0000000000..73c273750f --- /dev/null +++ b/client/python/tests/typecheck/mypy.ini @@ -0,0 +1,7 @@ +[mypy] +python_version = 3.10 +warn_unused_ignores = True +follow_imports = silent + +[mypy-opensysml.proto.*] +disable_error_code = type-arg, no-untyped-def diff --git a/client/python/tests/typecheck/pyrightconfig.json b/client/python/tests/typecheck/pyrightconfig.json new file mode 100644 index 0000000000..99ddf452d2 --- /dev/null +++ b/client/python/tests/typecheck/pyrightconfig.json @@ -0,0 +1,13 @@ +{ + "include": [ + "metamodel_usage.py", + "../../opensysml/metamodel" + ], + "extraPaths": [ + "../.." + ], + "pythonVersion": "3.10", + "typeCheckingMode": "strict", + "reportUnnecessaryTypeIgnoreComment": true, + "enableTypeIgnoreComments": false +} diff --git a/client/rust/Cargo.lock b/client/rust/Cargo.lock index 79e2370fe9..4b9fe4e649 100644 --- a/client/rust/Cargo.lock +++ b/client/rust/Cargo.lock @@ -211,7 +211,7 @@ checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "opensysml" -version = "0.9.1" +version = "0.9.2" dependencies = [ "fs4", "prost", diff --git a/client/rust/README.md b/client/rust/README.md index 77806bc6ae..d12e3cf0cc 100644 --- a/client/rust/README.md +++ b/client/rust/README.md @@ -12,10 +12,12 @@ From crates.io: opensysml = "0.9" ``` -A published crate cannot download the `sysml-grpc` binary of its own release — -its embedded `release-digests.json` pins only the digests known when it was -built — so it targets a running service or a binary it is pointed at -(`$OPENSYSML_GRPC_BINARY`, then `sysml-grpc` on `$PATH`; see below). See +A crate published from a release tag carries that release's service digests in +its embedded `release-digests.json`, stamped from the release checksum manifest +at publish time, so its built-against default can verify and download the +binary. A crate built from a Git checkout, or asked for another release, still +needs a matching pin or `$OPENSYSML_ALLOW_UNPINNED_DOWNLOAD`. The Rust client +does not verify the manifest's Sigstore signature itself. See [docs/project/releasing.md](../../docs/project/releasing.md#releasing-the-rust-client-to-cratesio) for how the crate is published. @@ -82,17 +84,23 @@ Resolution is, in order: 1. `$OPENSYSML_GRPC_BINARY`, the explicit path; 2. `~/.opensysml/bin/sysml-grpc` (`sysml-grpc.exe` on Windows), the cache shared with the Python client; -3. a download of the release `$OPENSYSML_GRPC_VERSION` asks for, into that cache; +3. a download into that cache of the release `$OPENSYSML_GRPC_VERSION` names, + or the release this client was built against; 4. `sysml-grpc` on `$PATH`. -A download only happens when `$OPENSYSML_GRPC_VERSION` names a release -(`latest` resolves through the GitHub releases API), so a caller that never asks -for one still resolves a locally built binary from `$PATH`. When a release *is* -asked for, the download precedes `$PATH`, because a binary on `$PATH` is of no -known version and so does not answer for that release. A cached binary that is -another release is replaced with a warning, never used silently; a replacement -that cannot be downloaded leaves the working cache in place, unless the refusal -was about integrity. +`$OPENSYSML_GRPC_VERSION` overrides the built-against default, and `latest` +resolves through the GitHub releases API. An executable cache without release +metadata is treated as a hand-installed binary and kept. When a requested +release cannot be downloaded, a working cache is kept with a warning, or a +binary on `$PATH` is used with a warning; checksum mismatches are never +answered from either. + +The crate's behavior depends on how it was built. A release-tag crate receives +its own tag's digests at publish time from the release checksum manifest, so +its built-against default can be verified. A checkout build or a request for +another release still needs a matching embedded pin or +`$OPENSYSML_ALLOW_UNPINNED_DOWNLOAD`. This client does not verify the manifest's +Sigstore signature itself. The download goes to a temporary file, is verified, and only then atomically replaces the cache with mode `0700` (POSIX). Requests time out after 15 seconds. @@ -123,12 +131,13 @@ and is about to be started. ### Trust model, and what this client does not verify -A download is verified against the digest table the crate ships -([`opensysml/release-digests.json`](opensysml/release-digests.json), a synced copy of -`client/release-digests.json` embedded with `include_str!`) — a pin resolved -from outside the published artifact would not be a pin. A `.sha256` served -beside the binary that disagrees with a pin is tampering: the download is -refused, and the cache is untouched. +A download is verified against the digest table embedded in the crate +([`opensysml/release-digests.json`](opensysml/release-digests.json)); a pin +resolved from outside the published artifact would not be a pin. The committed +copy is synced from `client/release-digests.json`, and the release job adds the +crate's own tag from the release checksum manifest when it packages a release. +A `.sha256` served beside the binary that disagrees with a pin is tampering: the +download is refused, and the cache is untouched. **Known limitation:** unlike the Python, Node and Java clients, this client does **not** verify the release's sigstore-signed `SHA256SUMS.txt` manifest diff --git a/client/rust/conformance/sysml.descriptor.binpb b/client/rust/conformance/sysml.descriptor.binpb index 88312fdc63..22c8a26a18 100644 Binary files a/client/rust/conformance/sysml.descriptor.binpb and b/client/rust/conformance/sysml.descriptor.binpb differ diff --git a/client/rust/opensysml/Cargo.toml b/client/rust/opensysml/Cargo.toml index 7d9e37997a..4630352522 100644 --- a/client/rust/opensysml/Cargo.toml +++ b/client/rust/opensysml/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "opensysml" -version = "0.9.1" +version = "0.9.2" edition = "2021" rust-version = "1.83" description = "Blocking Rust client for the OpenSysML sysml-grpc service" diff --git a/client/rust/opensysml/src/binary.rs b/client/rust/opensysml/src/binary.rs index 9d8e2a6466..76d7218451 100644 --- a/client/rust/opensysml/src/binary.rs +++ b/client/rust/opensysml/src/binary.rs @@ -8,13 +8,13 @@ //! //! # Known limitation: this client verifies pins only //! -//! A download is verified against the digest table this crate ships -//! (`release-digests.json`, embedded at build time). Unlike the Python, Node and -//! Java clients, it does **not** verify the sigstore-signed `SHA256SUMS.txt` -//! manifest a release publishes, so a release this crate pins no digest for -//! cannot be verified here at all: it is refused. Setting -//! `$OPENSYSML_ALLOW_UNPINNED_DOWNLOAD` is the only way through, and it accepts -//! the checksum served beside the binary, which is same-origin trust. +//! A crate published from a release tag carries that release's service digests, +//! stamped from its checksum manifest when the crate is published. Its +//! built-against default can therefore be verified. A crate built from a Git +//! checkout, or asked for another release, still needs a matching embedded pin +//! or `$OPENSYSML_ALLOW_UNPINNED_DOWNLOAD`, which accepts the checksum served +//! beside the binary. This client does not verify the manifest's Sigstore +//! signature itself. use std::borrow::Cow; use std::collections::BTreeMap; @@ -235,6 +235,7 @@ pub(crate) fn lock_path(cache_dir: &Path) -> PathBuf { } /// Report to the caller the way this client can, since it has no logger. +#[cfg(test)] fn warn_on_stderr(message: &str) { eprintln!("opensysml: warning: {message}"); } @@ -386,7 +387,7 @@ fn link(source: &Path, target: &Path) -> Result<(), std::io::Error> { } /// Whether a path is a file this user can execute. -fn is_executable(path: &Path) -> bool { +pub(crate) fn is_executable(path: &Path) -> bool { let Ok(metadata) = fs::metadata(path) else { return false; }; @@ -404,6 +405,7 @@ fn is_executable(path: &Path) -> bool { /// The digest-named link to the cached binary, when one is cached. /// /// Resolution reaches the cache without a downloader when no release was asked for. +#[cfg(test)] pub(crate) fn stable_cached_binary(binary_path: &Path) -> Option { let cache_dir = binary_path.parent()?; let _held = cache_lock(cache_dir, &|message| warn_on_stderr(&message)); @@ -782,9 +784,22 @@ impl Downloader { /// The decision is made holding the shared cache lock, and what is returned /// for the cache is a digest-named link no later install replaces. pub(crate) fn ensure_binary(&self, version: Option<&str>) -> Result { + self.ensure_binary_with_policy(version, false) + } + + /// Resolve the built-against release while preserving an executable hand-installed cache. + pub(crate) fn ensure_implicit_binary(&self, version: &str) -> Result { + self.ensure_binary_with_policy(Some(version), true) + } + + fn ensure_binary_with_policy( + &self, + version: Option<&str>, + implicit: bool, + ) -> Result { let _held = self.hold_cache(); let binary_path = self.binary_path(); - let chosen = self.ensure_binary_locked(version)?; + let chosen = self.ensure_binary_locked(version, implicit)?; Ok(if chosen == binary_path { stable_binary(&binary_path, &|message| self.warn(message)) } else { @@ -793,10 +808,17 @@ impl Downloader { } /// [`Self::ensure_binary`], with the shared cache held. - fn ensure_binary_locked(&self, version: Option<&str>) -> Result { + fn ensure_binary_locked( + &self, + version: Option<&str>, + implicit: bool, + ) -> Result { let binary_path = self.binary_path(); let mut cached = None; if binary_path.is_file() { + if implicit && !self.metadata_path().exists() && is_executable(&binary_path) { + return Ok(binary_path); + } match self.stale_cache_reason(version) { None => return Ok(binary_path), Some(stale) => { @@ -818,6 +840,20 @@ impl Downloader { match self.install(version) { Ok(path) => Ok(path), + Err(Failure { + error: Error::UnpinnedRelease(message), + installed: false, + }) if implicit => match cached { + Some(path) => { + self.warn(format!( + "keeping the cached sysml-grpc at {}: {version} is not verifiable \ + ({message}). It may be an older release than asked for.", + path.display(), + )); + Ok(path) + } + None => Err(Error::UnpinnedRelease(message)), + }, // A download refused for integrity is never answered from the cache, // and neither is one that already replaced it. Err(Failure { @@ -1382,6 +1418,133 @@ mod tests { ); } + #[test] + fn the_built_against_release_is_downloaded_and_recorded() { + let version = format!("v{}", env!("CARGO_PKG_VERSION")); + let body = b"the built-against release binary"; + let digest = digest_of(body); + let harness = harness( + "built-against", + release_routes(&version, body, &digest), + pin_table(&version, &digest), + ); + + let path = harness + .downloader + .ensure_implicit_binary(&version) + .expect("built-against release"); + + assert_eq!(fs::read(path).expect("read binary"), body); + assert_eq!( + harness.downloader.cached_release().as_deref(), + Some(version.as_str()) + ); + } + + #[test] + fn an_implicit_request_keeps_an_executable_cache_without_metadata() { + let version = format!("v{}", env!("CARGO_PKG_VERSION")); + let harness = harness("hand-installed", HashMap::new(), PinTable::new()); + let path = harness.downloader.binary_path(); + fs::create_dir_all(path.parent().expect("cache directory")).expect("create cache"); + fs::write(&path, b"hand-installed binary").expect("install binary"); + #[cfg(unix)] + { + use std::os::unix::fs::PermissionsExt; + fs::set_permissions(&path, fs::Permissions::from_mode(0o700)).expect("make executable"); + } + + let resolved = harness + .downloader + .ensure_implicit_binary(&version) + .expect("keep hand-installed binary"); + + assert_eq!( + fs::read(resolved).expect("read binary"), + b"hand-installed binary" + ); + assert!(!harness.downloader.metadata_path().exists()); + } + + #[test] + fn an_implicit_request_replaces_a_cache_from_another_release() { + let version = format!("v{}", env!("CARGO_PKG_VERSION")); + let body = b"the built-against release binary"; + let digest = digest_of(body); + let harness = harness( + "implicit-replace", + release_routes(&version, body, &digest), + pin_table(&version, &digest), + ); + let downloader = &harness.downloader; + let old = b"old release"; + fs::write(downloader.binary_path(), old).expect("place old cache"); + downloader + .write_metadata(&CacheMetadata { + version: "v0.0.5".to_owned(), + sha256: digest_of(old), + repo: REPO.to_owned(), + }) + .expect("record old cache"); + #[cfg(unix)] + { + use std::os::unix::fs::PermissionsExt; + fs::set_permissions(downloader.binary_path(), fs::Permissions::from_mode(0o700)) + .expect("make executable"); + } + + let path = downloader + .ensure_implicit_binary(&version) + .expect("replace old release"); + + assert_eq!(fs::read(path).expect("read binary"), body); + assert_eq!( + downloader.cached_release().as_deref(), + Some(version.as_str()) + ); + assert!(downloader + .warnings() + .iter() + .any(|warning| warning.contains("replacing the cached sysml-grpc"))); + } + + #[test] + fn an_unpinned_implicit_replacement_keeps_the_working_cache() { + let version = "v0.3.0"; + let sidecar = format!("{} {ASSET}\n", digest_of(b"unpinned binary")); + let routes = HashMap::from([( + format!("/{REPO}/releases/download/{version}/{ASSET}.sha256"), + sidecar.into_bytes(), + )]); + let harness = harness("implicit-unpinned", routes, PinTable::new()); + let downloader = &harness.downloader; + let cached = b"working cache"; + fs::write(downloader.binary_path(), cached).expect("place cache"); + downloader + .write_metadata(&CacheMetadata { + version: "v0.0.5".to_owned(), + sha256: digest_of(cached), + repo: REPO.to_owned(), + }) + .expect("record cache"); + #[cfg(unix)] + { + use std::os::unix::fs::PermissionsExt; + fs::set_permissions(downloader.binary_path(), fs::Permissions::from_mode(0o700)) + .expect("make executable"); + } + + let path = downloader + .ensure_implicit_binary(version) + .expect("retain cache for unavailable release"); + + assert_eq!(fs::read(path).expect("read cache"), cached); + assert!(downloader + .warnings() + .iter() + .any(|warning| warning.contains("not verifiable"))); + } + #[test] #[cfg(unix)] fn a_cache_replaced_before_the_failure_is_not_reported_as_kept() { diff --git a/client/rust/opensysml/src/connection.rs b/client/rust/opensysml/src/connection.rs index 2d1dfe891f..8ce4e6b536 100644 --- a/client/rust/opensysml/src/connection.rs +++ b/client/rust/opensysml/src/connection.rs @@ -558,56 +558,69 @@ fn terminate_process(process: &mut Child, grace: Duration) -> Option process.wait().ok() } -/// Resolve the service binary: explicit path, shared cache, download, then `$PATH`. -/// -/// A download only runs when `$OPENSYSML_GRPC_VERSION` names a release, and then it -/// precedes `$PATH`, whose binary is of no known version. +/// Resolve the service binary: explicit path, matching cache, download, then `$PATH`. fn resolve_binary() -> Result { - let mut looked_in = Vec::new(); if let Ok(path) = env::var("OPENSYSML_GRPC_BINARY") { - looked_in.push(path.clone()); let candidate = PathBuf::from(path); if candidate.is_file() { return Ok(candidate); } - } else { - looked_in.push("$OPENSYSML_GRPC_BINARY".to_owned()); - } - - let downloader = binary::Downloader::from_env(); - let cached = binary::default_cache_dir().map(|dir| dir.join(binary::binary_file_name())); - looked_in.push(match &cached { - Ok(path) => path.display().to_string(), - Err(error) => format!("the shared cache ({error})"), - }); - match (downloader, binary::env_release_version()) { - (Ok(downloader), Some(version)) => return downloader.ensure_binary(Some(&version)), - // A release was asked for and cannot be downloaded here, so no binary of - // an unknown version answers for it. - (Err(error), Some(_)) => return Err(error), - _ => { - // The digest-named link, so an install over the cache does not change - // the binary this start is about to run. - if let Some(path) = cached - .ok() - .as_deref() - .and_then(binary::stable_cached_binary) - { + } + + let explicit_version = binary::env_release_version(); + let implicit_version = format!("v{}", env!("CARGO_PKG_VERSION")); + let version = explicit_version.as_deref().unwrap_or(&implicit_version); + + if explicit_version.is_some() { + return binary::Downloader::from_env()?.ensure_binary(Some(version)); + } + + let result = binary::Downloader::from_env() + .and_then(|downloader| downloader.ensure_implicit_binary(version)); + match result { + Ok(path) => Ok(path), + Err(error) if is_availability_failure(&error) => { + if let Some(path) = binary_on_path() { + eprintln!( + "opensysml: warning: could not download sysml-grpc release {version} \ + ({error}); using {} from $PATH", + path.display(), + ); return Ok(path); } + let detail = error.to_string(); + let unreleased = if detail.contains("404") { + " This may be an unreleased checkout." + } else { + "" + }; + Err(Error::BinaryDownload(format!( + "could not download sysml-grpc release {version}: {detail}.{unreleased} \ + Install sysml-grpc on $PATH, set $OPENSYSML_GRPC_BINARY, or choose another \ + release with $OPENSYSML_GRPC_VERSION." + ))) } + Err(error) => Err(error), } +} + +fn is_availability_failure(error: &Error) -> bool { + matches!( + error, + Error::BinaryDownload(_) | Error::UnpinnedRelease(_) | Error::UnsupportedPlatform { .. } + ) +} - looked_in.push("sysml-grpc on PATH".to_owned()); +fn binary_on_path() -> Option { if let Some(path) = env::var_os("PATH") { for directory in env::split_paths(&path) { let candidate = directory.join(binary::binary_file_name()); - if candidate.is_file() { - return Ok(candidate); + if binary::is_executable(&candidate) { + return Some(candidate); } } } - Err(Error::BinaryNotFound { looked_in }) + None } #[cfg(test)] @@ -642,41 +655,124 @@ mod tests { "OPENSYSML_GRPC_BINARY", "OPENSYSML_GITHUB_REPO", "OPENSYSML_GRPC_VERSION", + "PATH", ]); + let no_path = + env::temp_dir().join(format!("opensysml-rust-no-path-{}", std::process::id())); env::set_var("OPENSYSML_GRPC_BINARY", ""); env::set_var("OPENSYSML_GITHUB_REPO", "not-an-owner-repo"); env::remove_var("OPENSYSML_GRPC_VERSION"); + env::set_var("PATH", &no_path); - // Nothing was asked for, so resolution falls through to the cache and $PATH. - if let Err(error) = resolve_binary() { - assert!(matches!(error, Error::BinaryNotFound { .. }), "{error}"); + let error = resolve_binary().expect_err("the built-against release cannot be downloaded"); + assert!( + matches!(&error, Error::BinaryDownload(message) + if message.contains(&format!("v{}", env!("CARGO_PKG_VERSION"))) + && message.contains("owner/repo")), + "{error}" + ); + drop(restore); + } + + #[test] + fn an_unavailable_implicit_release_falls_back_to_path() { + let _guard = ENV.lock().unwrap_or_else(PoisonError::into_inner); + let restore = Restore::of(&[ + "OPENSYSML_GRPC_BINARY", + "OPENSYSML_GITHUB_REPO", + "OPENSYSML_GRPC_VERSION", + "PATH", + "HOME", + ]); + let directory = env::temp_dir().join(format!("opensysml-rust-path-{}", std::process::id())); + let binary = directory.join(binary::binary_file_name()); + std::fs::create_dir_all(&directory).expect("create PATH entry"); + std::fs::write(&binary, b"hand-installed binary").expect("place PATH binary"); + #[cfg(unix)] + { + use std::os::unix::fs::PermissionsExt; + std::fs::set_permissions(&binary, std::fs::Permissions::from_mode(0o700)) + .expect("make executable"); } + env::set_var("OPENSYSML_GRPC_BINARY", ""); + env::set_var("OPENSYSML_GITHUB_REPO", "not-an-owner-repo"); + env::remove_var("OPENSYSML_GRPC_VERSION"); + env::set_var("PATH", &directory); + env::set_var("HOME", &directory); + + assert_eq!(resolve_binary().expect("fall back to PATH"), binary); + + std::fs::remove_dir_all(directory).expect("remove test binaries"); + drop(restore); + } + + #[test] + fn an_unavailable_implicit_release_names_the_release_and_remedy() { + let _guard = ENV.lock().unwrap_or_else(PoisonError::into_inner); + let restore = Restore::of(&[ + "OPENSYSML_GRPC_BINARY", + "OPENSYSML_GITHUB_REPO", + "OPENSYSML_GRPC_VERSION", + "PATH", + "HOME", + ]); + let directory = + env::temp_dir().join(format!("opensysml-rust-empty-{}", std::process::id())); + std::fs::create_dir_all(&directory).expect("create isolated home"); + env::set_var("OPENSYSML_GRPC_BINARY", ""); + env::set_var("OPENSYSML_GITHUB_REPO", "not-an-owner-repo"); + env::remove_var("OPENSYSML_GRPC_VERSION"); + env::set_var("PATH", ""); + env::set_var("HOME", &directory); + + let error = resolve_binary().expect_err("no release or PATH binary"); + assert!( + matches!(&error, Error::BinaryDownload(message) + if message.contains(&format!("v{}", env!("CARGO_PKG_VERSION"))) + && message.contains("owner/repo") + && message.contains("OPENSYSML_GRPC_BINARY")), + "{error}" + ); + + std::fs::remove_dir_all(directory).expect("remove isolated home"); drop(restore); } + #[test] + fn checksum_mismatches_are_not_availability_failures() { + assert!(!is_availability_failure(&Error::ChecksumMismatch( + "tampered".to_owned() + ))); + assert!(is_availability_failure(&Error::UnpinnedRelease( + "not verifiable".to_owned() + ))); + } + #[test] fn without_a_home_directory_the_cache_is_not_the_working_directory() { let _guard = ENV.lock().unwrap_or_else(PoisonError::into_inner); let restore = Restore::of(&[ "OPENSYSML_GRPC_BINARY", + "OPENSYSML_GITHUB_REPO", "OPENSYSML_GRPC_VERSION", "HOME", "USERPROFILE", + "PATH", ]); env::set_var("OPENSYSML_GRPC_BINARY", ""); + env::set_var("OPENSYSML_GITHUB_REPO", binary::DEFAULT_GITHUB_REPO); env::remove_var("OPENSYSML_GRPC_VERSION"); env::remove_var("HOME"); env::remove_var("USERPROFILE"); + let no_path = + env::temp_dir().join(format!("opensysml-rust-no-path-{}", std::process::id())); + env::set_var("PATH", &no_path); assert!(binary::Downloader::from_env().is_err()); - if let Err(Error::BinaryNotFound { looked_in }) = resolve_binary() { - assert!( - !looked_in - .iter() - .any(|place| place.starts_with(".opensysml")), - "{looked_in:?}" - ); - } + let error = resolve_binary().expect_err("the cache needs a home"); + assert!(error + .to_string() + .contains(&format!("v{}", env!("CARGO_PKG_VERSION")))); drop(restore); } diff --git a/client/rust/opensysml/src/proto/sysml/sysml.rs b/client/rust/opensysml/src/proto/sysml/sysml.rs index fbab36cd63..aaea791aec 100644 --- a/client/rust/opensysml/src/proto/sysml/sysml.rs +++ b/client/rust/opensysml/src/proto/sysml/sysml.rs @@ -964,6 +964,14 @@ pub struct ConvertRequest { /// go missing silently. #[prost(bool, tag="5")] pub tolerate_syntax_errors: bool, + /// How derived element ids are spelled when notation is written as a graph + /// ("ttl" or "api-json"), as `sysml -id` does: "qualified" (the default, each + /// derived from its qualified name) or "uuid" (name-based uuids under each root + /// package, the library convention). Declared and normative ids are unchanged. + /// Empty is "qualified"; any other value, or one given for another direction, + /// is INVALID_ARGUMENT. + #[prost(string, tag="7")] + pub id_form: ::prost::alloc::string::String, #[prost(oneof="convert_request::Source", tags="1, 2, 6")] pub source: ::core::option::Option, } diff --git a/cmd/sysml/convert.go b/cmd/sysml/convert.go index fb647381ed..ce61ff9417 100644 --- a/cmd/sysml/convert.go +++ b/cmd/sysml/convert.go @@ -364,7 +364,9 @@ func convertRecorded(input string, to convert.Format) (int, error) { // convertOptions are the conversion settings -id asks for, refusing it for a // direction it does not apply to. func convertOptions(from, to convert.Format) (convert.Options, error) { - opts := convert.Options{} + opts := convert.Options{Warn: func(message string) { + fmt.Fprintf(os.Stderr, "warning: %s\n", message) + }} if idForm == "" { return opts, nil } diff --git a/cmd/sysml/convert_test.go b/cmd/sysml/convert_test.go index 2618a166f0..91af43de71 100644 --- a/cmd/sysml/convert_test.go +++ b/cmd/sysml/convert_test.go @@ -118,6 +118,29 @@ func TestConvertToStdout(t *testing.T) { } } +func TestConvertAPIJSONLibraryFallbackWarnsOnStderr(t *testing.T) { + binary := buildCLI(t) + data, err := os.ReadFile(filepath.Join("..", "..", "tests", "export", "testdata", "interchange", "library_identity.toolkit.full.json")) + if err != nil { + t.Fatal(err) + } + input := filepath.Join(t.TempDir(), "library.json") + if err := os.WriteFile(input, data, 0o644); err != nil { + t.Fatal(err) + } + result := runCommand(t, exec.Command(binary, input, "-from", "api-json", "-convert", "sysml")) + if result.status != 0 { + t.Fatalf("conversion exited %d:\n%s%s", result.status, result.stdout, result.stderr) + } + if !strings.Contains(result.stderr, "warning: the library element") || + !strings.Contains(result.stderr, "resolved by its qualified name ScalarValues::Real") { + t.Errorf("the library identity warning was not written to stderr:\n%s", result.stderr) + } + if strings.Contains(result.stdout, "warning:") || !strings.Contains(result.stdout, "library package DocumentLibrary") { + t.Errorf("stdout contains the wrong conversion output:\n%s", result.stdout) + } +} + // TestConvertFlagOrder checks that the model may be named before or after the // flags that apply to it, since Go's flag package stops at the first file name // unless the arguments are reordered. diff --git a/cmd/sysml/prompt_readline.go b/cmd/sysml/prompt_readline.go index 7fc2d44593..e6fb39dc2d 100644 --- a/cmd/sysml/prompt_readline.go +++ b/cmd/sysml/prompt_readline.go @@ -16,8 +16,8 @@ type rlReader struct{ rl *readline.Instance } func (r *rlReader) ReadLine(prompt string) (string, error) { r.rl.SetPrompt(prompt) line, err := r.rl.Readline() - if err == readline.ErrInterrupt { // Ctrl-C clears line (continue REPL) - return "", nil + if err == readline.ErrInterrupt { + return line, repl.ErrInterrupt } if err == io.EOF { // Ctrl-D exits REPL return "", io.EOF @@ -26,8 +26,7 @@ func (r *rlReader) ReadLine(prompt string) (string, error) { } // newLineInput opens the prompt's line reader: readline, with the session's history -// file and completion, an interrupted line clearing rather than ending the session, -// and end of input closing it. The returned function closes the reader. +// file and completion. The returned function closes the reader. func newLineInput(sess *repl.Session) (repl.LineReader, func() error, error) { rl, err := readline.NewEx(&readline.Config{ Prompt: "sysml> ", diff --git a/cmd/sysml/run_test.go b/cmd/sysml/run_test.go index 6474153ed6..5794fab01d 100644 --- a/cmd/sysml/run_test.go +++ b/cmd/sysml/run_test.go @@ -172,6 +172,44 @@ const quantityModel = `package Orbit { } ` +// dimensionOneModel declares a generator whose efficiency is a DimensionOneValue, +// written once in the library's `one` and once as a bare number. +const dimensionOneModel = `package P { + private import ISQ::*; + private import SI::*; + private import MeasurementReferences::*; + part def Gen { + attribute power : PowerValue; + attribute efficiency : DimensionOneValue; + calc deliveredEnergy { in duration : DurationValue; return : EnergyValue = power * duration * efficiency; } + } + part rated : Gen { attribute :>> power = 800.0 [W]; attribute :>> efficiency = 0.7 [one]; } + part rated2 : Gen { attribute :>> power = 800.0 [W]; attribute :>> efficiency = 0.7; } +} +` + +// TestRunEvalDimensionOneIdentity checks that a factor in `MeasurementReferences::one` +// is absorbed as the identity of the unit product, so the result folds to the +// derived unit the product without it reaches. +func TestRunEvalDimensionOneIdentity(t *testing.T) { + binary := buildCLI(t) + + cases := []struct{ expr, want string }{ + {"P::rated.deliveredEnergy(120.0 [SI::s])", "= 67200.0 [SI::J]"}, + {"P::rated2.deliveredEnergy(120.0 [SI::s])", "= 67200.0 [SI::J]"}, + {"P::rated.power * P::rated.efficiency", "= 560.0 [W]"}, + {"0.7 [MeasurementReferences::one] * 800.0 [SI::W]", "= 560.0 [SI::W]"}, + {"800.0 [SI::W] / 0.5 [MeasurementReferences::one]", "= 1600.0 [SI::W]"}, + {"2 [MeasurementReferences::one] * 3 [MeasurementReferences::one]", "= 6 [MeasurementReferences::one]"}, + {"3 [SI::rad] * 1 [MeasurementReferences::one]", "= 3 [SI::rad]"}, + } + for _, tc := range cases { + t.Run(tc.expr, func(t *testing.T) { + wantReport(t, check(t, binary, dimensionOneModel, "-e", tc.expr), 0, tc.want) + }) + } +} + // TestRunCalcQuantity checks that a calculation's quantity result is reported in // the coherent unit of its dimension, a prefix folded into the magnitude. func TestRunCalcQuantity(t *testing.T) { diff --git a/conformance/fixtures/verification.sysml b/conformance/fixtures/verification.sysml index 10300bc03b..df1032ebee 100644 --- a/conformance/fixtures/verification.sysml +++ b/conformance/fixtures/verification.sysml @@ -39,7 +39,7 @@ package Demo { attribute :>> mass = 1200.0; } - part analysis { + part 'analysis' { assert satisfy massLimit by sedan; assert satisfy massTiny by sedan; } diff --git a/docs/guide/01-install.md b/docs/guide/01-install.md index 008dc17d12..83dce366ad 100644 --- a/docs/guide/01-install.md +++ b/docs/guide/01-install.md @@ -69,7 +69,7 @@ as a dependency. `sysml-grpc`, the service the Python bindings talk to, is published as a bare `sysml-grpc--` file with a `.sha256` sidecar rather than inside an archive, because -the `opensysml` Python package downloads and verifies it itself (see [client/python/README.md](../../client/python/README.md)). +the `opensysml` Python package downloads and verifies it itself (see [client/python/DEVELOPING.md](../../client/python/DEVELOPING.md)). `make build-grpc` builds it from source. **Archive layout:** the `opensysml--.tar.gz` bundles contain both binaries under their diff --git a/docs/guide/05-checking.md b/docs/guide/05-checking.md index 1c81956051..75e609c28c 100644 --- a/docs/guide/05-checking.md +++ b/docs/guide/05-checking.md @@ -350,6 +350,20 @@ over a dimension-one unit such as `rad` keeps that unit, since the reduction wou unit written as one name (`3 [km]`, `400 [cm]`) is kept as written. The magnitude changes only by the exact scale factor of the reduction — never by the choice of spelling. +`MeasurementReferences::one`, the library's dimensionless unit, is the identity of the unit +product: a factor written in it leaves the product (`0.7 [one] * 800 [W]` is `560.0 [W]`, +`800 [W] / 0.5 [one]` is `1600.0 [W]`), a product of nothing but `one` is `one` +(`2 [one] * 3 [one]` is `6 [one]`), and the rest folds as if the factor were not there — an +efficiency declared `attribute :>> efficiency = 0.7 [one];` reads `67200.0 [SI::J]` in +`power * duration * efficiency` bound to an `EnergyValue`, the same as `0.7` with no unit. The +identity a product absorbed is the unit again once every other unit cancels, however the +operations are grouped: `(2 [one] * 3 [m]) / 3 [m]` and `2 [one] * (3 [m] / 3 [m])` are both +`2.0 [one]`, where `3 [m] / 3 [m]` alone is the plain number `1.0`. The identity is recognised +by the unit's structure — a plain `DimensionOneUnit` at scale one — not by its name, so a +dimension-one unit of another kind (`rad`, `sr`) or one that scales `one` by a `unitConversion` +(a percent) is kept in the product like `rad` is, while a unit a model declares as +`attribute unity : DimensionOneUnit = one;` is the same identity as `one`. + Writing a quantity to a feature typed by a quantity kind checks its reduced dimension, not its spelling: `10 [N] / 2 [kg]` is admitted to an `AccelerationValue`, and an `L·T^-1` value written to one is refused as a `type mismatch` naming both dimensions. See diff --git a/docs/guide/07-saving-and-rdf.md b/docs/guide/07-saving-and-rdf.md index 1eb05b21ff..33c47a60e3 100644 --- a/docs/guide/07-saving-and-rdf.md +++ b/docs/guide/07-saving-and-rdf.md @@ -112,6 +112,9 @@ passed inline, takes the same format names as `-from` and `-to`, and returns the with its formats, or an `error` together with the diagnostics that explain it. `tolerate_syntax_errors` writes notation despite syntax errors; it is rejected for any direction that builds a graph, where an unparsed declaration would be silently dropped. +`id_form` spells derived element ids when notation is written as a graph, as `-id` does: +`qualified` (the default) or `uuid`. It is rejected for any other direction, and for any other +value. A response whose conversion used the RDF mapping sets `experimental` and `experimental_notice`, whether it succeeded or refused, so a client can learn the status from the response rather than diff --git a/docs/guide/09-clients.md b/docs/guide/09-clients.md index 9c2d0e81f0..0350706fa4 100644 --- a/docs/guide/09-clients.md +++ b/docs/guide/09-clients.md @@ -56,7 +56,6 @@ package Demo { ```bash pip install opensysml - export OPENSYSML_GRPC_VERSION=latest # or install sysml-grpc yourself ``` === "Node" @@ -106,12 +105,15 @@ package Demo { No installation step beyond the path: the package is plain `.m` files. MATLAB R2019b+ or GNU Octave 7+. -The six service clients each need a `sysml-grpc` binary to start, and they share the cache they -find one in — `~/.opensysml/bin/sysml-grpc`, then `$PATH`, with a release downloaded into that -cache when `$OPENSYSML_GRPC_VERSION` asks for one. An explicit path comes first, from a variable -that differs by client: `$OPENSYSML_BINARY` for Python and Node, `$OPENSYSML_GRPC_BINARY` for Java -and Rust. [Getting the service binary](#getting-the-service-binary) gives the five ways to provide -one. The Go API needs none: it is the engine. +The service clients share the cache `~/.opensysml/bin/sysml-grpc` and can use a binary on `$PATH`; +Python and Java download and verify the release they were built against when no release is +configured. A Rust crate published from a release tag does too: its release's digests are stamped +from the checksum manifest when published. A checkout build or a request for another release still +needs a pin or `$OPENSYSML_ALLOW_UNPINNED_DOWNLOAD`; Rust does not verify the manifest's Sigstore +signature itself. An explicit path comes first, from a variable that differs by client: +`$OPENSYSML_BINARY` for Python and Node, +`$OPENSYSML_GRPC_BINARY` for Java and Rust. [Getting the service binary](#getting-the-service-binary) +gives the five ways to provide one. The Go API needs none: it is the engine. ### Author an action body @@ -383,6 +385,8 @@ states its concurrency, ownership and stability promises. client starts and stops automatically, so a script can parse, inspect, execute and convert a model without running `sysml` as a subprocess. The complete API, the generated typed classes and the measured latency are documented in [reference/python-api.md](../reference/python-api.md). +[Metamodel classes and JSON](../reference/python-metamodel.md) reads a JSON export into generated +SysML metamodel classes without a service. ### Installation @@ -399,14 +403,15 @@ Those projects publish wheels for CPython 3.10 and later only, which is the rang Every call goes through `sysml-grpc`. The client starts an instance of the service, looking for the binary in this order: `$OPENSYSML_BINARY`, then -`~/.opensysml/bin/sysml-grpc` (`.exe` on Windows), then a release download into that cache if -one was requested, then `sysml-grpc` on `$PATH`. There are five ways to provide it: +`~/.opensysml/bin/sysml-grpc` (`.exe` on Windows), then a download of the built-against release +or the configured release into that cache, then `sysml-grpc` on `$PATH`. There are five ways to +provide it: ```bash # 1. Download the release build (verified against the digest pinned in opensysml) python -c "from opensysml.binary import download_binary; download_binary('latest')" -# 2. Have opensysml.connect() download it on first use +# 2. Select another release instead of the built-against default export OPENSYSML_GRPC_VERSION=latest # or a tag like v0.0.5 # 3. Build from source @@ -418,22 +423,22 @@ export OPENSYSML_BINARY=$PWD/bin/sysml-grpc # 5. Install one on $PATH, with a package manager or `go install` ``` -If none of these is in place, `connect()` raises `ConnectionError` listing everywhere it looked, -rather than downloading anything you did not ask for. A binary from `$OPENSYSML_BINARY` or `$PATH` -belongs to no release, so it is started as found: not copied into the cache and not verified -against the pinned digests described below. If `$OPENSYSML_BINARY` names something that is not -executable, that is an error, not a reason to look elsewhere. `OPENSYSML_GITHUB_REPO` overrides -the repository releases are fetched from (default `Open-MBEE/OpenSysML`). +If the built-against release is unavailable, `connect()` uses an executable on `$PATH` with a +warning, or raises `ConnectionError` with the reason and remedies. A binary from +`$OPENSYSML_BINARY` or `$PATH` belongs to no release, so it is started as found: not copied into +the cache and not verified against the pinned digests described below. If `$OPENSYSML_BINARY` +names something that is not executable, that is an error, not a reason to look elsewhere. +`OPENSYSML_GITHUB_REPO` overrides the repository releases are fetched from (default +`Open-MBEE/OpenSysML`). A download records its release tag, repository and digest beside the binary (`~/.opensysml/bin/sysml-grpc.json`). That way a cache left by an earlier release, or by another repository publishing the same tag, is replaced rather than handed to a client asking for a newer one. Without this check an older build would answer and the call would fail with a -`MissingCapabilityError` naming a capability the requested release does provide. The check only -runs when a release is requested, so when `OPENSYSML_GRPC_VERSION` is unset a manually installed -binary (option 3) is left alone. If the requested release cannot be downloaded, because there is no -asset for the platform or no network, the cached binary keeps serving and a warning says so rather -than the connection failing. +`MissingCapabilityError` naming a capability the requested release does provide. A manually +installed cache without release metadata is left alone; a cache recorded for another release is +replaced. If a release cannot be downloaded because there is no asset for the platform or no +network, the cached binary keeps serving and a warning says so rather than the connection failing. A download is verified against the SHA-256 digest that `opensysml` pins for that release, not against the `.sha256` file served beside the binary. That sidecar comes from whoever served @@ -497,6 +502,11 @@ model.raise_for_errors() # raises ModelError, or returns the model model = opensysml.load("model.sysml", strict=True) # raises instead of returning ``` +The diagnostics are the ones `sysml -validate` reports for the same document: syntax errors, +the parser's notation warnings and what the analysis makes of them — a reserved keyword written +as a name (`part filter : X;`, code `reserved-keyword-name`) is an error over gRPC as it is on the +command line — and the resolution and validation findings. + A `Diagnostic` carries `severity`, `message`, `code` and its location. Branch on `code`, not on the message text: `"syntax"` for a syntax error, a validation code such as `"unresolved"` or `"feature-value-overriding"` for a finding, `"choice-point"` and `"guard-unevaluable"` for a @@ -1565,6 +1575,13 @@ inside a library would cost every consumer something for little gain. Calling it runtime is fine, and a test pins that. It is on crates.io as `opensysml`, published with each core release; take it from a path or from git for a checkout. The minimum supported Rust version is 1.83. +A crate published from a release tag carries that release's service digests, +stamped from the release checksum manifest at publish time, so its +built-against default can verify. A crate built from a Git checkout, or asked +for another release, still needs a matching pin or +`$OPENSYSML_ALLOW_UNPINNED_DOWNLOAD`. Rust does not verify the manifest's +Sigstore signature itself. + `load`/`loads` connect and parse in one call; `Connection::private()`, `Connection::external(host, port)` and `Connection::connect()` (which honours `$OPENSYSML_SERVICE`) are the explicit forms. `Drop` releases a private child deterministically, and the stdin pipe the client holds is what diff --git a/docs/internals/design/transport-evaluation.md b/docs/internals/design/transport-evaluation.md index a707284746..4b256b220e 100644 --- a/docs/internals/design/transport-evaluation.md +++ b/docs/internals/design/transport-evaluation.md @@ -284,7 +284,7 @@ because the service listens on a TCP port** — 40% of the file. Enumerated, not | **Total** | | **~690** | Plus roughly 25 of `__init__`'s 64 lines (address, channel, refcount and release fields). The -behaviors documented in the "Service ownership" section of `client/python/README.md` — +behaviors documented in the "Service ownership" section of `client/python/DEVELOPING.md` — "never stop a service you did not start", pid records authenticated by process start time so a reused pid is never signalled, stale-record cleanup, replacing a wrong-release service — are **entirely** in that 690. Under stdio the question they answer does not arise: the child is diff --git a/docs/project/README.md b/docs/project/README.md index 206c3beea6..d3901950ae 100644 --- a/docs/project/README.md +++ b/docs/project/README.md @@ -79,9 +79,10 @@ within these records and means nothing outside this repository. - **[MOSA library](mosa-library.md)** — the Modular Open Systems Approach as a bundled OpenSysML library: the statute's vocabulary, openness as metadata over the standard model, the interface control document and the warning-only checks -- **[Performance: 0.9.1 against 0.9.0](performance-release-0.9.1-vs-0.9.0.md)** — the release-gate - measurement of the 0.9.1 line against the previous release: every benchmark on both revisions, - whole-binary scaling, and each regression fixed or priced; the +- **[Performance: 0.9.2 against 0.9.1](performance-release-0.9.2-vs-0.9.1.md)** — the release-gate + measurement of the 0.9.2 patch line against 0.9.1: every benchmark on both revisions, the rows in + doubt re-run interleaved, and whole-binary scaling; the + [0.9.1 against 0.9.0](performance-release-0.9.1-vs-0.9.0.md), [0.8.0 against 0.7.0](performance-release-0.8-vs-0.7.0.md), [0.6 against 0.4.2](performance-release-0.6-vs-0.4.2.md) and [0.5 against 0.4.3](performance-release-0.5-vs-0.4.3.md) records precede it diff --git a/docs/project/nightly.md b/docs/project/nightly.md index fd98a260e0..c196b5b5b6 100644 --- a/docs/project/nightly.md +++ b/docs/project/nightly.md @@ -101,7 +101,7 @@ The `opensysml` Python client does not download a snapshot on its own. It accept manifest was signed by the CircleCI release pipeline, and a snapshot is neither. To run it against a snapshot, put the snapshot's `sysml-grpc` on your `PATH` (or point `OPENSYSML_BINARY` at it); see the -[client's README](../../client/python/README.md). +[client's developer guide](../../client/python/DEVELOPING.md). ## Verifying one diff --git a/docs/project/performance-release-0.9.2-vs-0.9.1.md b/docs/project/performance-release-0.9.2-vs-0.9.1.md new file mode 100644 index 0000000000..e42b2df616 --- /dev/null +++ b/docs/project/performance-release-0.9.2-vs-0.9.1.md @@ -0,0 +1,298 @@ +# Performance: release 0.9.2 against release 0.9.1 + +The release-gate measurement of the 0.9.2 candidate — `release/0.9.2` at +`2c96c7d9b` (2026-10-05), 28 commits past the `v0.9.1` tag (`61190b66a`, +2026-09-30) — against 0.9.1 itself. It follows the method of the +[0.9.1 against 0.9.0](performance-release-0.9.1-vs-0.9.0.md) record: every +benchmark on both revisions, `benchstat` over six runs, the rows the machine +left in doubt re-run interleaved, and whole-binary timings on generated and +real models. See [performance](../internals/performance.md) for what the +figures mean and where the remaining cost is. + +0.9.2 is a patch release cut from `main`: the semantic fixes requested for +the 0.9.1 line (library names, element ids by declaration, succession ends, +variant and requirement-constraint references, implicit-subsetting +uniqueness, transition source members, gRPC parser warnings) and the +Python-client work (release-digest stamp, metamodel reader, the PyPI +README). It carries none of the `develop` features that follow 0.9.1, so +the expectation going in was parity, and parity is what the measurement +finds. + +## Summary + +- **Package benchmarks are level.** Across the nine benchmark packages + no row regresses by a margin the interleaved re-run confirms. Package + geomeans move between −2.3% (`internal/exec/runtime`) and +1.1% + (`internal/frontend/lsp`), each within the machine's run-to-run spread; + `tests/perf` is +0.8% as found, with ten rows significantly faster + (3–9%) and one slower, re-run below. +- **Allocations are unchanged** to the byte everywhere except the model + loader, which allocates **+0.4–0.7% bytes per element** and +0.08% + allocations on the stress constellation at every size (32 to 512 + satellites), and the resolved-document analysis at +1.0% bytes. This is + the price of the semantic fixes' extra bookkeeping on the symbol tables + and is the only systematic difference the measurement finds. +- **Whole binary.** `sysml -validate` on the generated models (≈3 000, + 6 000 and 12 000 declarations) and on the Apollo 11 model is the same + wall time and the same resident set on both binaries, to the 10 ms and + 1 MiB resolution of the clock. The binary is 128 KiB larger; an empty + session starts in the same 0.02 s and maps the same 65 MiB. +- **Stress constellation as found** showed 13 rows slower by 11–44% on the + candidate, twelve of them in the load and open paths and all with a + 14–74% spread on the candidate's six counts against 2–5% on the baseline's. Re-run + interleaved, every one of them is `~`, their allocation counts are + identical to four digits, and the spread appears on both sides: the + first pass had measured the machine during the candidate's half hour, + not the candidate. + +Nothing here blocks the release. + +## Method + +Machine: `INTEL(R) XEON(R) PLATINUM 8559C`, 8 CPUs, 31 GiB, Go +`go1.25.0 linux/amd64`, `GOMAXPROCS=8`. 0.9.1 is a worktree at the tag, +built and benchmarked with its own tree; the candidate is `release/0.9.2` +at `2c96c7d9b`. Package benchmarks are +`go test ./ -run '^$' -bench . -benchmem -count 6` on each revision, +compared with `benchstat` (rows are significant at p < 0.05; `~` is no +significant difference). The first pass ran each package's six counts on +0.9.1 and then on the candidate; rows it left in doubt — a significant +difference, or a spread above 20% on either side — were re-run with the +two revisions interleaved, `-count 1` six times each, nothing else on the +machine. Whole-binary figures are `/usr/bin/time -f '%e %M'` over five +interleaved runs of each binary, both built with `make build-sysml` +(`-s -w`, `-trimpath`); medians are reported. + +### What is and is not comparable + +- **`internal/syntax/parser`** defines no benchmark that runs without + `OPENSYSML_BENCH_MODEL`; neither revision produced a row and the package + is omitted. +- **`internal/frontend/grpc`**: `InstantiateWarmModel` exists only on the + candidate (it arrived with the gRPC parser-warning fix, #751) and has no + baseline row; the two parse rows are compared. +- **`tests/stressmodel`**: both revisions have the same 48 rows. + `ConvertAPIJSON/satellites=512` completed a single count on each side + (134.6 s against 153.6 s) and is excluded as no distribution. +- **Diagnostics**: on every model measured both binaries return the same + exit status and the same report — `no errors` on the generated models, + the two example models and all 28 Apollo 11 files. + +## Package benchmarks + +Time per operation, 0.9.1 then the candidate; bytes and allocations where +they moved. + +### `internal/exec/runtime` + +| benchmark | 0.9.1 | 0.9.2 | +| --------- | ----- | ----- | +| `MaterializePlainAttributes` | 48.6 µs | 47.6 µs (~) | +| `SetFeatureValueNoDependents` | 401 ns | 386 ns (~) | +| `DerivedReadWriteRead` | 5.82 µs | 5.81 µs (~) | +| `AssignmentLoopStep` | 959 µs | 926 µs (~) | +| geomean | | −2.3% time / +0.0% B / +0.0% allocs | + +### `internal/frontend/repl` + +28 rows; 25 are `~`. The three that moved: + +| benchmark | 0.9.1 | 0.9.2 | +| --------- | ----- | ----- | +| `RunStateMachine/elements=1000` | 12.9 µs | 13.5 µs (+4.8%, p=0.026) | +| `RunCalc/elements=1000` | 4.50 µs | 4.60 µs (+2.2%, p=0.026) | +| `CompiledCalc/Hypot(3.0,4.0)/interpreted` | 10.4 µs ±20% | 7.57 µs (−27%, p=0.002) | +| geomean | | +0.3% time / +0.6% B / +0.0% allocs | + +The two slower rows are the 1 000-element size only; the 250 and 4 000 +sizes of the same benchmarks are `~`, and the re-run below has them `~` +at 1 000 as well: `RunStateMachine/elements=1000` 14.5 µs against 14.2 µs (~, p=0.818), +`RunCalc/elements=1000` 4.83 µs against 4.94 µs (~, p=0.818), allocations +identical. The `Hypot` gain is the baseline's own +±20% spread (its six counts straddle 7.5–12 µs) rather than a change in +the candidate, which has no commit on the interpreter. + +### `internal/frontend/grpc` + +| benchmark | 0.9.1 | 0.9.2 | +| --------- | ----- | ----- | +| `ParseFileColdShared` | 7.73 ms | 7.74 ms (~) | +| `ParseFileColdInline` | 7.89 ms | 7.90 ms (~) | +| geomean (compared rows) | | +0.1% time / +0.1% B / +0.0% allocs | + +### `internal/frontend/lsp` + +| benchmark | 0.9.1 | 0.9.2 | +| --------- | ----- | ----- | +| `FormatEdits` | 536 µs | 517 µs (−3.5%, p=0.026) | +| `SpanToRangeLarge` | 2.91 ms | 2.96 ms (~) | +| `ReferencesWarm` | 216 µs | 201 µs (~) | +| `ReferencesCold` | 37.9 ms | 38.5 ms (~) | +| `RenameWarm` | 17.8 ms | 17.3 ms (~) | +| `WorkspaceUpdate` | 208 ms ±3% | 248 ms ±17% (~, p=0.093) | +| geomean | | +1.1% time / +0.0% B / +0.0% allocs | + +`WorkspaceUpdate` is the row that sets the geomean; its re-run is below: +over twelve interleaved counts, 196 ms ±3% against 194 ms ±25% (~, +p=0.843), 49.38 MiB against 49.37 MiB, 605.6 k allocations on both. The +candidate's spread is two counts at 270 and 361 ms in a run of twelve +otherwise at 189–241 ms, the same shape the baseline shows at 256 ms; the +`FormatEdits` row that was faster as found is `~` the same way (530 µs +against 522 µs). + +### `internal/translate/migrate`, `internal/workspace/libs`, `internal/workspace/model` + +| benchmark | 0.9.1 | 0.9.2 | +| --------- | ----- | ----- | +| `migrate WriterSiblingBlocks` | 1.94 ms | 1.88 ms (~) | +| `libs ExpandWildcardImports` | 28.5 ms | 28.5 ms (~) | +| `libs IndexLibrary` | 14.3 ms | 14.1 ms (~) | +| `libs ExpandModelImports` | 6.85 ms | 6.76 ms (~) | +| `libs DecodeSnapshot` | 13.4 ms | 13.2 ms (~) | +| `libs SetDigest` | 637 µs | 643 µs (~) | +| `libs` geomean | | −0.6% time / +0.0% B / +0.0% allocs | +| `model AnalyseUnresolved` | 20.7 ms | 20.8 ms (~) | +| `model AnalyseResolved` | 1.31 ms / 486 KiB | 1.29 ms (~) / 491 KiB (+1.0%) | +| `model` geomean | | −0.6% time / +0.5% B / +0.2% allocs | + +### `tests/perf` + +37 rows; 26 are `~`. The rows that moved: + +| benchmark | 0.9.1 | 0.9.2 | +| --------- | ----- | ----- | +| `WorkspaceEdit/synthetic/reindex+diagnostics` | 1.74 s | 1.60 s (−8.2%, p=0.002) | +| `FeaturesOf` | 1.02 s | 0.94 s (−7.8%, p=0.002) | +| `REPLLoadFile` | 1.50 s | 1.38 s (−7.5%, p=0.004) | +| `REPLSubmitSnippet` | 1.11 s | 1.04 s (−6.8%, p=0.004) | +| `REPLEvalExpr` | 4.78 ms | 4.63 ms (−3.2%, p=0.026) | +| `LowerActionGraph` | 1.87 µs | 1.70 µs (−9.0%, p=0.015) | +| `ExecuteActionFreshContext` | 31.2 µs | 29.2 µs (−6.4%, p=0.002) | +| `ExecuteState` | 695 µs | 667 µs (−4.1%, p=0.026) | +| `BatchConstraints` | 9.75 ms | 9.26 ms (−5.0%, p=0.026) | +| `SameConstraintManyInstances` | 3.73 µs | 3.57 µs (−4.2%, p=0.002) | +| `ActionChain/chain100` | 575 µs ±3% | 747 µs ±23% (+30%, p=0.015) | +| `Analyze/synthetic` | 463 MiB | 466 MiB (+0.6% B) | +| `REPLLoadFile` / `REPLSubmitSnippet` | 593 / 510 MiB | 596 / 512 MiB (+0.4% / +0.5% B) — the loader's bytes, below | +| geomean | | +0.8% time / −0.0% B / +0.0% allocs | + +The gains are of the size the machine gives between two runs of the same +binary (the candidate has no commit on the REPL, the lowering or the +constraint engine), and the first pass ran 0.9.1's six counts first; the +re-run below is what to read: `FeaturesOf` is −11.8% at p=0.041 with a 23% spread on the baseline +side and no change in allocations (4.157 M against 4.154 M); +`REPLLoadFile`, `Lex`, `LowerStateGraph`, `Instantiate` and +`GRPCVerifyConstraint` are `~`. `WorkspaceEdit/synthetic/reindex+diagnostics` +is 1.57 s against 1.62 s (~, p=0.937) for −8.2% as found. Nothing here is +a change in the code. `ActionChain/chain100` is the +one row slower, with the candidate's six counts spread 23%: interleaved, 592 µs ±23% against 594 µs ±28% (~, p=0.818), 516.9 KiB and +5 757 allocations on both. **Noise.** + +### `tests/stressmodel` + +48 rows, 47 compared. As found, 34 time rows are `~`, two are faster +(`Satisfy/512` −3.3%, `FleetInstantiate/128` −15.5%) and 13 are slower, +twelve of them in the load and open paths, with a 14–74% spread on the +candidate's six counts against 2–5% on 0.9.1's: + +| benchmark | 0.9.1 | 0.9.2 as found | re-run | +| --------- | ----- | -------------- | ------ | +| `Load/satellites=32` | 371 ms ±4% | 455 ms ±27% (+22%) | 363 ms ±51% / 373 ms ±44% (~) | +| `LoadFiles/satellites=512` | 7.19 s ±2% | 9.37 s ±23% (+30%) | 7.36 s ±41% / 7.12 s ±34% (~) | +| `OpenSplit/satellites=128/cold` | 746 ms ±2% | 887 ms ±24% (+19%) | 735 ms ±39% / 715 ms ±62% (~) | +| `OpenSplit/satellites=128/warm` | 214 ms ±5% | 295 ms ±22% (+38%) | 203 ms ±32% / 198 ms ±76% (~) | +| `OpenSplit/satellites=512/cold` | 2.95 s ±2% | 3.28 s ±14% (+11%) | 2.88 s ±12% / 2.89 s ±63% (~) | +| `OpenSplit/satellites=512/warm` | 676 ms ±4% | 935 ms ±21% (+38%) | 655 ms ±29% / 638 ms ±58% (~) | +| `HydratePlane/satellites=32` | 99 ms ±35% | 128 ms ±15% (+29%) | 104 ms ±41% / 92 ms ±26% (~) | +| `HydratePlane/satellites=128` | 259 ms ±22% | 372 ms ±41% (+44%) | 268 ms ±42% / 254 ms ±45% (~) | +| `HydratePlane/satellites=512` | 1.03 s ±2% | 1.31 s ±74% (+27%) | 1.21 s ±41% / 1.03 s ±25% (~) | +| `ConvertAPIJSON/satellites=32` | 7.29 s ±8% | 9.32 s ±22% (+28%) | 7.15 s ±21% / 7.19 s ±62% (~) | +| `FleetSatisfy/satellites=32` | 1.06 ms ±4% | 1.11 ms ±10% (+4.5%) | 1.09 ms ±13% / 1.10 ms ±42% (~) | +| geomean (as found) | | +6.0% time / +0.3% B / +0.0% allocs | | + +The same paths at the other sizes are `~` as found (`Load` at 128 and 512, +`LoadFiles` at 32 and 128, `OpenSplit` at 32, `ValidateSplit` and +`AnalyzeSplitPerDocument` at every size and job count), which a code +regression in the loader would not leave alone. Interleaved, with nothing else on the machine, every one of the eleven +rows is `~` (the `re-run` column: 0.9.1 then the candidate, six counts +each), the re-run geomean over them is −0.4%, and the spread is now as +wide on 0.9.1 as it was on the candidate — 12–51% on the baseline's own +counts — which is what the first pass measured: the virtual machine's +neighbours during the candidate's half-hour, not the candidate. The two +rows faster as found (`Satisfy/512`, `FleetInstantiate/128`) are `~` the +same way. + +Bytes and allocations on this package are the one systematic signal in +the whole measurement: + +| benchmark | 0.9.1 | 0.9.2 | +| --------- | ----- | ----- | +| `Load/satellites=32` | 132.1 MiB / 1.993 M allocs | 132.6 MiB (+0.41%) / 1.994 M (+0.08%) | +| `Load/satellites=128` | 498.8 MiB / 7.676 M | 501.3 MiB (+0.50%) / 7.682 M (+0.08%) | +| `Load/satellites=512` | 1.924 GiB / 30.41 M | 1.934 GiB (+0.53%) / 30.43 M (+0.08%) | +| `LoadFiles/satellites=512` | 1.845 GiB | 1.858 GiB (+0.73%) | +| `ValidateSplit/satellites=512/jobs=8` | 2.325 GiB | 2.335 GiB (+0.45%) | +| bytes per element, `Load` | 21.0–21.7 KiB | +0.4–0.5% | +| `ConvertAPIJSON/satellites=32` | 25.73 M allocs | 25.53 M (−0.8%) | + +A constant +0.4–0.7% bytes per element at every size, with +0.08% +allocations (the REPL's `LoadModel/elements=4000` shows the same +0.58% +bytes and +0.09% allocations), is one small allocation per declaration +on the load-and-analyse path. The candidate's changes on that path are +the implicit-subsetting uniqueness check (#748), which now collects the +subsettings a feature writes before walking the ones it has implicitly, +and the variant-reference parse (#790); the time it costs is below what +the machine resolves. **Explained**, and well below the per-element growth +the previous two records priced. The API-JSON conversion allocates 0.8% +fewer objects for the same bytes (the id-form fix, #749). + +## Whole-binary scaling + +`sysml -validate` over generated compliant models (the satellite-network +generator at ≈3 000, 6 000 and 12 000 declarations: 3 804, 7 260 and +14 172 lines) that report `no errors`, five runs each with the two +binaries interleaved; median wall seconds and median maximum resident set. + +| declarations | 0.9.1 | 0.9.2 | +| ------------ | ----- | ----- | +| ≈3 000 | 0.10 s / 98 MiB | 0.10 s / 98 MiB | +| ≈6 000 | 0.14 s / 108 MiB | 0.15 s / 124 MiB | +| ≈12 000 | 0.25 s / 133 MiB | 0.24 s / 132 MiB | + +Level at every size within the clock's 10 ms. The 16 MiB at ≈6 000 is +one run's garbage-collector timing, not a trend: the 3 000 and 12 000 +rows are within 1 MiB and the five 6 000-declaration runs of the +candidate range 108–125 MiB. + +### Process start and session floor + +| figure | 0.9.1 | 0.9.2 | +| ------ | ----- | ----- | +| binary size | 42.46 MiB | 42.59 MiB (+128 KiB) | +| empty session (`sysml -e 1`), median of 5 | 0.02 s / 65 MiB | 0.02 s / 65 MiB | +| empty-session load (`LoadModel/elements=0`) | 392 µs | 398 µs (~) | + +### Example models and the Apollo 11 model + +Median wall time and maximum resident set of five interleaved runs; every +run returned the same exit status and report on both binaries. The Apollo +11 model is the public +[Apollo 11 SysML v2 model](https://github.com/airbus/apollo-11-sysml-v2) +(commit `6e9c93f`, 28 files, 7 221 lines). + +| model / command | 0.9.1 | 0.9.2 | +| --------------- | ----- | ----- | +| `action-executor-demo.sysml -validate` | 0.02 s / 67 MiB | 0.02 s / 66 MiB | +| `disposal-robot-demo/robot.sysml -validate` | 0.04 s / 72 MiB | 0.04 s / 72 MiB | +| Apollo 11, `-validate` all 28 files | 0.28 s / 150 MiB | 0.28 s / 150 MiB | + +## What this does not measure + +- The Python client's own paths (the metamodel reader, the release-digest + download) have no benchmark; they are covered by the client's test suite + and the release-packaging rehearsal, not by this record. +- The gRPC service's `InstantiateWarmModel` row has no 0.9.1 counterpart. +- Everything ran on one 8-CPU virtual machine; the as-found stress rows + show what its neighbours can do to a 30-minute benchmark run, and a + one-CPU host should read the package figures rather than the + whole-binary ones, as the previous record said. diff --git a/docs/project/pilot-differential-baseline.json b/docs/project/pilot-differential-baseline.json index 35605e5678..f659cb380a 100644 --- a/docs/project/pilot-differential-baseline.json +++ b/docs/project/pilot-differential-baseline.json @@ -61,7 +61,7 @@ "dir": "examples", "origin": "ours", "files": 45, - "digest": "sha256:a81cee6d77595285c96f9f55bc077ba6b9de7ade7fd33bbccee1ce6e26d53491" + "digest": "sha256:ff2e6448a1d48708f0cb7a8010f3cb5281775314d9835d0461b8a0a3c5f91ed1" }, { "name": "probes", diff --git a/docs/project/releasing.md b/docs/project/releasing.md index 4864e3b8cf..030b397839 100644 --- a/docs/project/releasing.md +++ b/docs/project/releasing.md @@ -126,7 +126,8 @@ artifacts; nothing reaches a registry or a GitHub release. A green rehearsal proves the tag will not fail on builds, tests, version lockstep, registry availability, credential presence, npm/Central/GitHub token auth, the GPG key and passphrase with real Maven signing, npm packing, -or `cargo package`. It cannot prove the PyPI and crates.io token validity (no +`cargo package`, or the release-digest stamps and the assertions that the +wheel, sdist and crate pin the rehearsed tag's binaries. It cannot prove the PyPI and crates.io token validity (no read-only check exists for either), cosign keyless signing (skipped because it writes to Rekor), the uploads themselves, Central publish permission beyond token auth, or a version someone publishes between the rehearsal and the tag. @@ -222,7 +223,9 @@ does a tag whose version `client/python/opensysml/_version.py`, ## What CircleCI publishes -`build-release` produces, in `dist/`: +`build-release-binaries` builds the Go binaries for every platform into `dist/`, +and `build-release` assembles the release from them and the Python distribution, +so that `dist/` holds: - per-binary archives — `sysml--.tar.gz`, `sysml-lsp--.tar.gz` (`.zip` on Windows); @@ -235,8 +238,9 @@ does a tag whose version `client/python/opensysml/_version.py`, archived, because that is what `opensysml` downloads and verifies (`client/python/opensysml/binary.py`) when it starts the service for a Python caller; - the Python client's distribution, `opensysml--py3-none-any.whl` and - `opensysml-.tar.gz`, built by `build-python-package` and the same files - `publish-pypi` uploads (see [Releasing opensysml to PyPI](#releasing-opensysml-to-pypi)); + `opensysml-.tar.gz`, built by `build-python-package` from those + `sysml-grpc` binaries' digests and the same files `publish-pypi` uploads (see + [Releasing opensysml to PyPI](#releasing-opensysml-to-pypi)); - `SHA256SUMS.txt` over every archive, the wheel and every `sysml-grpc` binary, with its cosign signature `SHA256SUMS.txt.bundle` (see [The signed checksum manifest](#the-signed-checksum-manifest)); @@ -247,7 +251,14 @@ does a tag whose version `client/python/opensysml/_version.py`, Platforms: linux/amd64, linux/arm64, darwin/amd64, darwin/arm64, windows/amd64. -Before any of it is stored or published, `build-release` runs each host-platform +The two jobs share one workspace: `build-release-binaries` persists the whole +`dist/` tree, and `build-release` persists only what it added to it — the +manifest, its signature and provenance bundles, the `.sha256` sidecars and the +Python distribution. Workspace layers are additive, and a path persisted by two +upstream jobs fails the attach in every job downstream of both, which is every +publish job. + +Before any of it is stored or published, `build-release-binaries` runs each host-platform binary and fails the release unless `--version` reports `CIRCLE_TAG`. The ldflags are the only thing stamping the tag into a binary, and a binary reporting `dev` or a stale tag looks the same on the release page as a correct one — that is how @@ -728,13 +739,13 @@ version: it changes what every installer ships. ### Pinned release digests -The table in `client/release-digests.json`, which every client ships a synced -copy of, still covers the releases published before signing existed, and it -stays the override: where a pin exists -it wins, and a verified manifest that disagrees with a pin is an error rather -than a downgrade. **Per release there is now nothing to do** — pinning a release -signed by the pipeline is optional. Pinning still works, and is worth doing for -a release clients on an older `opensysml` should be able to install: +The committed copies of `client/release-digests.json` stay in sync and still +cover releases published before signing existed. A pin remains an override: +where a client has a pin, it wins, and clients that verify signed manifests +refuse a disagreement rather than downgrade. **Per release there is now nothing +to do** — pinning a release signed by the pipeline is optional. Pinning still +works, and is worth doing for a release clients on an older `opensysml` should +be able to install: ```bash export GITHUB_TOKEN=... # must be able to read this repository's releases @@ -749,6 +760,22 @@ token, `Contents: read` for a fine-grained one; nothing is written through the API. Without either variable the script fails immediately with `MissingTokenError` naming the variable, rather than at the first request. +Each client's package ships the pins of its own release, stamped at release +time by `client/python/scripts/pin_release_checksums.py` and never committed to +the synced client tables. `build-python-package` runs it with +`--from-binaries dist/grpc` — hashing the `sysml-grpc` binaries +`build-release-binaries` built, before `SHA256SUMS.txt` exists — against the +copy of the table the wheel and sdist package, so `pip install opensysml==X.Y.Z` +verifies the service it downloads against a digest inside the wheel, with no +environment variable and no `sigstore` at run time. `publish-crates` stamps the +crate the same way with `--from-manifest dist/SHA256SUMS.txt`, once the signed +manifest exists. Both jobs then fail unless the packaged table pins all five +`sysml-grpc-*` assets for the tag, and `build-release` fails before signing +unless the wheel's pins are the digests the manifest lists. The signed manifest +is therefore what an `opensysml` reaches for only for another release, or when it +is older than the release it is asked for; `--write` back-fills the committed +tables after a release as before, for those clients. + ## The SonarCloud scan Not a release step — the `scan` job runs in the `build-test` workflow on every @@ -1012,16 +1039,27 @@ An API token is the authentication CircleCI has. Two jobs of the `release` workflow, so the distribution is built once and the same bytes go to the GitHub release and to PyPI. -`build-python-package`, which runs beside the Go suite and gates `build-release`: +`build-python-package`, which runs after `build-release-binaries` (whose `dist/grpc` +it attaches) and gates `build-release`: 1. `check_version.py` — the tag must name the declared version. -2. `python -m build` — wheel *and* sdist, into `client/python/dist/`. -3. `twine check --strict` — the metadata a broken listing comes from. -4. Installs the built wheel into a clean virtualenv, imports it, and checks +2. `pin_release_checksums.py --version "$CIRCLE_TAG" --from-binaries dist/grpc + --table client/python/opensysml/release-digests.json` — hashes the five + `sysml-grpc-*` binaries the release ships and stamps them, under the tag, + into the copy of the table the distribution packages (see [Pinned release + digests](#pinned-release-digests)). The committed tables are untouched. +3. `python -m build` — wheel *and* sdist, into `client/python/dist/`. +4. `twine check --strict` — the metadata a broken listing comes from. +5. Installs the built wheel into a clean virtualenv, imports it, and checks `opensysml.__version__` is the version being published. -5. Persists `client/python/dist/` to the workspace. `build-release` copies both - files into `dist/`, lists them in `SHA256SUMS.txt` before signing it, and checks - their names carry the tag's version. +6. Opens the wheel and the sdist and fails unless each packages a + `release-digests.json` pinning all five assets for the tag to the digests of + the binaries in `dist/grpc`, and the installed wheel's `pinned_digest()` + returns them. +7. Persists `client/python/dist/` to the workspace. `build-release` copies both + files into `dist/`, lists them in `SHA256SUMS.txt`, fails unless the wheel's + pins are the manifest's `sysml-grpc-*` lines, signs the manifest, and checks + the distribution's names carry the tag's version. `publish-pypi`, which runs last, after the Go suite, the Python client tests, `build-release` and `publish-github-release` have all passed on the tagged revision: @@ -1134,9 +1172,10 @@ See `client/node/README.md`. ### Where the binaries come from -The five binaries are `build-release`'s `dist/grpc` output — the same bytes as -the GitHub release and the signed `SHA256SUMS.txt`, persisted to the workspace -the npm job attaches. `npm run platform-packages` refuses to package a binary +The five binaries are `build-release-binaries`' `dist/grpc` output, with the +`.sha256` sidecars `build-release` writes beside them — the same bytes as the +GitHub release and the signed `SHA256SUMS.txt`, persisted to the workspace the +npm job attaches. `npm run platform-packages` refuses to package a binary whose bytes disagree with its `.sha256` sidecar, or that has none, so the packages can only carry what the release built. npm's `--provenance` is not used: the CLI mints attestations only on GitHub Actions and GitLab CI/CD. @@ -1464,13 +1503,14 @@ documents its own minimum supported Rust version. `opensysml-conformance` is a workspace member and a runner, not a library, and is **not** published: it reads `conformance/scenarios` from this repository. -One limitation stands, and this publish does not change it: a download of the -`sysml-grpc` release binary — which `$OPENSYSML_GRPC_VERSION` asks for — -verifies only against the digests pinned in the crate's embedded -`release-digests.json`, which currently runs through v0.3.0. A published crate -therefore cannot download the binary of its own release; it is used against a -running service or a binary it is pointed at (`$OPENSYSML_GRPC_BINARY`, then -`sysml-grpc` on `$PATH`). See `client/rust/README.md` for the resolution order. +Before packaging, the job stamps the crate's embedded `release-digests.json` +with the five service-asset digests for `CIRCLE_TAG` from +`dist/SHA256SUMS.txt`. The release build has already signed and verified this +manifest. A crate published from a release tag can therefore verify and +download the release it was built against by default. The Rust client still +does not verify the manifest's Sigstore signature itself. A crate built from a +Git checkout, or asked for another release, still needs a matching pin or +`$OPENSYSML_ALLOW_UNPINNED_DOWNLOAD`. ### Pre-releases @@ -1487,10 +1527,11 @@ so consumers get it only by naming it exactly. 3. Refuses the version when crates.io already holds it (a published version cannot be replaced, only yanked), and refuses rather than guesses when the API cannot be asked. -4. `cargo package -p opensysml --locked` — the dry run that builds and verifies - the packaged file list. -5. `cargo publish -p opensysml --locked --no-verify`; cargo reads the token - from the environment, so nothing is written to disk. +4. Stamps `CIRCLE_TAG` from `dist/SHA256SUMS.txt`, packages with + `cargo package -p opensysml --allow-dirty --locked`, and verifies the + packaged crate embeds all five service digests for that tag. +5. `cargo publish -p opensysml --locked --no-verify --allow-dirty`; cargo reads + the token from the environment, so nothing is written to disk. ### If a publish goes wrong diff --git a/docs/project/roadmap.md b/docs/project/roadmap.md index 2d958ef1a5..7cb339ee97 100644 --- a/docs/project/roadmap.md +++ b/docs/project/roadmap.md @@ -801,11 +801,13 @@ the inventory in `tests/export/testdata/ontology-known-violations.txt`. The `typ `function` and `targetFeature` keys stay listed for the fixtures' unresolvable names and body parameters above; the parameters go when D1/D2 make expression bodies elements of the graph. -The abstract-metaclass half is not mechanizable from the ontology: `SysML.owl` records no ecore -abstractness (see D8), so every metaclass the encoder writes (`kinds.go` and the constants in -`rdf_out.go`/`rdf_expr.go`) was checked by hand against the abstract classes of the pilot's -`SysML.ecore` and `kerml.ecore` — `ConnectorAsUsage`, `ControlNode`, `Element`, `Expose`, -`Import`, `InstantiationExpression`, `LoopActionUsage`, `Relationship`. Two were written: +The abstract-metaclass half was checked by hand while the table came from `SysML.owl`, which +records no ecore abstractness: every metaclass the encoder writes (`kinds.go` and the constants in +`rdf_out.go`/`rdf_expr.go`) against the abstract classes of the pilot's `SysML.ecore` and +`kerml.ecore` — `ConnectorAsUsage`, `ControlNode`, `Element`, `Expose`, `Import`, +`InstantiationExpression`, `LoopActionUsage`, `Relationship`. Generated from the ecore (D8), the +table now records them, and the same gate reports a subject typed by one as `abstract-class`; no +golden graph has one. Two were written: `Import`, now `NamespaceImport` / `MembershipImport` and, for an `expose`, `NamespaceExpose` / `MembershipExpose` in place of an `sysx:isExpose` flag, and `ConnectorAsUsage` for a KerML `connector`, now `Connector`. The decoder still accepts both abstract classes from older graphs. @@ -816,7 +818,9 @@ still delivers every `type`, `referent` and `targetFeature` of its fixture. [`Open-MBEE/sysmlv2-rdf-ontology`](https://github.com/Open-MBEE/sysmlv2-rdf-ontology) renders the OMG metamodel (version 202407, from `SysML.ecore`) as OML and OWL: `SysML.owl`, 172 classes, 348 -object properties, 63 datatype properties, with `rdfs:domain`/`rdfs:range` on each. It uses the +object properties, 63 datatype properties, with `rdfs:domain`/`rdfs:range` on each, and has not +been regenerated since. The current metamodel, version 20250201 as the pinned pilot's `SysML.ecore` +declares it, has 175 classes, 351 object properties and 64 datatype properties. It uses the *same* namespace we do and its class IRIs are the plain metaclass names we already emit; the difference is the properties, each qualified by the metaclass that defines it (`sysml:Element_declaredName`, `sysml:Element_owner` with range `OwningMembership`), and a @@ -830,9 +834,12 @@ structural decisions (`internal/translate/export/rdf_out.go`), so the profile is layer: property name → defining metaclass. **Done:** the table and the gate. `internal/translate/rdf/ontology` holds the term table generated -from `SysML.owl` by `tools/gen/ontology` from a local checkout (version `202407`, -upstream commit in the generated header): 411 properties spanning only **336 distinct unqualified -names — 59 names are declared by more than one metaclass** (`type`, `value`, `source`, `target`, +by `tools/gen/ontology` from the pilot's `SysML.ecore` at the release `scripts/pilot-pin.sh` pins +(version `20250201`, pilot tag and commit in the generated header), naming each property by the +OWL rendering's `_` IRI and recording its multiplicity, ordering, derivation, +redefinitions, subsettings and opposite; `make ontology-table-check` keeps it equal to the pin in +CI. It holds 415 properties spanning only **342 distinct unqualified +names — 58 names are declared by more than one metaclass** (`type`, `value`, `source`, `target`, …), so the unqualified convention is genuinely lossy in the other direction and a profile encoder has to pick by the subject's metaclass (`LookupProperty` returns every declaration; `AmbiguousNames` reports the set). The gate is `TestGoldenGraphsMatchOntology`, whose inventory is @@ -840,8 +847,8 @@ also the profile's work list, sorted into five causes: properties the metamodel relationship or membership element that we collapse into the element (`value` → `FeatureValue`, the multiplicity bounds → `MultiplicityRange`, `isNegated` → `Invariant`, a transition's ends → `Connector`) — the same collapse D3.3 undid for ownership and D1/D2 will undo for expressions and -ends; names as literals (D7); metaclass names the 202407 rendering does not have (`FlowUsage`, -which it calls `FlowConnectionUsage`, and `TerminateActionUsage`); the metaclasses of our own +ends; names as literals (D7); metaclass names the metamodel does not have (`ClassUsage`, +`IndividualDefinition`, `IndividualUsage`); the metaclasses of our own `sysx:` namespace; and the properties we write into the SysML namespace that no metaclass declares, each either a relationship the metamodel reifies as an element (`specializes`, `subsets`, `redefines`, `references`, `aliasedElement`, `via`) or a notation flag with no diff --git a/docs/project/spec-compliance.md b/docs/project/spec-compliance.md index fbc3767c5d..0e73cbf676 100644 --- a/docs/project/spec-compliance.md +++ b/docs/project/spec-compliance.md @@ -657,8 +657,8 @@ checked after the result is bound is not a form the runtime offers, and none is | **Name in the unit position of a quantity expression.** `x [u]` invokes `Quantities::'['(num, mRef)`, so `u` is an ordinary operand expression and its name is resolved by ordinary name resolution: resolution returns the *nearest* declaration the name reaches (KerML 8.2.3.5.3 Local and Visible Resolution, 8.2.3.5.4 Full Resolution), and the position's expected type (`ScalarMeasurementReference`) only decides whether what resolved conforms (KerML 8.2.3.5.1). A sibling named `m` therefore shadows an imported `SI::m` — resolution does **not** continue outward looking for a unit — and the quantity is rejected with a diagnostic naming the declaration, the namespace declaring it, and the qualified spelling of the unit it hid. One routine implements this for every evaluator (part feature value default, action/state attribute default, calc return, condition) | `semantics/units.go` `unitTermOfName`, `ShadowedUnitError`, `unitOutside`; `runtime/context.go` `chainMembers` (a condition evaluates in its own body scope, as the other paths do) | `unit_shadowed_by_sibling_slot.sysml`, `unit_shadowed_by_sibling_action.sysml`, `unit_shadowed_by_sibling_calc.sysml`, `unit_shadowed_by_sibling_constraint.sysml`, `unit_shadowed_by_local_unit.sysml`, `unit_undeclared.sysml`, `robustness_test.go:quantity_unit_shadowed_by_sibling` | ✅ Faithful | | A violated assertion renders a quantity operand as it was written (`1.0 [m] > 500.0 [m]`), since the bracket form is a quantity and not a sequence index | `runtime/condition.go` `conditionText` (`ast.IndexExpr`) | `runtime/condition_test.go:TestViolationRendersQuantityOperands` | ✅ Faithful | | Commensurable units convert before a comparison or a sum, through `MeasurementUnit::unitConversion` and unit-defining expressions reduced to base units — `1.5 [m/s] <= 5.4 [km/h]` is true, exactly, at its boundary (a conversion factor is kept as a ratio, not evaluated) | `semantics/units.go` `UnitTermOf`, `Scale`, `ConvertMagnitude` | `requirement_quantity_converted_unit.sysml`, `constraint_quantity_sum.sysml`, `semantics/units_test.go:TestScaleStaysExact` | ✅ Faithful | -| A unit is composed by the operation over quantities (`10 [m] / 2 [s]` is a quantity of dimension L·T^-1), and a ratio of like quantities is a number of no unit. The composition is kept in **canonical form** (`UnitProduct`) — a product of powers of the *named* units the operands were written in, powers of one unit merged, cancelled factors dropped, factors sorted, the denominator grouped once — so `3 [m] * 3 [m]`, `(3 [m]) ** 2` and `(3 [m] * 3 [m]) / 3 [m]` compose `m**2`, `m**2` and `m`; `(m/s) * (kg/s)` composes `kg*m/s**2`; and a named derived unit stays a factor as the user wrote it (`N*m`, `km/h**2`). A unit the notation quotes keeps its quotes, so it stays one unit under composition — `'A/m'*m`, `'A/m'**2`, never the quotient `A/m*m` — and the text reads back to the same units (`UnitNameText`). This canonical product is what a result *prints* only where the row below finds no coherent unit for it: a product no library unit measures (`2 [kg] * 3 [K]` is `6 [K*kg]`), one holding a dimension-one unit (`2 [m] * 3 [rad]` is `6 [m*rad]`) or an opaque unit the wire carried, and one whose exponent is not a number, which stays the error it was. The reduction to base units (`UnitTerm`) stays the one authority for commensurability and conversion; the named product is display only, and `Quantity.String`, the trace, the REPL, and the gRPC `unit` field all render the one text. A quantity arriving over gRPC carries only its unit text and reduction, so `ProtoToQuantity` reads the named product back out of the text against the model (`SI::m/SI::s` times `SI::s` is `SI::m` remotely as locally), a name written short under an import (`m`) being looked for in the namespaces of the base units the reduction names (`m` times `SI::m` is `m**2`); text that is no unit expression is one opaque named unit, quoted (`'metres per second'`) so a product it is in reads back as itself; text the model cannot read as a whole — a name no unit bears, or two units bear, or a reduction the whole contradicts — is read name by name, the units it does declare staying factors of their own (`'metres per second'*SI::s` divided by `SI::s` after a round trip is `'metres per second'` again); text that reads as units but reduces to another dimension or scale than the `unit_term` beside it is `ErrUnitTextMismatch`, never a quantity whose label and reduction disagree | `semantics/unit_product.go` `UnitProduct` (`Times`, `DividedBy`, `Pow`, `normalizeProduct`, `String`), `runtime/quantity.go` `scaleQuantities`, `powQuantity`, `composedQuantity`, `grpc/convert.go` `unitProductOfText` | `constraint_quantity_quotient.sysml`, `calc_quantity_ratio.sysml`, `instance_quantity_calculations.sysml`, `runtime/quantity_test.go:TestComposedUnitCanonical`, `TestUnitProductRendering`, `runtime/quantity_functions_test.go:TestQuantityPowerAndProductAgree`, `grpc/quantity_test.go:TestQuantityFromWireComposesAsWritten`, `TestOpaqueUnitFactorsSurviveTheWire`, `semantics/units_test.go:TestNamedUnitProductSpellsOneName`, `TestQuantityFromWireRejectsUnitTextItsReductionContradicts` | ✅ Faithful | -| A computed quantity is reported in the **coherent unit of its dimension**, not in the expression it was composed by (KerML/SysML Quantities and Units Domain Library: a `DerivedUnit` is the product of its `unitPowerFactors`, a `ConversionByPrefix`/`ConversionByConvention` a scale over its reference unit, and a coherent derived unit has conversion factor one over the system's base units): `9.80665 ['m⋅s⁻²'] * 311 [s]` is `3049.86815 [SI::'m/s']`, `10 [N] / 2 [kg]` is `5.0 [SI::'m⋅s⁻²']`, `3 [m] * 3 [m]` is `9 [SI::'m²']`, `(3.986E14 ['m³⋅s⁻²'] / 6563 [km]) ^ (1/2)` is `7793.229127559948 [SI::'m/s']` — the kilometre's 10^3 folded into the magnitude, so the same expression over `6563000 [m]` answers the same value. The reduction is derived from the library's `MeasurementReferences` data alone — a unit's `unitPowerFactors` (a user-declared `DerivedUnit` reduces like `SI`'s own), its `unitConversion`'s `conversionFactor` and `referenceUnit`, the prefixes — into a power vector over the system's base units and a scale; the scale is folded into the magnitude by the exact factor (`ConvertMagnitude`, never a rounding of the spelling), and the display unit is chosen among the measurement units the model and the libraries declare whose reduction matches: the coherent one (`SI::'m/s'`, not a model's synonym), the declared type of the feature or parameter the value is bound to deciding between same-dimension units that measure different kinds (`EnergyValue` takes `SI::J`, `TorqueValue` `SI::'N⋅m'`, a product bound to no kind the base-unit spelling `SI::'kg⋅m²⋅s⁻²'`), and the reduced base-unit product otherwise. A quantity written as one named unit is kept as written (`3 [km]` stays `3 [km]`; `1 [km] + 500 [m]` is `1.5 [km]`), a dimension-one result is a number (`6 [km] / 3 [km]` is `2.0`), and a magnitude changes only by the reduction's scale. The rule is applied once, in the quantity layer — `Context.coherentResult` over every product, quotient, power, root, aggregate, vector and tensor scaling and library operator, and `Context.checkWriteType` where a value is bound to a feature typed by a quantity kind — so `-calc`, `-eval`, `-analysis`, `-requirement`/`-satisfy`, `-instantiate`, the REPL, the trace, queries and the gRPC `unit` field all report the one spelling | `semantics/coherent_quantity.go` `Model.CoherentQuantity`, `Model.CoherentSpelling`, `coherentUnitOf`, `coherentSynonym`, `definedOverBaseUnits`; `semantics/units.go` `powerFactorsUnitTerm`, `unitPowerFactor` (a `DerivedUnit`'s `unitPowerFactors`); `semantics/coherent_unit.go` `Model.CoherentUnit`; `runtime/quantity.go` `Context.coherentResult`, `scaleQuantities`, `powQuantity`, `sqrtQuantity`; `runtime/write_conformance.go` `Context.checkWriteType`, `spellForDeclared`; `runtime/collections.go` (aggregates), `vector_functions.go`, `tensor_functions.go`, `library_operators.go`; `queryexec/computed.go` | `conformance/instance_quantity_coherent_units.sysml` + `.expected.json` (products, quotients, fractional powers, prefixed inputs, a user-declared `DerivedUnit`, a dimensionless ratio, a product no unit measures, a dimension-one factor kept, a non-numeric exponent), `calc_quantity_coherent_result.sysml`, `calc_quantity_coherent_mismatch.sysml` (an L·T^-1 result declared an acceleration stays the dimension mismatch), `semantics/coherent_quantity_test.go:TestCoherentQuantitySpellsTheLibraryUnit`, `:TestCoherentQuantityFallsBackToBaseUnits`, `:TestCoherentQuantityKeepsWhatItCannotReduce`, `:TestCoherentSpellingFollowsTheDeclaredType`, `runtime/quantity_test.go`, `runtime/quantity_functions_test.go`, `queryexec/quantity_test.go`, `grpc/quantity_test.go`, `repl/runtime_commands_test.go`, `cmd/sysml/run_test.go:TestRunCalcQuantity` | ✅ Faithful (the pinned pilot evaluator computes quantity magnitudes but spells no composed unit, so the coherent spelling is judged against the library declarations themselves: every unit chosen is one `SI` declares with conversion factor one over the base units) | +| A unit is composed by the operation over quantities (`10 [m] / 2 [s]` is a quantity of dimension L·T^-1), and a ratio of like quantities is a number of no unit. The composition is kept in **canonical form** (`UnitProduct`) — a product of powers of the *named* units the operands were written in, powers of one unit merged, cancelled factors dropped, the identity absorbed, factors sorted, the denominator grouped once — so `3 [m] * 3 [m]`, `(3 [m]) ** 2` and `(3 [m] * 3 [m]) / 3 [m]` compose `m**2`, `m**2` and `m`; `(m/s) * (kg/s)` composes `kg*m/s**2`; and a named derived unit stays a factor as the user wrote it (`N*m`, `km/h**2`). `MeasurementReferences::one`, the library's dimensionless unit (`DimensionOneUnit`, whose `unitPowerFactors` are empty), is the **identity** of the unit product: `one * u` and `u / one` compose `u`, `one * one` and `one ** n` compose `one`, so `0.7 [one] * 800 [W]` is `560.0 [W]` and `800 [W] * 120 [s] * 0.7 [one]` reaches the same derived unit as without the factor. The identity is recognised by structure, not by name (`Model.IsIdentityUnit`): a unit of `DimensionOneUnit` itself reducing to scale one — so a unit a model declares the same way is the identity too — while a unit of a specialization (`rad`, `sr`: `AngularMeasureUnit`) or one scaling `one` by a `unitConversion` (a percent) is a dimension-one factor that stays (`3 [rad] * 1 [one]` is `3 [rad]`, `50 ['%'] * 800 [W]` is `40000 ['%'*W]`). A unit the notation quotes keeps its quotes, so it stays one unit under composition — `'A/m'*m`, `'A/m'**2`, never the quotient `A/m*m` — and the text reads back to the same units (`UnitNameText`). This canonical product is what a result *prints* only where the row below finds no coherent unit for it: a product no library unit measures (`2 [kg] * 3 [K]` is `6 [K*kg]`), one holding a dimension-one unit (`2 [m] * 3 [rad]` is `6 [m*rad]`) or an opaque unit the wire carried, and one whose exponent is not a number, which stays the error it was. The reduction to base units (`UnitTerm`) stays the one authority for commensurability and conversion; the named product is display only, and `Quantity.String`, the trace, the REPL, and the gRPC `unit` field all render the one text. A quantity arriving over gRPC carries only its unit text and reduction, so `ProtoToQuantity` reads the named product back out of the text against the model (`SI::m/SI::s` times `SI::s` is `SI::m` remotely as locally), a name written short under an import (`m`) being looked for in the namespaces of the base units the reduction names (`m` times `SI::m` is `m**2`); text that is no unit expression is one opaque named unit, quoted (`'metres per second'`) so a product it is in reads back as itself; text the model cannot read as a whole — a name no unit bears, or two units bear, or a reduction the whole contradicts — is read name by name, the units it does declare staying factors of their own (`'metres per second'*SI::s` divided by `SI::s` after a round trip is `'metres per second'` again); text that reads as units but reduces to another dimension or scale than the `unit_term` beside it is `ErrUnitTextMismatch`, never a quantity whose label and reduction disagree | `semantics/unit_product.go` `UnitProduct` (`Times`, `DividedBy`, `Pow`, `normalizeProduct`, `String`), `absorbIdentity`, `semantics/units.go` `Model.IsIdentityUnit`, `Model.DeclaredUnitProduct`, `runtime/quantity.go` `scaleQuantities`, `powQuantity`, `composedQuantity`, `grpc/convert.go` `unitProductOfText` | `constraint_quantity_quotient.sysml`, `calc_quantity_ratio.sysml`, `instance_quantity_calculations.sysml`, `runtime/quantity_test.go:TestComposedUnitCanonical`, `TestUnitProductRendering`, `runtime/dimension_one_identity_test.go`, `conformance/instance_quantity_dimension_one_identity.sysml` + `.expected.json`, `semantics/units_test.go:TestIsIdentityUnit`, `TestUnitProductAbsorbsIdentity`, `cmd/sysml/run_test.go:TestRunEvalDimensionOneIdentity`, `runtime/quantity_functions_test.go:TestQuantityPowerAndProductAgree`, `grpc/quantity_test.go:TestQuantityFromWireComposesAsWritten`, `TestOpaqueUnitFactorsSurviveTheWire`, `semantics/units_test.go:TestNamedUnitProductSpellsOneName`, `TestQuantityFromWireRejectsUnitTextItsReductionContradicts` | ✅ Faithful | +| A computed quantity is reported in the **coherent unit of its dimension**, not in the expression it was composed by (KerML/SysML Quantities and Units Domain Library: a `DerivedUnit` is the product of its `unitPowerFactors`, a `ConversionByPrefix`/`ConversionByConvention` a scale over its reference unit, and a coherent derived unit has conversion factor one over the system's base units): `9.80665 ['m⋅s⁻²'] * 311 [s]` is `3049.86815 [SI::'m/s']`, `10 [N] / 2 [kg]` is `5.0 [SI::'m⋅s⁻²']`, `3 [m] * 3 [m]` is `9 [SI::'m²']`, `(3.986E14 ['m³⋅s⁻²'] / 6563 [km]) ^ (1/2)` is `7793.229127559948 [SI::'m/s']` — the kilometre's 10^3 folded into the magnitude, so the same expression over `6563000 [m]` answers the same value. The reduction is derived from the library's `MeasurementReferences` data alone — a unit's `unitPowerFactors` (a user-declared `DerivedUnit` reduces like `SI`'s own), its `unitConversion`'s `conversionFactor` and `referenceUnit`, the prefixes — into a power vector over the system's base units and a scale; the scale is folded into the magnitude by the exact factor (`ConvertMagnitude`, never a rounding of the spelling), and the display unit is chosen among the measurement units the model and the libraries declare whose reduction matches: the coherent one (`SI::'m/s'`, not a model's synonym), the declared type of the feature or parameter the value is bound to deciding between same-dimension units that measure different kinds (`EnergyValue` takes `SI::J`, `TorqueValue` `SI::'N⋅m'`, a product bound to no kind the base-unit spelling `SI::'kg⋅m²⋅s⁻²'`), and the reduced base-unit product otherwise. A quantity written as one named unit is kept as written (`3 [km]` stays `3 [km]`; `1 [km] + 500 [m]` is `1.5 [km]`), a dimension-one result is a number (`6 [km] / 3 [km]` is `2.0`), a factor in `MeasurementReferences::one` is absorbed before the fold so `power * duration * efficiency` with `efficiency = 0.7 [one]` bound to an `EnergyValue` is `67200.0 [SI::J]` exactly as with `efficiency = 0.7` (the row above), and a magnitude changes only by the reduction's scale. The rule is applied once, in the quantity layer — `Context.coherentResult` over every product, quotient, power, root, aggregate, vector and tensor scaling and library operator, and `Context.checkWriteType` where a value is bound to a feature typed by a quantity kind — so `-calc`, `-eval`, `-analysis`, `-requirement`/`-satisfy`, `-instantiate`, the REPL, the trace, queries and the gRPC `unit` field all report the one spelling | `semantics/coherent_quantity.go` `Model.CoherentQuantity`, `Model.CoherentSpelling`, `coherentUnitOf`, `coherentSynonym`, `definedOverBaseUnits`; `semantics/units.go` `powerFactorsUnitTerm`, `unitPowerFactor` (a `DerivedUnit`'s `unitPowerFactors`); `semantics/coherent_unit.go` `Model.CoherentUnit`; `runtime/quantity.go` `Context.coherentResult`, `scaleQuantities`, `powQuantity`, `sqrtQuantity`; `runtime/write_conformance.go` `Context.checkWriteType`, `spellForDeclared`; `runtime/collections.go` (aggregates), `vector_functions.go`, `tensor_functions.go`, `library_operators.go`; `queryexec/computed.go` | `conformance/instance_quantity_coherent_units.sysml` + `.expected.json` (products, quotients, fractional powers, prefixed inputs, a user-declared `DerivedUnit`, a dimensionless ratio, a product no unit measures, a dimension-one factor kept, a non-numeric exponent), `calc_quantity_coherent_result.sysml`, `calc_quantity_coherent_mismatch.sysml` (an L·T^-1 result declared an acceleration stays the dimension mismatch), `semantics/coherent_quantity_test.go:TestCoherentQuantitySpellsTheLibraryUnit`, `:TestCoherentQuantityFallsBackToBaseUnits`, `:TestCoherentQuantityKeepsWhatItCannotReduce`, `:TestCoherentSpellingFollowsTheDeclaredType`, `runtime/quantity_test.go`, `runtime/quantity_functions_test.go`, `queryexec/quantity_test.go`, `grpc/quantity_test.go`, `repl/runtime_commands_test.go`, `cmd/sysml/run_test.go:TestRunCalcQuantity` | ✅ Faithful (the pinned pilot evaluator computes quantity magnitudes but spells no composed unit, so the coherent spelling is judged against the library declarations themselves: every unit chosen is one `SI` declares with conversion factor one over the base units) | | A quantity raised to a constant exponent raises its unit with it, and its magnitude comes from the one `**` implementation the folder and the runtime share — so `(0.0 [m]) ** -1.0` and an overflowing magnitude are the same typed errors as for a bare number rather than an infinity carried in a unit, and `(2 [m]) ** 3` keeps an Integer magnitude. A product of quantities keeps the magnitude kind the same arithmetic gives bare numbers, so `l1 * l1` and `l1 ** 2` agree (`9 [m**2]`, both Integer) | `runtime/quantity.go` `powQuantity`, `scaleQuantities`; `semantics/quantity_eval.go` `PowQuantity`, `ScaleQuantities`, `MagnitudeArith`, `semantics/eval.go` `Pow`, `semantics/units.go` `UnitTerm.Pow` | `runtime/quantity_test.go:TestQuantityExponentiation`, `TestQuantityExponentiationReports`, `runtime/quantity_functions_test.go:TestQuantityPowerAndProductAgree` | ✅ Faithful | | **`QuantityCalculations`** computes unit-aware: `sqrt` takes the root of the unit with the magnitude (`sqrt(9 [m**2])` is `3.0 [m]`, `sqrt(4 [m**2/s**2])` is `2.0 [SI::'m/s']`), and a unit some base unit of which is raised to an odd power has no root — `sqrt(9 [m])`, `sqrt(8 [m**3])` — and is a typed error (`ErrUnitRoot`) naming the unit and the offending power, never a magnitude in a fractional unit; a root the *named* units cannot spell at whole powers is taken over the base units instead (`sqrt(4 [km*m])` is `63.24… [m]`), except that a dimension-one unit at an odd power has no base unit to fall back to and is `ErrUnitRoot` too — `sqrt(9 [rad])`, `sqrt(9 ['°'])`, `sqrt(9 [rad*m**2])` — while `sqrt(9 [rad**2])` is `3.0 [rad]` and a cancelled ratio `sqrt(9 [m/m])` is the number `3.0`; no `rad**0.5` is ever made; `abs`, `floor`, `round` act on the magnitude and keep the unit; `max`/`min` convert to compare and answer the winning operand *as written* (`max(1 [m], 200 [cm])` is `200 [cm]`), incommensurable operands being `ErrIncommensurableUnits`; `sum`/`product` fold in the first element's unit (`(1 [km], 500 [m])->sum()` is `1.5 [km]`, `(2 [m], 3 [m])->product()` is `6 [SI::'m²']`); `'+'`, `'-'` (both arities), `'*'`, `'/'`, `'**'`, `'^'`, `'<'`, `'>'`, `'<='`, `'>='`, `'=='`, `isZero`, `isUnit`, `ToString`, `ToInteger`, `ToRational`, `ToReal` delegate to the same quantity code the operators use (`ToInteger` truncates the magnitude toward zero as `RealFunctions::ToInteger` does: `ToInteger(2.5 [m])` is `2`); `ToDimensionOneValue(2.5)` is the number `2.5`, which is how the runtime holds every quantity of dimension one and no unit (a bare number multiplies, adds and compares with quantities as one — `ratio * 3 [m]` is `7.5 [m]`), so it binds to a `DimensionOneValue` feature and computes on from there; conversely the `ScalarQuantityValue` parameters of these functions take a bare number *as* that dimension-one quantity, and answer a bare number back (`abs(-3)` is `3`, `ToString(2)` is `"2"`, `2 + 1 [rad]` is `3`, never a made-up `3 [1]`) | `runtime/quantity_functions.go` `registerQuantityCalculations`, `quantityArg`, `runtime/quantity.go` `inUnit`, `runtime/quantity.go` `sqrtQuantity`, `runtime/errors.go` `ErrUnitRoot` | `instance_quantity_calculations.sysml`, `instance_quantity_calculation_failures.sysml`, `runtime/quantity_functions_test.go:TestQuantityCalculations`, `TestQuantityCalculationsReport`, `robustness_test.go:quantity_calculation_that_has_no_value` | ✅ Faithful | | `import QuantityCalculations::*;` — which the ISQ examples do — leaves `(1 [m], 2 [m])->sum()` computing `3 [m]`: the runtime's registration answers the library declaration before its vendored body, whose private `zero` the library constrains but never values, is reached; without that import the bare `sum` is whichever `sum` the model does import (`NumericalFunctions::sum` sums quantities too), and a model importing neither is told the name is unresolved, as the checker tells it | `runtime/quantity_functions.go` `registerQuantityCalculations`, `runtime/library_functions.go` `libraryFunctionFor` | `calc_quantity_sum_imported.sysml`, `calc_quantity_sum_unimported.sysml`, `runtime/quantity_functions_test.go:TestQuantitySumWithAndWithoutImport` | ✅ Faithful | @@ -2643,7 +2643,7 @@ a whole model or that its vocabulary is settled — see | Ownership as the abstract syntax states it: `sysml:owner` and `sysml:owningRelatedElement` as element references, and a materialized `OwningMembership` — or `FeatureMembership` where a type owns a feature — between owner and member, each with its own IRI, `sysml:elementId` and member/owner wiring | `export/rdf_out.go` `owningMembership`/`relationshipOwnership`, `rdf/ids.go` `OwningMembershipID` (the member's id plus `_om`, which no element id can be) | `export/ownership_graph_test.go:TestEveryElementCarriesItsElementID`, `:TestOnlyTheOutermostElementIsARoot`, `:TestMembersAreReachedThroughTheirMembership`, `:TestAFeatureIsOwnedThroughAFeatureMembership`, `:TestARelationshipOwnsItsMemberDirectly`, `:TestVisibilityIsStatedByTheMembership`, `:TestOwnershipComesBackFromTheMembershipsAlone`, `:TestWithoutAnyOwnershipPropertyTheTreeFlattens`, `:TestCompactOwnershipGraphStillConverts`, `:TestMembershipWithoutItsEndsIsReported` | ✅ Faithful for containment — one root per document, and the tree comes back from the memberships alone with `sysx:sourceText` and `sysml:owningNamespace` stripped. The compact `sysml:owningNamespace` shape earlier releases wrote is still written and still read; a membership missing an end is a typed error naming `sysml:memberElement`. Not claimed: a graph read back through a live Flexo API | | Expression node identity: an id in `[a-zA-Z0-9_-]+` and `sysml:elementId`, so a node is addressable by id like an element | `rdf/ids.go` `ExpressionNodeID` (the owner's id, `_p`, and the encoded position, which no element or membership id can be), `rdf/vocab.go` `ExpressionIRI`, `export/rdf_expr.go` `expressionNode` | `rdf/ids_test.go:TestExpressionNodeIDRoundTripsAndCannotCollide`, `export/export_test.go:TestFixtureElementIDsRoundTrip`, `export/w6g4_rdf_expr_test.go:TestExpressionIdentityIsPerPosition`, `:TestExpressionTreesKeepTheRoundTripExact` | ✅ Faithful for addressing — the id is deterministic, reversible and accepted where an element id is; the `.` an earlier id held was refused by `requireValidId` before the store was read. A node is still not a model element: no `sysml:qualifiedName`, no ownership, and it is reached only from the position holding it | | Reference-valued properties as element references, as the API defines them: `sysml:type`, `importedNamespace`, `importedMembership` (the imported element's owning membership, KerML §8.3.2.5 `MembershipImport::importedMembership`), `sourceFeature`/`targetFeature`, `referent`, `function`, and every declaration-head relationship link the element the name resolves to — an element of the graph by its id, a standard library element by its normative id whether or not the library is in the graph — and stay a literal only for a name that resolves to nothing the model declares or a body parameter, which is no element | `export/rdf_out.go` `reference`, `importedMembership`; `export/rdf_identity.go` `subjectForNode` (normative ids through `identity.LibraryCatalog`); `export/names.go` resolver-checked shortest spelling; `export/rdf_in.go` `referenceName`, `libraryElement` (reads an IRI or a legacy literal) | `tests/export/reference_iris_test.go` `TestReferencePropertiesLinkElements` (a library type, a current-document type, an inherited `start`, a feature chain, a membership import's owning membership, a metadata definition by short name, an unresolvable name kept as a literal), `TestLegacyReferenceGraphsStillRead`; `tests/export/ontology_gate_test.go` `TestGoldenGraphsMatchOntology` (the `literal-for-object-property` inventory shrank to the fixtures' unresolvable names) | ✅ Faithful (a graph from a release that wrote the name as a literal reads back and gains the links on its next hop) | -| Every metaclass written is concrete in the metamodel, as every element the SysML v2 API returns is: an import is `sysml:NamespaceImport` or `sysml:MembershipImport`, never abstract `sysml:Import`; a KerML `connector` is `sysml:Connector`, never abstract `sysml:ConnectorAsUsage`; and no other abstract class of the pilot's `SysML.ecore`/`kerml.ecore` (`ControlNode`, `Element`, `Expose`, `InstantiationExpression`, `LoopActionUsage`, `Relationship`) is written | `export/rdf_out.go` `encodeMember` (`mNamespaceImport`/`mMembershipImport`); `export/kinds.go` `usageMetaclass` (`Connector`), `legacyConnectorAsUsage`; `export/rdf_in.go` `declarationHead` (accepts `sysml:Import` and `sysml:ConnectorAsUsage` from older graphs) | `tests/export/reference_iris_test.go` `TestReferencePropertiesLinkElements`, `TestLegacyReferenceGraphsStillRead` (abstract `sysml:Import`), `TestLegacyConnectorAsUsageStillReads`; golden `imports.golden.ttl` | ✅ Faithful (audited by hand against the ecore models' abstract classes, which the pinned `SysML.owl` does not record) | +| Every metaclass written is concrete in the metamodel, as every element the SysML v2 API returns is: an import is `sysml:NamespaceImport` or `sysml:MembershipImport`, never abstract `sysml:Import`; a KerML `connector` is `sysml:Connector`, never abstract `sysml:ConnectorAsUsage`; and no other abstract class of the pilot's `SysML.ecore`/`kerml.ecore` (`ControlNode`, `Element`, `Expose`, `InstantiationExpression`, `LoopActionUsage`, `Relationship`) is written | `export/rdf_out.go` `encodeMember` (`mNamespaceImport`/`mMembershipImport`); `export/kinds.go` `usageMetaclass` (`Connector`), `legacyConnectorAsUsage`; `export/rdf_in.go` `declarationHead` (accepts `sysml:Import` and `sysml:ConnectorAsUsage` from older graphs) | `tests/export/reference_iris_test.go` `TestReferencePropertiesLinkElements`, `TestLegacyReferenceGraphsStillRead` (abstract `sysml:Import`), `TestLegacyConnectorAsUsageStillReads`; golden `imports.golden.ttl` | ✅ Faithful (`TestGoldenGraphsMatchOntology` reports a subject typed by a metaclass the pinned `SysML.ecore` declares abstract) | | Ownership cycle in an input graph | refused: every element's `owningNamespace` chain must reach a root, or no root owns the element and printing would emit an empty document | `export_test.go:TestOwnershipCycleIsUnsupported` | ⛔ Rejected rather than emitting an empty file (deliberate). Ownership in the abstract syntax is a tree — an element has at most one owning relationship, and the graph is what a notation document nests — so a cycle is not an unrepresentable model but an inconsistent graph. The alternative, writing the elements a root does reach, would silently drop the cycle's members; the refusal names the elements in it | | Lexical `//` and `/* */` trivia across the RDF hop | no element owns trivia; `doc`/`comment` are declarations and do convert | `export_test.go:TestCommentsThroughRDF` | ⛔ Not carried through `.ttl` (a direct `.sysml` save keeps it). Trivia belongs to no element in the abstract syntax, so there is no subject to hang it on; carrying it as a per-element `sysx:` blob would make the graph a source archive rather than a model. The surfaces say so: `sysml -convert` and `%save` print the experimental note, and the guide points at the notation save for round trips that must keep comments | | Blank nodes, RDF collections, bare literal shorthands | rejected by `rdf.ParseTurtle` | `rdf_test.go:TestParseTurtleRejects` | ⛔ Not supported (deliberate; see [the mapping](../reference/rdf-mapping.md)). This is a subset of Turtle, not all of it: an element of this graph is addressed by an IRI derived from its qualified name, and a blank node has no such name, so a blank-node subject could not be read back as an element or written twice to the same address. Collections and bare literal shorthands are unused by anything this mapping writes. A parse error names the line rather than dropping the statement, so a foreign graph using them fails loudly | diff --git a/docs/project/validation-constraints.md b/docs/project/validation-constraints.md index ae5e070ec6..a6f560f4ae 100644 --- a/docs/project/validation-constraints.md +++ b/docs/project/validation-constraints.md @@ -186,7 +186,7 @@ parser/resolver location. *Our message* is given only where OpenSysML's wording | `validateSubsettingFeaturingTypes` | KerML | A subsetted feature is accessible from the subsetting feature's featuring types | internal/check/passes/subsetting_featuring.go:checkSubsettingFeaturingTypes | — | `semantic/k13-subsets-inaccessible-feature.kerml` | ✅ faithful | | `validateSubsettingMultiplicityConformance` | KerML | A subsetting feature does not widen the subsetted feature's upper bound (warning) | internal/check/passes/multiplicity_conformance.go:constraintChecker.checkMultiplicityConformance | — | none | ✅ faithful | | `validateSubsettingPortionConformance` | KerML | A feature subsetting a portion feature is a portion (`Subsetting/redefining feature must be portion if subsetted/redefined feature is portion`); no-op: the pinned `KerMLValidator` declares the constant and its message but `checkSubsetting` never reports it, so `feature q :> p;` against `portion feature p : Occurrence` — in the same class, in a nested feature, inherited (`:> p` and `:>> p` in a subclass) — and the SysML `part q :> s;` against `snapshot s`/`timeslice t` usages validate clean in both notations; OpenSysML has no check either | — | — | none | ❔ unknown — no case and no identifiable pass yet | -| `validateSubsettingUniquenessConformance` | KerML | A nonunique feature does not subset or redefine a unique feature | internal/check/passes/w8b_redefinition_conformance.go:RedefinitionConformancePass.Run | — | `xpect/p04-nonunique-subsets-unique.kerml` | ✅ faithful | +| `validateSubsettingUniquenessConformance` | KerML | A nonunique feature does not subset or redefine a unique feature, whether the Subsetting is written or implied (a composite action in an action implicitly subsets `Action::subactions`, a composite part in a part `Item::subitems`; the finding is at the declaration) | internal/check/passes/w8b_redefinition_conformance.go:RedefinitionConformancePass.Run, internal/semantic/semantics/redefinition_conformance.go:ConformanceViolations (implicit subsettings through `ImplicitSubsettings`) | — | `xpect/p04-nonunique-subsets-unique.kerml` | ✅ faithful | | `validateTypeAtMostOneConjugator` | KerML | A type has at most one conjugator (`Cannot have more than one conjugator`); the pilot grammar rejects a second `~` as a syntax error; OpenSysML's parser does the same on a classifier or SysML definition, and accepts it on a feature or SysML usage where the constraint reports every conjugation past the first | internal/check/passes/conjugator.go:constraintChecker.checkAtMostOneConjugator | same wording, followed by the fix: remove the other `~` | `semantic/k52-two-conjugators.kerml` | ✅ faithful | | `validateTypeDifferencingTypesNotSelf` | KerML | A type does not difference itself | internal/check/passes/w8c_type_relationships.go:TypeRelationshipsPass.Run | — | `semantic/k05-differences-self.kerml` | ✅ faithful | | `validateTypeIntersectingTypesNotSelf` | KerML | A type does not intersect itself | internal/check/passes/w8c_type_relationships.go:TypeRelationshipsPass.Run | — | `semantic/k06-intersects-self.kerml` | ✅ faithful | diff --git a/docs/reference/api.md b/docs/reference/api.md index f6733de50e..15b96d0899 100644 --- a/docs/reference/api.md +++ b/docs/reference/api.md @@ -1035,6 +1035,7 @@ answer. | `type` | Qualified name of the resolved type of a typed feature; absent when untyped or unresolved | | | `satisfiedRequirement` | The requirement a non-verification satisfy usage references, or the satisfy usage itself when it declares the requirement; absent when unresolved or not a satisfy usage | | | `satisfyingFeature` | The feature named by a satisfy usage's `by` clause; a feature chain (`by v.heater`) reports the feature the chain ends at; absent when there is no `by` clause or it is unresolved | | +| `elementId` | The `elementId` `Convert` writes for the element (qualified id form), read from a conversion of the model made once: a declared id as declared, a standard-library element's normative id (a library file's copy included), any other the encoding of its qualified or positional name. It is the API JSON `@id` too, except in a model of several identity scopes, whose `@id` the scope qualifies. Absent for a library element a model gives an id of its own, which `Convert` references by name. A query reading it of a model `Convert` refuses is `FAILED_PRECONDITION`. Reported only when a query selects or constrains it, never by an empty `select`, since reading it converts the model | | | `multiplicityLower` | Declared lower bound | ✅ | | `multiplicityUpper` | Declared upper bound, `*` when unbounded | ✅ | diff --git a/docs/reference/python-api.md b/docs/reference/python-api.md index b43638b39f..9acbbdc6c5 100644 --- a/docs/reference/python-api.md +++ b/docs/reference/python-api.md @@ -257,6 +257,59 @@ side detected the problem either. A capability that only describes how a respons populated is not a refusal: the answer omits the fields it names, as documented per call. +## Metamodel classes and the JSON reader + +`opensysml.generate` (above) creates classes for definitions in a user's SysML model. The separate +`opensysml.metamodel` package contains generated classes for the SysML metamodel itself. Use +`opensysml.read_json` to wrap an exported JSON document without starting a service: + +```python +import opensysml +from opensysml.metamodel import PartDefinition, PartUsage + +graph = opensysml.read_json("vehicle.json") +vehicle = next( + definition for definition in graph.all(PartDefinition) + if definition.declared_name == "Vehicle" +) +print([feature.declared_name for feature in vehicle.owned_feature]) +for part in graph.all(PartUsage): + print(part.declared_name) +``` + +Elements use the metaclass inheritance hierarchy, so `isinstance(part, Feature)` works. Property +names use `snake_case` primarily (`owned_feature`) and expose their SysML `camelCase` spelling as +an alias (`ownedFeature`) to the same descriptor. `PartUsage.from_json_key("partDefinition")` +returns the primary Python name, and `PartUsage.json_key("part_definition")` returns the JSON key. +Strings passed to `read_json` are file paths, not JSON text; bytes, mappings, and sequences of +element mappings are also accepted. The reader understands DataVersion and Commit envelopes. +Reference targets are checked against their declared metaclass ranges by default; pass +`check_ranges=False` to return out-of-range targets as written. + +Missing keys raise `NotSupplied`, including absent multi-valued properties. Dangling `@id` and +unresolved `@ref` values raise `UnresolvedReference` when accessed. Invalid document structure +raises `MalformedDocument`, and a value outside its declared type raises `MalformedValue`. +These exceptions share `MetamodelError`, a subclass of `opensysml.errors.OpenSysMLError`: + +| Error | Raised when | +| --- | --- | +| `NotSupplied` | A declared JSON key is absent; `.derived` identifies computed properties. | +| `UnresolvedReference` | A reference's `@id` is absent from the graph or its `@ref` cannot be resolved. | +| `MalformedValue` | A property value has the wrong primitive, enum, array, or reference shape, or (when range checks are enabled) a reference targets the wrong metaclass. | +| `MalformedDocument` | The input is not an element object/array, or has missing/duplicate IDs or types. | +| `UnknownJSONKey` | A JSON key is not declared for the selected metaclass. | + +OpenSysML's `api-json` export carries the owned properties it writes plus some derived ones +(`ownedFeature`, `owner`, `qualifiedName`, `ownedMember`, ...). It carries no `feature`, +`inheritedFeature` or `definition`, and `type` only on some usages, so those reads raise +`NotSupplied` with `derived=True` until the engine serves derived properties. The export also +writes no `null` and no `[]`: an unset owned property, such as an unnamed element's +`declaredName`, is absent and raises `NotSupplied` too. sysml-toolkit `full-json` carries derived +properties as well. A reference to an element the document does not include, such as a +standard-library element, raises `UnresolvedReference` when read. +Providing engine-computed derived properties, implementing metamodel operations, and loading JSON +into the OpenSysML engine are separate follow-up work. + ## Development ```bash diff --git a/docs/reference/python-metamodel.md b/docs/reference/python-metamodel.md new file mode 100644 index 0000000000..44b514a892 --- /dev/null +++ b/docs/reference/python-metamodel.md @@ -0,0 +1,72 @@ +# Metamodel classes and JSON + +`opensysml.metamodel` holds one generated class per SysML/KerML metaclass +(`Element`, `Namespace`, `Feature`, `PartUsage`, ...), each with one read-only +property per metamodel property. `opensysml.read_json` builds those objects +from a JSON export in pure Python: it needs no `sysml-grpc` service, never +converts to notation and never writes back. + +This is not the same as [typed classes](python-api.md#generated-typed-classes): +`opensysml.generate` writes classes for the definitions in *your* model +(`Vehicle`, `Engine`) over service-backed instances, while the metamodel +classes describe the language's own elements and are the same for every model. + +```python +import opensysml +from opensysml.metamodel import Feature, PartUsage + +g = opensysml.read_json("vehicle.full.json") # sysml-toolkit full-json + +for p in g.all(PartUsage): + print(p.qualifiedName, [t.name for t in p.type], len(p.ownedFeature)) + assert isinstance(p, Feature) # follows the spec hierarchy +``` + +The classes follow the metamodel's inheritance, so `graph.all(Feature)` also +returns every `PartUsage`. `graph[id]` looks an element up by `@id`, and +`graph.roots()` returns the namespaces the document records no owner for. References are +resolved when read, and many-valued properties return tuples. + +## Names + +Each property's primary name is `snake_case` (`owned_feature`, `is_abstract`); +the spec's `camelCase` name (`ownedFeature`, `isAbstract`) is an alias for the +same descriptor, so both spellings behave identically and type-check. A name +that would be a Python keyword gets a trailing `_`. `PartUsage.from_json_key("partDefinition")` +and `PartUsage.json_key("part_definition")` convert between the two. The +package ships `py.typed`, so mypy and pyright see every property's type. + +## Inputs + +`read_json` accepts a file path (a `str` is always a path, never JSON text), +bytes, a single element object, or a list of element objects, with `@id`, +`@type` and `{"@id": ...}` references. It also unwraps SysML v2 API DataVersion +(`identity`/`payload`) and Commit (`change`) envelopes and `sysml:`-prefixed or +IRI types. An `@type` the metamodel does not know is read as its nearest known +ancestor when you pass `supertypes={"MyType": "PartUsage", ...}`, otherwise as +`Element`; `element.json_type` keeps the written name. + +## Missing, empty and dangling values + +A property the JSON does not carry raises `NotSupplied` (its `.derived` says +whether the property is computed). It never reads as `None` or `()` instead: +only an explicit `null` or `[]` in the JSON means empty. A reference to an `@id` +the document does not contain raises `UnresolvedReference` when read. A reference +to an element of the wrong metaclass raises `MalformedValue`. Some exports write +derived values outside their range (sysml-toolkit full-json sets a requirement +definition's `result` to the definition itself, for example); +`read_json(..., check_ranges=False)` returns such elements as written instead. + +OpenSysML's `api-json` export carries the owned properties it writes plus some derived ones +(`ownedFeature`, `owner`, `qualifiedName`, `ownedMember`, ...). It carries no `feature`, +`inheritedFeature` or `definition`, and `type` only on some usages, so those reads raise +`NotSupplied` with `derived=True` until the engine serves derived properties. The export also +writes no `null` and no `[]`: an unset owned property, such as an unnamed element's +`declaredName`, is absent and raises `NotSupplied` too. sysml-toolkit `full-json` carries derived +properties as well. A reference to an element the document does not include, such as a +standard-library element, raises `UnresolvedReference` when read. +Providing engine-computed derived properties, implementing metamodel operations, and loading JSON +into the OpenSysML engine are separate follow-up work. + +See the [Python API reference](python-api.md#metamodel-classes-and-the-json-reader) +for the full error table. diff --git a/docs/reference/rdf-mapping.md b/docs/reference/rdf-mapping.md index f620ebf193..dd557175b1 100644 --- a/docs/reference/rdf-mapping.md +++ b/docs/reference/rdf-mapping.md @@ -250,6 +250,36 @@ still wins over the normative id when a library element carries one; an annotation restating the norm's own id declares nothing, so the id stays normative and `sysx:declaredId` is not written. +**A converted model names the library elements it references.** A normative +id is a hash of a name, and cannot be turned back into one. So for each standard +library element the output references, the writer states the element under its +normative id, marked `sysml:isLibraryElement true` (KerML +`Element::isLibraryElement`, `Element_isLibraryElement` in the ontology), with: +- its `rdf:type` (`LibraryPackage` for a library package); +- `sysml:elementId`, `sysml:qualifiedName` and `sysml:declaredName`. + +Nothing else is written about it: its owner, members and relationships stay in +the library, and the library itself is not exported. A library membership the +output references (the `importedMembership` of `import ScalarValues::Real;`) is +stated as a `sysml:OwningMembership` with its `sysml:memberElement`, marked the +same way. + +So every `@id` an API JSON output references is an element of it. Such an +element has no owner in the graph, and the document's root namespace does not +take it (`LibraryReference`). + +Reading a graph back, such an element is a reference into the bundled library, +not a declaration, and it is not written. A qualified name other than the one +the library gives its id is refused rather than trusted. If the id is not in +the catalog, the reader tries the stated qualified name; without one, it uses +the stated declared name and an owner chain the graph itself states. A match +must have a compatible metaclass. A fallback match is written by its bundled +identity and reports a warning with both ids and the name used; an unmatched +stub is refused with its id and stated name. A `library package` that owns +content in the document is a declaration, even when it states +`sysml:isLibraryElement true`, and is written as notation rather than treated +as a reference stub. Repository sync never creates, changes or deletes one. + **What is a version of a library file.** A document is a version of a bundled library file when every one of its roots is a top-level package that file declares, under the same qualified name, and all of one file. On the graph side @@ -355,11 +385,16 @@ triples come); a set of classes with no such member is refused, naming the subje an element a relationship owns, whose owner is no namespace), kept alongside `sysml:owner` as the compact spelling earlier releases wrote - `sysml:visibility`, `sysml:direction` +- `sysml:isUnique` `false` for `nonunique` (`Feature::isUnique`, true when + absent), the one flag written false. The `sysml:isNonunique` earlier releases + wrote, which the 20250201 metamodel no longer declares, still reads. - Feature flags, written only when true, so an absent flag reads as false: `isAbstract`, `isVariation`, `isVariant`, `isReference`, `isComposite`, `isDerived`, - `isOrdered`, `isNonunique`, `isEnd`, `isConstant`, `isIndividual`, `isPortion`, + `isOrdered`, `isEnd`, `isConstant`, `isIndividual`, `isPortion`, `isConjugated`, `isAll`, `isAccept`, `isResult`, and `isEvent` for an `event` modifier on a usage whose metaclass is not itself `sysml:EventOccurrenceUsage`. + `sysml:EnumerationDefinition` has no `abstract` or `variation` prefix, so + neither flag adds a keyword to its declaration. A flag the two grammars spell differently is written back in the grammar of its root (`sysx:sourceLanguage`): `isConstant` as KerML's `const` or SysML's `constant`; `isPortion` as KerML's `portion`, in place of `composite` (a @@ -538,8 +573,14 @@ The `sysx:` properties: | `sysx:isKindImplicit` | The declaration wrote no kind keyword (`in x : Real;`), which takes its kind from its owner. Without it the canonical keyword would come back written out, declaring what the author did not. A kind named in a comment in the head (`in /* attribute */ x : Real;`) is trivia, not a keyword the declaration wrote. | | the behavioral properties | `sysx:guard`, `sysx:expression`, `sysx:payload`, … — the parts of a behavioral node the vocabulary has no predicate for, listed under [Behavior](#behavior). | +A `return` parameter written without a kind keyword is a `ReferenceUsage` +owned through a `ReturnParameterMembership`. OpenSysML-authored graphs retain +`sysx:isKindImplicit` for this form. The API-JSON reader supplies that marker +for a toolkit `ReferenceUsage` result with no `sysx:declaredKeyword`, so it also +writes the return without a kind keyword. + For expressions and end-binding heads, the encoder still emits these `sysx:` -terms. They carry notation or ordering facts for which the 202407 metamodel has +terms. They carry notation or ordering facts for which the metamodel has no property; they are annotations, not replacements for the standard shape: | Terms | Why the annotation remains | @@ -602,6 +643,14 @@ from: - `sysx:ActionExecutionNode` — `action a { x + 1 }`, an action node performing an inline expression, which no SysML v2 production spells. +A type owns a `FlowUsage`, `SuccessionFlowUsage`, `FlowEnd`, `PayloadFeature`, +`TerminateActionUsage` or `ConstructorExpression`, `IndexExpression` or +`InstantiationExpression` through a `sysml:FeatureMembership`, listed in its +`sysml:ownedFeature`, as it owns any feature. Releases whose metamodel table +predated these metaclasses (version 202407) owned them through a plain +`sysml:OwningMembership`; in a SysML graph, which has no `member` keyword, that +shape still reads back as the same feature. + Reading, the metaclasses earlier releases wrote for the standard constructs above — `sysx:Alias`, `sysx:FilterMember`, `sysx:MultiplicityDeclaration`, `sysx:ConstraintMember`, `sysx:AssumeMember`, `sysx:RequireMember`, @@ -621,6 +670,7 @@ keyword the grammar qualified it with (SysML.xtext `PerformActionUsage`, | `sysml:IncludeUseCaseUsage` | `include use case iu : U` | `include u1;` | | `sysml:AssertConstraintUsage` | `assert constraint ac : C` | `assert c1;` | | `sysml:SatisfyRequirementUsage` | `satisfy requirement sr : R` | `satisfy r1;` | +| `sysml:ReferenceUsage` (a variant's) | `variant part vp : P` (the usage it declares) | `variant e1;`, `variant P::e2;`, `variant q.k;` | An unnamed one reads its target from `sysml:references` (or `includes`/`subsets` where another writer collapses it there) — a chain target comes back as the @@ -630,6 +680,21 @@ the reference form cannot say. A `sysx:declaredKeyword`/`sysx:declaredPrefix` that contradicts the metaclass (`perform` on a plain `sysml:ActionUsage`) is refused rather than one of the two written. +A variant's reference form is SysML.xtext `VariantReference`: an unnamed +`sysml:ReferenceUsage` its `VariantMembership` owns, with an owned +`sysml:ReferenceSubsetting` to the feature it names, or to the chain feature of +`q.k`. `variant e1;` answers to the name of the feature it references, so +the variant keeps its identity `P::V::e1`. It is written back bare when the +graph names it that way, and refused when `e1` does not reach that feature from +the variation. A qualified or chained one is anonymous, like `perform P::a;`, and is +written back by its reference in more than one segment, since a single name would +read back as `variant e1;`. A `variant x;` whose `x` resolves to nothing keeps +the name as a literal `sysml:references "x"`, as an unresolved reference +does, and stays a `ReferenceUsage`. An anonymous variant whose reference is +a single-name literal is refused. A variant written with a usage prefix +(`variant ref x;`) is no reference: it declares `x`, and is written back +with `variant` ahead of the prefix. + The rest of the membership-side metaclasses the notation implies are standard: the mapping materializes each as the relationship element the OMG metamodel defines for it, so a consumer reading elements rather than notation @@ -1226,7 +1291,7 @@ the node, that name is used; the rest are `sysx:` terms, marked below. | written | metaclass | carries | |---|---|---| | `first x;` in an action body | `sysml:Membership` with `sysx:declaredKeyword "first"` | `sysml:memberElement` and `sysml:sourceFeature` (the member the flow starts at — a reference, not a name it declares), `sysx:hasBody` and the members of its body. Read, a `sysx:InitialNode` from an older graph is the same member | -| `first x then y { … }` in an action body (the succession x → y, which marks no start) | `sysml:SuccessionAsUsage` with `sysx:declaredKeyword "first"` | `sysml:sourceFeature` (x, a reference), `sysml:targetFeature` (y), `sysx:guard`, `sysx:hasBody` and the members of its body | +| `first x then y { … }` in an action body (the succession x → y, which marks no start) | `sysml:SuccessionAsUsage` with `sysx:declaredKeyword "first"` | its two ends, each a `ReferenceUsage` under an `EndFeatureMembership` whose `ReferenceSubsetting` references x or y (SysML-textual-bnf `SuccessionAsUsage`, `ConnectorEndMember`), listed by `sysml:connectorEnd`; `sysml:sourceFeature` (x, a reference) and `sysml:targetFeature` (y), which the ends derive; `sysx:guard`, `sysx:hasBody` and the members of its body. A guarded `first x if g then y` is a transition and owns no ends of its own. Reading back, an end whose referenced feature differs from `sysml:sourceFeature` or `sysml:targetFeature`, or that declares a name or bounds, is refused, since the notation states each end once, as the bare feature it names | | `done;` written on its own | `sysml:Membership` with `sysx:declaredKeyword "done"` | `sysml:memberElement`, the library's `Actions::Action::done`. Read, a `sysx:FinalNode` from an older graph is the same member | | `then done;`, `[m] then done;`, `then [m] done;` | `sysml:SuccessionAsUsage` with `sysx:endForm "then"` | its target end's `ReferenceSubsetting` reaches the library's `Actions::Action::done` — `sysml:targetFeature` states the same — and no member is declared for the node. A source-end multiplicity (`[m] then`) is carried on the empty source connector end; a target-end crossing multiplicity (`then [m] done`) on the target connector end, as `succession first a then [m] done;` carries it. Read, an older graph's `done` Membership targeted through `sysx:targetMember` writes back as `then done;` | | `action a;`, `action a { x + 1 }` | `sysx:ActionExecutionNode` | `sysml:references` or `sysx:expression` | @@ -1246,7 +1311,7 @@ the node, that name is used; the rest are `sysx:` terms, marked below. | `entry`/`do`/`exit`, `entry do { … }` (whatever separates the `do` from the body) | `sysml:StateSubactionMembership` | `sysml:kind` (`entry`, `do`, `exit`) beside `sysx:subactionKind`, `sysx:declaredKeyword`, the one action it performs, which a `perform a;` states as a `sysml:PerformActionUsage` and an empty `entry;` as an anonymous `sysml:ActionUsage` with no name and no body; a braced block `entry { … }` is an anonymous `sysml:ActionUsage` with `sysx:isKindImplicit` (no `action` keyword was written) whose `sysx:hasBody` is the braces. A graph from an older mapping that wrote a braced block as its statements under the membership, `sysx:hasBody` on the membership itself, is refused as unsupported: it holds no anonymous action to read the block back as | | `defer sig, other;` | `sysx:DeferMember` | `sysx:deferredEvent` per event | | `choice`, `junction`, `fork`, `join`, `shallow`/`deep history` | `sysx:Pseudostate` | `sysx:pseudostateKind`, `sysx:declaredKeyword` | -| `transition [n] [first] s [accept t] [if g] [do e] then t;`, `… then t { … }` | `sysml:TransitionUsage` | `sysml:source`, `sysml:target` and the `then` succession it owns through a `sysml:OwningMembership` — a `sysml:SuccessionAsUsage` (SysML.xtext `TransitionSuccessionMember`) stated as `sysml:succession`, whose first end is the empty source end and whose second end's `ReferenceSubsetting` names the target; the succession is implied — never written back — and one whose ends disagree with the head's `sysml:source`/`sysml:target` is refused — plus its trigger as metamodel structure (below), `sysx:guard`, `sysx:transitionSyntax`, its effect and body as members: the effect is owned through a `sysml:TransitionFeatureMembership` with `sysml:kind "effect"` and `sysml:transitionFeature` (SysML v2 1.0 § 8.3.18.8), the transition stating it as `sysml:effectAction`, and the collapsed `sysx:effectMember`, `sysx:bodyMember` links are written beside; a graph carrying either form alone reads, and one whose `TransitionFeatureMembership` and `sysx:effectMember` name different members is refused, with `sysx:hasEffect` on every transition written with `do` (its braced effect `do { … }` is an anonymous action as for a state's `entry { … }`, so an empty `do { }` survives as that action's `sysx:hasBody`) and `sysx:hasBody` for a trailing body; a graph with members linked by neither owns an effect alone, `sysx:hasBody` its braces. A graph from an older mapping that wrote a braced effect as its statements (`sysx:bracedEffect`, or `sysx:hasBody` on an unlinked effect) is refused as unsupported: it holds no anonymous action to read the block back as. The trigger is the transition's `sysml:triggerAction`, a `sysml:AcceptActionUsage` owned through a `sysml:TransitionFeatureMembership` with `sysml:kind "trigger"` and `sysml:transitionFeature` (formal/2026-03-02 § 8.3.17.9, SysML.xtext `TriggerActionMember`), as the pinned pilot builds it: its payload is a `sysml:ParameterMembership`-owned `sysml:payloadParameter` (`sysml:isAccept`, direction `in`), named as written and typed through a `sysml:FeatureTyping` (`accept Sig` is an unnamed payload typed `Sig`, `accept c : Cmd` a payload `c`); `via p` is the accept action's `sysml:receiverArgument`, the `sysml:FeatureReferenceExpression` to `p` a second parameter binds; `after d`, `at t` and `when c` are the payload's value and the accept action's `sysml:payloadArgument`, a `sysml:TriggerInvocationExpression` with `sysml:kind` `"after"`, `"at"` or `"when"` and its one argument (a `when` condition through a `sysml:FeatureReferenceExpression`, as the pilot writes it). `sysx:triggerKeyword "when"` is written beside that structure only for the change trigger spelled without `accept` (`transition first s1 when c then s2`), a notation choice. The OpenSysML-only `when `, which names a signal the runtime injects rather than a Boolean condition, has no metamodel form and keeps the extension predicates `sysx:trigger` (the name) and `sysx:triggerKeyword "when"`. A graph an earlier mapping wrote, with the trigger as `sysx:trigger` text, `sysx:triggerKeyword` and the port as `sysml:via`, still reads; a `sysx:trigger` or `sysml:via` stated beside the structure must name the same payload, types and port (each name compared by the element it reaches from the transition through its enclosing namespaces or the standard library, so `T::Sig` and `Sig`, `T::'Stop Signal'` and `'Stop Signal'`, or a global `$::T::Sig` agree; a name only an import or inheritance brings into scope, such as `Real` under `import ScalarValues::*`, agrees when it ends the qualified name the other reaches), or the graph is refused rather than one of them dropped. Likewise a `sysml:triggerAction` naming an action other than the one the trigger membership owns, a `sysml:payloadParameter` naming another parameter than the one flagged `sysml:isAccept`, a `sysml:payloadArgument` other than the payload parameter's value, more than one valued receiver parameter, and a valued receiver parameter no `sysml:receiverArgument` names (or one it disagrees with) are refused | +| `transition [n] [first] s [accept t] [if g] [do e] then t;`, `… then t { … }` | `sysml:TransitionUsage` | `sysml:source`, `sysml:target`; ahead of everything else it owns, the `FeatureChainMember` naming the source of a `first` transition — a `sysml:Membership` whose member is the state, or for `first a.b` a `sysml:OwningMembership` owning the chain `sysml:Feature` — then an `EmptyParameterMember` (a `sysml:ParameterMembership` owning an undeclared `sysml:ReferenceUsage`, direction `in`), and a second one ahead of a trigger (SysML-textual-bnf `TransitionUsage`, `TargetTransitionUsage`); and the `then` succession it owns through a `sysml:OwningMembership` — a `sysml:SuccessionAsUsage` (SysML.xtext `TransitionSuccessionMember`) stated as `sysml:succession`, whose first end is the empty source end and whose second end's `ReferenceSubsetting` names the target, or for `then b.c` owns the chain it references; the source member, parameters and succession are implied — never written back, a chained source or target written as its chain — and one that disagrees with the head's `sysml:source`/`sysml:target`, a chain by its last link, is refused — plus its trigger as metamodel structure (below), its guard from a `TransitionFeatureMembership` with `sysml:kind "guard"` and `sysml:transitionFeature` (checked against `sysx:guard` when both are stated), `sysml:transitionSyntax`, its effect and body as members: the effect is owned through a `sysml:TransitionFeatureMembership` with `sysml:kind "effect"` and `sysml:transitionFeature` (SysML v2 1.0 § 8.3.18.8), the transition stating it as `sysml:effectAction`, and the collapsed `sysx:effectMember`, `sysx:bodyMember` links are written beside; a graph carrying either form alone reads, and one whose `TransitionFeatureMembership` and `sysx:effectMember` name different members is refused. A `ParameterMembership` is never read as a transition effect. `sysx:hasEffect` is written on every transition written with `do` (its braced effect `do { … }` is an anonymous action as for a state's `entry { … }`, so an empty `do { }` survives as that action's `sysx:hasBody`) and `sysx:hasBody` for a trailing body; a graph with members linked by neither owns an effect alone, `sysx:hasBody` its braces. A graph from an older mapping that wrote a braced effect as its statements (`sysx:bracedEffect`, or `sysx:hasBody` on an unlinked effect) is refused as unsupported: it holds no anonymous action to read the block back as. The trigger is the transition's `sysml:triggerAction`, a `sysml:AcceptActionUsage` owned through a `sysml:TransitionFeatureMembership` with `sysml:kind "trigger"` and `sysml:transitionFeature` (formal/2026-03-02 § 8.3.17.9, SysML.xtext `TriggerActionMember`), as the pinned pilot builds it: its payload is a `sysml:ParameterMembership`-owned `sysml:payloadParameter` (`sysml:isAccept`, direction `in`), named as written and typed through a `sysml:FeatureTyping` (`accept Sig` is an unnamed payload typed `Sig`, `accept c : Cmd` a payload `c`); `via p` is the accept action's `sysml:receiverArgument`, the `sysml:FeatureReferenceExpression` to `p` a second parameter binds; `after d`, `at t` and `when c` are the payload's value and the accept action's `sysml:payloadArgument`, a `sysml:TriggerInvocationExpression` with `sysml:kind` `"after"`, `"at"` or `"when"` and its one argument (a `when` condition through a `sysml:FeatureReferenceExpression`, as the pilot writes it). `sysx:triggerKeyword "when"` is written beside that structure only for the change trigger spelled without `accept` (`transition first s1 when c then s2`), a notation choice. The OpenSysML-only `when `, which names a signal the runtime injects rather than a Boolean condition, has no metamodel form and keeps the extension predicates `sysx:trigger` (the name) and `sysx:triggerKeyword "when"`. A graph an earlier mapping wrote, with the trigger as `sysx:trigger` text, `sysx:triggerKeyword` and the port as `sysml:via`, still reads; a `sysx:trigger` or `sysml:via` stated beside the structure must name the same payload, types and port (each name compared by the element it reaches from the transition through its enclosing namespaces or the standard library, so `T::Sig` and `Sig`, `T::'Stop Signal'` and `'Stop Signal'`, or a global `$::T::Sig` agree; a name only an import or inheritance brings into scope, such as `Real` under `import ScalarValues::*`, agrees when it ends the qualified name the other reaches), or the graph is refused rather than one of them dropped. Likewise a `sysml:triggerAction` naming an action other than the one the trigger membership owns, a `sysml:payloadParameter` naming another parameter than the one flagged `sysml:isAccept`, a `sysml:payloadArgument` other than the payload parameter's value, more than one valued receiver parameter, and a valued receiver parameter no `sysml:receiverArgument` names (or one it disagrees with) are refused | These action-body forms also apply recursively inside their own bodies; a nested statement uses the same RDF mapping as a top-level body item. A @@ -1457,7 +1522,10 @@ expr:P__Car___402_pend0_om ``` A `flow`'s end (and a `succession flow`'s) is a `sysml:FlowEnd` instead -(SysML.xtext FlowEnd), under the same `EndFeatureMembership`. Its +(SysML.xtext FlowEnd), under the same `EndFeatureMembership`; the reader folds +it into the owning flow's `from … to …` head and never writes it as a separate +declaration. A declared name or content the head cannot represent is refused. +Its `ReferenceSubsetting` names all but the last segment of the end as written — the feature itself for `t.fuel`, a chain feature for `a.p.fuel`, nothing for a lone name — and the end owns, through a `sysml:FeatureMembership`, a @@ -1470,8 +1538,8 @@ A flow's `of` clause is a `sysml:PayloadFeature` the flow owns through a is that feature, named `p`, so `m.p` reaches it; `of T` and `of T[1]` state only its `FeatureTyping` and multiplicity, and the feature takes the flow's next position as its name (`…::@0` in a flow with no body members). Read back, the -feature is written after `of`, not in the flow's body. 202407 names the -metaclass `ItemFeature`. A graph written before this states the payload as the +feature is written after `of`, not in the flow's body. The 202407 metamodel +named the metaclass `ItemFeature`. A graph written before this states the payload as the expression `sysx:payload` and still reads back with it; a flow stating both, or a `PayloadFeature` owned by anything but a flow, is refused. @@ -1626,6 +1694,11 @@ is a synonym for the kind (`allocate` for an allocation) it is carried as `sysml:RequirementUsage` a `sysml:RequirementVerificationMembership` owns, with `sysml:kind "requirement"` (SysML-textual-bnf RequirementVerificationMember). +For `satisfy R by a.b`, the subject parameter's value is a +`FeatureReferenceExpression` whose `referent` is an owned chain `Feature`. +The chain is the `FeatureChainMember` in SysML.xtext's +`SatisfactionReferenceExpression` grammar, rather than expression text. + An anonymous connector's own multiplicity (`sysml:lowerBound`/`sysml:upperBound` on the connector, as against on an end node) is its declaration, and is written ahead of the ends: `succession [n] first a then b`, `binding [1] of a = b`. A @@ -1755,12 +1828,18 @@ a condition are carried, each as the `sysx:` metaclass named above with its condition as `sysx:condition`: a constraint body's conditions (`assert`, `assume`, a bare condition, and the `not` of `assert not …` as `sysml:isNegated`), a nested `assert constraint [name] { … }`, a requirement's -`assume`/`require` members in all three forms (an expression, the constraint -they name, or a body) together with the declaration of the constraint usage they -own — `sysml:declaredName`, its specializations, `sysml:lowerBound`/`upperBound` +`assume`/`require` members in both forms (the constraint they name, or a +`constraint` they declare, with or without a body) together with the declaration +of the constraint usage they own — `sysml:declaredName`, its specializations, `sysml:lowerBound`/`upperBound` and `sysml:value` with its `default`/`:=` operator (`require #Goal constraint braked [1] = true;`) — and `subject s : X;` as the `sysml:SubjectMembership` it declares. The `assert` prefixing a named usage -(`assert constraint c : C`) is carried as `sysx:declaredPrefix`. The conditions +(`assert constraint c : C`) is carried as `sysx:declaredPrefix`. A member that +names its constraint — bare or qualified (`assume c;`, `require P::c;`, +`assert c;`) or by a feature chain (`require q.k;`) — is the reference form +(SysML.xtext `RequirementConstraintUsage`, `AssertConstraintUsage`): the +constraint usage owns a `sysml:ReferenceSubsetting` to the feature, or to the +chain feature of `q.k`, and states no `sysx:condition`. A graph that states one +inline is still read. The conditions themselves are notation, with the limits stated above. The keyword-less condition that closes a body is written bare, as a [result expression](#result-expressions) is, because a name alone before a `;` (`ready;`) declares a kind-less feature rather diff --git a/docs/reference/repl-commands.md b/docs/reference/repl-commands.md index 2a95bf7832..9e4469a13c 100644 --- a/docs/reference/repl-commands.md +++ b/docs/reference/repl-commands.md @@ -113,6 +113,7 @@ into the parts it holds (`car.fl.hub`, `#3.fl`, `car.wheels[2]`). | **Control** | | | `%quit` | Exit the REPL | | `Tab` | Complete meta commands, symbol names (after `%print`, `%instantiate`, `%features` …; a name that needs quoting is offered in quotes, `Q::'the ra` completing to `Q::'the rack'`), object references where a command takes one (`#` offers the ids there are; `car.` offers the object-holding features of `car` — the same ones a path may pass through — a multi-valued one as `car.wheels[1]`, `car.wheels[2]` …; completing reads and materializes nothing, so a part no command has reached yet is offered by type, and only the elements reading it would hold: those the features subsetting it contribute, then anonymous ones up to its lower bound — so an optional part (`spare : Wheel[0..1]`) or an abstract one, which hold only what subsets them, is offered only once something does), the form after `%render ` and the palette after `%render dot`, and file paths after `%load` and `%save` | +| `Ctrl-C` | Discard the line being typed, and any continuation buffered before it; at an empty `sysml>` prompt, exit REPL | | `Ctrl-D` | Exit REPL | The five solving commands (`%check`, `%explain`, `%solve`, `%configure`, `%optimize`) follow the diff --git a/docs/reference/sysml-v1-migration.md b/docs/reference/sysml-v1-migration.md index 95a2064a58..e2c80067bb 100644 --- a/docs/reference/sysml-v1-migration.md +++ b/docs/reference/sysml-v1-migration.md @@ -126,7 +126,7 @@ returned over the service yet. | InstanceSpecification of a value type | `attribute` typed by it, holding its slot values (an individual cannot specialize an attribute def) | mapped | | InstanceSpecification naming no classifier, under a `SimulationConfig`'s `resultLocation`, whose slots are of features of one lineage of blocks ending in the configuration's target classifier or a general of it (a simulation tool's result snapshot) | the `individual part def` of the most special of those blocks, with its slots; the note says which owner classified it and for which configuration | mapped | | InstanceSpecification naming no classifier, anywhere else, or under a `resultLocation` with slots of features of blocks that are no one lineage or none the target is of | comment | **unmapped** — nothing classifies it; under a `resultLocation` the note says which owners its slots have and why they type no snapshot | -| Slot contradicting its feature (more values than the multiplicity allows, a repeated value of a unique feature, a feature of a classifier the instance is not written to specialize, an instance that is not of the property's type or of its default individual, a value outside the document) | comment | **unmapped** | +| Slot contradicting its feature (more values than the multiplicity allows, a repeated value of a feature written unique — declared so in v1, or written without its `nonunique` by the rule above — a feature of a classifier the instance is not written to specialize, an instance that is not of the property's type or of its default individual, a value outside the document) | comment | **unmapped** | | Slot of a port, or of an untyped property | comment (no individual can type a port; a `ref` without a type takes none) | **unmapped** | | Property whose default is an InstanceSpecification of a block | the individual added to the usage's types, or its only type when the property is untyped; no `default` (a definition is not a v2 value). A port, a usage of another kind than the individual, or a usage whose type the individual is not an instance of, keeps its types and the default is a comment | approximated | | Literal default on a value type with no scalar base (a structured value type, an enumeration) | comment | approximated | @@ -138,6 +138,7 @@ returned over the service yet. | Anonymous association owning every end | a named `connection def` | approximated | | Value property | `attribute`, with multiplicity and default | mapped | | Composite part property | `part` | mapped | +| Property with `isOrdered` / `isUnique="false"` | `ordered` / `nonunique` after the multiplicity — except `nonunique` on a usage that must be unique: one that implicitly subsets a unique library feature (a composite `part` or `item` in a part or item, `Items::Item::subparts`/`subitems`; a composite `action` in an action, `Actions::Action::subactions`, or in a part, `Parts::Part::ownedActions`; likewise `substates`, `subcalculations`, `subcases`, `ownedPorts`, `suboccurrences`…), or that redefines or subsets a feature written unique. The target is the one `ImplicitSubsettings` gives the written usage, its uniqueness read from the bundled library, so an `attribute` (`Base::dataValues`) and a `ref part` (no implicit subsetting) keep `nonunique`. The modifier is dropped and the entry notes which unique feature forbade it | mapped; approximated when `nonunique` is dropped ("nonunique is not written: …") | | Reference property (no aggregation) | `ref part` | mapped | | Undirected part or item property of an «InterfaceBlock» | `ref part` / `ref item`; a port owns no composite parts | approximated | | Shared aggregation | `ref part` | approximated | @@ -852,7 +853,8 @@ as `…` becomes plain text, as a requirement's `Text` One tool stereotype is read as a type, not kept as a comment: MagicDraw's «typeModifier» on a property or parameter, whose tag spells a C-style shape after the type. `[]` on a feature whose declared multiplicity is `[1]` or absent writes `[0..*] ordered nonunique`, and `[n]` -writes `[n] ordered nonunique`, so the feature is the sequence the tool meant; `*` (and `&`) +writes `[n] ordered nonunique`, so the feature is the sequence the tool meant — `ordered` +alone, with the drop noted, on a usage that must be unique (the `isUnique` row); `*` (and `&`) on a part or item property held by value writes it `ref`, a reference rather than a containment. A shape with no v2 form is kept as the applied-stereotype comment with the reason in the report: `[][]`, `[n*m]` and other two-dimensional shapes (a multiplicity has one @@ -1150,6 +1152,26 @@ signal fits are bound to that name. Entry, do and exit behaviors owned by the st action bodies, on a submachine state as on any other; those it only refers to are `entry x;` references. +A region's entry is its initial pseudostate's transition, `entry; then s;`. The initial a +region takes as its own is the one whose transition enters a vertex of the region; a further +one entering the region is refused, as a region has one initial pseudostate. An initial +whose transition enters an *orthogonal* region — a sibling region of the same state, or a +region nested in one, which some tools draw an arrow into from the next region over — is +written as the entry of the region that owns its target, in whatever body that region is +written as: the sub-state of the `parallel` state, or the body of a nested composite state. +Its effect follows the initial-effect rules there and its triggers and guards are dropped as +an initial transition's are; the pseudostate and transition are approximated, the report +naming the region written. When the target's region has an initial of its own entering the +same vertex, the stray one coincides with it and nothing is written twice; when its own +initial enters another vertex the two conflict, the region's own entry is kept and the stray +one is refused with both targets named (`-strict` reports its triggers, guard and effect as +refused with it). An initial pseudostate no transition leaves is no entry, so a donated one +may enter its region; an initial whose transition enters a region of another state — one that +is not orthogonal to its own — is refused, since an initial transition enters its own region. +The owner's default entry into its `parallel` state is written once every region has an +entry, its own or a donated one; a region none of whose initials enters it is listed in the +owner's `no default entry` note. + A state whose entry or do behavior takes parameters is entered by transitions that carry no arguments, so the parameters are valued from the signal those transitions accept when every transition into the state accepts the same signal and its attributes match the parameters in diff --git a/editors/README.md b/editors/README.md index 5786e4664e..2c2d448515 100644 --- a/editors/README.md +++ b/editors/README.md @@ -30,7 +30,7 @@ directory here with its own build. ## Versions -The editors carry the core version — `0.9.1` now — the same lockstep the clients +The editors carry the core version — `0.9.2` now — the same lockstep the clients follow, even though nothing publishes them. `check_version.py --editors` checks every manifest (the two package.json files and their locks, the Cameo and SysON poms and their children's ``), and a release fails early when diff --git a/editors/cameo/dist/pom.xml b/editors/cameo/dist/pom.xml index 0084fa49c1..b5409af09c 100644 --- a/editors/cameo/dist/pom.xml +++ b/editors/cameo/dist/pom.xml @@ -4,7 +4,7 @@ org.openmbee opensysml-cameo-parent - 0.9.1 + 0.9.2 opensysml-cameo-dist pom diff --git a/editors/cameo/openapi-stubs/pom.xml b/editors/cameo/openapi-stubs/pom.xml index 59c0569ce5..f6cf126869 100644 --- a/editors/cameo/openapi-stubs/pom.xml +++ b/editors/cameo/openapi-stubs/pom.xml @@ -4,7 +4,7 @@ org.openmbee opensysml-cameo-parent - 0.9.1 + 0.9.2 opensysml-cameo-openapi-stubs Compile-only Cameo OpenAPI stubs diff --git a/editors/cameo/plugin/pom.xml b/editors/cameo/plugin/pom.xml index bde4d4b993..4c32c9c425 100644 --- a/editors/cameo/plugin/pom.xml +++ b/editors/cameo/plugin/pom.xml @@ -4,7 +4,7 @@ org.openmbee opensysml-cameo-parent - 0.9.1 + 0.9.2 opensysml-cameo-plugin OpenSysML Cameo plugin diff --git a/editors/cameo/pom.xml b/editors/cameo/pom.xml index fb12c93e13..76659cf89c 100644 --- a/editors/cameo/pom.xml +++ b/editors/cameo/pom.xml @@ -5,7 +5,7 @@ 4.0.0 org.openmbee opensysml-cameo-parent - 0.9.1 + 0.9.2 pom OpenSysML Cameo plugin @@ -20,7 +20,7 @@ 5.11.4 3.13.0 3.5.2 - 0.9.1 + 0.9.2 diff --git a/editors/cameo/tools/pom.xml b/editors/cameo/tools/pom.xml index ecc5ff89d6..1368481cdc 100644 --- a/editors/cameo/tools/pom.xml +++ b/editors/cameo/tools/pom.xml @@ -4,7 +4,7 @@ org.openmbee opensysml-cameo-parent - 0.9.1 + 0.9.2 opensysml-cameo-tools OpenSysML Cameo build tools diff --git a/editors/syson/backend/pom.xml b/editors/syson/backend/pom.xml index 28ce14df8d..61f6b9f652 100644 --- a/editors/syson/backend/pom.xml +++ b/editors/syson/backend/pom.xml @@ -7,7 +7,7 @@ org.openmbee opensysml-syson - 0.9.1 + 0.9.2 opensysml-syson-backend @@ -17,7 +17,7 @@ org.openmbee opensysml - 0.9.1 + 0.9.2 org.springframework diff --git a/editors/syson/frontend/package-lock.json b/editors/syson/frontend/package-lock.json index 1128d10c29..09f38d1b6f 100644 --- a/editors/syson/frontend/package-lock.json +++ b/editors/syson/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "@openmbee/opensysml-syson", - "version": "0.9.1", + "version": "0.9.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@openmbee/opensysml-syson", - "version": "0.9.1", + "version": "0.9.2", "devDependencies": { "@apollo/client": "3.10.4", "@emotion/react": "11.14.0", diff --git a/editors/syson/frontend/package.json b/editors/syson/frontend/package.json index 5abdd13ff0..57caa8fb5f 100644 --- a/editors/syson/frontend/package.json +++ b/editors/syson/frontend/package.json @@ -1,6 +1,6 @@ { "name": "@openmbee/opensysml-syson", - "version": "0.9.1", + "version": "0.9.2", "private": false, "type": "module", "main": "dist/opensysml-syson.cjs.js", diff --git a/editors/syson/pom.xml b/editors/syson/pom.xml index 96ecd00a98..527924291b 100644 --- a/editors/syson/pom.xml +++ b/editors/syson/pom.xml @@ -6,7 +6,7 @@ org.openmbee opensysml-syson - 0.9.1 + 0.9.2 pom OpenSysML SysON integration diff --git a/editors/syson/syson-api-stubs/pom.xml b/editors/syson/syson-api-stubs/pom.xml index 11b34dbfe7..f4d3715462 100644 --- a/editors/syson/syson-api-stubs/pom.xml +++ b/editors/syson/syson-api-stubs/pom.xml @@ -7,7 +7,7 @@ org.openmbee opensysml-syson - 0.9.1 + 0.9.2 opensysml-syson-api-stubs diff --git a/editors/vscode/package-lock.json b/editors/vscode/package-lock.json index 475faac9f5..a7f9f4e95e 100644 --- a/editors/vscode/package-lock.json +++ b/editors/vscode/package-lock.json @@ -1,12 +1,12 @@ { "name": "opensysml-sysml", - "version": "0.9.1", + "version": "0.9.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "opensysml-sysml", - "version": "0.9.1", + "version": "0.9.2", "license": "Apache-2.0", "dependencies": { "elkjs": "0.12.0", diff --git a/editors/vscode/package.json b/editors/vscode/package.json index 58c1eb84c8..62cfdd178c 100644 --- a/editors/vscode/package.json +++ b/editors/vscode/package.json @@ -2,7 +2,7 @@ "name": "opensysml-sysml", "displayName": "SysML v2 (OpenSysML)", "description": "SysML v2 and KerML syntax highlighting and language support backed by the OpenSysML language server.", - "version": "0.9.1", + "version": "0.9.2", "publisher": "open-mbee", "license": "Apache-2.0", "repository": { diff --git a/examples/parser_features_demo_messages_events.sysml b/examples/parser_features_demo_messages_events.sysml index 15d8663abc..955aed7514 100644 --- a/examples/parser_features_demo_messages_events.sysml +++ b/examples/parser_features_demo_messages_events.sysml @@ -45,8 +45,8 @@ package MessagesAndEvents { part def MessageChannel { // Message flows - message incoming: Message[*] nonunique; - message outgoing: Message[*] nonunique; + message incoming: Message[*]; + message outgoing: Message[*]; // Event-driven in event occurrence events [*]; diff --git a/go.mod b/go.mod index a11c4a1ce7..b1285a056c 100644 --- a/go.mod +++ b/go.mod @@ -26,4 +26,5 @@ require ( go.uber.org/multierr v1.8.0 // indirect golang.org/x/sys v0.45.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 45ac4b8633..1ae3b0c577 100644 --- a/go.sum +++ b/go.sum @@ -105,3 +105,5 @@ gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/internal/check/edit/delete_test.go b/internal/check/edit/delete_test.go index eaed3df1cc..66f888ec62 100644 --- a/internal/check/edit/delete_test.go +++ b/internal/check/edit/delete_test.go @@ -138,7 +138,7 @@ func TestDeleteCascadeRemovesTheReferringDeclarationOnly(t *testing.T) { { name: "namespace import", src: "package P {\n part def Base;\n}\n" + - "package Q {\n import P::Base::*;\n part keep;\n}\n", + "package Q {\n private import P::Base::*;\n part keep;\n}\n", referrer: "import P::Base::* in Q", want: "package P {\n}\npackage Q {\n part keep;\n}\n", }, diff --git a/internal/check/edit/edit_test.go b/internal/check/edit/edit_test.go index d4a86debcb..564b0da586 100644 --- a/internal/check/edit/edit_test.go +++ b/internal/check/edit/edit_test.go @@ -47,7 +47,7 @@ func loadContent(t *testing.T, name, content string) Model { idx.AddDocument(name, root) var sem []diag.Diagnostic if len(p.Diagnostics) == 0 { - sem = passes.Analyze(name, root, nil, idx) + sem = passes.Analyze(name, root, parser.AsDiagnostics(p.Diagnostics, p.Warnings), idx) } return Model{ Source: sf, @@ -59,6 +59,14 @@ func loadContent(t *testing.T, name, content string) Model { } } +// parseGate is what the parse of sf reported, as every reader hands it to the +// analysis: its errors and its warnings. +func parseGate(sf *source.SourceFile) []diag.Diagnostic { + p := parser.New(sf) + p.ParseFile() + return parser.AsDiagnostics(p.Diagnostics, p.Warnings) +} + // loadWorkspace is loadContent with sibling workspace documents indexed beside // the edited one, the way the language server edits a document of several. func loadWorkspace(t *testing.T, name, content string, siblings map[string]string) Model { @@ -72,7 +80,7 @@ func loadWorkspace(t *testing.T, name, content string, siblings map[string]strin m.Index.AddDocument(name, m.Root) m.Index.ExpandWildcardImports() if len(m.ParseDiags) == 0 { - m.SemDiags = passes.Analyze(name, m.Root, nil, m.Index) + m.SemDiags = passes.Analyze(name, m.Root, parseGate(m.Source), m.Index) } m.NewIndex = func() *symbols.Index { idx := libraryIndex(t) @@ -101,11 +109,11 @@ func loadEditableWorkspace(t *testing.T, name, content string, siblings map[stri } m.Index.ExpandWildcardImports() if len(m.ParseDiags) == 0 { - m.SemDiags = passes.Analyze(name, m.Root, nil, m.Index) + m.SemDiags = passes.Analyze(name, m.Root, parseGate(m.Source), m.Index) } for sibling, doc := range others { if len(doc.ParseDiags) == 0 { - doc.SemDiags = passes.Analyze(sibling, roots[sibling], nil, m.Index) + doc.SemDiags = passes.Analyze(sibling, roots[sibling], parseGate(doc.Source), m.Index) others[sibling] = doc } } diff --git a/internal/check/edit/move.go b/internal/check/edit/move.go index bc04b6e8d4..283103a03c 100644 --- a/internal/check/edit/move.go +++ b/internal/check/edit/move.go @@ -363,7 +363,7 @@ func (mv *mover) reread() (*moved, error) { return nil, err } model := reparseModel(m, edited) - if introduced := introduced(parseDiagnostics(m.ParseDiags), parseDiagnostics(model.ParseDiags)); len(introduced) > 0 { + if introduced := introduced(parser.AsDiagnostics(m.ParseDiags, nil), parser.AsDiagnostics(model.ParseDiags, nil)); len(introduced) > 0 { return nil, &Error{ Failure: FailureResultInvalid, OperationIndex: mv.index, diff --git a/internal/check/edit/move_test.go b/internal/check/edit/move_test.go index ee3c461c50..9d66667faf 100644 --- a/internal/check/edit/move_test.go +++ b/internal/check/edit/move_test.go @@ -189,7 +189,7 @@ func TestMoveRemovesImportMadeRedundant(t *testing.T) { " part def Base;\n" + " }\n" + " package Other {\n" + - " import Lib::Base;\n" + + " private import Lib::Base;\n" + " part b : Base;\n" + " }\n" + "}\n" @@ -216,9 +216,9 @@ func TestMoveReadsNameBetweenCarriedImportsItRespells(t *testing.T) { " part def B;\n" + " }\n" + " part def Holder {\n" + - " import Lib::A;\n" + + " private import Lib::A;\n" + " part a : A;\n" + - " import Lib::B;\n" + + " private import Lib::B;\n" + " part b : B;\n" + " }\n" + "}\n" @@ -230,9 +230,9 @@ func TestMoveReadsNameBetweenCarriedImportsItRespells(t *testing.T) { " }\n" + "}\n" + "part def Holder {\n" + - " import Spacecraft_Models::Lib::A;\n" + + " private import Spacecraft_Models::Lib::A;\n" + " part a : A;\n" + - " import Spacecraft_Models::Lib::B;\n" + + " private import Spacecraft_Models::Lib::B;\n" + " part b : B;\n" + "}\n" if got != want { @@ -247,7 +247,7 @@ func TestMoveRespellsImportOfTheTarget(t *testing.T) { " }\n" + " package Other;\n" + " package Client {\n" + - " import Lib::Base;\n" + + " private import Lib::Base;\n" + " part b : Base;\n" + " }\n" + "}\n" @@ -259,7 +259,7 @@ func TestMoveRespellsImportOfTheTarget(t *testing.T) { " part def Base;\n" + " }\n" + " package Client {\n" + - " import Other::Base;\n" + + " private import Other::Base;\n" + " part b : Base;\n" + " }\n" + "}\n" diff --git a/internal/check/edit/prefix.go b/internal/check/edit/prefix.go index c030ea06c3..f838e8627c 100644 --- a/internal/check/edit/prefix.go +++ b/internal/check/edit/prefix.go @@ -62,7 +62,7 @@ func (m Model) addMetadataPrefixSplice(i int, op Operation) (splice, error) { } declSpan := sym.Decl.Span() - for _, diagnostic := range parseDiagnostics(m.ParseDiags) { + for _, diagnostic := range parser.AsDiagnostics(m.ParseDiags, nil) { if diagnostic.Span.Offset >= declSpan.Offset && diagnostic.Span.Offset < declSpan.End() { return splice{}, &Error{ Failure: FailureResultInvalid, OperationIndex: i, diff --git a/internal/check/edit/sequence.go b/internal/check/edit/sequence.go index c838b8d364..f868a356d3 100644 --- a/internal/check/edit/sequence.go +++ b/internal/check/edit/sequence.go @@ -645,7 +645,7 @@ func validateSourceMultiplicity(i int, keyword, multiplicity string) error { p := parser.New(sf) mult := p.ParseMultiplicity() if len(p.Diagnostics) > 0 { - return refuse("does not parse as a multiplicity", parseDiagnostics(p.Diagnostics)) + return refuse("does not parse as a multiplicity", parser.AsDiagnostics(p.Diagnostics, nil)) } if mult == nil { return refuse("does not parse as a multiplicity", []diag.Diagnostic{{ diff --git a/internal/check/edit/validate.go b/internal/check/edit/validate.go index 77acbf3080..5e99fb5e22 100644 --- a/internal/check/edit/validate.go +++ b/internal/check/edit/validate.go @@ -37,7 +37,7 @@ func (m Model) checkExpression(i int, label, target, value string) error { p := parser.New(sf) expr := p.ParseExpression() if len(p.Diagnostics) > 0 { - return refuse("does not parse as an expression", parseDiagnostics(p.Diagnostics)) + return refuse("does not parse as an expression", parser.AsDiagnostics(p.Diagnostics, nil)) } if expr == nil { return refuse("does not parse as an expression", nil) @@ -102,9 +102,9 @@ func (m Model) validate(edited rewrites) error { doc, _ := m.inDocument(name) sf := source.NewWithKind(name, edited[name].content, doc.Source.Kind()) p := parser.New(sf) - rr := &reread{Model: doc, sf: sf, root: p.ParseFile(), editedParse: parseDiagnostics(p.Diagnostics)} - originalParse := parseDiagnostics(doc.ParseDiags) - if introduced := introduced(originalParse, rr.editedParse); len(introduced) > 0 { + rr := &reread{Model: doc, sf: sf, root: p.ParseFile(), editedParse: parser.AsDiagnostics(p.Diagnostics, p.Warnings)} + originalParse := parser.AsDiagnostics(doc.ParseDiags, nil) + if introduced := introduced(originalParse, errorsOnly(rr.editedParse)); len(introduced) > 0 { return invalidResult(own, sf, introduced, "does not parse") } rr.before = errorsOnly(originalParse) @@ -122,9 +122,10 @@ func (m Model) validate(edited rewrites) error { m.reindex = newReindexer(m) } // The parse diagnostics are handed to the analysis, so a model that already - // had syntax errors is not judged by tiers its own parse never reached. The - // baselines are taken first: they and the edited notation share one index, in - // which each is in turn the document under its name. + // had syntax errors is not judged by tiers its own parse never reached, and + // the notation passes escalate the parser's warnings as they do for every + // other reader. The baselines are taken first: they and the edited notation + // share one index, in which each is in turn the document under its name. for _, rr := range rereads { rr.reindex = m.reindex rr.before = append(errorsOnly(rr.baseline(rr.editedParse)), rr.before...) @@ -162,8 +163,8 @@ func invalidResult(own string, sf *source.SourceFile, introduced []diag.Diagnost // edited notation is judged at. A model that did not parse was never analyzed — // the service analyzes a clean parse only — so its stored diagnostics say // nothing about the tiers an edit that repairs the syntax reaches for the first -// time; the original is analyzed here instead, under the edited model's gate, so -// that both are compared at one tier. +// time; the original is analyzed here instead, under the edited model's gate of +// errors and its own parse's warnings, so that both are compared at one tier. func (m Model) baseline(gate []diag.Diagnostic) []diag.Diagnostic { if len(m.ParseDiags) == 0 { return m.SemDiags @@ -171,23 +172,8 @@ func (m Model) baseline(gate []diag.Diagnostic) []diag.Diagnostic { p := parser.New(m.Source) root := p.ParseFile() idx := m.reindex.analyzedIn(m.Source, root) - return passes.AnalyzeWithOptions(m.Source.Name(), m.Source.Kind(), root, gate, idx, m.Analysis) -} - -// parseDiagnostics presents parse diagnostics as pass diagnostics, which is how -// every consumer of them reports them: as syntax errors. -func parseDiagnostics(diags []parser.Diagnostic) []diag.Diagnostic { - out := make([]diag.Diagnostic, 0, len(diags)) - for _, d := range diags { - out = append(out, diag.Diagnostic{ - Severity: diag.SeverityError, - Span: d.Span, - Message: d.Message, - Code: "syntax", - Source: "syntax", - }) - } - return out + own := append(errorsOnly(gate), parser.AsDiagnostics(nil, p.Warnings)...) + return passes.AnalyzeWithOptions(m.Source.Name(), m.Source.Kind(), root, own, idx, m.Analysis) } // errorsOnly keeps the diagnostics that say the model is wrong. diff --git a/internal/check/edit/validate_test.go b/internal/check/edit/validate_test.go new file mode 100644 index 0000000000..1e7cf16ac5 --- /dev/null +++ b/internal/check/edit/validate_test.go @@ -0,0 +1,38 @@ +package edit + +import ( + "strings" + "testing" + + "github.com/Open-MBEE/OpenSysML/internal/syntax/diag" +) + +// An edit is judged under the parse's warnings as every reader is, so what the +// notation passes make of the original's notation is not laid at the edit's +// door: an import without a visibility indicator the original already had is +// not an error the edit introduced. +func TestValidateJudgesTheEditUnderTheOriginalsParseWarnings(t *testing.T) { + src := "package P {\n" + + " package Lib {\n" + + " part def Base;\n" + + " }\n" + + " package Client {\n" + + " import Lib::Base;\n" + + " part b : Base;\n" + + " }\n" + + "}\n" + m := loadContent(t, "validate.sysml", src) + var visibility []diag.Diagnostic + for _, d := range m.SemDiags { + if d.Code == "import-visibility" && d.Severity == diag.SeverityError { + visibility = append(visibility, d) + } + } + if len(visibility) != 1 { + t.Fatalf("original reports %d import-visibility errors, want 1: %v", len(visibility), m.SemDiags) + } + res := applyOne(t, m, AddMember("P::Client", "part def", "Extra")) + if got := string(res.Content); !strings.Contains(got, "part def Extra;") || !strings.Contains(got, " import Lib::Base;\n") { + t.Fatalf("edited source:\n%s", got) + } +} diff --git a/internal/check/passes/w8b_redefinition_conformance_test.go b/internal/check/passes/w8b_redefinition_conformance_test.go index 1c98a0aefb..9c6d347b17 100644 --- a/internal/check/passes/w8b_redefinition_conformance_test.go +++ b/internal/check/passes/w8b_redefinition_conformance_test.go @@ -229,3 +229,53 @@ func TestW8BMetadataBodyMustRedefineOwningTypeFeature(t *testing.T) { t.Fatalf("diagnostic must be located at the offending declaration: %+v", got[0]) } } + +// conformanceDiagsSysML returns the feature-conformance findings of a SysML source. +func conformanceDiagsSysML(t *testing.T, src string) []diag.Diagnostic { + t.Helper() + root := parser.New(source.New(".sysml", []byte(src))).ParseFile() + idx := newTestIndex() + idx.AddDocument(".sysml", root) + var out []diag.Diagnostic + for _, d := range Analyze(".sysml", root, nil, idx) { + switch d.Code { + case "subsetting-uniqueness-conformance", "subsetting-constancy-conformance": + out = append(out, d) + } + } + return out +} + +// A subsetting the feature has implicitly is a Subsetting all the same: a +// composite action in an action definition implicitly subsets the unique +// Actions::Action::subactions, so declaring it nonunique breaks uniqueness +// conformance, reported once at the declaration however it subsets (#726). +func TestW8BUniquenessConformanceOfAnImplicitSubsetting(t *testing.T) { + for _, tc := range []struct { + name, src string + want int + }{ + {"implicit", "package N { action def A { action b[*] nonunique; } }", 1}, + {"written and implicit", "package N { action def A { action b[*] nonunique :> subactions; } }", 1}, + {"unique", "package N { action def A { action b[*]; } }", 0}, + // A composite part in a part implicitly subsets Item::subitems, unique too. + {"composite part in a part", "package N { part def A { part b[*] nonunique; } }", 1}, + // A message is an action: in a part it implicitly subsets Part::ownedActions, unique. + {"message in a part", "package N { abstract flow def F; part def C { message m : F[*] nonunique; } }", 1}, + // A reference part or an attribute has no implicit subsetting of a unique feature. + {"reference part", "package N { part def A { ref part b[*] nonunique; } }", 0}, + {"attribute", "package N { part def A { attribute b[*] nonunique; } }", 0}, + } { + t.Run(tc.name, func(t *testing.T) { + diags := conformanceDiagsSysML(t, tc.src) + if len(diags) != tc.want { + t.Fatalf("got %v, want %d uniqueness finding(s)", codes(diags), tc.want) + } + for _, d := range diags { + if d.Code != "subsetting-uniqueness-conformance" { + t.Fatalf("unexpected diagnostic %q", d.Code) + } + } + }) + } +} diff --git a/internal/exec/runtime/adopt.go b/internal/exec/runtime/adopt.go index 219599ddfb..1c83626aa8 100644 --- a/internal/exec/runtime/adopt.go +++ b/internal/exec/runtime/adopt.go @@ -724,7 +724,7 @@ func (a *adoption) planUnit(unit Unit) error { return nil } term := semantics.UnitTerm{Scale: semantics.UnitScale(1)} - for _, power := range unit.Product.Powers { + for _, power := range unit.Product.AllPowers() { what := "the unit " + power.Name + " it is measured in" var reduces semantics.UnitTerm switch { @@ -774,20 +774,30 @@ func (a *adoption) planTerm(term semantics.UnitTerm) error { func (a *adoption) rewriteUnit(unit Unit) Unit { powers := make([]semantics.UnitPower, len(unit.Product.Powers)) for i, power := range unit.Product.Powers { - if found, ok := a.rebound[power.Unit]; ok { - power.Unit = found - } - if power.Reduces != nil { - reduces := a.rewriteTerm(*power.Reduces) - power.Reduces = &reduces - } - powers[i] = power + powers[i] = a.rewritePower(power) } - unit.Product = semantics.UnitProduct{Powers: powers} + product := semantics.UnitProduct{Powers: powers} + if unit.Product.Identity != nil { + identity := a.rewritePower(*unit.Product.Identity) + product.Identity = &identity + } + unit.Product = product unit.Term = a.rewriteTerm(unit.Term) return unit } +// rewritePower is one power with the declaration it names rebound, its reduction too. +func (a *adoption) rewritePower(power semantics.UnitPower) semantics.UnitPower { + if found, ok := a.rebound[power.Unit]; ok { + power.Unit = found + } + if power.Reduces != nil { + reduces := a.rewriteTerm(*power.Reduces) + power.Reduces = &reduces + } + return power +} + // rewriteTerm is the reduction with every base unit it names rebound. func (a *adoption) rewriteTerm(term semantics.UnitTerm) semantics.UnitTerm { factors := make([]semantics.UnitFactor, len(term.Factors)) diff --git a/internal/exec/runtime/dimension_one_identity_test.go b/internal/exec/runtime/dimension_one_identity_test.go new file mode 100644 index 0000000000..2a7101c7f5 --- /dev/null +++ b/internal/exec/runtime/dimension_one_identity_test.go @@ -0,0 +1,160 @@ +package runtime + +import ( + "testing" + + "github.com/Open-MBEE/OpenSysML/internal/semantic/symbols" +) + +// dimensionOneContext builds a runtime over the quantity libraries with a +// generator whose efficiency is a DimensionOneValue, once written in the +// library's `one` and once as a bare number, a percent unit scaling `one`, and +// a `unity` the model declares as `one` again. +func dimensionOneContext(t *testing.T) (*Context, *symbols.Scope) { + t.Helper() + idx, _, ctx := buildRuntimeWithLibraries(t, "", parseAndBuild(t, ` + package test { + public import ISQ::*; + public import SI::*; + public import ScalarValues::*; + public import QuantityCalculations::*; + public import MeasurementReferences::*; + attribute <'%'> percent : DimensionOneUnit { :>> unitConversion : ConversionByConvention { :>> referenceUnit = one; :>> conversionFactor = 0.01; } } + attribute unity : DimensionOneUnit = one; + part def Gen { + attribute power : PowerValue; + attribute efficiency : DimensionOneValue; + calc deliveredEnergy { in duration : DurationValue; return : EnergyValue = power * duration * efficiency; } + } + part rated : Gen { attribute :>> power = 800.0 [W]; attribute :>> efficiency = 0.7 [one]; } + part rated2 : Gen { attribute :>> power = 800.0 [W]; attribute :>> efficiency = 0.7; } + } + `)) + pkg, ok := idx.DocumentRoot("").LookupLocal("test") + if !ok || pkg.Scope == nil { + t.Fatal("test package not indexed") + } + return ctx, pkg.Scope +} + +// TestDimensionOneIdentityInProducts: `MeasurementReferences::one` is the +// identity of the unit product. It leaves any product it shares with another +// unit, whichever side of a multiplication or division it enters from, and +// any power of it alone is itself — so a product with a `one` factor folds to +// the same derived unit the product without it reaches. Once every other unit +// cancels it is the unit again, however the operations are grouped. Units that +// merely have dimension one (`rad`) or scale `one` (`%`) are not the identity +// and stay; a unit the model declares as `one` again is the same identity. +func TestDimensionOneIdentityInProducts(t *testing.T) { + ctx, scope := dimensionOneContext(t) + + cases := []struct{ src, want string }{ + {"1 [one] * 800 [W] * 120 [s]", "96000 [SI::'kg⋅m²⋅s⁻²']"}, + {"800 [W] * 120 [s] * 1 [one]", "96000 [SI::'kg⋅m²⋅s⁻²']"}, + {"(800 [W] * 120 [s]) / 1 [one]", "96000.0 [SI::'kg⋅m²⋅s⁻²']"}, + {"0.7 [one] * 800 [W]", "560.0 [W]"}, + {"800 [W] * 0.7 [one]", "560.0 [W]"}, + {"800 [W] / 0.5 [one]", "1600.0 [W]"}, + {"2 [one] * 3 [one]", "6 [one]"}, + {"1 [one] / 1 [one]", "1.0 [one]"}, + {"(2 [one] * 3 [m]) / 3 [m]", "2.0 [one]"}, + {"2 [one] * (3 [m] / 3 [m])", "2.0 [one]"}, + {"(2 [one] * 3 [rad]) / 3 [rad]", "2.0 [one]"}, + {"(0.7 [one] * 800 [W] * 120 [s]) / (800 [W] * 120 [s])", "0.7 [one]"}, + {"rated.deliveredEnergy(120.0 [s]) / (800.0 [W] * 120.0 [s])", "0.7 [one]"}, + {"(2 [one] * 3 [J]) / 3 ['N⋅m']", "2.0 [one]"}, + {"2 [one] * (3 [J] / 3 ['N⋅m'])", "2.0 [one]"}, + {"(2 [one] * 3 [km]) / 3 [m]", "2000.0 [one]"}, + {"1 [one] * 1 [unity]", "1 [one]"}, + {"1 [unity] * 1 [one]", "1 [one]"}, + {"(2 [one]) ** 3", "8 [one]"}, + {"sqrt(9.0 [one])", "3.0 [one]"}, + {"0.7 [one]", "0.7 [one]"}, + {"3 [rad] * 1 [one]", "3 [rad]"}, + {"2 [m] * 3 [rad]", "6 [m*rad]"}, + {"50 ['%'] * 800 [W]", "40000 ['%'*W]"}, + {"50 ['%'] + 0.25 [one]", "75.0 ['%']"}, + {"rated.deliveredEnergy(120.0 [s])", "67200.0 [SI::J]"}, + {"rated2.deliveredEnergy(120.0 [s])", "67200.0 [SI::J]"}, + {"rated.power * rated.efficiency", "560.0 [W]"}, + } + for _, tc := range cases { + t.Run(tc.src, func(t *testing.T) { + got, err := evalIn(t, ctx, scope, tc.src) + if err != nil { + t.Fatalf("%s: %v", tc.src, err) + } + if got.Kind != ValQuantity { + t.Fatalf("%s = %v (%s), want a quantity", tc.src, got, got.Kind) + } + if got.Quantity().String() != tc.want { + t.Errorf("%s = %s, want %s", tc.src, got.Quantity(), tc.want) + } + }) + } +} + +// TestDimensionOneIdentityIsTheUnitItLeaves: a quantity `one` left carries a +// real reference to the unit that remains, so its measurement reference is +// that library unit and it compares equal to a literal written in it; and the +// identity leaves measurement-reference products the same way. +func TestDimensionOneIdentityIsTheUnitItLeaves(t *testing.T) { + ctx, scope := dimensionOneContext(t) + + booleans := []struct { + src string + want bool + }{ + {"(1 [one] * 800 [W]).mRef == W", true}, + {"(800 [W] / 1 [one]).mRef == W", true}, + {"rated.deliveredEnergy(120.0 [s]).mRef == J", true}, + {"2 [W] * 3 [s] * 1 [one] == 6 [J]", true}, + {"rated.deliveredEnergy(120.0 [s]) >= 0.0 [SI::J]", true}, + {"(3 [rad] * 1 [one]).mRef == rad", true}, + {"(50 ['%'] * 2 [m]).mRef == m", false}, + {"((2 [one] * 3 [m]) / 3 [m]).mRef == one", true}, + {"(2 [one] * (3 [m] / 3 [m])).mRef == one", true}, + {"(1 [one] * 1 [unity]).mRef == (1 [unity] * 1 [one]).mRef", true}, + {"(1 [unity]).mRef == one", true}, + {"1 [unity] * 2 [m] == 2 [m] * 1 [one]", true}, + } + for _, tc := range booleans { + got, err := evalIn(t, ctx, scope, tc.src) + if err != nil { + t.Errorf("%s: %v", tc.src, err) + continue + } + if !got.isBool() || got.Const.Bool != tc.want { + t.Errorf("%s = %v, want %v", tc.src, got, tc.want) + } + } + + refs := []struct{ src, want string }{ + {"one * m", "m"}, + {"m * one", "m"}, + {"m / one", "m"}, + {"one * one", "one"}, + {"one ** 2", "one"}, + {"one * W * s", "W*s"}, + {"one", "one"}, + {"one * rad", "rad"}, + {"'%' * m", "'%'*m"}, + {"one * m / m", "one"}, + {"one * unity", "one"}, + {"unity * one", "one"}, + } + for _, tc := range refs { + got, err := evalIn(t, ctx, scope, tc.src) + if err != nil { + t.Errorf("%s: %v", tc.src, err) + continue + } + if got.Kind != ValMeasurementRef { + t.Errorf("%s = %v (%s), want a measurement reference", tc.src, got, got.Kind) + continue + } + if s := got.MeasurementRef().String(); s != tc.want { + t.Errorf("%s = %s, want %s", tc.src, s, tc.want) + } + } +} diff --git a/internal/exec/runtime/measurement_ref.go b/internal/exec/runtime/measurement_ref.go index d274957ec2..7d1ba631dd 100644 --- a/internal/exec/runtime/measurement_ref.go +++ b/internal/exec/runtime/measurement_ref.go @@ -109,17 +109,16 @@ func (ctx *Context) MeasurementUnitValue(sym *symbols.Symbol) (Value, bool, erro if err != nil { return Value{}, true, fmt.Errorf("%w: %s: %w", ErrNotAQuantity, sym.Name, err) } - return DeclaredMeasurementRef(sym, "", term), true, nil + return DeclaredMeasurementRef(ctx.model.semantics, sym, "", term), true, nil } // DeclaredMeasurementRef is the reference a unit declaration names, reducing to // term, spelt as text (`SI::km`) or, given none, by its symbol (`km`). -func DeclaredMeasurementRef(sym *symbols.Symbol, text string, term semantics.UnitTerm) Value { +func DeclaredMeasurementRef(sem *semantics.Model, sym *symbols.Symbol, text string, term semantics.UnitTerm) Value { if text == "" { text = unitSymbolName(sym) } - product := semantics.NamedUnitProduct(sym, text, term.Dimensionless()) - return NewMeasurementRefValue(Unit{Text: text, Product: product, Term: term}) + return NewMeasurementRefValue(Unit{Text: text, Product: sem.DeclaredUnitProduct(sym, text), Term: term}) } // measurementScaleValue is the scale a measurement scale declaration (`SI::'°C_abs'`, diff --git a/internal/exec/runtime/testdata/conformance/instance_quantity_dimension_one_identity.expected.json b/internal/exec/runtime/testdata/conformance/instance_quantity_dimension_one_identity.expected.json new file mode 100644 index 0000000000..a7cf8d9e15 --- /dev/null +++ b/internal/exec/runtime/testdata/conformance/instance_quantity_dimension_one_identity.expected.json @@ -0,0 +1,20 @@ +{ + "type": "instance", + "libraries": true, + "instantiate": "test::Plant", + "slots": { + "delivered": {"type": "Quantity", "value": 67200.0, "unit": "SI::J"}, + "deliveredBare": {"type": "Quantity", "value": 67200.0, "unit": "SI::J"}, + "nonNegative": {"type": "Boolean", "value": true}, + "inJoules": {"type": "Boolean", "value": true}, + "usable": {"type": "Quantity", "value": 560.0, "unit": "W"}, + "leading": {"type": "Quantity", "value": 560.0, "unit": "W"}, + "perOne": {"type": "Quantity", "value": 1600.0, "unit": "W"}, + "squared": {"type": "Quantity", "value": 0.25, "unit": "one"}, + "ratio": {"type": "Quantity", "value": 2.0, "unit": "one"}, + "ratioGrouped": {"type": "Quantity", "value": 2.0, "unit": "one"}, + "recovered": {"type": "Quantity", "value": 0.7, "unit": "one"}, + "swept": {"type": "Quantity", "value": 3, "unit": "rad"}, + "share": {"type": "Quantity", "value": 40000.0, "unit": "'%'*W"} + } +} diff --git a/internal/exec/runtime/testdata/conformance/instance_quantity_dimension_one_identity.sysml b/internal/exec/runtime/testdata/conformance/instance_quantity_dimension_one_identity.sysml new file mode 100644 index 0000000000..50b8d93c7c --- /dev/null +++ b/internal/exec/runtime/testdata/conformance/instance_quantity_dimension_one_identity.sysml @@ -0,0 +1,35 @@ +// A quantity written in MeasurementReferences::one multiplies and divides as the +// identity of the unit product: the product it enters folds to the derived unit +// the same product without it reaches, and holds a real reference to that unit. +// Once every other unit cancels, the identity is the unit again, however the +// operations were grouped. Units of dimension one that are not the identity +// (rad; a percent scaling one) stay in the product. +package test { + private import ISQ::*; + private import SI::*; + private import ScalarValues::*; + private import MeasurementReferences::*; + attribute <'%'> percent : DimensionOneUnit { :>> unitConversion : ConversionByConvention { :>> referenceUnit = one; :>> conversionFactor = 0.01; } } + part def Gen { + attribute power : PowerValue; + attribute efficiency : DimensionOneValue; + calc deliveredEnergy { in duration : DurationValue; return : EnergyValue = power * duration * efficiency; } + } + part def Plant { + part rated : Gen { attribute :>> power = 800.0 [W]; attribute :>> efficiency = 0.7 [one]; } + part bare : Gen { attribute :>> power = 800.0 [W]; attribute :>> efficiency = 0.7; } + attribute delivered : EnergyValue = rated.deliveredEnergy(120.0 [s]); + attribute deliveredBare : EnergyValue = bare.deliveredEnergy(120.0 [s]); + attribute nonNegative : Boolean = delivered >= 0.0 [SI::J]; + attribute inJoules : Boolean = delivered.mRef == J; + attribute usable : PowerValue = rated.power * rated.efficiency; + attribute leading : PowerValue = rated.efficiency * rated.power; + attribute perOne : PowerValue = rated.power / 0.5 [one]; + attribute squared : DimensionOneValue = 0.5 [one] * 0.5 [one]; + attribute ratio : DimensionOneValue = (2 [one] * 3 [m]) / 3 [m]; + attribute ratioGrouped : DimensionOneValue = 2 [one] * (3 [m] / 3 [m]); + attribute recovered : DimensionOneValue = delivered / (rated.power * 120.0 [s]); + attribute swept = 3 [rad] * 1 [one]; + attribute share = 50 ['%'] * 800.0 [W]; + } +} diff --git a/internal/frontend/grpc/attributes_test.go b/internal/frontend/grpc/attributes_test.go index 693444a185..2d4bc5cd7c 100644 --- a/internal/frontend/grpc/attributes_test.go +++ b/internal/frontend/grpc/attributes_test.go @@ -19,7 +19,7 @@ package Demo { part def Car :> Base { attribute :>> mass = 1600.0 [SI::kg]; attribute wheels : ScalarValues::Integer = 4; - attribute derived : ScalarValues::Real = wheels * 2; + attribute 'derived' : ScalarValues::Real = wheels * 2; part engine; } } diff --git a/internal/frontend/grpc/cache.go b/internal/frontend/grpc/cache.go index bba4807074..9622daef99 100644 --- a/internal/frontend/grpc/cache.go +++ b/internal/frontend/grpc/cache.go @@ -17,15 +17,21 @@ import ( "github.com/Open-MBEE/OpenSysML/internal/syntax/diag" "github.com/Open-MBEE/OpenSysML/internal/syntax/parser" "github.com/Open-MBEE/OpenSysML/internal/syntax/source" + "github.com/Open-MBEE/OpenSysML/internal/translate/export" "github.com/Open-MBEE/OpenSysML/internal/workspace/libs" ) // CachedDocument is one parsed document of a model. type CachedDocument struct { - Root *ast.RootNamespace - Source *source.SourceFile // For diagnostic line/col mapping - ParseDiags []parser.Diagnostic // Parser diagnostics - PassesDiags []diag.Diagnostic // Semantic pass diagnostics (name-resolution, type, constraint) + Root *ast.RootNamespace + Source *source.SourceFile // For diagnostic line/col mapping + // ParseDiags are the parse's errors, for the consumers that refuse a + // document that did not parse. + ParseDiags []parser.Diagnostic + // Diagnostics are what the document reports, as the workspace reports a + // document's: the parse's errors and warnings as the passes present them, + // and the passes' own findings when the model parsed clean and was analyzed. + Diagnostics []diag.Diagnostic } // CachedModel holds parsed model data with semantic analysis results @@ -45,6 +51,11 @@ type CachedModel struct { positionalOnce sync.Once positional map[*symbols.Symbol]string byPositional map[string]*symbols.Symbol + // elementIDs is what a conversion of the model writes as each element's + // elementId, which a query reports (queryEval.elementID). + elementIDsOnce sync.Once + elementIDs *export.ElementIDs + elementIDsErr error // idle are the workers requests have given back, warm with what they resolved. idleMu sync.Mutex diff --git a/internal/frontend/grpc/convert.go b/internal/frontend/grpc/convert.go index 7abf677935..dcbd3e208c 100644 --- a/internal/frontend/grpc/convert.go +++ b/internal/frontend/grpc/convert.go @@ -109,7 +109,7 @@ func RunNoteDiagnosticsToProto(notes []runtime.RunNote, model *CachedModel) []*p // SyntaxDiagnosticCode is the code every reporter gives a parser error; the // parser itself codes only warnings. -const SyntaxDiagnosticCode = "syntax" +const SyntaxDiagnosticCode = parser.CodeSyntax // ParserDiagnosticToProto converts a parser error to protobuf. func ParserDiagnosticToProto(diag parser.Diagnostic, sf *source.SourceFile) *pb.Diagnostic { diff --git a/internal/frontend/grpc/convert_id_form_test.go b/internal/frontend/grpc/convert_id_form_test.go new file mode 100644 index 0000000000..55e4f5f3e0 --- /dev/null +++ b/internal/frontend/grpc/convert_id_form_test.go @@ -0,0 +1,117 @@ +package grpc + +import ( + "context" + "encoding/json" + "testing" + + "connectrpc.com/connect" + + pb "github.com/Open-MBEE/OpenSysML/api/proto" + "github.com/Open-MBEE/OpenSysML/internal/translate/convert" + "github.com/Open-MBEE/OpenSysML/internal/translate/export" +) + +const idFormModel = "package P { part def A; part a : A; }\n" + +// id_form spells derived ids as `sysml -id` does: the service's uuid form is +// byte for byte the conversion's, and the default is the qualified form (#732). +func TestConvertIDFormIsTheCommandLines(t *testing.T) { + srv := mustNewService(t, 10) + defer srv.Close() + for _, form := range []string{"", "qualified", "uuid"} { + resp, err := srv.Convert(context.Background(), &pb.ConvertRequest{ + Source: &pb.ConvertRequest_Content{Content: idFormModel}, + FromFormat: "sysml", + ToFormat: "api-json", + IdForm: form, + }) + if err != nil || resp.Error != "" { + t.Fatalf("id_form %q: %v %s", form, err, resp.GetError()) + } + parsed, _ := export.ParseIDForm(form) + want, err := convert.ConvertWith("", []byte(idFormModel), convert.FormatSysML, convert.FormatAPIJSON, convert.Options{ID: parsed}) + if err != nil { + t.Fatal(err) + } + if resp.Content != string(want) { + t.Errorf("id_form %q: the service's output differs from the conversion's", form) + } + ids := apiJSONIDs(t, resp.Content) + if _, qualified := ids["P::a"]; !qualified { + t.Fatalf("id_form %q: no element P::a", form) + } + if got := ids["P::a"]; (form == "uuid") == (got == "P__a") { + t.Errorf("id_form %q: P::a has @id %q", form, got) + } + } +} + +// A model parsed from several documents takes id_form too. +func TestConvertModelOfSeveralDocumentsTakesIDForm(t *testing.T) { + srv := mustNewService(t, 10) + defer srv.Close() + parsed, err := srv.ParseSources(context.Background(), &pb.ParseSourcesRequest{ + Documents: inlineDocuments( + "lib.sysml", "package Lib { part def Engine; }\n", + "app.sysml", "package App { private import Lib::*; part e : Engine; }\n"), + }) + if err != nil { + t.Fatalf("ParseSources: %v", err) + } + resp, err := srv.Convert(context.Background(), &pb.ConvertRequest{ + Source: &pb.ConvertRequest_ModelHash{ModelHash: parsed.ModelHash}, + ToFormat: "api-json", + IdForm: "uuid", + }) + if err != nil || resp.Error != "" { + t.Fatalf("Convert: %v %s", err, resp.GetError()) + } + for name, id := range apiJSONIDs(t, resp.Content) { + if id == "Lib__Engine" || id == "App__e" { + t.Errorf("%s kept its qualified-form @id %q under id_form uuid", name, id) + } + } +} + +// id_form is refused where `-id` is: for a notation target, and for a value +// that names no id form. +func TestConvertIDFormRefusals(t *testing.T) { + srv := mustNewService(t, 10) + defer srv.Close() + parsed, err := srv.ParseSources(context.Background(), &pb.ParseSourcesRequest{ + Documents: inlineDocuments( + "lib.sysml", "package Lib { part def Engine; }\n", + "app.sysml", "package App { private import Lib::*; part e : Engine; }\n"), + }) + if err != nil { + t.Fatalf("ParseSources: %v", err) + } + for name, req := range map[string]*pb.ConvertRequest{ + "notation target": {Source: &pb.ConvertRequest_Content{Content: idFormModel}, FromFormat: "sysml", ToFormat: "sysml", IdForm: "uuid"}, + // Judged before the several-document model's notation refusal, so the + // same request is refused the same way for one document or several. + "notation target, several documents": {Source: &pb.ConvertRequest_ModelHash{ModelHash: parsed.ModelHash}, ToFormat: "sysml", IdForm: "uuid"}, + "unknown form": {Source: &pb.ConvertRequest_Content{Content: idFormModel}, FromFormat: "sysml", ToFormat: "api-json", IdForm: "guid"}, + } { + if _, err := srv.Convert(context.Background(), req); connect.CodeOf(err) != connect.CodeInvalidArgument { + t.Errorf("%s: err = %v, want INVALID_ARGUMENT", name, err) + } + } +} + +// apiJSONIDs maps each named element of an API JSON document to its @id. +func apiJSONIDs(t *testing.T, content string) map[string]string { + t.Helper() + var elements []map[string]any + if err := json.Unmarshal([]byte(content), &elements); err != nil { + t.Fatal(err) + } + out := map[string]string{} + for _, e := range elements { + if name, ok := e["qualifiedName"].(string); ok { + out[name], _ = e["@id"].(string) + } + } + return out +} diff --git a/internal/frontend/grpc/edit.go b/internal/frontend/grpc/edit.go index 4092415ab6..65a527b167 100644 --- a/internal/frontend/grpc/edit.go +++ b/internal/frontend/grpc/edit.go @@ -214,7 +214,7 @@ func (s *Service) editModel(cached *CachedModel, edited *CachedDocument) edit.Mo Root: edited.Root, Index: cached.Index, ParseDiags: edited.ParseDiags, - SemDiags: edited.PassesDiags, + SemDiags: edited.Diagnostics, Analysis: passes.Options{Conformance: cached.Mode}, // The edited notation is analyzed in an index of its own, over the // libraries and every document of the model the edit did not rewrite. @@ -229,7 +229,7 @@ func (s *Service) editModel(cached *CachedModel, edited *CachedDocument) edit.Mo Other: func(name string) (edit.Document, bool) { for _, doc := range others { if doc.Source.Name() == name { - return edit.Document{Source: doc.Source, ParseDiags: doc.ParseDiags, SemDiags: doc.PassesDiags}, true + return edit.Document{Source: doc.Source, ParseDiags: doc.ParseDiags, SemDiags: doc.Diagnostics}, true } } return edit.Document{}, false diff --git a/internal/frontend/grpc/explore_test.go b/internal/frontend/grpc/explore_test.go index c9dbbc4a86..98cffe821d 100644 --- a/internal/frontend/grpc/explore_test.go +++ b/internal/frontend/grpc/explore_test.go @@ -492,15 +492,15 @@ package Fail { action zero { assign d := 0; } action one { assign d := 1; } join sync; - action use { assign q := 10 / d; } + action 'use' { assign q := 10 / d; } done; succession first start then split; succession first split then zero; succession first split then one; succession first zero then sync; succession first one then sync; - succession first sync then use; - succession first use then done; + succession first sync then 'use'; + succession first 'use' then done; } } `, "explore-error") diff --git a/internal/frontend/grpc/export.go b/internal/frontend/grpc/export.go index f2966b1548..717bcef76a 100644 --- a/internal/frontend/grpc/export.go +++ b/internal/frontend/grpc/export.go @@ -40,6 +40,10 @@ func (s *Service) Convert(ctx context.Context, req *pb.ConvertRequest) (*pb.Conv if !to.Writable() { return nil, statusError(connect.CodeInvalidArgument, (&convert.NotWritableError{Format: to}).Error()) } + opts, err := convertOptions(req.IdForm, from, to) + if err != nil { + return nil, err + } resp := &pb.ConvertResponse{FromFormat: from.String(), ToFormat: to.String()} // Marked on the response rather than left to the client to infer, so a caller @@ -48,7 +52,7 @@ func (s *Service) Convert(ctx context.Context, req *pb.ConvertRequest) (*pb.Conv resp.Experimental = true resp.ExperimentalNotice = convert.Notice(from, to) } - out, syntax, err := convertModel(name, data, from, to, req.TolerateSyntaxErrors) + out, syntax, err := convertModel(name, data, from, to, req.TolerateSyntaxErrors, opts) if err != nil { resp.Error = err.Error() var broken *convert.SyntaxError @@ -64,14 +68,33 @@ func (s *Service) Convert(ctx context.Context, req *pb.ConvertRequest) (*pb.Conv // convertModel runs the conversion, tolerating unreadable notation only when the // request asked for it. -func convertModel(name string, data []byte, from, to convert.Format, tolerant bool) ([]byte, *convert.SyntaxError, error) { +func convertModel(name string, data []byte, from, to convert.Format, tolerant bool, opts convert.Options) ([]byte, *convert.SyntaxError, error) { if tolerant { - return convert.ConvertTolerant(name, data, from, to) + return convert.ConvertTolerantWith(name, data, from, to, opts) } - out, err := convert.Convert(name, data, from, to) + out, err := convert.ConvertWith(name, data, from, to, opts) return out, nil, err } +// convertOptions reads id_form as `sysml -id` reads its argument: how derived +// element ids are spelled when notation is written as a graph. It is refused +// for any other direction, and for a value that names no id form. +func convertOptions(idForm string, from, to convert.Format) (convert.Options, error) { + opts := convert.Options{} + if idForm == "" { + return opts, nil + } + if from != convert.FormatSysML || (to != convert.FormatTurtle && to != convert.FormatAPIJSON) { + return opts, statusError(connect.CodeInvalidArgument, "id_form applies to notation converted to ttl or api-json") + } + form, ok := export.ParseIDForm(idForm) + if !ok { + return opts, statusErrorf(connect.CodeInvalidArgument, "id_form wants qualified or uuid, not %q", idForm) + } + opts.ID = form + return opts, nil +} + // convertSource reads the model the request names, and the name to report it by. // A model_hash converts the source that parse read rather than the file as it // stands now, so a model is written back out as the client inspected it. @@ -177,6 +200,12 @@ func (s *Service) convertModelOfDocuments(req *pb.ConvertRequest) (*pb.ConvertRe return nil, true, statusError(connect.CodeInvalidArgument, "a model parsed from several documents is notation; from_format must be empty or sysml") } } + // id_form is judged first, as for one document: one given for a notation + // target is INVALID_ARGUMENT, whatever else the model's target refuses. + opts, err := convertOptions(req.IdForm, convert.FormatSysML, to) + if err != nil { + return nil, true, err + } if to != convert.FormatTurtle && to != convert.FormatAPIJSON { return nil, true, statusErrorf(connect.CodeFailedPrecondition, "notation is written for one document, and this model has %d; convert it to %s or %s, or convert each document", @@ -204,7 +233,7 @@ func (s *Service) convertModelOfDocuments(req *pb.ConvertRequest) (*pb.ConvertRe resp.Error = strings.Join(refused, "\n") return resp, true, nil } - graph, err := export.ModelToRDFWith(documents, export.IDQualifiedName) + graph, err := export.ModelToRDFWith(documents, opts.ID) if err != nil { resp.Error = err.Error() return resp, true, nil diff --git a/internal/frontend/grpc/parser_warnings_test.go b/internal/frontend/grpc/parser_warnings_test.go new file mode 100644 index 0000000000..ab66f13349 --- /dev/null +++ b/internal/frontend/grpc/parser_warnings_test.go @@ -0,0 +1,281 @@ +package grpc + +import ( + "context" + "encoding/json" + "fmt" + "os" + "os/exec" + "path/filepath" + "sort" + "strings" + "sync" + "testing" + + pb "github.com/Open-MBEE/OpenSysML/api/proto" + "github.com/Open-MBEE/OpenSysML/tests/testutil/gobuild" +) + +const ( + // keywordAsName writes a reserved keyword where the grammar's ID terminal + // admits only a name; the parser warns and the notation pass escalates. + keywordAsName = "package P { part def X; part def M { part filter : X; } }" + // quotedKeywordName spells the same name as the unrestricted name the + // grammar admits. + quotedKeywordName = "package P { part def X; part def M { part 'filter' : X; } }" + // misplacedComment is notation the parser reads but the grammar does not + // admit: the parser warns, and strict conformance escalates the warning. + misplacedComment = "package P { calc def F { 1 /* c */ } }" + // keywordAndSyntaxError has a syntax error alongside the keyword name, so + // the parse's errors and warnings are both reported. The service analyzes + // a clean parse only, so the warning is not escalated as the CLI's is. + keywordAndSyntaxError = "package P { part def X; part def M { part filter : X; part q : ; } }" +) + +// codeSeverity spells one diagnostic as the pair a client keys on. +func codeSeverity(d *pb.Diagnostic) string { return d.Code + "/" + strings.ToLower(d.Severity) } + +// codeSeverities lists every diagnostic of a response as code/severity, sorted. +func codeSeverities(diags []*pb.Diagnostic) []string { + out := make([]string, 0, len(diags)) + for _, d := range diags { + out = append(out, codeSeverity(d)) + } + sort.Strings(out) + return out +} + +// The service reports a reserved keyword written as a name the way the CLI +// does: as an error coded reserved-keyword-name, in every conformance mode. +func TestParseFileReportsReservedKeywordName(t *testing.T) { + srv := mustNewService(t, 10) + defer srv.Close() + + for _, strict := range []bool{false, true} { + t.Run(fmt.Sprintf("strict_conformance=%v", strict), func(t *testing.T) { + resp, err := srv.ParseFile(context.Background(), &pb.ParseFileRequest{ + Source: &pb.ParseFileRequest_Content{Content: keywordAsName}, + StrictConformance: strict, + }) + if err != nil { + t.Fatalf("ParseFile: %v", err) + } + if resp.Error != "" { + t.Fatalf("ParseFile error %q, want none", resp.Error) + } + got := codeSeverities(resp.Diagnostics) + want := []string{"reserved-keyword-name/error"} + if strings.Join(got, ",") != strings.Join(want, ",") { + t.Fatalf("diagnostics = %v, want %v\n%v", got, want, resp.Diagnostics) + } + if d := resp.Diagnostics[0]; !strings.Contains(d.Message, "reserved keyword") { + t.Errorf("message %q does not name the reserved keyword", d.Message) + } + + clean, err := srv.ParseFile(context.Background(), &pb.ParseFileRequest{ + Source: &pb.ParseFileRequest_Content{Content: quotedKeywordName}, + StrictConformance: strict, + }) + if err != nil { + t.Fatalf("ParseFile: %v", err) + } + if len(clean.Diagnostics) != 0 { + t.Errorf("quoted 'filter' reported %v, want no diagnostics", clean.Diagnostics) + } + }) + } +} + +// ParseSources reports a reserved keyword written as a name in any of its +// documents, against the document that wrote it. +func TestParseSourcesReportsReservedKeywordName(t *testing.T) { + srv := mustNewService(t, 10) + defer srv.Close() + + resp, err := srv.ParseSources(context.Background(), &pb.ParseSourcesRequest{ + Documents: inlineDocuments("lib.sysml", sourcesLibrary, "kw.sysml", keywordAsName), + StrictConformance: true, + }) + if err != nil { + t.Fatalf("ParseSources: %v", err) + } + if resp.Error != "" { + t.Fatalf("ParseSources error %q, want none", resp.Error) + } + got := codeSeverities(resp.Diagnostics) + if want := []string{"reserved-keyword-name/error"}; strings.Join(got, ",") != strings.Join(want, ",") { + t.Fatalf("diagnostics = %v, want %v\n%v", got, want, resp.Diagnostics) + } + if file := resp.Diagnostics[0].Span.GetFile(); file != "kw.sysml" { + t.Errorf("diagnostic reported against %q, want kw.sysml", file) + } +} + +// A parser nonstandard-notation warning is a warning by default and an error +// under strict conformance, reported once either way. +func TestParseFileStrictConformanceEscalatesParserNotationWarning(t *testing.T) { + srv := mustNewService(t, 10) + defer srv.Close() + + for _, tc := range []struct { + strict bool + want string + }{ + {false, "nonstandard-notation/warning"}, + {true, "nonstandard-notation/error"}, + } { + t.Run(fmt.Sprintf("strict_conformance=%v", tc.strict), func(t *testing.T) { + resp, err := srv.ParseFile(context.Background(), &pb.ParseFileRequest{ + Source: &pb.ParseFileRequest_Content{Content: misplacedComment}, + StrictConformance: tc.strict, + }) + if err != nil { + t.Fatalf("ParseFile: %v", err) + } + got := codeSeverities(resp.Diagnostics) + if strings.Join(got, ",") != tc.want { + t.Fatalf("diagnostics = %v, want [%s]\n%v", got, tc.want, resp.Diagnostics) + } + }) + } +} + +// Every diagnostic of a document is reported once, whether the parse was +// clean, warned, or failed: the parse's errors and warnings reach the client +// through the passes, not alongside them. +func TestModelDiagnosticsReportEachOnce(t *testing.T) { + srv := mustNewService(t, 10) + defer srv.Close() + + for name, tc := range map[string]struct { + content string + want []string + }{ + "warning": {keywordAsName, []string{"reserved-keyword-name/error"}}, + "error_and_warning": {keywordAndSyntaxError, []string{"reserved-keyword-name/warning", "syntax/error"}}, + "comment": {misplacedComment, []string{"nonstandard-notation/warning"}}, + } { + t.Run(name, func(t *testing.T) { + resp, err := srv.ParseFile(context.Background(), &pb.ParseFileRequest{ + Source: &pb.ParseFileRequest_Content{Content: tc.content}, + }) + if err != nil { + t.Fatalf("ParseFile: %v", err) + } + got := codeSeverities(resp.Diagnostics) + if strings.Join(got, ",") != strings.Join(tc.want, ",") { + t.Fatalf("diagnostics = %v, want %v\n%v", got, tc.want, resp.Diagnostics) + } + seen := map[string]int{} + for _, d := range resp.Diagnostics { + key := fmt.Sprintf("%s|%s|%d:%d", d.Code, d.Message, d.Span.GetStartLine(), d.Span.GetStartCol()) + seen[key]++ + if seen[key] > 1 { + t.Errorf("diagnostic reported twice: %v", d) + } + } + again, err := srv.GetDiagnostics(context.Background(), &pb.DiagnosticsRequest{ModelHash: resp.ModelHash}) + if err != nil { + t.Fatalf("GetDiagnostics: %v", err) + } + if got, want := codeSeverities(again.Diagnostics), codeSeverities(resp.Diagnostics); strings.Join(got, ",") != strings.Join(want, ",") { + t.Errorf("GetDiagnostics = %v, want the ParseFile diagnostics %v", got, want) + } + }) + } +} + +var ( + cliOnce sync.Once + cliPath string + cliErr error +) + +// sysmlCLI builds cmd/sysml once per test binary. +func sysmlCLI(t *testing.T) string { + t.Helper() + cliOnce.Do(func() { + dir, err := os.MkdirTemp("", "sysml-cli") + if err != nil { + cliErr = err + return + } + cliPath = filepath.Join(dir, "sysml") + build := exec.Command("go", gobuild.Args(cliPath)...) + build.Dir = filepath.Join("..", "..", "..", "cmd", "sysml") + if out, err := build.CombinedOutput(); err != nil { + cliErr = fmt.Errorf("go build: %v\n%s", err, out) + } + }) + if cliErr != nil { + t.Fatalf("building sysml: %v", cliErr) + } + return cliPath +} + +// cliDiagnostics runs `sysml -validate -json` on the file and returns its +// diagnostics as code/severity, sorted. +func cliDiagnostics(t *testing.T, binary, file string, strict bool) []string { + t.Helper() + args := []string{"-validate", "-json"} + if strict { + args = append(args, "-strict") + } + out, err := exec.Command(binary, append(args, file)...).Output() + if err != nil { + if exit, ok := err.(*exec.ExitError); !ok || len(out) == 0 { + t.Fatalf("sysml %v: %v\n%s", args, err, exit) + } + } + var report struct { + Diagnostics []struct { + Severity string `json:"severity"` + Code string `json:"code"` + } `json:"diagnostics"` + } + if err := json.Unmarshal(out, &report); err != nil { + t.Fatalf("sysml -json output: %v\n%s", err, out) + } + codes := make([]string, 0, len(report.Diagnostics)) + for _, d := range report.Diagnostics { + codes = append(codes, d.Code+"/"+strings.ToLower(d.Severity)) + } + sort.Strings(codes) + return codes +} + +// The CLI and the service report the same diagnostics, by code and severity, +// for the same document in the same conformance mode. +func TestParseFileMatchesCLIValidate(t *testing.T) { + binary := sysmlCLI(t) + srv := mustNewService(t, 10) + defer srv.Close() + + dir := t.TempDir() + for name, content := range map[string]string{ + "keyword.sysml": keywordAsName, + "quoted.sysml": quotedKeywordName, + "comment.sysml": misplacedComment, + } { + file := filepath.Join(dir, name) + if err := os.WriteFile(file, []byte(content), 0o644); err != nil { + t.Fatal(err) + } + for _, strict := range []bool{false, true} { + t.Run(fmt.Sprintf("%s/strict=%v", name, strict), func(t *testing.T) { + want := cliDiagnostics(t, binary, file, strict) + resp, err := srv.ParseFile(context.Background(), &pb.ParseFileRequest{ + Source: &pb.ParseFileRequest_Content{Content: content}, + StrictConformance: strict, + }) + if err != nil { + t.Fatalf("ParseFile: %v", err) + } + got := codeSeverities(resp.Diagnostics) + if strings.Join(got, ",") != strings.Join(want, ",") { + t.Errorf("gRPC reports %v, CLI reports %v\n%v", got, want, resp.Diagnostics) + } + }) + } + } +} diff --git a/internal/frontend/grpc/query.go b/internal/frontend/grpc/query.go index 9f610971d1..27bbe84a3c 100644 --- a/internal/frontend/grpc/query.go +++ b/internal/frontend/grpc/query.go @@ -11,6 +11,7 @@ import ( pb "github.com/Open-MBEE/OpenSysML/api/proto" corequery "github.com/Open-MBEE/OpenSysML/internal/semantic/query" "github.com/Open-MBEE/OpenSysML/internal/semantic/symbols" + "github.com/Open-MBEE/OpenSysML/internal/translate/convert" "github.com/Open-MBEE/OpenSysML/internal/translate/export" ) @@ -95,7 +96,8 @@ func (s *Service) Query(ctx context.Context, req *pb.QueryRequest) (*pb.QueryRes sc := cached.SymbolContext() defer sc.Lock()() eval := &queryEval{sc: sc, cached: cached} - eval.reader = corequery.NewPropertyReader(sc.Index, sc.Resolver, sc.Semantics).WithIdentity(eval.identity) + eval.reader = corequery.NewPropertyReader(sc.Index, sc.Resolver, sc.Semantics). + WithIdentity(eval.identity).WithElementID(eval.elementID) if req.OslcQuery != "" { parsed, err := corequery.ParseOSLC(req.OslcQuery) if err != nil { @@ -105,6 +107,9 @@ func (s *Service) Query(ctx context.Context, req *pb.QueryRequest) (*pb.QueryRes if err != nil { return nil, queryStatus(err) } + if eval.elementIDErr != nil { + return nil, elementIDStatus(eval.elementIDErr) + } out := make([]*pb.QueryResultElement, 0, len(elements)) for _, element := range elements { out = append(out, &pb.QueryResultElement{ @@ -135,9 +140,20 @@ func (s *Service) Query(ctx context.Context, req *pb.QueryRequest) (*pb.QueryRes } elements = append(elements, eval.project(sym, projection)) } + if eval.elementIDErr != nil { + return nil, elementIDStatus(eval.elementIDErr) + } return &pb.QueryResponse{Elements: elements}, nil } +// elementIDStatus reports a query that read elementId of a model no conversion +// can write: what it would report does not exist, so the query fails with the +// conversion's refusal rather than answering without the property. +func elementIDStatus(err error) error { + return statusErrorf(connect.CodeFailedPrecondition, + "elementId is the id a conversion of the model writes, and converting this model is refused: %v", err) +} + // queryEval evaluates one query over a model's symbol context. It holds no // element state of its own: every property is read from the index and semantic // model on demand. @@ -145,6 +161,9 @@ type queryEval struct { sc *SymbolContext reader *corequery.PropertyReader cached *CachedModel + // elementIDErr is why the model has no elementIds, once a property read + // asked for one: the conversion that writes them refused the model. + elementIDErr error } // candidates returns the elements a query considers, in declaration order: every @@ -198,6 +217,54 @@ func (e *queryEval) identity(sym *symbols.Symbol) string { return e.cached.positional[sym] } +// elementID is the elementId Convert writes for sym in the qualified id form, +// read from a conversion of the model made once per model, so a query result +// joins the converted graph. A model the conversion refuses has none: the +// refusal is recorded, and a query reading elementId fails with it. +func (e *queryEval) elementID(sym *symbols.Symbol) string { + cached := e.cached + if cached == nil { + return "" + } + cached.elementIDsOnce.Do(func() { + documents := make([]export.ModelDocument, 0, len(cached.Documents)) + for _, doc := range cached.Documents { + if doc != nil && doc.Source != nil && doc.Root != nil { + documents = append(documents, export.ModelDocument{File: doc.Source, Root: doc.Root}) + } + } + // Convert refuses a model of several documents one of which the parser + // could not read whole, so no ids are read from its recovered trees. + if len(documents) > 1 { + for _, doc := range cached.Documents { + if doc == nil || doc.Source == nil { + continue + } + if syntax := convert.SyntaxErrorOf(doc.Source.Name(), doc.Source, doc.ParseDiags); syntax != nil { + cached.elementIDsErr = syntax + return + } + } + } + // The ids are the ones Convert writes for this model hash, so they are + // read from the same conversion: one document is converted from its + // text (convertSource), several from what parse read + // (convertModelOfDocuments). + if len(documents) == 1 { + doc := documents[0].File + cached.elementIDs, cached.elementIDsErr = export.NewElementIDsOfDocument(doc.Name(), doc.Bytes()) + return + } + cached.elementIDs, cached.elementIDsErr = export.NewElementIDs(documents) + }) + if cached.elementIDsErr != nil { + e.elementIDErr = cached.elementIDsErr + return "" + } + id, _ := cached.elementIDs.OfDeclaration(sym.Decl, e.identity(sym)) + return id +} + func (e *queryEval) positionalNames(cached *CachedModel) { if cached == nil { return @@ -297,7 +364,7 @@ func (w *elementWalk) members(sym *symbols.Symbol) { // An empty selection reports every property. func projectedProperties(selected []string) ([]string, error) { if len(selected) == 0 { - return QueryPropertyNames(), nil + return corequery.DefaultProjection(), nil } out := make([]string, 0, len(selected)) for _, name := range selected { diff --git a/internal/frontend/grpc/query_element_id_test.go b/internal/frontend/grpc/query_element_id_test.go new file mode 100644 index 0000000000..11574f52b5 --- /dev/null +++ b/internal/frontend/grpc/query_element_id_test.go @@ -0,0 +1,330 @@ +package grpc + +import ( + "context" + "encoding/json" + "os" + "path/filepath" + "testing" + + "connectrpc.com/connect" + + pb "github.com/Open-MBEE/OpenSysML/api/proto" +) + +// A query's elementId is the elementId Convert writes for the same element, so a +// query result joins the converted graph: across documents, for an unnamed +// member (by its positional @id), a quoted name, a declared ElementId and +// elements of two identity scopes, whose API JSON @id the scope qualifies while +// elementId stays the element's own (#733). +func TestQueryElementIDIsTheIDConvertWrites(t *testing.T) { + for _, tc := range []struct { + name string + documents []string + scoped bool + }{ + {name: "two documents", documents: []string{ + "lib.sysml", "package Lib { part def Engine { attribute mass : ScalarValues::Real; } }\n", + "app.sysml", "package App { private import Lib::*; part e : Engine; }\n", + }}, + {name: "unnamed and quoted", documents: []string{ + "q.sysml", "package Q { part def 'Fuel Pump'; part def A { part : 'Fuel Pump'; part p : 'Fuel Pump'; } }\n", + }}, + {name: "declared id", documents: []string{ + "d.sysml", "package D { @IdentityMetadata::ProjectRef { projectId = \"d\"; branch = \"main\"; } part def A { @IdentityMetadata::ElementId { id = \"a-declared-id\"; } } }\n", + }}, + {name: "two scopes", scoped: true, documents: []string{ + "one.sysml", "package P { @IdentityMetadata::ProjectRef { projectId = \"one\"; branch = \"main\"; } part def A; }\n", + "two.sysml", "package R { @IdentityMetadata::ProjectRef { projectId = \"two\"; branch = \"main\"; } part def B; }\n", + }}, + } { + t.Run(tc.name, func(t *testing.T) { + srv := mustNewService(t, 10) + defer srv.Close() + parsed, err := srv.ParseSources(context.Background(), &pb.ParseSourcesRequest{Documents: inlineDocuments(tc.documents...)}) + if err != nil { + t.Fatalf("ParseSources: %v", err) + } + if len(parsed.Diagnostics) > 0 { + t.Fatalf("the model does not parse cleanly: %v", parsed.Diagnostics) + } + converted, err := srv.Convert(context.Background(), &pb.ConvertRequest{ + Source: &pb.ConvertRequest_ModelHash{ModelHash: parsed.ModelHash}, + ToFormat: "api-json", + }) + if err != nil || converted.Error != "" { + t.Fatalf("Convert: %v %s", err, converted.GetError()) + } + var elements []map[string]any + if err := json.Unmarshal([]byte(converted.Content), &elements); err != nil { + t.Fatal(err) + } + written, atIDs := map[string]string{}, map[string]string{} + for _, e := range elements { + if name, ok := e["qualifiedName"].(string); ok { + written[name], _ = e["elementId"].(string) + atIDs[name], _ = e["@id"].(string) + } + } + queried, err := srv.Query(context.Background(), &pb.QueryRequest{ + ModelHash: parsed.ModelHash, + Query: &pb.Query{Select: []string{"@id", "elementId"}}, + }) + if err != nil { + t.Fatalf("Query: %v", err) + } + if len(queried.Elements) == 0 { + t.Fatal("the query selected nothing") + } + for _, e := range queried.Elements { + want, ok := written[e.Id] + if !ok { + t.Errorf("%s: Convert writes no element of that name", e.Id) + continue + } + got := e.Properties["elementId"] + if got != want { + t.Errorf("%s: elementId %q, Convert writes elementId %q", e.Id, got, want) + } + // Where no identity scope qualifies the IRIs, the API JSON @id + // is the elementId, so a result joins the graph by @id too. + if !tc.scoped && got != atIDs[e.Id] { + t.Errorf("%s: elementId %q, Convert writes @id %q", e.Id, got, atIDs[e.Id]) + } + } + }) + } +} + +// A standard library element's elementId is its normative id, the id every +// reference to it in a converted graph carries. +func TestQueryElementIDOfALibraryElementIsItsNormativeID(t *testing.T) { + srv := mustNewService(t, 10) + defer srv.Close() + parsed, err := srv.ParseSources(context.Background(), &pb.ParseSourcesRequest{ + Documents: inlineDocuments("p.sysml", "package P { attribute speed : ScalarValues::Real; }\n"), + }) + if err != nil { + t.Fatalf("ParseSources: %v", err) + } + queried, err := srv.Query(context.Background(), &pb.QueryRequest{ + ModelHash: parsed.ModelHash, + Query: &pb.Query{Scope: []string{"ScalarValues::Real"}, Select: []string{"elementId"}}, + }) + if err != nil { + t.Fatalf("Query: %v", err) + } + if len(queried.Elements) == 0 { + t.Fatal("the query selected nothing") + } + // uuid5(uuid5(NAMESPACE_URL, "https://www.omg.org/spec/KerML/ScalarValues"), "ScalarValues::Real") + if got := queried.Elements[0].Properties["elementId"]; got != "14c0aa22-5489-59b5-b438-ded26e83ba31" { + t.Errorf("ScalarValues::Real: elementId %q, want its normative id", got) + } +} + +// A copy of a bundled library file parsed as a model is the library, as a +// conversion analyses it: its elements' elementIds are their normative ids. +func TestQueryElementIDOfALibraryCopyIsNormative(t *testing.T) { + library, err := os.ReadFile(filepath.Join("..", "..", "workspace", "libs", "stdlib", + "Kernel Libraries", "Kernel Data Type Library", "ScalarValues.kerml")) + if err != nil { + t.Fatal(err) + } + srv := mustNewService(t, 10) + defer srv.Close() + parsed, err := srv.ParseSources(context.Background(), &pb.ParseSourcesRequest{ + Documents: inlineDocuments("ScalarValues.kerml", string(library)), + }) + if err != nil { + t.Fatalf("ParseSources: %v", err) + } + queried, err := srv.Query(context.Background(), &pb.QueryRequest{ + ModelHash: parsed.ModelHash, + Query: &pb.Query{Scope: []string{"ScalarValues::Real"}, Select: []string{"elementId"}}, + }) + if err != nil { + t.Fatalf("Query: %v", err) + } + if len(queried.Elements) == 0 { + t.Fatal("the query selected nothing") + } + if got := queried.Elements[0].Properties["elementId"]; got != "14c0aa22-5489-59b5-b438-ded26e83ba31" { + t.Errorf("ScalarValues::Real in a library copy: elementId %q, want its normative id", got) + } +} + +// A model a conversion refuses has no elementIds: a query reading elementId +// fails with the refusal, and one that does not is answered as before. +func TestQueryElementIDOfAModelConvertRefuses(t *testing.T) { + srv := mustNewService(t, 10) + defer srv.Close() + parsed, err := srv.ParseSources(context.Background(), &pb.ParseSourcesRequest{ + Documents: inlineDocuments( + "a.sysml", "package P { part def A; }\n", + "b.sysml", "package P { part def B; }\n"), + }) + if err != nil { + t.Fatalf("ParseSources: %v", err) + } + converted, err := srv.Convert(context.Background(), &pb.ConvertRequest{ + Source: &pb.ConvertRequest_ModelHash{ModelHash: parsed.ModelHash}, ToFormat: "api-json", + }) + if err != nil || converted.Error == "" { + t.Fatalf("the model converted, so the case tests nothing: %v %q", err, converted.GetError()) + } + _, err = srv.Query(context.Background(), &pb.QueryRequest{ + ModelHash: parsed.ModelHash, + Query: &pb.Query{Select: []string{"@id", "elementId"}}, + }) + if connect.CodeOf(err) != connect.CodeFailedPrecondition { + t.Errorf("selecting elementId of a model Convert refuses: err = %v, want FAILED_PRECONDITION", err) + } + if _, err := srv.Query(context.Background(), &pb.QueryRequest{ + ModelHash: parsed.ModelHash, + Query: &pb.Query{Select: []string{"@id"}}, + }); err != nil { + t.Errorf("a query not reading elementId failed: %v", err) + } + // An empty select reports every property but elementId, which only a query + // naming it converts the model for. + all, err := srv.Query(context.Background(), &pb.QueryRequest{ModelHash: parsed.ModelHash, Query: &pb.Query{}}) + if err != nil { + t.Fatalf("an empty select failed: %v", err) + } + for _, e := range all.Elements { + if _, ok := e.Properties["elementId"]; ok { + t.Errorf("%s: an empty select reported elementId", e.Id) + } + } +} + +// A library element a model annotates with an id of its own is referenced by +// name in a conversion (no id is written for it), so it has no elementId. +func TestQueryElementIDOfAnAnnotatedLibraryElementIsAbsent(t *testing.T) { + srv := mustNewService(t, 10) + defer srv.Close() + model := "package P {\n" + + " @IdentityMetadata::ProjectRef { projectId = \"p\"; branch = \"main\"; }\n" + + " metadata sid : IdentityMetadata::ElementId about ScalarValues::Boolean { id = \"custom-boolean\"; }\n" + + " attribute b : ScalarValues::Boolean;\n" + + "}\n" + parsed, err := srv.ParseSources(context.Background(), &pb.ParseSourcesRequest{Documents: inlineDocuments("p.sysml", model)}) + if err != nil { + t.Fatalf("ParseSources: %v", err) + } + converted, err := srv.Convert(context.Background(), &pb.ConvertRequest{ + Source: &pb.ConvertRequest_ModelHash{ModelHash: parsed.ModelHash}, ToFormat: "api-json", + }) + if err != nil || converted.Error != "" { + t.Fatalf("Convert: %v %s", err, converted.GetError()) + } + var elements []map[string]any + if err := json.Unmarshal([]byte(converted.Content), &elements); err != nil { + t.Fatal(err) + } + for _, e := range elements { + if e["@type"] == "FeatureTyping" { + if ref, _ := e["type"].(map[string]any); ref["@ref"] != "ScalarValues::Boolean" { + t.Fatalf("the conversion no longer references Boolean by name (%v); revisit this case", e["type"]) + } + } + } + queried, err := srv.Query(context.Background(), &pb.QueryRequest{ + ModelHash: parsed.ModelHash, + Query: &pb.Query{Scope: []string{"ScalarValues::Boolean"}, Select: []string{"elementId"}}, + }) + if err != nil { + t.Fatalf("Query: %v", err) + } + if len(queried.Elements) == 0 { + t.Fatal("the query selected nothing") + } + if got, ok := queried.Elements[0].Properties["elementId"]; ok { + t.Errorf("ScalarValues::Boolean: elementId %q, but the conversion writes no id for it", got) + } +} + +// A model of several documents one of which has syntax errors is refused by +// Convert, so a query reading elementId of it fails too, rather than reading +// ids from the trees the parser recovered. +func TestQueryElementIDOfAModelWithSyntaxErrors(t *testing.T) { + srv := mustNewService(t, 10) + defer srv.Close() + parsed, err := srv.ParseSources(context.Background(), &pb.ParseSourcesRequest{ + Documents: inlineDocuments( + "a.sysml", "package A { part def X; }\n", + "b.sysml", "package B { part def Y\n"), + }) + if err != nil { + t.Fatalf("ParseSources: %v", err) + } + converted, err := srv.Convert(context.Background(), &pb.ConvertRequest{ + Source: &pb.ConvertRequest_ModelHash{ModelHash: parsed.ModelHash}, ToFormat: "api-json", + }) + if err != nil || converted.Error == "" { + t.Fatalf("the model converted, so the case tests nothing: %v %q", err, converted.GetError()) + } + _, err = srv.Query(context.Background(), &pb.QueryRequest{ + ModelHash: parsed.ModelHash, + Query: &pb.Query{Scope: []string{"A::X"}, Select: []string{"elementId"}}, + }) + if connect.CodeOf(err) != connect.CodeFailedPrecondition { + t.Errorf("elementId of a model with a broken document: err = %v, want FAILED_PRECONDITION", err) + } +} + +// Two identity scopes may each declare one qualified name. The conversion keeps +// the two elements apart, and so does a query: each reports the elementId +// written for its own declaration, not the one written last for the name. +func TestQueryElementIDOfOneNameInTwoScopes(t *testing.T) { + srv := mustNewService(t, 10) + defer srv.Close() + documents := inlineDocuments( + "one.sysml", "package P { @IdentityMetadata::ProjectRef { projectId = \"one\"; branch = \"main\"; }\n"+ + " part def A { @IdentityMetadata::ElementId { id = \"first-a\"; } } }\n", + "two.sysml", "package P { @IdentityMetadata::ProjectRef { projectId = \"two\"; branch = \"main\"; }\n"+ + " part def A { @IdentityMetadata::ElementId { id = \"second-a\"; } } }\n", + ) + parsed, err := srv.ParseSources(context.Background(), &pb.ParseSourcesRequest{Documents: documents}) + if err != nil { + t.Fatalf("ParseSources: %v", err) + } + converted, err := srv.Convert(context.Background(), &pb.ConvertRequest{ + Source: &pb.ConvertRequest_ModelHash{ModelHash: parsed.ModelHash}, + ToFormat: "api-json", + }) + if err != nil || converted.Error != "" { + t.Fatalf("Convert: %v %s", err, converted.GetError()) + } + var elements []map[string]any + if err := json.Unmarshal([]byte(converted.Content), &elements); err != nil { + t.Fatal(err) + } + written := map[string]int{} + for _, e := range elements { + if name, _ := e["qualifiedName"].(string); name == "P::A" { + id, _ := e["elementId"].(string) + written[id]++ + } + } + if len(written) != 2 || written["first-a"] != 1 || written["second-a"] != 1 { + t.Fatalf("Convert writes elementIds %v for P::A, want first-a and second-a once each", written) + } + queried, err := srv.Query(context.Background(), &pb.QueryRequest{ + ModelHash: parsed.ModelHash, + Query: &pb.Query{Scope: []string{"P::A"}, Select: []string{"@id", "elementId"}}, + }) + if err != nil { + t.Fatalf("Query: %v", err) + } + reported := map[string]int{} + for _, e := range queried.Elements { + if e.Id == "P::A" { + reported[e.Properties["elementId"]]++ + } + } + if len(reported) != 2 || reported["first-a"] != 1 || reported["second-a"] != 1 { + t.Errorf("query reports elementIds %v for P::A, Convert writes %v", reported, written) + } +} diff --git a/internal/frontend/grpc/robustness_test.go b/internal/frontend/grpc/robustness_test.go index c8134039e2..358e0202d0 100644 --- a/internal/frontend/grpc/robustness_test.go +++ b/internal/frontend/grpc/robustness_test.go @@ -197,7 +197,7 @@ func TestGRPCAuthoringRobustness(t *testing.T) { service := mustNewService(t, 10) hash := mustParsedModel(t, service, `package Demo { part def Base; - part use : Base; + part 'use' : Base; }`) t.Run("unknown_owner", func(t *testing.T) { diff --git a/internal/frontend/grpc/service.go b/internal/frontend/grpc/service.go index b81d7d847e..02aa616a0c 100644 --- a/internal/frontend/grpc/service.go +++ b/internal/frontend/grpc/service.go @@ -760,9 +760,10 @@ func (s *Service) parseModel(inputs []sourceInput, mode diag.ConformanceMode) (s parsedClean = false } documents = append(documents, &CachedDocument{ - Root: root, - Source: srcFile, - ParseDiags: p.Diagnostics, + Root: root, + Source: srcFile, + ParseDiags: p.Diagnostics, + Diagnostics: parser.AsDiagnostics(p.Diagnostics, p.Warnings), }) } @@ -781,8 +782,8 @@ func (s *Service) parseModel(inputs []sourceInput, mode diag.ConformanceMode) (s batch := &passes.Batch{Documents: names, Gathers: passes.NewGathers()} passes.PrepareBatch(idx, batch) for i, doc := range documents { - doc.PassesDiags, _ = passes.AnalyzeInBatch(inputs[i].name, inputs[i].kind, doc.Root, - make([]diag.Diagnostic, 0), idx, passes.Options{Conformance: mode}, batch) + doc.Diagnostics, _ = passes.AnalyzeInBatch(inputs[i].name, inputs[i].kind, doc.Root, + doc.Diagnostics, idx, passes.Options{Conformance: mode}, batch) } } @@ -828,14 +829,12 @@ func (s *Service) GetDiagnostics(ctx context.Context, req *pb.DiagnosticsRequest } // modelDiagnostics are every document's diagnostics, document by document, each -// located in the source it came from. +// located in the source it came from. The parse's are among them once: the +// passes report them, escalated where a pass judged the notation. func (s *Service) modelDiagnostics(model *CachedModel) []*pb.Diagnostic { var pbDiags []*pb.Diagnostic for _, doc := range model.Documents { - for _, diag := range doc.ParseDiags { - pbDiags = append(pbDiags, ParserDiagnosticToProto(diag, doc.Source)) - } - for _, diag := range doc.PassesDiags { + for _, diag := range doc.Diagnostics { pbDiags = append(pbDiags, DiagnosticToProto(diag, doc.Source)) } } diff --git a/internal/frontend/grpc/verify_questions_test.go b/internal/frontend/grpc/verify_questions_test.go index ddc20b78c8..4bed4cdfc5 100644 --- a/internal/frontend/grpc/verify_questions_test.go +++ b/internal/frontend/grpc/verify_questions_test.go @@ -279,7 +279,7 @@ func TestVerifyQuestionsSatisfaction(t *testing.T) { } requirement massLimit : MassLimit { attribute :>> cap = 2000.0; } part craft : Craft { attribute :>> mass = 1200.0; } - part analysis { assert satisfy massLimit by craft; } + part 'analysis' { assert satisfy massLimit by craft; } } ` hash := mustVerifyModel(t, srv, source, "verify-satisfy-questions") @@ -313,7 +313,7 @@ func TestVerifyQuestionsPinsNoSubObjectFeature(t *testing.T) { } requirement deepLimit : DeepLimit; part craft : Thing { attribute :>> power = 5.0; } - part analysis { assert satisfy deepLimit by craft; } + part 'analysis' { assert satisfy deepLimit by craft; } } ` hash := mustVerifyModel(t, srv, source, "verify-satisfy-deep") @@ -655,7 +655,7 @@ const failedDefaultsModelSource = `package P { } requirement massLimit : MassLimit; part craft : Craft { attribute :>> mass = 1.0 / 0.0; } - part analysis { assert satisfy massLimit by craft; } + part 'analysis' { assert satisfy massLimit by craft; } } ` @@ -770,7 +770,7 @@ const satisfactionChainModelSource = `package P { part :>> inner { attribute :>> power = 7.0; } } } - part analysis { + part 'analysis' { assert satisfy r2 by craft; assert satisfy r3 by craft; assert satisfy r4 by craft; @@ -950,7 +950,7 @@ const nestedReadModelSource = `package P { assert constraint gatedBroken { gate > 0.0 or inner.broken > 0.0 } assert constraint unbound { inner.free > 0.0 } } - part item : Item; + part 'item' : Item; } ` diff --git a/internal/frontend/grpc/verify_test.go b/internal/frontend/grpc/verify_test.go index d08cf89510..da3a825a80 100644 --- a/internal/frontend/grpc/verify_test.go +++ b/internal/frontend/grpc/verify_test.go @@ -57,7 +57,7 @@ const verifyModelSource = `package Demo { attribute :>> mass = 1200.0; } - part analysis { + part 'analysis' { assert satisfy massLimit by sedan; assert satisfy massTiny by sedan; } diff --git a/internal/frontend/protoconv/convert.go b/internal/frontend/protoconv/convert.go index aaabc75801..d550fc62a3 100644 --- a/internal/frontend/protoconv/convert.go +++ b/internal/frontend/protoconv/convert.go @@ -920,7 +920,7 @@ func declaredMeasurementRef(id, text string, term semantics.UnitTerm, idx *symbo if text != "" && !textSpellsUnit(text, unit, idx, sem) { return runtime.Value{}, fmt.Errorf("%w: %s is not %s", ErrUnitIDMismatch, text, id) } - return runtime.DeclaredMeasurementRef(unit, text, declared), nil + return runtime.DeclaredMeasurementRef(sem, unit, text, declared), nil } // textSpellsUnit reports whether unit text is one name for the declaration unit: diff --git a/internal/frontend/repl/integration_test.go b/internal/frontend/repl/integration_test.go index fb05815013..a52c12a4ab 100644 --- a/internal/frontend/repl/integration_test.go +++ b/internal/frontend/repl/integration_test.go @@ -136,3 +136,50 @@ func TestStopCommand(t *testing.T) { t.Errorf("missing session error:\n%s", got) } } + +// interruptReader yields scripted lines, a nil-error entry for each line and +// ErrInterrupt where interrupted is set. +type interruptReader struct { + lines []string + interrupted []bool + prompts []string +} + +func (r *interruptReader) ReadLine(prompt string) (string, error) { + r.prompts = append(r.prompts, prompt) + i := len(r.prompts) - 1 + if i >= len(r.lines) { + return "", io.EOF + } + if r.interrupted[i] { + return r.lines[i], ErrInterrupt + } + return r.lines[i], nil +} + +// TestLoopInterrupt checks that Ctrl-C discards a typed line and a buffered +// continuation, and ends the session at an empty primary prompt. +func TestLoopInterrupt(t *testing.T) { + r := &interruptReader{ + lines: []string{"package Typed", "package Cont {", "part def X;", "", "package Kept;", "", "package Never;"}, + interrupted: []bool{true, false, false, true, false, true, false}, + } + var out strings.Builder + s := NewSession() + if err := Loop(r, &out, s); err != nil { + t.Fatalf("Loop error: %v", err) + } + wantPrompts := []string{primaryPrompt, primaryPrompt, contPrompt, contPrompt, primaryPrompt, primaryPrompt} + if strings.Join(r.prompts, "|") != strings.Join(wantPrompts, "|") { + t.Errorf("prompts = %q, want %q", r.prompts, wantPrompts) + } + got := out.String() + if !strings.Contains(got, "package Kept") { + t.Errorf("submission after an interrupt was not taken:\n%s", got) + } + for _, gone := range []string{"Typed", "Cont", "Never"} { + if strings.Contains(got, gone) { + t.Errorf("output mentions %q, which an interrupt should have discarded or the exit never read:\n%s", gone, got) + } + } +} diff --git a/internal/frontend/repl/loop.go b/internal/frontend/repl/loop.go index e154d17c7b..b29ac645b0 100644 --- a/internal/frontend/repl/loop.go +++ b/internal/frontend/repl/loop.go @@ -15,14 +15,20 @@ const ( contPrompt = " ...> " ) +// ErrInterrupt is returned by a LineReader, with the text typed so far, when the +// line is interrupted (Ctrl-C). +var ErrInterrupt = errors.New("interrupt") + // LineReader yields input lines; the prompt argument switches between primary // and continuation prompts. Implemented by a readline adapter in cmd, and by a -// slice in tests. ReadLine returns io.EOF at end of input. +// slice in tests. ReadLine returns io.EOF at end of input and ErrInterrupt when +// the line is interrupted. type LineReader interface { ReadLine(prompt string) (string, error) } -// Loop runs the read/eval/print cycle until the reader returns io.EOF (Ctrl-D). +// Loop runs until io.EOF (Ctrl-D) or an interrupt at an empty prompt (Ctrl-C); +// any other interrupt discards the line and the buffered continuation. func Loop(r LineReader, out io.Writer, s *Session) error { w := bufio.NewWriter(out) defer func() { _ = w.Flush() }() @@ -33,6 +39,14 @@ func Loop(r LineReader, out io.Writer, s *Session) error { if errors.Is(err, io.EOF) { return nil } + if errors.Is(err, ErrInterrupt) { + if buf.Len() == 0 && line == "" { + return nil + } + buf.Reset() + prompt = primaryPrompt + continue + } if err != nil { return err } diff --git a/internal/frontend/repl/session.go b/internal/frontend/repl/session.go index 25ea8b4140..1330925002 100644 --- a/internal/frontend/repl/session.go +++ b/internal/frontend/repl/session.go @@ -461,7 +461,7 @@ func (s *Session) acceptParsed(origin, src string, pre parsed) (declared []strin key: key, gen: s.version, open: true, - diags: parseDiagnostics(p), + diags: parser.AsDiagnostics(p.Diagnostics, p.Warnings), }) return declared, drops } @@ -722,33 +722,6 @@ func (s *Session) text() string { return strings.Join(parts, "\n") } -// parseDiagnostics maps a parse of one submission the way the workspace maps a -// document's: its errors carry the syntax code, its warnings their own. -func parseDiagnostics(p *parser.Parser) []diag.Diagnostic { - out := make([]diag.Diagnostic, 0, len(p.Diagnostics)+len(p.Warnings)) - for _, d := range p.Diagnostics { - out = append(out, diag.Diagnostic{ - Severity: diag.SeverityError, - Span: d.Span, - Message: d.Message, - Code: "syntax", - Source: "syntax", - Fixes: d.Fixes, - }) - } - for _, w := range p.Warnings { - out = append(out, diag.Diagnostic{ - Severity: diag.SeverityWarning, - Span: w.Span, - Message: w.Message, - Code: w.Code, - Source: "syntax", - Fixes: w.Fixes, - }) - } - return out -} - // maskedSpans locates the masked submissions in the buffer, so a finding of // theirs is not read as having stopped the deeper checks from running. func (s *Session) maskedSpans() []source.Span { diff --git a/internal/semantic/query/oslc.go b/internal/semantic/query/oslc.go index 252898caaf..5adba9ccbf 100644 --- a/internal/semantic/query/oslc.go +++ b/internal/semantic/query/oslc.go @@ -70,6 +70,7 @@ var oslcPropertyMappings = map[string]string{ sysmlNS + "multiplicityUpper": PropertyMultiplicityUpper, sysmlNS + "satisfiedRequirement": PropertySatisfiedRequirement, sysmlNS + "satisfyingFeature": PropertySatisfyingFeature, + sysmlNS + "elementId": PropertyElementID, } // ParseOSLC parses a where expression. It also accepts a query-parameter diff --git a/internal/semantic/query/properties.go b/internal/semantic/query/properties.go index efe4912917..c3ff010b6e 100644 --- a/internal/semantic/query/properties.go +++ b/internal/semantic/query/properties.go @@ -16,6 +16,7 @@ type PropertyReader struct { resolver *resolve.Resolver semantics *semantics.Model identity func(*symbols.Symbol) string + elementID func(*symbols.Symbol) string } // NewPropertyReader constructs a reader over one index and semantic model. @@ -29,6 +30,13 @@ func (r *PropertyReader) WithIdentity(identity func(*symbols.Symbol) string) *Pr return r } +// WithElementID sets how an element's elementId is read: the id a conversion +// of the model writes for it. Without one, elementId is absent. +func (r *PropertyReader) WithElementID(elementID func(*symbols.Symbol) string) *PropertyReader { + r.elementID = elementID + return r +} + // Values returns the values of one queryable property. func (r *PropertyReader) Values(sym *symbols.Symbol, property string) ([]string, bool) { if sym == nil || r == nil || r.index == nil { @@ -63,6 +71,10 @@ func (r *PropertyReader) Values(sym *symbols.Symbol, property string) ([]string, return r.multiplicityValues(sym, property) case PropertySatisfiedRequirement, PropertySatisfyingFeature: return r.satisfyEnd(sym, property) + case PropertyElementID: + if r.elementID != nil { + return presentValues(r.elementID(sym)) + } } return nil, false } diff --git a/internal/semantic/query/query.go b/internal/semantic/query/query.go index 0edd404474..dcf7d9e181 100644 --- a/internal/semantic/query/query.go +++ b/internal/semantic/query/query.go @@ -49,6 +49,9 @@ const ( PropertySatisfiedRequirement = "satisfiedRequirement" // PropertySatisfyingFeature is the feature a satisfy usage is by. PropertySatisfyingFeature = "satisfyingFeature" + // PropertyElementID is the elementId a conversion of the model writes for + // the element, reported only where the reader is given one (WithElementID). + PropertyElementID = "elementId" ) // propertyNames is the closed set of properties supported by element queries. @@ -59,6 +62,7 @@ var propertyNames = []string{ PropertyGeneral, PropertyMultiplicityLower, PropertyMultiplicityUpper, PropertySatisfiedRequirement, PropertySatisfyingFeature, + PropertyElementID, } // PropertyNames returns the supported property names in stable order. @@ -68,6 +72,19 @@ func PropertyNames() []string { return out } +// DefaultProjection is what a query that selects nothing reports: every +// property but elementId, which is read from a conversion of the whole model +// and so is reported only when a query names it. +func DefaultProjection() []string { + out := make([]string, 0, len(propertyNames)) + for _, name := range PropertyNames() { + if name != PropertyElementID { + out = append(out, name) + } + } + return out +} + // IsOrdered reports whether a property supports numeric ordered comparisons. func IsOrdered(name string) bool { return name == PropertyMultiplicityLower || name == PropertyMultiplicityUpper @@ -196,7 +213,7 @@ func Evaluate(model Model, q Query) ([]Element, error) { requestedSelect := q.Select selected := append([]string(nil), requestedSelect...) if len(selected) == 0 { - selected = PropertyNames() + selected = DefaultProjection() } else { for _, term := range q.OrderBy { found := false diff --git a/internal/semantic/semantics/coherent_quantity.go b/internal/semantic/semantics/coherent_quantity.go index a8ed67aec1..81be96b08f 100644 --- a/internal/semantic/semantics/coherent_quantity.go +++ b/internal/semantic/semantics/coherent_quantity.go @@ -45,6 +45,7 @@ func (m *Model) CoherentQuantity(q Quantity, declared *symbols.Symbol) (Quantity return Quantity{}, err } } + coherent.Product.Identity = q.Unit.Product.Identity return Quantity{Num: num, Unit: coherent}, nil } @@ -63,6 +64,7 @@ func (m *Model) CoherentSpelling(q Quantity, declared *symbols.Symbol) Quantity if !ok || !q.Unit.Term.Same(coherent.Term) { return q } + coherent.Product.Identity = q.Unit.Product.Identity return Quantity{Num: q.Num, Unit: coherent} } @@ -186,7 +188,7 @@ func (m *Model) judgeCoherentUnits(candidates []*symbols.Symbol, rank int, out m if err != nil || term.Dimensionless() { continue } - if slices.ContainsFunc(m.definitionPowers(sym), func(p UnitPower) bool { return p.DimensionOne }) { + if slices.ContainsFunc(m.definitionPowers(sym), func(p UnitPower) bool { return p.DimensionOne && !p.Identity }) { continue } if declared, ok := m.dimensionOf(sym); ok { @@ -206,7 +208,7 @@ func (m *Model) definedOverBaseUnits(sym *symbols.Symbol) bool { return false } bases := slices.Collect(maps.Values(m.systemBaseUnits())) - return !slices.ContainsFunc(powers, func(p UnitPower) bool { return p.Unit == nil || !slices.Contains(bases, p.Unit) }) + return !slices.ContainsFunc(powers, func(p UnitPower) bool { return !p.Identity && (p.Unit == nil || !slices.Contains(bases, p.Unit)) }) } // definitionPowers lists the unit powers a derived unit's definition names, from diff --git a/internal/semantic/semantics/nested.go b/internal/semantic/semantics/nested.go index 811c11aa1c..deac83ee21 100644 --- a/internal/semantic/semantics/nested.go +++ b/internal/semantic/semantics/nested.go @@ -76,60 +76,137 @@ func (m *Model) implicitSubsettingFQN(sym *symbols.Symbol, usage *ast.Usage, own if !ok { return "" } - if fqn := familyNestedFQN(kind, usage, owner, composite); fqn != "" { - return fqn + u := NestedUsage{Kind: kind, Composite: composite, Portion: portion} + if usage != nil { + u.Performed = usage.IsPerformedAction() + u.Exhibited = usage.IsExhibitedState() + u.Included = usage.IsIncludedUseCase() + u.RequirementConstraint = usage.IsRequirementConstraint() + } + o, ok := nestedOwnerOf(owner) + if !ok { + return "" + } + fqn, step := nestedRuleFQN(u, o) + if step { + return m.stepNestedFQN(owner) + } + return fqn +} + +// NestedUsage is what a usage's declaration alone says of it to the implicit +// subsetting rules, for deciding them before the usage has a symbol. +type NestedUsage struct { + Kind ast.UsageKind + Composite bool + Portion ast.PortionKind + // Performed, Exhibited and Included are the `perform action`, `exhibit + // state` and `include use case` forms; RequirementConstraint is a + // `require` or `assume` constraint, which subsets nothing implicitly. + Performed, Exhibited, Included, RequirementConstraint bool +} + +// NestedOwner is the declaration kind of the type a usage nests in: a usage's +// kind, or a definition's when IsDef. +type NestedOwner struct { + Usage ast.UsageKind + Def ast.DefinitionKind + IsDef bool +} + +// nestedOwnerOf is the declaration kind of owner, false for a declaration +// that is neither a usage (or a member form standing in for one) nor a definition. +func nestedOwnerOf(owner *symbols.Symbol) (NestedOwner, bool) { + if u, ok := ownerUsageKind(owner); ok { + return NestedOwner{Usage: u}, true } - switch kind { + if d, ok := owner.Decl.(*ast.Definition); ok { + return NestedOwner{Def: d.Kind, IsDef: true}, true + } + return NestedOwner{}, false +} + +// stepFallbackFQNs are the features the KerML step fallback selects among, +// by what the owner conforms to (KerML 1.1 §8.3.4.8). +var stepFallbackFQNs = []string{ + "Performances::Performance::subperformances", + "Objects::Object::ownedPerformances", + "Performances::Performance::enclosedPerformances", +} + +// ImplicitSubsettingCandidates lists, by declaration kinds alone, the library +// features a usage so declared may implicitly subset: the one the kind rules +// settle on, or the step fallback's three under an owner whose kind is an +// occurrence's, which of them depending on what the owner conforms to. +func ImplicitSubsettingCandidates(u NestedUsage, owner NestedOwner) []string { + fqn, step := nestedRuleFQN(u, owner) + switch { + case fqn != "": + return []string{fqn} + case step && ownerInOccurrenceFamily(owner): + return slices.Clone(stepFallbackFQNs) + } + return nil +} + +// nestedRuleFQN runs the rule chains by declaration kinds: the feature they +// settle on, or step when they end in the KerML step fallback, which what the +// owner conforms to decides. +func nestedRuleFQN(u NestedUsage, owner NestedOwner) (fqn string, step bool) { + if fqn := familyNestedFQN(u, owner); fqn != "" { + return fqn, false + } + switch u.Kind { case ast.UsagePart, ast.UsageActor, ast.UsageStakeholder, ast.UsageConnection, ast.UsageInterface, ast.UsageAllocation, ast.UsageRendering, ast.UsageViewRendering, ast.UsageView: - return m.partNestedFQN(owner, composite, portion) + return partNestedFQN(owner, u.Composite, u.Portion) case ast.UsageItem, ast.UsagePort, ast.UsageOccurrence, ast.UsageIndividual: - return m.occurrenceNestedFQN(owner, composite, portion, false) + return occurrenceNestedFQN(owner, u.Composite, u.Portion, false) case ast.UsageAction, ast.UsageTransition, ast.UsageFlow: - return m.actionNestedFQN(owner, composite, portion) + return actionNestedFQN(owner, u.Composite, u.Portion) case ast.UsageState: - return m.stateNestedFQN(owner, composite, portion) + return stateNestedFQN(owner, u.Composite, u.Portion) case ast.UsageCalc: - return m.calcNestedFQN(owner, composite, portion) + return calcNestedFQN(owner, u.Composite, u.Portion) case ast.UsageCase, ast.UsageAnalysisCase, ast.UsageVerificationCase, ast.UsageUseCase: - return m.caseNestedFQN(owner, composite, portion) + return caseNestedFQN(owner, u.Composite, u.Portion) case ast.UsageConstraint: - if usage.IsRequirementConstraint() { - return "" + if u.RequirementConstraint { + return "", false } - return m.constraintNestedFQN(owner, composite, portion) + return constraintNestedFQN(owner, u.Composite, u.Portion) case ast.UsageRequirement, ast.UsageSatisfy, ast.UsageConcern, ast.UsageViewpoint: - return m.requirementNestedFQN(owner, composite, portion) + return requirementNestedFQN(owner, u.Composite, u.Portion) case ast.UsageStep: - if composite { - return m.stepNestedFQN(owner) + if u.Composite { + return "", true } } - return "" + return "", false } // familyNestedFQN is the feature a usage of one kind nested in an owner of its // own family subsets ahead of the general rule chains, "" when none applies. -func familyNestedFQN(kind ast.UsageKind, usage *ast.Usage, owner *symbols.Symbol, composite bool) string { - switch kind { +func familyNestedFQN(u NestedUsage, owner NestedOwner) string { + switch u.Kind { case ast.UsageAction: - if usage.IsPerformedAction() && ownerInPartFamily(owner) { + if u.Performed && ownerInPartFamily(owner) { return "Parts::Part::performedActions" } case ast.UsageState: - if usage != nil && usage.IsExhibitedState() && ownerInPartFamily(owner) { + if u.Exhibited && ownerInPartFamily(owner) { return "Parts::Part::exhibitedStates" } case ast.UsageUseCase: - if ownerInUseCaseFamily(owner) && usage.IsIncludedUseCase() { + if ownerInUseCaseFamily(owner) && u.Included { return "UseCases::UseCase::includedUseCases" } } - if !composite { + if !u.Composite { return "" } - switch kind { + switch u.Kind { case ast.UsageItem: if ownerInItemFamily(owner) { return "Items::Item::subitems" @@ -167,90 +244,87 @@ func familyNestedFQN(kind ast.UsageKind, usage *ast.Usage, owner *symbols.Symbol // partNestedFQN is the rule chain of a usage whose kind nests under an item: // the item's `subparts` when composite, else the occurrence rules. -func (m *Model) partNestedFQN(owner *symbols.Symbol, composite bool, portion ast.PortionKind) string { +func partNestedFQN(owner NestedOwner, composite bool, portion ast.PortionKind) (string, bool) { if composite && ownerInItemFamily(owner) { - return "Items::Item::subparts" + return "Items::Item::subparts", false } - return m.occurrenceNestedFQN(owner, composite, portion, false) + return occurrenceNestedFQN(owner, composite, portion, false) } // actionNestedFQN is the rule chain of a usage whose kind nests under an // action: the action's `subactions`, the part's `ownedActions`, then the // occurrence rules with the KerML step fallback behind them. -func (m *Model) actionNestedFQN(owner *symbols.Symbol, composite bool, portion ast.PortionKind) string { +func actionNestedFQN(owner NestedOwner, composite bool, portion ast.PortionKind) (string, bool) { if composite && ownerInActionFamily(owner) { - return "Actions::Action::subactions" + return "Actions::Action::subactions", false } if composite && ownerInPartFamily(owner) { - return "Parts::Part::ownedActions" + return "Parts::Part::ownedActions", false } - return m.occurrenceNestedFQN(owner, composite, portion, true) + return occurrenceNestedFQN(owner, composite, portion, true) } // stateNestedFQN is the rule chain of a nested state that is not exhibited. -func (m *Model) stateNestedFQN(owner *symbols.Symbol, composite bool, portion ast.PortionKind) string { +func stateNestedFQN(owner NestedOwner, composite bool, portion ast.PortionKind) (string, bool) { if composite && ownerInStateFamily(owner) { - return "States::StateAction::substates" + return "States::StateAction::substates", false } if composite && ownerInPartFamily(owner) { - return "Parts::Part::ownedStates" + return "Parts::Part::ownedStates", false } - return m.actionNestedFQN(owner, composite, portion) + return actionNestedFQN(owner, composite, portion) } // calcNestedFQN is the rule chain of a nested calculation, which continues as // the action rules when no calculation owns it. -func (m *Model) calcNestedFQN(owner *symbols.Symbol, composite bool, portion ast.PortionKind) string { +func calcNestedFQN(owner NestedOwner, composite bool, portion ast.PortionKind) (string, bool) { if composite && ownerInCalcFamily(owner) { - return "Calculations::Calculation::subcalculations" + return "Calculations::Calculation::subcalculations", false } - return m.actionNestedFQN(owner, composite, portion) + return actionNestedFQN(owner, composite, portion) } // caseNestedFQN is the rule chain of a nested case, which continues as the // calculation rules when no case owns it. -func (m *Model) caseNestedFQN(owner *symbols.Symbol, composite bool, portion ast.PortionKind) string { +func caseNestedFQN(owner NestedOwner, composite bool, portion ast.PortionKind) (string, bool) { if composite && ownerInCaseFamily(owner) { - return "Cases::Case::subcases" + return "Cases::Case::subcases", false } - return m.calcNestedFQN(owner, composite, portion) + return calcNestedFQN(owner, composite, portion) } // constraintNestedFQN is the rule chain of a nested constraint check. -func (m *Model) constraintNestedFQN(owner *symbols.Symbol, composite bool, portion ast.PortionKind) string { +func constraintNestedFQN(owner NestedOwner, composite bool, portion ast.PortionKind) (string, bool) { if composite && ownerInItemFamily(owner) { - return "Items::Item::checkedConstraints" + return "Items::Item::checkedConstraints", false } - return m.occurrenceNestedFQN(owner, composite, portion, false) + return occurrenceNestedFQN(owner, composite, portion, false) } // requirementNestedFQN is the rule chain of a nested requirement check, which // continues as the constraint rules when no requirement owns it. -func (m *Model) requirementNestedFQN(owner *symbols.Symbol, composite bool, portion ast.PortionKind) string { +func requirementNestedFQN(owner NestedOwner, composite bool, portion ast.PortionKind) (string, bool) { if composite && ownerInRequirementFamily(owner) { - return "Requirements::RequirementCheck::subrequirements" + return "Requirements::RequirementCheck::subrequirements", false } - return m.constraintNestedFQN(owner, composite, portion) + return constraintNestedFQN(owner, composite, portion) } // occurrenceNestedFQN is the occurrence fallback every chain ends in: an // occurrence-family owner's `suboccurrences`, or its `timeSlices`/`snapshots` // for a portion usage. Behind it, for usages routed through the action rules, // is the KerML step fallback. -func (m *Model) occurrenceNestedFQN(owner *symbols.Symbol, composite bool, portion ast.PortionKind, stepFallback bool) string { +func occurrenceNestedFQN(owner NestedOwner, composite bool, portion ast.PortionKind, stepFallback bool) (string, bool) { if composite && ownerInOccurrenceFamily(owner) { switch portion { case ast.PortionTimeslice: - return "Occurrences::Occurrence::timeSlices" + return "Occurrences::Occurrence::timeSlices", false case ast.PortionSnapshot: - return "Occurrences::Occurrence::snapshots" + return "Occurrences::Occurrence::snapshots", false } - return "Occurrences::Occurrence::suboccurrences" - } - if stepFallback { - return m.stepNestedFQN(owner) + return "Occurrences::Occurrence::suboccurrences", false } - return "" + return "", stepFallback } // stepNestedFQN is the KerML step fallback (KerML 1.1 §8.3.4.8), whose owner is @@ -258,11 +332,11 @@ func (m *Model) occurrenceNestedFQN(owner *symbols.Symbol, composite bool, porti func (m *Model) stepNestedFQN(owner *symbols.Symbol) string { switch { case m.conformsByName(owner, "Performances::Performance"): - return "Performances::Performance::subperformances" + return stepFallbackFQNs[0] case m.conformsByName(owner, "Objects::Object"): - return "Objects::Object::ownedPerformances" + return stepFallbackFQNs[1] case m.conformsByName(owner, "Occurrences::Occurrence"): - return "Performances::Performance::enclosedPerformances" + return stepFallbackFQNs[2] } return "" } @@ -286,14 +360,11 @@ func ownerUsageKind(owner *symbols.Symbol) (ast.UsageKind, bool) { // ownerKindIn reports whether the owner's declaration kind is one of the usage // or definition kinds the family lists. -func ownerKindIn(owner *symbols.Symbol, usages []ast.UsageKind, defs []ast.DefinitionKind) bool { - if u, ok := ownerUsageKind(owner); ok { - return slices.Contains(usages, u) - } - if d, ok := owner.Decl.(*ast.Definition); ok { - return slices.Contains(defs, d.Kind) +func ownerKindIn(owner NestedOwner, usages []ast.UsageKind, defs []ast.DefinitionKind) bool { + if owner.IsDef { + return slices.Contains(defs, owner.Def) } - return false + return slices.Contains(usages, owner.Usage) } var ( @@ -351,59 +422,59 @@ var ( }, nestedItemFamilyDefs, nestedActionFamilyDefs, nestedConstraintFamilyDefs) ) -func ownerInPartFamily(owner *symbols.Symbol) bool { +func ownerInPartFamily(owner NestedOwner) bool { return ownerKindIn(owner, nestedPartFamilyUsages, nestedPartFamilyDefs) } -func ownerInItemFamily(owner *symbols.Symbol) bool { +func ownerInItemFamily(owner NestedOwner) bool { return ownerKindIn(owner, nestedItemFamilyUsages, nestedItemFamilyDefs) } -func ownerInPortFamily(owner *symbols.Symbol) bool { +func ownerInPortFamily(owner NestedOwner) bool { return ownerKindIn(owner, []ast.UsageKind{ast.UsagePort}, []ast.DefinitionKind{ast.DefPort}) } -func ownerInOccurrenceFamily(owner *symbols.Symbol) bool { +func ownerInOccurrenceFamily(owner NestedOwner) bool { return ownerKindIn(owner, nestedOccurrenceFamilyUsages, nestedOccurrenceFamilyDefs) } -func ownerInActionFamily(owner *symbols.Symbol) bool { +func ownerInActionFamily(owner NestedOwner) bool { return ownerKindIn(owner, nestedActionFamilyUsages, nestedActionFamilyDefs) } -func ownerInStateFamily(owner *symbols.Symbol) bool { +func ownerInStateFamily(owner NestedOwner) bool { return ownerKindIn(owner, []ast.UsageKind{ast.UsageState}, []ast.DefinitionKind{ast.DefState}) } -func ownerInCalcFamily(owner *symbols.Symbol) bool { +func ownerInCalcFamily(owner NestedOwner) bool { return ownerKindIn(owner, nestedCalcFamilyUsages, nestedCalcFamilyDefs) } -func ownerInCaseFamily(owner *symbols.Symbol) bool { +func ownerInCaseFamily(owner NestedOwner) bool { return ownerKindIn(owner, nestedCaseFamilyUsages, nestedCaseFamilyDefs) } -func ownerInAnalysisCaseFamily(owner *symbols.Symbol) bool { +func ownerInAnalysisCaseFamily(owner NestedOwner) bool { return ownerKindIn(owner, []ast.UsageKind{ast.UsageAnalysisCase}, []ast.DefinitionKind{ast.DefAnalysisCase}) } -func ownerInVerificationCaseFamily(owner *symbols.Symbol) bool { +func ownerInVerificationCaseFamily(owner NestedOwner) bool { return ownerKindIn(owner, []ast.UsageKind{ast.UsageVerificationCase}, []ast.DefinitionKind{ast.DefVerificationCase}) } -func ownerInUseCaseFamily(owner *symbols.Symbol) bool { +func ownerInUseCaseFamily(owner NestedOwner) bool { return ownerKindIn(owner, []ast.UsageKind{ast.UsageUseCase}, []ast.DefinitionKind{ast.DefUseCase}) } -func ownerInRequirementFamily(owner *symbols.Symbol) bool { +func ownerInRequirementFamily(owner NestedOwner) bool { return ownerKindIn(owner, nestedRequirementFamilyUsages, nestedRequirementFamilyDefs) } -func ownerInViewFamily(owner *symbols.Symbol) bool { +func ownerInViewFamily(owner NestedOwner) bool { return ownerKindIn(owner, []ast.UsageKind{ast.UsageView}, []ast.DefinitionKind{ast.DefView}) } -func ownerInRenderingFamily(owner *symbols.Symbol) bool { +func ownerInRenderingFamily(owner NestedOwner) bool { return ownerKindIn(owner, []ast.UsageKind{ast.UsageRendering, ast.UsageViewRendering}, []ast.DefinitionKind{ast.DefRendering}) diff --git a/internal/semantic/semantics/quantity_eval.go b/internal/semantic/semantics/quantity_eval.go index 5541f42eb2..2bcc80f55e 100644 --- a/internal/semantic/semantics/quantity_eval.go +++ b/internal/semantic/semantics/quantity_eval.go @@ -333,10 +333,16 @@ func EqualQuantities(op ast.OperatorKind, left, right Quantity) (bool, error) { } // ComposedQuantity is a result in the canonical form of its composed unit; a -// unit that cancels leaves a number unless it names a dimension-one unit (`rad`). +// unit that cancels leaves a number unless it names a dimension-one unit (`rad`) +// or absorbed the identity (`one`), which is the unit again once the rest cancels. func ComposedQuantity(num Value, product UnitProduct, term UnitTerm) (Quantity, error) { if term.Dimensionless() && !product.NamesDimensionOne() { - return dimensionlessQuantity(num, term) + bare, err := dimensionlessQuantity(num, term) + if err != nil || product.Identity == nil { + return bare, err + } + identity := UnitProduct{Powers: []UnitPower{*product.Identity}} + return Quantity{Num: bare.Num, Unit: Unit{Text: identity.String(), Product: identity, Term: UnitTerm{Scale: UnitScale(1)}}}, nil } return Quantity{Num: num, Unit: Unit{Text: product.String(), Product: product, Term: term}}, nil } diff --git a/internal/semantic/semantics/redefinition_conformance.go b/internal/semantic/semantics/redefinition_conformance.go index 2a9fdd600d..08331af410 100644 --- a/internal/semantic/semantics/redefinition_conformance.go +++ b/internal/semantic/semantics/redefinition_conformance.go @@ -44,6 +44,7 @@ func (m *Model) ConformanceViolations(sym *symbols.Symbol) []ConformanceViolatio return nil } var out []ConformanceViolation + written := map[*symbols.Symbol]bool{} for _, rel := range RelationshipsOf(sym) { if rel == nil || rel.Target == nil { continue @@ -55,12 +56,23 @@ func (m *Model) ConformanceViolations(sym *symbols.Symbol) []ConformanceViolatio if target == nil || target == sym { continue } + written[target] = true ref := ast.Node(rel.Target) if rel.Kind == ast.RelRedefines { out = append(out, m.directionViolations(sym, traits, target, ref)...) } out = append(out, m.restrictionViolations(sym, traits, target, ref)...) } + // A subsetting the feature has implicitly — a composite action in an + // action one of its `subactions` — is a Subsetting all the same, and the + // uniqueness and constancy conformance constraints hold of it as of a + // written one. Nothing is written to point at, so the declaration is. + for _, target := range m.ImplicitSubsettings(sym) { + if target == nil || target == sym || written[target] { + continue + } + out = append(out, m.restrictionViolations(sym, traits, target, sym.Decl)...) + } // A parameter redefines the parameter at its position implicitly, and the // direction it declares must be the redefined one's (KerML 7.4.7.2). for _, target := range m.implicitParameterCounterparts(sym) { diff --git a/internal/semantic/semantics/unit_product.go b/internal/semantic/semantics/unit_product.go index a5c605f378..e087c84bf0 100644 --- a/internal/semantic/semantics/unit_product.go +++ b/internal/semantic/semantics/unit_product.go @@ -18,6 +18,7 @@ type UnitPower struct { Name string // the unit as the model wrote it, quoted where the notation must (`'A/m'`) Exponent float64 DimensionOne bool // the unit reduces to no base unit: an angle, a ratio, a count + Identity bool // the unit is the identity of unit products (`one`): a plain DimensionOneUnit at scale one Reduces *UnitTerm // what a unit resolving to none reduces to, where known; nil otherwise } @@ -25,6 +26,9 @@ type UnitPower struct { // the canonical display form (`N*m`, `m**2`); UnitTerm, not this, decides conversion. type UnitProduct struct { Powers []UnitPower + // Identity is the identity power (`one`) the product absorbed, kept apart from + // the powers so that it is the unit again once every other power cancels. + Identity *UnitPower } // NamedUnitProduct is the product of one named unit to the first power, spelt @@ -77,6 +81,10 @@ func (p UnitProduct) Clone() UnitProduct { out.Powers[i].Reduces = &reduces } } + if p.Identity != nil { + identity := *p.Identity + out.Identity = &identity + } return out } @@ -89,9 +97,20 @@ func (p UnitProduct) ShortSpelling() UnitProduct { out.Powers[i].Name = unitNameSpelling(unitShortName(f.Unit)) } } + if out.Identity != nil && out.Identity.Unit != nil { + out.Identity.Name = unitNameSpelling(unitShortName(out.Identity.Unit)) + } return out } +// AllPowers is the powers with the identity the product absorbed among them, where it did. +func (p UnitProduct) AllPowers() []UnitPower { + if p.Identity == nil { + return p.Powers + } + return append(slices.Clone(p.Powers), *p.Identity) +} + // Times returns the product of two unit products. func (p UnitProduct) Times(q UnitProduct) UnitProduct { return combineProducts(p, q, 1) } @@ -101,7 +120,7 @@ func (p UnitProduct) DividedBy(q UnitProduct) UnitProduct { return combineProduc // Pow raises every power of the product to exp. func (p UnitProduct) Pow(exp float64) UnitProduct { out := UnitProduct{} - for _, f := range p.Powers { + for _, f := range p.AllPowers() { f.Exponent *= exp out.Powers = append(out.Powers, f) } @@ -109,10 +128,11 @@ func (p UnitProduct) Pow(exp float64) UnitProduct { } // Root divides every power by n, reporting false where a power does not divide -// into a whole exponent: `m**2` has a square root `m`, `rad` and `km*m` have none. +// into a whole exponent: `m**2` has a square root `m`, `rad` and `km*m` have none; +// the identity `one` has every root, itself. func (p UnitProduct) Root(n float64) (UnitProduct, bool) { for _, f := range p.Powers { - if math.Mod(f.Exponent, n) != 0 { + if !f.Identity && math.Mod(f.Exponent, n) != 0 { return UnitProduct{}, false } } @@ -203,8 +223,8 @@ func afterNameSegment(name string) (string, bool) { // signed by sign so that division shares multiplication's accumulation. func combineProducts(a, b UnitProduct, sign float64) UnitProduct { out := UnitProduct{} - out.Powers = append(out.Powers, a.Powers...) - for _, f := range b.Powers { + out.Powers = append(out.Powers, a.AllPowers()...) + for _, f := range b.AllPowers() { f.Exponent *= sign out.Powers = append(out.Powers, f) } @@ -213,6 +233,8 @@ func combineProducts(a, b UnitProduct, sign float64) UnitProduct { // normalizeProduct merges repeated units (by symbol, or by name and reduction // where both are unresolved), drops cancelled powers and orders the rest by name. +// The identity (`one`, any power of it) leaves a product it shares with any other +// unit, remembered aside; a product of nothing but the identity is the identity. func normalizeProduct(p UnitProduct) UnitProduct { merged := make([]UnitPower, 0, len(p.Powers)) for _, f := range p.Powers { @@ -222,19 +244,29 @@ func normalizeProduct(p UnitProduct) UnitProduct { continue } merged[at].Exponent += f.Exponent - merged[at].Name = shorterSpelling(merged[at].Name, f.Name) + if shorterSpelling(merged[at].Name, f.Name) == f.Name { + merged[at].Name, merged[at].Unit = f.Name, f.Unit + } if merged[at].Reduces == nil { merged[at].Reduces = f.Reduces } } + var identity *UnitPower kept := merged[:0] for _, f := range merged { - if f.Exponent != 0 { + switch { + case f.Identity: + f.Exponent = 1 + identity = &f + case f.Exponent != 0: kept = append(kept, f) } } + if len(kept) == 0 && identity != nil { + return UnitProduct{Powers: []UnitPower{*identity}} + } slices.SortStableFunc(kept, func(a, b UnitPower) int { return strings.Compare(a.Name, b.Name) }) - return UnitProduct{Powers: kept} + return UnitProduct{Powers: kept, Identity: identity} } // shorterSpelling picks, of two spellings of one unit, the one with fewer @@ -255,10 +287,14 @@ func shorterSpelling(a, b string) string { return min(a, b) } -// sameUnit: two resolved powers are one unit by symbol; two unresolved ones by -// text, unless both are known to reduce differently; a resolved and an -// unresolved power are never the same unit. +// sameUnit: two identity powers are one unit, whatever declares them; two other +// resolved powers are one unit by symbol; two unresolved ones by text, unless +// both are known to reduce differently; a resolved and an unresolved power are +// never the same unit. func sameUnit(f, g UnitPower) bool { + if f.Identity && g.Identity { + return true + } if f.Unit != nil || g.Unit != nil { return f.Unit == g.Unit } @@ -341,15 +377,22 @@ func (m *Model) unitProductOfName(qn *ast.QualifiedName, lookup UnitLookup) (Uni if qn == nil { return UnitProduct{}, ErrUnitExpr } - var unit *symbols.Symbol - dimensionOne := false if sym, ok := lookup(qn); ok && sym != nil { - unit = sym - if term, err := m.UnitTermOf(unit); err == nil { - dimensionOne = term.Dimensionless() - } + return m.DeclaredUnitProduct(sym, UnitNameText(qn)), nil + } + return NamedUnitProduct(nil, UnitNameText(qn), false), nil +} + +// DeclaredUnitProduct is the product of the one unit sym declares, spelt name, +// flagged by what it reduces to: dimension one, and the identity where it is `one`. +func (m *Model) DeclaredUnitProduct(sym *symbols.Symbol, name string) UnitProduct { + dimensionOne := false + if term, err := m.UnitTermOf(sym); err == nil { + dimensionOne = term.Dimensionless() } - return NamedUnitProduct(unit, UnitNameText(qn), dimensionOne), nil + p := NamedUnitProduct(sym, name, dimensionOne) + p.Powers[0].Identity = m.IsIdentityUnit(sym) + return p } // unitProductOfOperator reads a product, quotient or power of units. diff --git a/internal/semantic/semantics/units.go b/internal/semantic/semantics/units.go index 328815c74d..b0afc44ba7 100644 --- a/internal/semantic/semantics/units.go +++ b/internal/semantic/semantics/units.go @@ -397,6 +397,27 @@ func (m *Model) reduceUnit(sym *symbols.Symbol) (UnitTerm, error) { return UnitTerm{Scale: UnitScale(1), Factors: []UnitFactor{{Unit: sym, Exponent: 1}}}, nil } +// IsIdentityUnit reports whether sym is the identity of unit products, as +// MeasurementReferences::one is: a unit of DimensionOneUnit itself — of no +// specialization of it, as an angular unit is — reducing to scale one, as a +// unit scaling `one` by convention (a percent) does not. +func (m *Model) IsIdentityUnit(sym *symbols.Symbol) bool { + if m == nil || sym == nil { + return false + } + dimOne := m.libSymbol(fqnDimensionOneUnit) + if dimOne == nil || !m.Conforms(sym, dimOne) { + return false + } + for _, super := range m.AllSupertypes(sym) { + if m.Conforms(super, dimOne) && !m.Conforms(dimOne, super) { + return false + } + } + term, err := m.UnitTermOf(sym) + return err == nil && term.Dimensionless() && term.Scale.Num == term.Scale.Den +} + // powerFactorsUnitTerm reduces a derived unit through the `unitPowerFactors` it // lists, each unit raised to its exponent; declared is false for a unit listing none. func (m *Model) powerFactorsUnitTerm(sym *symbols.Symbol) (UnitTerm, bool, error) { diff --git a/internal/semantic/semantics/units_test.go b/internal/semantic/semantics/units_test.go index 71edeeeb94..56273f5079 100644 --- a/internal/semantic/semantics/units_test.go +++ b/internal/semantic/semantics/units_test.go @@ -189,3 +189,110 @@ func TestUnitTermAlgebra(t *testing.T) { t.Errorf("(m/s)^-1 = %v, want s/m", inv) } } + +// TestIsIdentityUnit: `MeasurementReferences::one` is the identity of unit +// products by its structure — a plain DimensionOneUnit at scale one, as is any +// unit declared so — while an angular unit, a unit scaling `one` by convention +// and a unit of a base dimension are not. +func TestIsIdentityUnit(t *testing.T) { + m, root := buildModelWithStdlib(t, ` + package test { + private import ISQ::*; + private import SI::*; + private import MeasurementReferences::*; + attribute unity : DimensionOneUnit = one; + attribute another : DimensionOneUnit = new DimensionOneUnit(); + attribute <'%'> percent : DimensionOneUnit { :>> unitConversion : ConversionByConvention { :>> referenceUnit = one; :>> conversionFactor = 0.01; } } + attribute halfTurn : AngularMeasureUnit = rad; + attribute halfMetre : LengthUnit { :>> unitConversion : ConversionByConvention { :>> referenceUnit = m; :>> conversionFactor = 0.5; } } + } + `) + lib := func(fqn string) *symbols.Symbol { + matches := m.resolver.Index().LookupQualified(fqn) + if len(matches) != 1 { + t.Fatalf("%s: %d matches", fqn, len(matches)) + } + return matches[0] + } + cases := []struct { + sym *symbols.Symbol + want bool + }{ + {lib("MeasurementReferences::one"), true}, + {nestedSym(t, root, "test::unity"), true}, + {nestedSym(t, root, "test::another"), true}, + {nestedSym(t, root, "test::percent"), false}, + {nestedSym(t, root, "test::halfTurn"), false}, + {nestedSym(t, root, "test::halfMetre"), false}, + {lib("SI::rad"), false}, + {lib("SI::sr"), false}, + {lib("SI::m"), false}, + {lib("SI::J"), false}, + } + for _, tc := range cases { + if got := m.IsIdentityUnit(tc.sym); got != tc.want { + t.Errorf("IsIdentityUnit(%s) = %v, want %v", tc.sym.Name, got, tc.want) + } + } + if m.IsIdentityUnit(nil) { + t.Error("IsIdentityUnit(nil) = true") + } +} + +// TestUnitProductAbsorbsIdentity: the identity power leaves any product it shares +// with another unit, from either side of a product or quotient, and is the unit +// again once every other power cancels, however the operations are grouped; alone +// it stays, to the first power, whatever power it is raised to, with every root +// itself. Two identity units a model spells differently are one unit. +func TestUnitProductAbsorbsIdentity(t *testing.T) { + one := NamedUnitProduct(nil, "one", true) + one.Powers[0].Identity = true + unity := NamedUnitProduct(nil, "unity", true) + unity.Powers[0].Identity = true + m := NamedUnitProduct(nil, "m", false) + rad := NamedUnitProduct(nil, "rad", true) + cases := []struct { + got UnitProduct + want string + }{ + {one.Times(m), "m"}, + {m.Times(one), "m"}, + {m.DividedBy(one), "m"}, + {one.DividedBy(m), "1/m"}, + {one.Times(one), "one"}, + {one.DividedBy(one), "one"}, + {one.Pow(3), "one"}, + {one.Pow(-2), "one"}, + {one.Pow(0), "one"}, + {one.Times(rad), "rad"}, + {rad.Times(one).Times(m), "m*rad"}, + {one.Times(m).Times(one).DividedBy(one), "m"}, + {one.Times(m).DividedBy(m), "one"}, + {one.Times(m.DividedBy(m)), "one"}, + {m.DividedBy(m), "1"}, + {m.Times(one).Pow(2).DividedBy(m.Pow(2)), "one"}, + {one.Times(rad).DividedBy(rad), "one"}, + {one.Times(m).DividedBy(one.Times(m)), "one"}, + {one.Times(unity), "one"}, + {unity.Times(one), "one"}, + {unity.Times(m).DividedBy(m), "unity"}, + } + for _, tc := range cases { + if s := tc.got.String(); s != tc.want { + t.Errorf("got %s, want %s", s, tc.want) + } + } + if !one.Equal(unity) || !unity.Times(m).Equal(one.Times(m)) { + t.Error("two identity units are not one unit") + } + if !one.Times(m).Equal(m) || one.Times(m).ShortSpelling().Identity == nil { + t.Error("the identity a product absorbed is not kept aside from its powers") + } + root, ok := one.Root(2) + if !ok || root.String() != "one" { + t.Errorf("one.Root(2) = %s, %v; want one, true", root, ok) + } + if _, ok := rad.Root(2); ok { + t.Error("rad.Root(2) succeeded; rad has no square root") + } +} diff --git a/internal/syntax/ast/defusage.go b/internal/syntax/ast/defusage.go index 9c4d1bd703..20d9c28a7f 100644 --- a/internal/syntax/ast/defusage.go +++ b/internal/syntax/ast/defusage.go @@ -509,8 +509,18 @@ func (u *Usage) IsPerformedAction() bool { // IsVariantReference reports a bare `variant x;` (SysML.xtext VariantReference), // a reference to an existing feature rather than a declaration of a new one. +// A VariantReference takes no usage prefix: `variant ref x;` declares the +// reference usage x (SysML-textual-bnf VariantUsageElement → ReferenceUsage). func (u *Usage) IsVariantReference() bool { - return u.IsVariant && u.Keyword == "variant" + return u.IsVariant && u.Keyword == "variant" && !u.hasUsagePrefix() +} + +// hasUsagePrefix reports a usage prefix written ahead of the declaration: a +// direction or one of the modifiers SysML-textual-bnf UsagePrefix spells. +func (u *Usage) hasUsagePrefix() bool { + return u.Direction != DirNone || u.IsAbstract || u.IsVariation || u.IsReference || + u.IsVariable || u.IsEnd || u.IsChain || u.IsConstant || u.IsEvent || u.IsIndividual || + u.Portion != PortionNone || u.IsPortion || u.IsComposite || u.IsDerived } // IsStateAction reports whether the usage is a state's `entry a;`, `do a;` or diff --git a/internal/syntax/parser/defusage.go b/internal/syntax/parser/defusage.go index ae1cb67767..7f7669e785 100644 --- a/internal/syntax/parser/defusage.go +++ b/internal/syntax/parser/defusage.go @@ -1497,7 +1497,9 @@ func (p *Parser) parseDefUsage(start int) ast.Node { mods.noteUsageOnly(t) // The variant element carries its own usage prefix (SysML.xtext // VariantUsageElement → OccurrenceUsagePrefix): `variant ref port a;`. + beforeModifiers := p.peek().Span.Offset p.parseMoreFeatureModifiers(&mods) + prefixed := p.peek().Span.Offset != beforeModifiers prefixes = append(prefixes, p.parsePrefixMetadata()...) if u := p.parsePortionPrefix(start, &mods, &prefixes); u != nil { return applyPrefixes(u) @@ -1509,6 +1511,17 @@ func (p *Parser) parseDefUsage(start int) ast.Node { p.advance() // 'def' return applyPrefixes(p.parseDefinition(start, p.definitionKindOf(defKw), defKw, mods, false, true)) } + // `variant P::x;` and `variant a.b;` name the feature they reference + // (SysML-textual-bnf VariantReference :343-345, whose + // OwnedReferenceSubsetting is a qualified name or a feature chain); + // a lone `variant x;` keeps x as the name its reference resolves. + // A VariantReference takes no usage prefix, so `variant ref P::x;` + // is read as the declaration it is not and reported there. + if !prefixed && p.atQualifiedOrChainedName() { + u := p.parseReferenceMemberUsage(start, ast.UsagePart, "variant", "feature", mods, p.parseDefUsageBodyMembers, false) + u.IsVariant = true + return applyPrefixes(u) + } } isAll := p.acceptSufficientAll() // `render` names the rendering a view uses (ViewRenderingMember) and @@ -3394,6 +3407,16 @@ func (p *Parser) parsePerformedActionReference(start int, mods featureMods, kw s return p.parseReferenceMemberUsage(start, ast.UsageAction, kw, "action", mods, p.parseActionBodyMixed, true) } +// atQualifiedOrChainedName reports a name at the cursor that a `::` or `.` +// continues, which no identification spells. +func (p *Parser) atQualifiedOrChainedName() bool { + next := p.peekN(1).Kind + if p.at(lexer.Dollar) { + return next == lexer.ColonColon + } + return p.atName() && (next == lexer.ColonColon || next == lexer.Dot) +} + // memberKeywordNames are the SysML member keywords KerML does not reserve, so a // KerML declaration may carry one as its name (`in frame : SpatialFrame[1]`). var memberKeywordNames = map[string]bool{ diff --git a/internal/syntax/parser/namespace_keywords_test.go b/internal/syntax/parser/namespace_keywords_test.go index 25ae34d999..385bb0587d 100644 --- a/internal/syntax/parser/namespace_keywords_test.go +++ b/internal/syntax/parser/namespace_keywords_test.go @@ -1,6 +1,7 @@ package parser import ( + "strings" "testing" "github.com/Open-MBEE/OpenSysML/internal/syntax/ast" @@ -126,6 +127,53 @@ func TestParseVariantWithKindKeyword(t *testing.T) { } } +// `variant P::x;` and `variant a.b;` are VariantReferences whose +// OwnedReferenceSubsetting is a qualified name or a feature chain +// (SysML-textual-bnf :343-345, :463-466): no identification spells either, so +// the usage declares no name and references the feature, as `perform` does. +func TestParseVariantReferenceByQualifiedNameOrChain(t *testing.T) { + for _, tt := range []struct{ ref, target string }{ + {"P::x", "P::x"}, + {"$::P::x", "$::P::x"}, + {"a.b", "a.b"}, + } { + t.Run(tt.ref, func(t *testing.T) { + src := "package P { variation part def C { variant " + tt.ref + " { } } }" + p := New(source.New("test.sysml", []byte(src))) + root := p.ParseFile() + if len(p.Diagnostics) > 0 { + t.Fatalf("parse errors: %v", p.Diagnostics) + } + pkg := root.Members[0].(*ast.Membership).Member.(*ast.Package) + def := pkg.Members[0].(*ast.Membership).Member.(*ast.Definition) + usage, ok := def.Members[0].(*ast.Membership).Member.(*ast.Usage) + if !ok { + t.Fatalf("parsed to %T, want a usage", def.Members[0].(*ast.Membership).Member) + } + if !usage.IsVariantReference() || usage.Ident.Declared() || !usage.HasBody { + t.Errorf("variant reference %+v: want an unnamed variant reference with a body", usage) + } + ref := usage.ReferenceSubsetting() + if ref == nil { + t.Fatalf("no reference subsetting among %v", usage.Relationships) + } + if got := strings.ReplaceAll(src[ref.Target.Span().Offset:ref.Target.Span().End()], " ", ""); got != tt.target { + t.Errorf("references %q, want %q", got, tt.target) + } + }) + } +} + +// A VariantReference takes no usage prefix, so `variant ref P::x;` is no +// reference form: `ref` begins a declaration, which a qualified name cannot name. +func TestParsePrefixedVariantIsNoReference(t *testing.T) { + p := New(source.New("test.sysml", []byte("package P { variation part def C { variant ref P::x; } }"))) + p.ParseFile() + if len(p.Diagnostics) == 0 { + t.Errorf("`variant ref P::x;` parsed without error") + } +} + // A keyword in name position is reported: SysML reserves keywords there, and // only an unrestricted name may spell one. It is a warning rather than an error // because the normative OMG library relies on unquoted keyword names diff --git a/internal/syntax/parser/report.go b/internal/syntax/parser/report.go new file mode 100644 index 0000000000..b0d1972216 --- /dev/null +++ b/internal/syntax/parser/report.go @@ -0,0 +1,35 @@ +package parser + +import "github.com/Open-MBEE/OpenSysML/internal/syntax/diag" + +// CodeSyntax is the diagnostic code every reporter gives a parse error. +const CodeSyntax = "syntax" + +// AsDiagnostics presents a parse's errors and warnings as the diagnostics the +// analysis passes take and every frontend reports: an error is an error coded +// syntax, a warning keeps the code the parser gave it, and both name syntax +// as their source and carry the parser's fixes. The errors come first. +func AsDiagnostics(errors, warnings []Diagnostic) []diag.Diagnostic { + out := make([]diag.Diagnostic, 0, len(errors)+len(warnings)) + for _, d := range errors { + out = append(out, diag.Diagnostic{ + Severity: diag.SeverityError, + Span: d.Span, + Message: d.Message, + Code: CodeSyntax, + Source: CodeSyntax, + Fixes: d.Fixes, + }) + } + for _, w := range warnings { + out = append(out, diag.Diagnostic{ + Severity: diag.SeverityWarning, + Span: w.Span, + Message: w.Message, + Code: w.Code, + Source: CodeSyntax, + Fixes: w.Fixes, + }) + } + return out +} diff --git a/internal/translate/convert/api_json_test.go b/internal/translate/convert/api_json_test.go index 28dee83d36..de1d798480 100644 --- a/internal/translate/convert/api_json_test.go +++ b/internal/translate/convert/api_json_test.go @@ -3,6 +3,7 @@ package convert_test import ( "errors" "os" + "path/filepath" "strings" "testing" @@ -105,6 +106,38 @@ func TestAPIJSONToolkitCompactFixture(t *testing.T) { } } +func TestLibraryFallbackWarningsReachBothGraphImportPaths(t *testing.T) { + data, err := os.ReadFile(filepath.Join("..", "..", "..", "tests", "export", "testdata", "interchange", "library_identity.toolkit.full.json")) + if err != nil { + t.Fatal(err) + } + turtle, err := convert.Convert("library.json", data, convert.FormatAPIJSON, convert.FormatTurtle) + if err != nil { + t.Fatalf("api-json to ttl: %v", err) + } + for _, input := range []struct { + name string + from convert.Format + data []byte + }{ + {name: "api-json", from: convert.FormatAPIJSON, data: data}, + {name: "ttl", from: convert.FormatTurtle, data: turtle}, + } { + t.Run(input.name, func(t *testing.T) { + var warnings []string + _, err := convert.ConvertWith(input.name, input.data, input.from, convert.FormatSysML, convert.Options{ + Warn: func(message string) { warnings = append(warnings, message) }, + }) + if err != nil { + t.Fatalf("%s to sysml: %v", input.name, err) + } + if len(warnings) != 1 || !strings.Contains(warnings[0], "ScalarValues::Real") { + t.Fatalf("warnings = %v", warnings) + } + }) + } +} + // A malformed element document is a syntax error of the input, as a malformed // Turtle document is. func TestAPIJSONSyntaxError(t *testing.T) { diff --git a/internal/translate/convert/convert.go b/internal/translate/convert/convert.go index 8b162846a6..0987da27b0 100644 --- a/internal/translate/convert/convert.go +++ b/internal/translate/convert/convert.go @@ -191,7 +191,8 @@ func (e *SyntaxError) Error() string { type Options struct { // ID is the form derived element ids are written in; the zero value is // qualified-name-derived ids. - ID export.IDForm + ID export.IDForm + Warn func(string) } // Convert reads data in the from format and writes it in the to format. name is @@ -367,13 +368,21 @@ func convert(name string, data []byte, from, to Format, tolerateSyntaxErrors boo return out, nil, err case from == FormatAPIJSON: + if to == FormatSysML { + out, err := export.APIJSONToSysML(data, opts.Warn) + var readErr *export.APIJSONReadError + if errors.As(err, &readErr) { + return nil, nil, &SyntaxError{Name: name, Messages: []string{readErr.Error()}} + } + return out, nil, err + } // The input is the API element form; api-json to api-json normalizes it // as Turtle to Turtle does. graph, err := readAPIJSON(name, data) if err != nil { return nil, nil, err } - out, err := FromGraph(graph, to) + out, err := FromGraphWith(graph, to, opts) return out, nil, err case from == FormatFMU: @@ -393,7 +402,7 @@ func convert(name string, data []byte, from, to Format, tolerateSyntaxErrors boo if err != nil { return nil, nil, &SyntaxError{Name: name, Messages: []string{err.Error()}} } - out, err := FromGraph(graph, to) + out, err := FromGraphWith(graph, to, opts) return out, nil, err } } @@ -401,9 +410,14 @@ func convert(name string, data []byte, from, to Format, tolerateSyntaxErrors boo // FromGraph writes a graph in the to format, so a graph that did not come // from a Turtle file — a repository branch read as RDF — converts alike. func FromGraph(graph *rdf.Graph, to Format) ([]byte, error) { + return FromGraphWith(graph, to, Options{}) +} + +// FromGraphWith writes a graph in the to format with conversion options. +func FromGraphWith(graph *rdf.Graph, to Format, opts Options) ([]byte, error) { switch { case to == FormatSysML: - return export.ToSysML(graph) + return export.ToSysMLWarn(graph, opts.Warn) case to == FormatTurtle: return rdf.WriteTurtle(graph), nil case to == FormatAPIJSON: diff --git a/internal/translate/export/api_json_import_test.go b/internal/translate/export/api_json_import_test.go index ca024be5c1..d2bf20a334 100644 --- a/internal/translate/export/api_json_import_test.go +++ b/internal/translate/export/api_json_import_test.go @@ -6,7 +6,9 @@ import ( "fmt" "os" "path/filepath" + "reflect" "regexp" + "slices" "strings" "testing" @@ -47,6 +49,11 @@ func countTable(t *testing.T, data []byte) map[string]int { } table := map[string]int{} for _, object := range objects { + // A library element the export names (isLibraryElement) is a reference + // into the library, not an element of the model. + if object["isLibraryElement"] == true { + continue + } if typ, ok := object["@type"].(string); ok { table[typ]++ } @@ -70,6 +77,25 @@ func TestToolkitAPIJSONDecodes(t *testing.T) { } } +func TestToSysMLDoesNotMutateTurtleGraph(t *testing.T) { + graph, err := ReadAPIJSON(interchangeFixture(t, "flow_ends.toolkit.full.json")) + if err != nil { + t.Fatalf("ReadAPIJSON: %v", err) + } + turtle := rdf.WriteTurtle(graph) + graph, err = rdf.ParseTurtle(turtle) + if err != nil { + t.Fatalf("ParseTurtle: %v", err) + } + before := slices.Clone(graph.Triples()) + if _, err := ToSysML(graph); err != nil { + t.Fatalf("ToSysML: %v", err) + } + if after := graph.Triples(); !slices.Equal(after, before) { + t.Fatalf("ToSysML changed the Turtle graph triples: before %d, after %d", len(before), len(after)) + } +} + // TestToolkitAPIGoldenNotation pins the notation the toolkit's interchange // decodes to. func TestToolkitAPIGoldenNotation(t *testing.T) { @@ -80,6 +106,255 @@ func TestToolkitAPIGoldenNotation(t *testing.T) { } } +func TestToolkitSatisfyByKeepsFeatureReferenceExpression(t *testing.T) { + input := interchangeFixture(t, "satisfy_by.toolkit.full.json") + notation := decodeAPIJSON(t, input) + if !bytes.Contains(notation, []byte("satisfy mission by vehicle.engine;")) { + t.Fatalf("the satisfy subject was not written as a `by` reference:\n%s", notation) + } + file := source.New("satisfy_by.sysml", notation) + p := parser.New(file) + root := p.ParseFile() + if len(p.Diagnostics) != 0 { + t.Fatalf("the decoded notation does not parse: %v", p.Diagnostics) + } + graph, err := ToRDF(file, root) + if err != nil { + t.Fatalf("ToRDF: %v", err) + } + reexported, err := WriteAPIJSON(graph) + if err != nil { + t.Fatalf("WriteAPIJSON: %v", err) + } + before, after := countTable(t, input), countTable(t, reexported) + for _, metaclass := range []string{"FeatureChainExpression", "FeatureChaining", "FeatureReferenceExpression"} { + if before[metaclass] != after[metaclass] { + t.Errorf("%s count changed: before %d, after %d", metaclass, before[metaclass], after[metaclass]) + } + } +} + +func TestReturnUsageKeepsItsMetaclass(t *testing.T) { + for _, tc := range []struct { + name string + src string + toolkit bool + wantReference bool + byteIdentical bool + expectedNotation string + }{ + { + name: "default usage", + src: "package R {\n calc def F {\n return x : Real;\n }\n}\n", + byteIdentical: true, + expectedNotation: "return x : Real", + }, + { + name: "reference usage", + src: "package R { calc def F { return ref result : Real; } }", + toolkit: true, + wantReference: true, + expectedNotation: "return ref result : Real", + }, + { + name: "anonymous reference usage", + src: "package R { calc def F { in value : Real; return :> value = value; } }", + toolkit: true, + wantReference: true, + expectedNotation: "return :> value = value", + }, + } { + t.Run(tc.name, func(t *testing.T) { + file := source.New("return.sysml", []byte(tc.src)) + p := parser.New(file) + root := p.ParseFile() + if len(p.Diagnostics) > 0 { + t.Fatalf("the fixture does not parse: %v", p.Diagnostics) + } + graph, err := ToRDF(file, root) + if err != nil { + t.Fatalf("ToRDF: %v", err) + } + ownText, err := ToSysML(graph) + if err != nil { + t.Fatalf("ToSysML native graph: %v", err) + } + if tc.byteIdentical && !bytes.Equal(ownText, []byte(tc.src)) { + t.Fatalf("native notation is not byte-identical:\n--- want ---\n%s\n--- got ---\n%s", tc.src, ownText) + } + ownFile := source.New("return.sysml", ownText) + ownParser := parser.New(ownFile) + ownRoot := ownParser.ParseFile() + if len(ownParser.Diagnostics) > 0 { + t.Fatalf("the native round-trip notation does not parse: %v\n%s", ownParser.Diagnostics, ownText) + } + ownGraph, err := ToRDF(ownFile, ownRoot) + if err != nil { + t.Fatalf("ToRDF native round trip: %v", err) + } + if !reflect.DeepEqual(graphWithoutSourceText(graph), graphWithoutSourceText(ownGraph)) { + t.Fatalf("native return graph changed:\n%s", string(ownText)) + } + before := resultUsageTypes(t, graph) + graphToDecode := graph + if tc.toolkit { + var triples []rdf.Triple + for _, triple := range graph.Triples() { + switch triple.Predicate.Value { + case rdf.OpenSysML + xDeclaredKeyword, + rdf.OpenSysML + xSourceText, + rdf.OpenSysML + xSourceTail, + rdf.OpenSysML + xSourceLanguage: + continue + } + triples = append(triples, triple) + } + graphToDecode = rdf.NewGraphOf(triples, graph.Prefixes) + } + out, err := ToSysML(graphToDecode) + if err != nil { + t.Fatalf("ToSysML: %v", err) + } + roundTrip := source.New("return.sysml", out) + roundParser := parser.New(roundTrip) + roundRoot := roundParser.ParseFile() + if len(roundParser.Diagnostics) > 0 { + t.Fatalf("the round-trip notation does not parse: %v\n%s", roundParser.Diagnostics, out) + } + reparsed, err := ToRDF(roundTrip, roundRoot) + if err != nil { + t.Fatalf("round-trip ToRDF: %v", err) + } + after := resultUsageTypes(t, reparsed) + if !reflect.DeepEqual(before, after) { + t.Fatalf("result metaclasses changed: before %v, after %v\n%s", before, after, out) + } + if len(before) != 1 { + t.Fatalf("result metaclasses = %v, want one metaclass", before) + } + if tc.wantReference && before["ReferenceUsage"] != 1 { + t.Fatalf("result metaclasses = %v, want ReferenceUsage", before) + } + if tc.expectedNotation != "" && !bytes.Contains(out, []byte(tc.expectedNotation)) { + t.Fatalf("the return form is missing %q:\n%s", tc.expectedNotation, out) + } + if tc.toolkit { + toolkitNotation := out + if !bytes.Contains(toolkitNotation, []byte(tc.expectedNotation)) { + t.Fatalf("the toolkit ReferenceUsage return was not written with its reference semantics:\n%s", toolkitNotation) + } + toolkitFile := source.New("return.sysml", toolkitNotation) + toolkitParser := parser.New(toolkitFile) + toolkitRoot := toolkitParser.ParseFile() + if len(toolkitParser.Diagnostics) > 0 { + t.Fatalf("the toolkit return notation does not parse: %v\n%s", toolkitParser.Diagnostics, toolkitNotation) + } + toolkitGraph, err := ToRDF(toolkitFile, toolkitRoot) + if err != nil { + t.Fatalf("toolkit return ToRDF: %v", err) + } + if got := resultUsageTypes(t, toolkitGraph); !reflect.DeepEqual(got, map[string]int{"ReferenceUsage": 1}) { + t.Fatalf("toolkit return metaclasses = %v, want ReferenceUsage", got) + } + } + }) + } +} + +func TestAPIJSONReferenceResultOmitsKindKeyword(t *testing.T) { + file := source.New("return.sysml", []byte("package R { calc def F { return result : Real; } }")) + p := parser.New(file) + root := p.ParseFile() + if len(p.Diagnostics) != 0 { + t.Fatalf("the fixture does not parse: %v", p.Diagnostics) + } + graph, err := ToRDF(file, root) + if err != nil { + t.Fatalf("ToRDF: %v", err) + } + data, err := WriteAPIJSON(graph) + if err != nil { + t.Fatalf("WriteAPIJSON: %v", err) + } + var elements []map[string]any + if err := json.Unmarshal(data, &elements); err != nil { + t.Fatalf("decode API JSON: %v", err) + } + found := false + foundReturnMembership := false + for _, element := range elements { + if element["@type"] == "ReferenceUsage" && element["declaredName"] == "result" { + found = true + if _, ok := element["declaredKeyword"]; ok { + t.Fatal("API JSON unexpectedly retains the declared kind keyword") + } + } + if element["@type"] == mReturnParameterMembership { + foundReturnMembership = true + } + } + if !found { + t.Fatal("API JSON has no ReferenceUsage result") + } + if !foundReturnMembership { + t.Fatal("API JSON has no ReturnParameterMembership") + } + out, err := APIJSONToSysML(data, nil) + if err != nil { + t.Fatalf("APIJSONToSysML: %v", err) + } + if !bytes.Contains(out, []byte("return result : Real")) || + bytes.Contains(out, []byte("return attribute")) { + t.Fatalf("API JSON ReferenceUsage result was written with a kind keyword:\n%s", out) + } + roundTrip := source.New("return.sysml", out) + roundParser := parser.New(roundTrip) + roundRoot := roundParser.ParseFile() + if len(roundParser.Diagnostics) != 0 { + t.Fatalf("the decoded notation does not parse: %v\n%s", roundParser.Diagnostics, out) + } + reparsed, err := ToRDF(roundTrip, roundRoot) + if err != nil { + t.Fatalf("round-trip ToRDF: %v", err) + } + if got := resultUsageTypes(t, reparsed); !reflect.DeepEqual(got, map[string]int{"ReferenceUsage": 1}) { + t.Fatalf("API JSON return metaclasses = %v, want ReferenceUsage", got) + } +} + +func graphWithoutSourceText(graph *rdf.Graph) map[rdf.Triple]bool { + out := make(map[rdf.Triple]bool, graph.Len()) + for _, triple := range graph.Triples() { + switch triple.Predicate.Value { + case rdf.OpenSysML + xSourceText, rdf.OpenSysML + xSourceTail, rdf.OpenSysML + xSourceLanguage: + continue + } + out[triple] = true + } + return out +} + +func resultUsageTypes(t *testing.T, graph *rdf.Graph) map[string]int { + t.Helper() + data, err := WriteAPIJSON(graph) + if err != nil { + t.Fatalf("WriteAPIJSON: %v", err) + } + var objects []map[string]any + if err := json.Unmarshal(data, &objects); err != nil { + t.Fatalf("decode API JSON: %v", err) + } + types := map[string]int{} + for _, object := range objects { + if object["isResult"] == true { + if kind, ok := object["@type"].(string); ok { + types[kind]++ + } + } + } + return types +} + // TestToolkitRootTransparent checks the toolkit's root Namespace wrapper does // not decode as a member of its own. func TestToolkitRootTransparent(t *testing.T) { diff --git a/internal/translate/export/api_json_in.go b/internal/translate/export/api_json_in.go index 28bd5bb65b..b1cd7a8d5b 100644 --- a/internal/translate/export/api_json_in.go +++ b/internal/translate/export/api_json_in.go @@ -21,49 +21,74 @@ import ( // same elements back; the unnamed root Namespace a document wraps its // top-level elements in is dropped, as the Turtle form does not carry it. func ReadAPIJSON(data []byte) (*rdf.Graph, error) { - elements, expressionIDs, err := parseAPIJSON(data) + expressionIDs, elementCount, err := apiJSONExpressionIDs(data) if err != nil { return nil, err } - graph := rdf.NewGraph() + builder := rdf.NewGraphBuilder(elementCount * apiJSONEstimatedTriplesPerElement) + cache := newAPIJSONTermCache() // The collection annotations are stated after every element's triples, the // positions AnnotateCollections writes them in. var annotations []apiJSONAnnotation - for _, element := range elements { + err = apiJSONElementsOf(data, apiJSONObjectOf, func(element apiJSONElementData) error { var subject rdf.Term - if element.expression { + if expressionIDs[element.id] { subject = rdf.IRI(rdf.Expression + element.id) } else { subject = rdf.ReferenceIRI(rdf.Term{}, element.id) } - typ, err := apiJSONTypeIRI(element.typ) + typ, err := cache.typeIRI(element.typ) if err != nil { - return nil, fmt.Errorf("element %q: %w", element.id, err) + return fmt.Errorf("element %q: %w", element.id, err) } - graph.Add(subject, rdf.IRI(rdf.RDFType), typ) + builder.Add(subject, rdf.IRI(rdf.RDFType), typ) for _, member := range element.members { - predicate, sysmlKey, err := apiJSONPredicate(member.key) + predicate, sysmlKey, err := cache.predicate(member.key) if err != nil { - return nil, fmt.Errorf("element %q: %w", element.id, err) + return fmt.Errorf("element %q: %w", element.id, err) } - if err := apiJSONTriples(graph, subject, predicate, sysmlKey, member.value, expressionIDs, &annotations); err != nil { - return nil, fmt.Errorf("element %q: %w", element.id, err) + if err := apiJSONTriples(builder, subject, predicate, sysmlKey, member.value, expressionIDs, cache, &annotations); err != nil { + return fmt.Errorf("element %q: %w", element.id, err) } } + return nil + }) + if err != nil { + return nil, err } for _, annotation := range annotations { text, err := rdf.CollectionJSON(annotation.subject, annotation.members) if err != nil { return nil, err } - graph.Add(annotation.subject, rdf.AnnotationJSONTerm(annotation.key), rdf.String(text)) + builder.Add(annotation.subject, rdf.AnnotationJSONTerm(annotation.key), rdf.String(text)) } if len(expressionIDs) > 0 { - graph.Prefixes[rdf.ExpressionPrefix] = rdf.Expression + builder.SetPrefix(rdf.ExpressionPrefix, rdf.Expression) } + graph := builder.Build() return withoutRootNamespace(graph), nil } +// APIJSONReadError reports a failure to parse an API element document. +type APIJSONReadError struct { + err error +} + +func (e *APIJSONReadError) Error() string { + if e == nil || e.err == nil { + return "cannot read the API element document" + } + return e.err.Error() +} + +func (e *APIJSONReadError) Unwrap() error { + if e == nil { + return nil + } + return e.err +} + // apiJSONElementData is one parsed element object: its identity, its class as // an expression node, and its properties in written order. type apiJSONElementData struct { @@ -72,64 +97,73 @@ type apiJSONElementData struct { expression bool qualifiedName bool members []apiJSONMember + indexMember string + indexOwner string } var apiJSONInteger = regexp.MustCompile(`^-?[0-9]+$`) -// parseAPIJSON decodes the document into element objects, preserving member -// order, and returns the ids classified into the expression namespace, since -// references resolve against the whole document. -func parseAPIJSON(data []byte) ([]apiJSONElementData, map[string]bool, error) { - objects, err := apiJSONObjectsOf(data) - if err != nil { - return nil, nil, err +const apiJSONEstimatedTriplesPerElement = 10 + +// apiJSONExpressionIDs indexes the element identities in a first pass, so the +// second pass can stream their properties directly into the graph. +func apiJSONExpressionIDs(data []byte) (map[string]bool, int, error) { + var objects []apiJSONElementData + if err := apiJSONElementsOf(data, apiJSONIndexObjectOf, func(object apiJSONElementData) error { + objects = append(objects, object) + return nil + }); err != nil { + return nil, 0, err } index, err := newAPIJSONIndex(objects) if err != nil { - return nil, nil, err + return nil, 0, err } index.classifyExpressions(objects) - return objects, index.expressionIDs, nil + return index.expressionIDs, len(objects), nil } -// apiJSONObjectsOf decodes the document's element objects: an array of them -// or a single object, and nothing after it. -func apiJSONObjectsOf(data []byte) ([]apiJSONElementData, error) { +// apiJSONElementsOf visits each element object in either supported document +// shape, rejecting trailing JSON values. +func apiJSONElementsOf(data []byte, read func(*json.Decoder) (apiJSONElementData, error), visit func(apiJSONElementData) error) error { dec := json.NewDecoder(bytes.NewReader(data)) dec.UseNumber() start, err := dec.Token() if err != nil { - return nil, fmt.Errorf("cannot read the API element document: %w", err) + return fmt.Errorf("cannot read the API element document: %w", err) } - var objects []apiJSONElementData switch start { case json.Delim('['): for dec.More() { if token, err := dec.Token(); err != nil || token != json.Delim('{') { - return nil, fmt.Errorf("an API element array holds element objects, not %v", token) + return fmt.Errorf("an API element array holds element objects, not %v", token) } - object, err := apiJSONObjectOf(dec) + object, err := read(dec) if err != nil { - return nil, err + return err + } + if err := visit(object); err != nil { + return err } - objects = append(objects, object) } if _, err := dec.Token(); err != nil { - return nil, fmt.Errorf("cannot read the API element array: %w", err) + return fmt.Errorf("cannot read the API element array: %w", err) } case json.Delim('{'): - object, err := apiJSONObjectOf(dec) + object, err := read(dec) if err != nil { - return nil, err + return err + } + if err := visit(object); err != nil { + return err } - objects = append(objects, object) default: - return nil, fmt.Errorf("an API element document is an array of element objects or a single object, not %v", start) + return fmt.Errorf("an API element document is an array of element objects or a single object, not %v", start) } if _, err := dec.Token(); err != io.EOF { - return nil, fmt.Errorf("the API element document holds more than one JSON value") + return fmt.Errorf("the API element document holds more than one JSON value") } - return objects, nil + return nil } // apiJSONIndex is what classifying the expression namespace reads across the @@ -173,17 +207,7 @@ func newAPIJSONIndex(objects []apiJSONElementData) (*apiJSONIndex, error) { // Opaque ids such as UUIDs carry no parent, so the membership that states // the node as its member stands in. for _, object := range objects { - member, owner := "", "" - for _, m := range object.members { - id, isRef := memberReference(m.value) - switch { - case !isRef: - case membershipMemberProperty(m.key): - member = id - case membershipOwnerProperty(m.key): - owner = id - } - } + member, owner := object.indexMember, object.indexOwner if owner != "" && isRelationship(object.typ) { index.relationshipOwner[object.id] = owner } @@ -304,6 +328,110 @@ func memberReference(value any) (string, bool) { // apiJSONObjectOf reads one '{...}' from the decoder — its '{' already consumed // — returning "@type"/"@id" extracted and the other members in written order. +func apiJSONIndexObjectOf(dec *json.Decoder) (apiJSONElementData, error) { + object := apiJSONElementData{} + seen := map[string]bool{} + for dec.More() { + token, err := dec.Token() + if err != nil { + return object, err + } + key, ok := token.(string) + if !ok { + return object, fmt.Errorf("an element object's member key is a string, not %v", token) + } + if seen[key] { + return object, fmt.Errorf("element object states %q twice", key) + } + seen[key] = true + switch { + case key == "@type", key == "@id": + value, err := apiJSONValueOf(dec) + if err != nil { + return object, fmt.Errorf("%s: %w", key, err) + } + text, ok := value.(string) + if !ok { + return object, fmt.Errorf("%q is a string, not %v", key, value) + } + if key == "@type" { + object.typ = text + } else { + object.id = text + } + case strings.HasPrefix(key, "@"): + return object, fmt.Errorf("the key %q is not a keyword this document carries", key) + case key == "qualifiedName": + value, err := apiJSONValueOf(dec) + if err != nil { + return object, fmt.Errorf("%s: %w", key, err) + } + text, ok := value.(string) + object.qualifiedName = ok && text != "" + case membershipMemberProperty(key), membershipOwnerProperty(key): + value, err := apiJSONValueOf(dec) + if err != nil { + return object, fmt.Errorf("%s: %w", key, err) + } + if id, ok := memberReference(value); ok { + if membershipMemberProperty(key) { + object.indexMember = id + } else { + object.indexOwner = id + } + } + default: + if err := skipAPIJSONValue(dec); err != nil { + return object, fmt.Errorf("%s: %w", key, err) + } + } + } + if _, err := dec.Token(); err != nil { + return object, err + } + return object, nil +} + +func skipAPIJSONValue(dec *json.Decoder) error { + token, err := dec.Token() + if err != nil { + return err + } + switch token { + case json.Delim('{'): + seen := map[string]bool{} + for dec.More() { + keyToken, err := dec.Token() + if err != nil { + return err + } + key, ok := keyToken.(string) + if !ok { + return fmt.Errorf("an object member key is a string, not %v", keyToken) + } + if seen[key] { + return fmt.Errorf("object states %q twice", key) + } + seen[key] = true + if err := skipAPIJSONValue(dec); err != nil { + return err + } + } + _, err := dec.Token() + return err + case json.Delim('['): + for dec.More() { + if err := skipAPIJSONValue(dec); err != nil { + return err + } + } + _, err := dec.Token() + return err + default: + return nil + } +} + func apiJSONObjectOf(dec *json.Decoder) (apiJSONElementData, error) { var object apiJSONElementData seen := map[string]bool{} @@ -432,6 +560,89 @@ func apiJSONPredicate(key string) (rdf.Term, string, error) { return rdf.SysMLTerm(key), key, nil } +type apiJSONPredicateValue struct { + term rdf.Term + key string +} + +type apiJSONReferenceKey struct { + scope string + id string +} + +type apiJSONTermCache struct { + types map[string]rdf.Term + predicates map[string]apiJSONPredicateValue + references map[apiJSONReferenceKey]rdf.Term + literals map[string]string +} + +func newAPIJSONTermCache() *apiJSONTermCache { + return &apiJSONTermCache{ + types: map[string]rdf.Term{}, + predicates: map[string]apiJSONPredicateValue{}, + references: map[apiJSONReferenceKey]rdf.Term{}, + literals: map[string]string{}, + } +} + +func (cache *apiJSONTermCache) literal(value string) string { + if stored, ok := cache.literals[value]; ok { + return stored + } + cache.literals[value] = value + return value +} + +func (cache *apiJSONTermCache) typeIRI(typ string) (rdf.Term, error) { + if term, ok := cache.types[typ]; ok { + return term, nil + } + term, err := apiJSONTypeIRI(typ) + if err == nil { + cache.types[typ] = term + } + return term, err +} + +func (cache *apiJSONTermCache) predicate(key string) (rdf.Term, string, error) { + if value, ok := cache.predicates[key]; ok { + return value.term, value.key, nil + } + term, local, err := apiJSONPredicate(key) + if err == nil { + cache.predicates[key] = apiJSONPredicateValue{term: term, key: local} + } + return term, local, err +} + +// referenceTarget resolves one JSON id or unresolved name to its graph term. +func (cache *apiJSONTermCache) referenceTarget(subject rdf.Term, object map[string]any, expressionIDs map[string]bool) (rdf.Term, error) { + if len(object) == 1 { + if id, ok := object["@id"].(string); ok && id != "" { + key := apiJSONReferenceKey{id: id} + if !strings.Contains(id, ":") { + if owner, ok := rdf.SubjectID(subject); ok { + key.scope, _, _ = strings.Cut(owner, ":") + } + } + if target, ok := cache.references[key]; ok { + return target, nil + } + target := rdf.ReferenceIRI(subject, id) + if targetID, ok := rdf.SubjectID(target); ok && expressionIDs[targetID] { + target = rdf.IRI(rdf.Expression + targetID) + } + cache.references[key] = target + return target, nil + } + if name, ok := object["@ref"].(string); ok && name != "" { + return rdf.String(cache.literal(name)), nil + } + } + return rdf.Term{}, fmt.Errorf("an object value is a reference {\"@id\": } or {\"@ref\": }") +} + // apiJSONAnnotation is a collection awaiting its json: literal: the members // a sysml: array stated, settled once every triple stands. type apiJSONAnnotation struct { @@ -441,22 +652,22 @@ type apiJSONAnnotation struct { } // apiJSONTriples states one property of an element object as graph triples. -func apiJSONTriples(graph *rdf.Graph, subject rdf.Term, predicate rdf.Term, sysmlKey string, value any, expressionIDs map[string]bool, annotations *[]apiJSONAnnotation) error { +func apiJSONTriples(graph *rdf.GraphBuilder, subject rdf.Term, predicate rdf.Term, sysmlKey string, value any, expressionIDs map[string]bool, cache *apiJSONTermCache, annotations *[]apiJSONAnnotation) error { switch v := value.(type) { case nil: // The API serves absent properties as null; nothing to state. return nil case map[string]any: - target, err := apiJSONReferenceTarget(subject, v, expressionIDs) + target, err := cache.referenceTarget(subject, v, expressionIDs) if err != nil { return err } graph.Add(subject, predicate, target) return nil case []any: - return apiJSONCollection(graph, subject, predicate, sysmlKey, v, expressionIDs, annotations) + return apiJSONCollection(graph, subject, predicate, sysmlKey, v, expressionIDs, cache, annotations) default: - object, err := apiJSONScalarOf(subject, predicate, sysmlKey, value, expressionIDs) + object, err := apiJSONScalarOf(subject, predicate, sysmlKey, value, expressionIDs, cache) if err != nil { return err } @@ -465,26 +676,6 @@ func apiJSONTriples(graph *rdf.Graph, subject rdf.Term, predicate rdf.Term, sysm } } -// apiJSONReferenceTarget resolves a member object into the term it names: a -// {"@id": } reference the IRI it spells from subject, a {"@ref": } -// — sysml-toolkit's spelling of a target it could not resolve — the name -// literal the mapping already writes for a name-valued reference. -func apiJSONReferenceTarget(subject rdf.Term, object map[string]any, expressionIDs map[string]bool) (rdf.Term, error) { - if len(object) == 1 { - if id, ok := object["@id"].(string); ok && id != "" { - target := rdf.ReferenceIRI(subject, id) - if targetID, ok := rdf.SubjectID(target); ok && expressionIDs[targetID] { - target = rdf.IRI(rdf.Expression + targetID) - } - return target, nil - } - if name, ok := object["@ref"].(string); ok && name != "" { - return rdf.String(name), nil - } - } - return rdf.Term{}, fmt.Errorf("an object value is a reference {\"@id\": } or {\"@ref\": }") -} - // nonuniqueCollections are the derived KerML collections declared {nonunique}: // a relationship's related elements may repeat (an association of two ends on one type). var nonuniqueCollections = map[string]bool{ @@ -494,13 +685,13 @@ var nonuniqueCollections = map[string]bool{ // apiJSONCollection states an array member: one triple per value, recording // a collection of at least two on a sysml: key for its json: annotation. -func apiJSONCollection(graph *rdf.Graph, subject rdf.Term, predicate rdf.Term, sysmlKey string, values []any, expressionIDs map[string]bool, annotations *[]apiJSONAnnotation) error { +func apiJSONCollection(graph *rdf.GraphBuilder, subject rdf.Term, predicate rdf.Term, sysmlKey string, values []any, expressionIDs map[string]bool, cache *apiJSONTermCache, annotations *[]apiJSONAnnotation) error { if len(values) == 0 { return nil } members := make([]rdf.Term, 0, len(values)) for _, value := range values { - member, err := apiJSONScalarOf(subject, predicate, sysmlKey, value, expressionIDs) + member, err := apiJSONScalarOf(subject, predicate, sysmlKey, value, expressionIDs, cache) if err != nil { return err } @@ -533,23 +724,24 @@ func apiJSONCollection(graph *rdf.Graph, subject rdf.Term, predicate rdf.Term, s // apiJSONScalarOf turns one JSON value into the term a triple holds: a // reference object an IRI, a bool or number its typed literal, a string a plain // literal — or the expression text a reference-valued property carries. -func apiJSONScalarOf(subject rdf.Term, predicate rdf.Term, sysmlKey string, value any, expressionIDs map[string]bool) (rdf.Term, error) { +func apiJSONScalarOf(subject rdf.Term, predicate rdf.Term, sysmlKey string, value any, expressionIDs map[string]bool, cache *apiJSONTermCache) (rdf.Term, error) { switch v := value.(type) { case bool: return rdf.Bool(v), nil case json.Number: - lexical := v.String() + lexical := cache.literal(v.String()) if apiJSONInteger.MatchString(lexical) { return rdf.TypedLiteral(lexical, rdf.XSD+"integer"), nil } return rdf.TypedLiteral(lexical, realDatatype(lexical)), nil case string: + v = cache.literal(v) if apiJSONIsExpressionText(sysmlKey, v) { return rdf.TypedLiteral(v, rdf.OpenSysML+dtExpression), nil } return rdf.String(v), nil case map[string]any: - return apiJSONReferenceTarget(subject, v, expressionIDs) + return cache.referenceTarget(subject, v, expressionIDs) case nil: return rdf.Term{}, fmt.Errorf("a collection member cannot be null") case []any: diff --git a/internal/translate/export/api_json_out.go b/internal/translate/export/api_json_out.go index caa5f1f54d..0bd7d9b705 100644 --- a/internal/translate/export/api_json_out.go +++ b/internal/translate/export/api_json_out.go @@ -29,8 +29,9 @@ func WriteAPIJSON(graph *rdf.Graph) ([]byte, error) { if err != nil { return nil, err } - elements := make([]apiJSONObject, 0, len(settled.Subjects())) - for _, subject := range settled.Subjects() { + subjects := settled.Subjects() + elements := make([]apiJSONObject, 0, len(subjects)) + for _, subject := range subjects { element, err := apiJSONElement(settled, subject) if err != nil { return nil, err diff --git a/internal/translate/export/behavior.go b/internal/translate/export/behavior.go index d54043f373..a28165ef36 100644 --- a/internal/translate/export/behavior.go +++ b/internal/translate/export/behavior.go @@ -85,6 +85,10 @@ const ( // libraryDone is the library feature a `done;` member names. var libraryDone = ast.QualifiedNameOf("Actions", "Action", "done") +var libraryStateStart = ast.QualifiedNameOf("States", "StateAction", "start") + +var libraryTransitionLinkSource = ast.QualifiedNameOf("Actions", "TransitionAction", "transitionLinkSource") + // libraryReference is the subject of a standard library element named from // the global scope, or its name when no library is loaded. func (e *encoder) libraryReference(name *ast.QualifiedName) rdf.Term { @@ -244,6 +248,21 @@ func (e *encoder) encodeBehavior(node ast.Node, head func(rdf.Term), subject rdf return false, nil } +// initialSuccessionEnds emits the two connector ends of `first a then b;`: the +// source the initial node names, the target its successor names. +func (e *encoder) initialSuccessionEnds(subject rdf.Term, owner string, n *ast.InitialNode) error { + source := connectorEndSpec{owner: owner, slot: "end0", index: 0, ends: 2, noCollapse: true} + if decl, fqn, ok := e.linked(e.res.InitialSymbol(n)); ok { + source.targetTerm = e.ids.subjectForNode(decl, fqn) + } else { + return nil + } + if err := e.connectorEnd(subject, source); err != nil { + return err + } + return e.connectorEnd(subject, connectorEndSpec{owner: owner, slot: "end1", index: 1, ends: 2, target: n.Successor, noCollapse: true}) +} + // encodeInitialNode emits `first x;` — a Membership of the member the body // starts at (SysML.xtext InitialNodeMember) — or `first x then y`, the // SuccessionAsUsage it sequences. @@ -272,6 +291,15 @@ func (e *encoder) encodeInitialNode(n *ast.InitialNode, head func(rdf.Term), sub } if qualifiedText(n.Successor) != "" { e.graph.Add(subject, e.sysml(pTargetFeature), e.edgeReference(n.Successor)) + // `first a then b;` owns its two ends, each a ConnectorEnd referencing + // the feature it names (SysML-textual-bnf SuccessionAsUsage, + // ConnectorEndMember), beside the sourceFeature and targetFeature the + // ends derive. A guarded one is a transition, not a succession. + if n.Guard == nil && n.Name() != "" { + if err := e.initialSuccessionEnds(subject, owner, n); err != nil { + return err + } + } } else if n.Guard != nil { return &UnsupportedError{ What: fmt.Sprintf("the guarded initial node at %s", e.where(n)), @@ -422,6 +450,8 @@ func (e *encoder) encodeTransition(n *ast.TransitionMember, head func(rdf.Term), e.name(subject, n.Name) e.graph.Add(subject, e.sysx(xTransitionSyntax), rdf.String(e.transitionSyntax(n))) e.transitionKeyword(subject, n) + // The members ahead of the trigger come first, in the grammar's order. + e.transitionHeadMembers(subject, n) succession, membership, err := e.transitionSuccession(subject, n, owner) if err != nil { return err @@ -514,12 +544,84 @@ func (e *encoder) transitionSuccession(subject rdf.Term, n *ast.TransitionMember if err := e.connectorEnd(succession, connectorEndSpec{owner: owner, slot: "end0", index: 0, ends: 2, empty: true, noCollapse: true}); err != nil { return rdf.Term{}, rdf.Term{}, err } - if err := e.connectorEnd(succession, connectorEndSpec{owner: owner, slot: "end1", index: 1, ends: 2, targetTerm: e.edgeReference(n.Target), noCollapse: true}); err != nil { + // A chained target (`then b.c`) is the OwnedFeatureChain its end's + // reference subsetting owns; a name is the member it resolves to here. + target := connectorEndSpec{owner: owner, slot: "end1", index: 1, ends: 2, noCollapse: true} + if qualifiedNameHasChain(n.Target) { + target.target = n.Target + } else { + target.targetTerm = e.edgeReference(n.Target) + } + if err := e.connectorEnd(succession, target); err != nil { return rdf.Term{}, rdf.Term{}, err } return succession, membership, nil } +// transitionHeadMembers emits what a transition owns ahead of its trigger +// (SysML-textual-bnf TransitionUsage :1281-1290, TargetTransitionUsage +// :1292-1300): the FeatureChainMember naming the source of a `first` +// transition, then an EmptyParameterMember (:1081-1085), and a second one +// ahead of a trigger it states as a TriggerActionMember. +func (e *encoder) transitionHeadMembers(subject rdf.Term, n *ast.TransitionMember) { + if qualifiedText(n.Source) != "" { + e.transitionSourceMember(subject, n.Source) + } + e.emptyParameterMember(subject, "linkparam") + if e.triggerPayload(n) != nil { + e.emptyParameterMember(subject, "triggerparam") + } +} + +// transitionSourceMember emits the FeatureChainMember of `first source`: a +// Membership whose member is the state it names, or, for `first a.b`, an +// OwningMembership owning the chain Feature (FeatureChainMember, :1111-1116). +func (e *encoder) transitionSourceMember(subject rdf.Term, source *ast.QualifiedName) { + if qualifiedNameHasChain(source) { + // A chain is a node, as an end's chain is. + chain := e.ids.mintedNode(rdf.ExpressionIRI(subject, "sourcechain"), subject, "sourcechain") + membership := e.ids.minted(rdf.OwningMembershipIRIOf(chain), chain, rdf.OwningMembershipSuffix) + e.graph.Prefixes[rdf.ExpressionPrefix] = rdf.Expression + e.typed(chain, mFeature) + e.graph.Add(chain, e.sysml(pElementID), rdf.String(rdf.LocalName(chain.Value))) + e.featureChainings(chain, e.qualifiedChainReferences(source)) + e.graph.Add(subject, e.sysml(pOwnedRelationship), membership) + e.graph.Add(subject, e.sysml(pOwnedMembership), membership) + e.emitMembershipCore(membership, chain, subject, mOwningMembership, true) + return + } + membership := e.ids.minted(rdf.ExpressionIRI(subject, "sourcemember"), subject, "sourcemember") + e.graph.Prefixes[rdf.ExpressionPrefix] = rdf.Expression + e.graph.Add(membership, rdf.IRI(rdf.RDFType), e.sysml(mMembership)) + e.graph.Add(membership, e.sysml(pElementID), rdf.String(rdf.LocalName(membership.Value))) + e.graph.Add(membership, e.sysml(pOwner), subject) + e.graph.Add(membership, e.sysml(pMemberElement), e.edgeReference(source)) + e.graph.Add(membership, e.sysml(pOwningRelatedElement), subject) + e.graph.Add(membership, e.sysml(pMembershipOwningNamespace), subject) + e.graph.Add(subject, e.sysml(pOwnedRelationship), membership) + e.graph.Add(subject, e.sysml(pOwnedMembership), membership) +} + +// emptyParameterMember emits an EmptyParameterMember: a ParameterMembership +// owning an EmptyUsage, a ReferenceUsage that declares nothing. +func (e *encoder) emptyParameterMember(subject rdf.Term, slot string) { + // Minted as an element, as the transition's succession is: an + // expression-part id would read back from the element form as a node. + feature := e.ids.minted(rdf.IRI(subject.Value+"_"+slot), subject, "_"+slot) + membership := e.ids.minted(rdf.OwningMembershipIRIOf(feature), feature, rdf.OwningMembershipSuffix) + e.typed(feature, mReferenceUsage) + e.graph.Add(feature, e.sysml(pElementID), rdf.String(rdf.LocalName(feature.Value))) + // A parameter with no direction of its own is an `in` parameter. + e.graph.Add(feature, e.sysml(pDirection), rdf.String("in")) + e.graph.Add(subject, e.sysml(pOwnedRelationship), membership) + e.graph.Add(subject, e.sysml(pOwnedMembership), membership) + e.graph.Add(subject, e.sysml(pOwnedFeatureMembership), membership) + e.graph.Add(subject, e.sysml(pOwnedFeature), feature) + e.emitMembershipCore(membership, feature, subject, mParameterMembership, true) + e.graph.Add(membership, e.sysml(pOwnedMemberFeature), feature) + e.graph.Add(membership, e.sysml(pOwnedMemberParameter), feature) +} + // triggerSegment is the qualified-name segment of a transition's trigger // action, which declares no name of its own. const triggerSegment = "@trigger" @@ -1082,6 +1184,11 @@ func (d *decoder) membershipKeyword(el *element) string { } switch el.metaclass { case mSuccession: + if source, ok := d.graph.Object(rdf.IRI(el.iri), rdf.SysML+pSourceFeature); ok { + if start, err := d.referencedElement(source.Value); err == nil && start.qname == qualifiedText(libraryStateStart) { + return "first" + } + } return "" case mAlias: return "alias" @@ -1135,9 +1242,70 @@ func (d *decoder) startOf(el *element) (rdf.Term, bool) { return d.graph.Object(rdf.IRI(el.iri), rdf.SysML+pSourceFeature) } +// initialEndsAgree refuses a `first a then b` whose connector ends and +// sysml:sourceFeature/sysml:targetFeature name different features, or whose +// end declares a name or bounds: the notation states each end once, as the +// bare feature it names, so writing it would drop the rest. +func (d *decoder) initialEndsAgree(el *element) error { + ends, err := d.standardEndFeatures(el) + if err != nil || len(ends) == 0 { + return err + } + subject := rdf.IRI(el.iri) + source, hasSource := d.graph.Object(subject, rdf.SysML+pSourceFeature) + target, hasTarget := d.graph.Object(subject, rdf.SysML+pTargetFeature) + if len(ends) != 2 || !hasSource || !hasTarget { + return &UnsupportedError{ + What: fmt.Sprintf("the succession <%s>", el.iri), + Note: fmt.Sprintf("it owns %d connector ends and states sysml:sourceFeature %t and sysml:targetFeature %t, where `first a then b` relates two ends, its source and its target", len(ends), hasSource, hasTarget), + } + } + for i, want := range []rdf.Term{source, target} { + got, ok, err := d.standardEndTarget(ends[i], el) + if err != nil { + return err + } + if !ok { + return &UnsupportedError{ + What: fmt.Sprintf("the succession <%s>", el.iri), + Note: fmt.Sprintf("its connector end <%s> has no ReferenceSubsetting or sysml:references target, so `first a then b` would invent one from its sysml:%s", ends[i].Value, []string{pSourceFeature, pTargetFeature}[i]), + } + } + // `first a then b` writes each end as the bare feature it names; a + // name or bounds the end declares have no place there. + name, err := d.standardEndName(ends[i], el) + if err != nil { + return err + } + mult, err := d.endMultiplicity(ends[i], el) + if err != nil { + return err + } + if name != "" || mult != "" { + return &UnsupportedError{ + What: fmt.Sprintf("the succession <%s>", el.iri), + Note: fmt.Sprintf("its connector end <%s> declares %q, which `first a then b` writes no name or multiplicity for, so writing it would drop them", ends[i].Value, strings.TrimSpace(mult+" "+name)), + } + } + // A literal names a feature the graph does not link, so it is no + // identity to compare with. + if got != want && !got.IsLiteral() && !want.IsLiteral() { + property := []string{pSourceFeature, pTargetFeature}[i] + return &UnsupportedError{ + What: fmt.Sprintf("the succession <%s>", el.iri), + Note: fmt.Sprintf("its connector end <%s> references <%s> and its sysml:%s is <%s>; the notation states the end once, so writing one would drop the other", ends[i].Value, got.Value, property, want.Value), + } + } + } + return nil +} + // initialNodeHead writes `first x [if g then y]`. The start is a member of // this body or a label, written by its own name: `first` takes no qualified name. func (d *decoder) initialNodeHead(el *element) (string, error) { + if err := d.initialEndsAgree(el); err != nil { + return "", err + } words := []string{"first"} if start, ok := d.startOf(el); ok { name, target, err := d.memberName(start) @@ -1370,6 +1538,16 @@ func (d *decoder) successionChild(src *keptSources, child *element) (bool, error from := src.sourceBefore(1) if positionalTarget { from = src.sourceBeforeMember(target) + targetKept := false + for _, member := range src.kept { + if member == target { + targetKept = true + break + } + } + if !targetKept { + from = src.sourceBefore(0) + } } if err := d.attachable(child, from); err != nil { return false, err @@ -1488,7 +1666,11 @@ func (d *decoder) sequencesFrom(el, from *element) bool { return false } if term, positional := d.graph.Object(rdf.IRI(el.iri), rdf.OpenSysML+xSourceMember); positional { - return term.Value == from.iri + if term.Value == from.iri { + return true + } + answers, ok := d.answersTo(from) + return ok && term.Equal(answers) } source, ok := d.graph.Object(rdf.IRI(el.iri), rdf.SysML+pSourceFeature) if !ok { @@ -1758,7 +1940,11 @@ func (d *decoder) transitionText(el *element, annotations []string, depth int) ( return "", "", err } words = append(words, triggerWords...) - if guard, ok := d.stringOf(el, rdf.OpenSysML+xGuard); ok { + guard, err := d.transitionGuard(el) + if err != nil { + return "", "", err + } + if guard != "" { words = append(words, "if", guard) } effect, body, hasEffect, hasBody, err := d.transitionMembers(el) @@ -1780,6 +1966,68 @@ func (d *decoder) transitionText(el *element, annotations []string, depth int) ( return strings.Join(words, " "), bodyText, nil } +func (d *decoder) transitionGuard(el *element) (string, error) { + refuse := func(note string) error { + return &UnsupportedError{What: fmt.Sprintf("the transition <%s>", el.iri), Note: note} + } + subject := rdf.IRI(el.iri) + var guards []rdf.Term + for _, membership := range d.graph.Objects(subject, rdf.SysML+pOwnedFeatureMembership) { + if d.metaclass(membership) != mTransitionFeatureMembership { + continue + } + kind, _ := d.graph.Lexical(membership, rdf.SysML+pKind) + if kind != "guard" { + continue + } + member := firstIRI(d.graph, membership, pMemberElement, pOwnedMemberElement, pOwnedMemberFeature, pOwnedRelatedElement) + if member.Value == "" { + return "", refuse("its TransitionFeatureMembership of kind `guard` names no expression") + } + guards = append(guards, member) + } + if len(guards) > 1 { + return "", refuse(fmt.Sprintf("it owns %d guard features, and the transition notation writes one `if` clause", len(guards))) + } + stated := d.graph.Objects(subject, rdf.SysML+"guardExpression") + if len(stated) > 1 { + return "", refuse("it states more than one sysml:guardExpression, and the transition notation writes one `if` clause") + } + if len(guards) > 0 && len(stated) > 0 && guards[0] != stated[0] { + return "", refuse("its guard membership and sysml:guardExpression name different expressions") + } + var guard rdf.Term + if len(guards) > 0 { + guard = guards[0] + } else if len(stated) > 0 { + guard = stated[0] + } + if guard.Value == "" { + text, _ := d.stringOf(el, rdf.OpenSysML+xGuard) + return text, nil + } + var text string + var err error + if guard.IsLiteral() { + if guard.Datatype != rdf.OpenSysML+dtExpression { + return "", refuse("its guard is a literal that is not a SysML expression") + } + text = guard.Value + } else { + text, err = d.expressionNodeText(guard, el) + if err != nil { + return "", err + } + } + if text == "" { + return "", refuse("its guard expression has no notation") + } + if written, ok := d.stringOf(el, rdf.OpenSysML+xGuard); ok && written != text { + return "", refuse("its sysx:guard text disagrees with the guard expression") + } + return text, nil +} + // effectText writes a transition's `do` effect members. func (d *decoder) effectText(effect []*element, depth int) (string, error) { text, err := d.membersText(effect, false, depth) @@ -2229,9 +2477,8 @@ func (d *decoder) triggerReceiver(el, accepter, payload *element) (string, error return d.expressionNodeText(receiver, el) } -// transitionMembers partitions a transition's members into effect and body: -// members are linked as effect or body; unlinked members are from a mapping -// that owned the effect alone, with sysx:hasBody its braces. +// transitionMembers partitions linked effects and body members. Unlinked legacy +// members are effects only when they are not parameters. func (d *decoder) transitionMembers(el *element) (effect, body []*element, hasEffect, hasBody bool, err error) { inEffect := d.linked(el, xEffectMember) inBody := d.linked(el, xBodyMember) @@ -2256,6 +2503,13 @@ func (d *decoder) transitionMembers(el *element) (effect, body []*element, hasEf } } legacy := len(children) > 0 && len(inEffect) == 0 && len(inBody) == 0 + for _, child := range children { + if m, owned := d.owningMembership[child.iri]; owned && + d.metaclass(rdf.IRI(m.iri)) == mParameterMembership { + legacy = false + break + } + } hasEffect = d.boolOf(el, rdf.OpenSysML+xHasEffect) || (!collapsed && len(inEffect) > 0) hasBody = d.boolOf(el, rdf.OpenSysML+xHasBody) // A braced effect is one anonymous action; a graph that wrote it as the @@ -2319,6 +2573,11 @@ func (d *decoder) transitionObject(el *element, property string) (rdf.Term, bool // transitionReferenceText renders a standard endpoint, falling back to legacy RDF. func (d *decoder) transitionReferenceText(el *element, property, legacy string) (string, error) { + // A chained end (`first a.b`, `then b.c`) is written as the chain it owns, + // which the collapsed source or target, the feature it reaches, is not. + if text, ok, err := d.transitionChainText(el, property); err != nil || ok { + return text, err + } _, standard, err := d.transitionObject(el, property) if err != nil { return "", err @@ -2329,6 +2588,66 @@ func (d *decoder) transitionReferenceText(el *element, property, legacy string) return d.referenceText(el, rdf.SysML+legacy) } +// transitionChainText is the chain a transition's source or target is written +// as: the chain its FeatureChainMember owns, or the chain its succession's +// target end references; ok is false when that end names a feature directly. +func (d *decoder) transitionChainText(el *element, property string) (string, bool, error) { + subject := rdf.IRI(el.iri) + var chain rdf.Term + switch property { + case pSource: + owned := d.graph.Objects(subject, rdf.SysML+pOwnedRelationship) + if len(owned) == 0 || d.metaclass(owned[0]) != mOwningMembership { + return "", false, nil + } + chain, _ = d.graph.Object(owned[0], rdf.SysML+pOwnedRelatedElement) + case pTarget: + succession, ok := d.graph.Object(subject, rdf.SysML+"succession") + if !ok { + return "", false, nil + } + ends := d.graph.Objects(succession, rdf.SysML+pConnectorEnd) + if len(ends) != 2 { + return "", false, nil + } + target, ok, err := d.standardEndTarget(ends[1], el) + if err != nil || !ok { + return "", false, err + } + chain = target + default: + return "", false, nil + } + if !chain.IsIRI() { + return "", false, nil + } + isChain, err := d.chainFeatureTerm(chain) + if err != nil || !isChain { + return "", false, err + } + // The chain is written in place of the collapsed endpoint, so the two + // must state the same one. + if head, hasHead, err := d.transitionObject(el, property); err != nil { + return "", false, err + } else if hasHead { + same, err := d.sameEndpoint(head, chain) + if err != nil { + return "", false, err + } + if !same { + return "", false, &UnsupportedError{ + What: fmt.Sprintf("the transition <%s>", el.iri), + Note: fmt.Sprintf("its head states <%s> as its %s while it owns the chain <%s>, and writing one would drop the other", head.Value, property, chain.Value), + } + } + } + parts, err := d.standardChainText(chain, el) + if err != nil { + return "", false, err + } + return strings.Join(parts, "."), true, nil +} + // transitionLinkError refuses a transition whose effect and body links do not // partition its members. func transitionLinkError(el *element, member, fault string) error { diff --git a/internal/translate/export/callee_test.go b/internal/translate/export/callee_test.go index 1904712b9d..c0a068b3e2 100644 --- a/internal/translate/export/callee_test.go +++ b/internal/translate/export/callee_test.go @@ -29,7 +29,7 @@ func TestCalleeTextChainAgreesByIdentity(t *testing.T) { } d := newDecoder(g, map[rdf.Term]string{ node: rdf.SysML + mInvocation, membership: rdf.SysML + mOwningMembership, chain: rdf.SysML + mFeature, - }, nil) + }, nil, nil) for iri, qname := range map[rdf.Term]string{foo: "Service::foo", other: "Other::foo"} { g.Add(iri, rdf.SysMLTerm(pQualifiedName), rdf.String(qname)) d.byIRI[iri.Value] = &element{iri: iri.Value, qname: qname} diff --git a/internal/translate/export/element_ids.go b/internal/translate/export/element_ids.go new file mode 100644 index 0000000000..0e4b71ef32 --- /dev/null +++ b/internal/translate/export/element_ids.go @@ -0,0 +1,119 @@ +package export + +import ( + "fmt" + + "github.com/Open-MBEE/OpenSysML/internal/semantic/resolve" + "github.com/Open-MBEE/OpenSysML/internal/syntax/ast" + "github.com/Open-MBEE/OpenSysML/internal/syntax/parser" + "github.com/Open-MBEE/OpenSysML/internal/syntax/source" + "github.com/Open-MBEE/OpenSysML/internal/translate/rdf" +) + +// ElementIDs reports the elementId a conversion of a model writes for each of +// its elements, in the qualified id form. It is read from that conversion +// itself — ToRDF for one document, modelToRDF (ModelToRDFWith) for several, +// the paths Convert takes — so a library file's copy, a declared id and scope +// qualification come out as they are written, and a model the conversion +// refuses has no ids at all. +type ElementIDs struct { + // byNode keys each id by the declaration the conversion wrote it for: two + // identity scopes may declare one qualified name, and only the node tells + // their elements apart. + byNode map[ast.Node]string + byName map[string]string + res *resolve.Resolver + encoders []*encoder +} + +// NewElementIDs converts the documents of one model and records the elementId +// written for each element by its qualified (or positional) name. The error is +// the conversion's: a model Convert refuses has no elementIds to report. +func NewElementIDs(documents []ModelDocument) (*ElementIDs, error) { + graph, res, encoders, err := modelToRDF(documents, IDQualifiedName) + if err != nil { + return nil, err + } + return elementIDsOf(graph, res, encoders), nil +} + +// NewElementIDsOfDocument is NewElementIDs for a model of one document, which +// is converted from its text as a conversion of one document is: parsed +// afresh, in the language its name gives it, then written alone (ToRDF). A +// document the parser cannot read whole converts to nothing, so it is refused. +func NewElementIDsOfDocument(name string, data []byte) (*ElementIDs, error) { + file := source.New(name, data) + p := parser.New(file) + root := p.ParseFile() + if len(p.Diagnostics) > 0 { + return nil, fmt.Errorf("%s: %d syntax error(s)", name, len(p.Diagnostics)) + } + e, err := encodeDocument(file, root, "", IDQualifiedName) + if err != nil { + return nil, err + } + return elementIDsOf(e.graph, e.res, []*encoder{e}), nil +} + +// elementIDsOf records the elementId a converted graph writes for each element, +// by the declaration each encoder wrote it for and by its qualified (or +// positional) name. +func elementIDsOf(graph *rdf.Graph, res *resolve.Resolver, encoders []*encoder) *ElementIDs { + ids := &ElementIDs{byNode: map[ast.Node]string{}, byName: map[string]string{}, res: res, encoders: encoders} + for _, subject := range graph.Subjects() { + name, named := graph.Lexical(subject, rdf.SysML+pQualifiedName) + id, identified := graph.Lexical(subject, rdf.SysML+pElementID) + if named && identified { + ids.byName[name] = id + } + } + for _, e := range encoders { + for node, fqn := range e.fqn { + if id, ok := graph.Lexical(e.ids.subjectForNode(node, fqn), rdf.SysML+pElementID); ok { + ids.byNode[node] = id + } + } + } + return ids +} + +// OfDeclaration is the elementId written for the element declared at decl, +// named fqn: the one its own declaration was written with where the conversion +// encoded that node, else Of(fqn). Two identity scopes may declare one +// qualified name, and the declaration tells their ids apart where the name +// cannot. +func (ids *ElementIDs) OfDeclaration(decl ast.Node, fqn string) (string, bool) { + if ids == nil { + return "", false + } + if decl != nil { + if id, ok := ids.byNode[decl]; ok { + return id, true + } + } + return ids.Of(fqn) +} + +// Of is the elementId written for the element named fqn: the model's own as +// the conversion wrote it, or, for a standard library element the model does +// not declare, the normative id every reference to it carries. False where the +// conversion writes none, as for a library element a model annotates with an +// id of its own, whose references are written by name. +func (ids *ElementIDs) Of(fqn string) (string, bool) { + if ids == nil || fqn == "" { + return "", false + } + if id, ok := ids.byName[fqn]; ok { + return id, true + } + if len(ids.encoders) == 0 || ids.res == nil || ids.res.Index() == nil { + return "", false + } + facts := ids.encoders[0].ids + for _, sym := range ids.res.Index().LookupQualified(fqn) { + if libraryFQN, ok := facts.libraryElement(sym); ok { + return rdf.LocalName(facts.subjectForNode(sym.Decl, libraryFQN).Value), true + } + } + return "", false +} diff --git a/internal/translate/export/end_forms.go b/internal/translate/export/end_forms.go index 2de46efb5a..519d4f99c4 100644 --- a/internal/translate/export/end_forms.go +++ b/internal/translate/export/end_forms.go @@ -425,7 +425,7 @@ func (d *decoder) payloadText(el *element) (string, error) { if d.boolOf(payload, rdf.SysML+"isOrdered") { flags += " ordered" } - if d.boolOf(payload, rdf.SysML+"isNonunique") { + if d.nonunique(payload) { flags += " nonunique" } words := d.identWords(payload) @@ -497,7 +497,7 @@ func (d *decoder) flowPayload(el *element) *element { // flowMetaclasses are the usages whose head takes an `of` clause // (SysML-textual-bnf FlowDeclaration, MessageDeclaration). -var flowMetaclasses = map[string]bool{"FlowUsage": true, "SuccessionFlowUsage": true} +var flowMetaclasses = map[string]bool{mFlowUsage: true, mSuccessionFlowUsage: true} // relatedEnds reads the ends of a head in the order they are written, each // behind the multiplicity it states, with the payload of a flow kept apart: it @@ -637,7 +637,9 @@ func (d *decoder) standardEndFeatures(el *element) ([]rdf.Term, error) { // member is written in its body as `end`, not in its head: the abstract // syntax is the same. func (d *decoder) appendEnd(el *element, terms []rdf.Term, term rdf.Term) []rdf.Term { - if d.declaredChild(el, term) || slices.Contains(terms, term) { + flowEnd := d.byIRI[term.Value] + headFlowEnd := flowEnd != nil && flowEnd.metaclass == mFlowEnd && d.headEnd(flowEnd, el) + if (d.declaredChild(el, term) && !headFlowEnd) || slices.Contains(terms, term) { return terms } return append(terms, term) @@ -866,6 +868,19 @@ func (d *decoder) declaredChild(el *element, term rdf.Term) bool { // standardEndTarget resolves an end through ReferenceSubsetting, then the // interim sysml:references property, refusing conflicting representations. +func referenceSubsettingIndex(graph *rdf.Graph, meta func(rdf.Term) string, subjects []rdf.Term) map[string][]rdf.Term { + index := map[string][]rdf.Term{} + for _, subject := range subjects { + if meta(subject) != mReferenceSubsetting { + continue + } + if referencing, ok := graph.Object(subject, rdf.SysML+pReferencingFeature); ok && referencing.IsIRI() { + index[referencing.Value] = append(index[referencing.Value], subject) + } + } + return index +} + func (d *decoder) standardEndTarget(end rdf.Term, in *element) (rdf.Term, bool, error) { var relationships []rdf.Term appendUnique := func(term rdf.Term) { @@ -882,13 +897,8 @@ func (d *decoder) standardEndTarget(end rdf.Term, in *element) (rdf.Term, bool, } } if len(relationships) == 0 { - for _, subject := range d.graph.Subjects() { - if d.metaclass(subject) != mReferenceSubsetting { - continue - } - if referencing, ok := d.graph.Object(subject, rdf.SysML+pReferencingFeature); ok && referencing == end { - appendUnique(subject) - } + for _, relationship := range d.referenceSubsettings[end.Value] { + appendUnique(relationship) } } var target rdf.Term @@ -981,6 +991,35 @@ func (d *decoder) flowEndText(end rdf.Term, in *element) (string, error) { return text, nil } +func (d *decoder) flowFeatureImplied(el, parent *element) (bool, error) { + if parent == nil || parent.metaclass != mFlowEnd || el.metaclass != mReferenceUsage { + return false, nil + } + membership, owned := d.owningMembership[el.iri] + if !owned || d.metaclass(rdf.IRI(membership.iri)) != mFeatureMembership { + return false, nil + } + subject := rdf.IRI(el.iri) + if d.graph.HasProperty(subject, rdf.SysML+pDeclaredName) || + d.graph.HasProperty(subject, rdf.SysML+pDeclaredShortName) || + len(d.graph.Objects(subject, rdf.SysML+pOwnedAnnotation)) > 0 { + return false, nil + } + relationships := d.graph.Objects(subject, rdf.SysML+pOwnedRelationship) + redefinitions := 0 + for _, relation := range relationships { + meta := d.metaclass(relation) + if meta == mRedefinition { + redefinitions++ + continue + } + if !impliedRelationshipMetaclasses[meta] || !d.graph.BoolValue(relation, rdf.SysML+pIsImplied) { + return false, nil + } + } + return redefinitions == 1, nil +} + // flowEndSegments is the chain a FlowEnd is written as: what its // ReferenceSubsetting names, if anything, then the feature its FlowFeature // redefines. The FlowFeature is found through ownedFeature, else through the @@ -989,6 +1028,18 @@ func (d *decoder) flowEndSegments(end rdf.Term, in *element) ([]rdf.Term, error) refuse := func(note string) ([]rdf.Term, error) { return nil, &UnsupportedError{What: fmt.Sprintf("the flow end <%s> of <%s>", end.Value, in.iri), Note: note} } + if d.graph.HasProperty(end, rdf.SysML+pDeclaredName) || + d.graph.HasProperty(end, rdf.SysML+pDeclaredShortName) || + len(d.graph.Objects(end, rdf.SysML+pOwnedAnnotation)) > 0 { + return refuse("it declares a name or annotations that the `from`/`to` form cannot carry") + } + toolkitFeatures := d.toolkitFlowFeatures(end) + toolkitShape := len(toolkitFeatures) > 0 + if toolkitShape { + if len(toolkitFeatures) != 1 { + return refuse(fmt.Sprintf("it owns %d toolkit FlowFeatures, and a flow end writes exactly one reference chain", len(toolkitFeatures))) + } + } var segments []rdf.Term target, ok, err := d.standardEndTarget(end, in) if err != nil { @@ -1022,9 +1073,124 @@ func (d *decoder) flowEndSegments(end rdf.Term, in *element) ([]rdf.Term, error) if len(redefined) != 1 { return refuse(fmt.Sprintf("its FlowFeature redefines %d features, and a flow end names exactly one", len(redefined))) } + if toolkitShape { + feature := toolkitFeatures[0] + if len(features) != 1 || features[0] != feature { + return refuse("its toolkit FlowFeature is not the only feature the flow end owns") + } + flowFeature, flowEnd := d.byIRI[feature.Value], d.byIRI[end.Value] + if flowFeature == nil || flowEnd == nil { + return refuse("its FlowFeature is not an implied ReferenceUsage owned through a FeatureMembership") + } + implied, err := d.flowFeatureImplied(flowFeature, flowEnd) + if err != nil { + return nil, err + } + if !implied { + return refuse("its FlowFeature is not an implied ReferenceUsage owned through a FeatureMembership") + } + if d.graph.HasProperty(feature, rdf.SysML+pDeclaredName) || + d.graph.HasProperty(feature, rdf.SysML+pDeclaredShortName) || + len(d.graph.Objects(feature, rdf.SysML+pOwnedAnnotation)) > 0 { + return refuse("its FlowFeature declares a name or annotations that the `from`/`to` form cannot carry") + } + if d.graph.HasProperty(feature, rdf.SysML+pValue) { + return refuse("its FlowFeature carries a value that the `from`/`to` form cannot carry") + } + for _, relation := range d.graph.Objects(feature, rdf.SysML+pOwnedRelationship) { + meta := d.metaclass(relation) + if meta == mRedefinition { + continue + } + if !impliedRelationshipMetaclasses[meta] || !d.graph.BoolValue(relation, rdf.SysML+pIsImplied) { + return refuse(fmt.Sprintf("its FlowFeature owns a %s relationship that the `from`/`to` form cannot carry", meta)) + } + } + if name, hasName := d.graph.Lexical(feature, rdf.SysML+pName); hasName { + redefinedName, err := d.flowEndTargetName(redefined[0]) + if err != nil { + return nil, err + } + if name != redefinedName { + return refuse("its FlowFeature's derived name does not match the feature it redefines") + } + } + for _, relation := range d.graph.Objects(end, rdf.SysML+pOwnedRelationship) { + meta := d.metaclass(relation) + switch { + case meta == mReferenceSubsetting, meta == mFeatureMembership: + case impliedRelationshipMetaclasses[meta] && d.graph.BoolValue(relation, rdf.SysML+pIsImplied): + default: + return refuse(fmt.Sprintf("it owns a %s relationship that the `from`/`to` form cannot carry", meta)) + } + } + if name, hasName := d.graph.Lexical(end, rdf.SysML+pName); hasName { + var endRedefined []rdf.Term + endRedefined = append(endRedefined, d.graph.Objects(end, rdf.SysML+relationshipProperty[ast.RelRedefines])...) + if len(endRedefined) == 0 { + for _, relation := range d.graph.Objects(end, rdf.SysML+pOwnedRelationship) { + if d.metaclass(relation) != mRedefinition { + continue + } + if target, ok := d.graph.Object(relation, rdf.SysML+"redefinedFeature"); ok { + endRedefined = append(endRedefined, target) + } + } + } + if len(endRedefined) != 1 { + return refuse(fmt.Sprintf("its derived name has %d redefined features, and a flow end names exactly one", len(endRedefined))) + } + redefinedName, err := d.flowEndTargetName(endRedefined[0]) + if err != nil { + return nil, err + } + if name != redefinedName { + return refuse("its derived name does not match the feature it redefines") + } + } + } return append(segments, redefined[0]), nil } +func (d *decoder) toolkitFlowFeatures(end rdf.Term) []rdf.Term { + var features []rdf.Term + seen := map[string]bool{} + for _, membership := range d.graph.Objects(end, rdf.SysML+pOwnedFeatureMembership) { + if d.metaclass(membership) != mFeatureMembership { + continue + } + feature, ok := d.graph.Object(membership, rdf.SysML+pMemberElement) + if !ok || d.metaclass(feature) != mReferenceUsage { + continue + } + owning, ok := d.owningMembership[feature.Value] + if !ok || owning.iri != membership.Value || seen[feature.Value] { + continue + } + seen[feature.Value] = true + features = append(features, feature) + } + return features +} + +func (d *decoder) flowEndTargetName(target rdf.Term) (string, error) { + if name, ok := d.graph.Lexical(target, rdf.SysML+pName); ok { + return name, nil + } + if !target.IsIRI() { + return "", &UnsupportedError{What: fmt.Sprintf("the flow-end redefinition target %s", target), Note: "it has no name"} + } + el, err := d.referencedElement(target.Value) + if err != nil { + return "", err + } + segments := identitySegments(el.qname) + if len(segments) == 0 { + return "", &UnsupportedError{What: fmt.Sprintf("the flow-end redefinition target <%s>", target.Value), Note: "it has no qualified name"} + } + return identityName(segments[len(segments)-1]), nil +} + // standardEndName renders an end's declared name and ReferencesKeyword. func (d *decoder) standardEndName(end rdf.Term, in *element) (string, error) { keyword := referencesSymbol diff --git a/internal/translate/export/kinds.go b/internal/translate/export/kinds.go index dca8c925c3..af0b4857e7 100644 --- a/internal/translate/export/kinds.go +++ b/internal/translate/export/kinds.go @@ -172,6 +172,11 @@ func declaredMetaclass(decl ast.Node) string { switch n := decl.(type) { case *ast.Namespace: return "Namespace" + case *ast.Package: + if n.IsLibrary { + return mLibraryPackage + } + return mPackage case *ast.Definition: return definitionMetaclass[n.Kind] case *ast.Usage: diff --git a/internal/translate/export/names.go b/internal/translate/export/names.go index 15674c7349..9034e996cd 100644 --- a/internal/translate/export/names.go +++ b/internal/translate/export/names.go @@ -47,12 +47,17 @@ type wanted struct { segments map[segmentKey]bool // starts holds the member each `first` names, keyed by the initial node. starts map[string]string + // variants holds the feature each `variant x;` names, keyed by the variant. + variants map[string]string } type wantedReference struct { qualified, written string // count is how many times the rendering wrote the reference. count int + // qualifiedOnly holds a reference only a qualified name may spell: the + // one-segment spelling reads back as a declared name (`variant x;`). + qualifiedOnly bool } func newWanted() *wanted { @@ -60,11 +65,12 @@ func newWanted() *wanted { references: map[nameKey]wantedReference{}, segments: map[segmentKey]bool{}, starts: map[string]string{}, + variants: map[string]string{}, } } func (w *wanted) empty() bool { - return len(w.references) == 0 && len(w.segments) == 0 && len(w.starts) == 0 + return len(w.references) == 0 && len(w.segments) == 0 && len(w.starts) == 0 && len(w.variants) == 0 } // chooseNames reads a rendering as the language name says, in the place of the @@ -114,29 +120,59 @@ func chooseNames(name, library string, text []byte, want *wanted, previous *name chains = append(chains, ref) continue } - member, target := e.memberOf(ref), e.writtenTarget(ref) - if alias, ok := memberAliases[member]; ok && alias != "" { - member = alias - } + target := e.writtenTarget(ref) if alias, ok := targetAliases[target]; ok && alias != "" { target = alias } - key := nameKey{member: member, target: target} - if _, ok := want.references[key]; !ok && ref.Within == nil { - // A graph written before the payload was a feature states `of T` - // from the flow itself. - if flow := (nameKey{member: e.fqn[ref.Member], target: key.target}); flow != key { - if _, ok := want.references[flow]; ok { - key = flow + memberGroups := e.memberOfCandidates(ref) + var key nameKey + matched := false + for _, members := range memberGroups { + var matches []nameKey + seen := map[nameKey]bool{} + for _, member := range members { + if alias, ok := memberAliases[member]; ok && alias != "" { + member = alias + } + candidate := nameKey{member: member, target: target} + if _, ok := want.references[candidate]; ok && !seen[candidate] { + matches = append(matches, candidate) + seen[candidate] = true } } + if len(matches) > 1 { + return nil, false, &UnsupportedError{ + What: fmt.Sprintf("the reference to %s from %s", target, e.memberOf(ref)), + Note: "the member's qualified name matches multiple graph references, so its spelling cannot be checked unambiguously", + } + } + if len(matches) == 1 { + key, matched = matches[0], true + break + } } - if _, ok := want.references[key]; ok { + if matched { occurrences[key] = append(occurrences[key], ref) continue } - if as := (segmentKey{member: e.memberOf(ref), name: qualifiedText(ref.QN)}); len(writtenAs[as]) > 0 { - roots[as] = append(roots[as], ref) + rootMatched := false + for _, members := range memberGroups { + for _, member := range members { + if alias, ok := memberAliases[member]; ok && alias != "" { + member = alias + } + as := segmentKey{member: member, name: qualifiedText(ref.QN)} + if len(writtenAs[as]) > 0 { + roots[as] = append(roots[as], ref) + rootMatched = true + break + } + } + if rootMatched { + break + } + } + if rootMatched { continue } misread = append(misread, ref) @@ -144,15 +180,31 @@ func chooseNames(name, library string, text []byte, want *wanted, previous *name // A spelling read as another element is still an occurrence of the reference // written that way, unless every writing of it already read back correctly. for _, ref := range misread { - key, ok := written[nameKey{member: e.memberOf(ref), target: qualifiedText(ref.QN)}] - if !ok || len(occurrences[key]) >= want.references[key].count { - continue + found := false + for _, members := range e.memberOfCandidates(ref) { + for _, member := range members { + if alias, ok := memberAliases[member]; ok && alias != "" { + member = alias + } + key, ok := written[nameKey{member: member, target: qualifiedText(ref.QN)}] + if !ok || len(occurrences[key]) >= want.references[key].count { + continue + } + occurrences[key] = append(occurrences[key], ref) + found = true + break + } + if found { + break + } } - occurrences[key] = append(occurrences[key], ref) } if err := e.checkStarts(want.starts, declared); err != nil { return nil, false, err } + if err := e.checkVariants(want.variants, declared); err != nil { + return nil, false, err + } for key := range want.references { if _, ok := occurrences[key]; !ok { // A reference written but never read back cannot be checked to reach @@ -170,6 +222,9 @@ func chooseNames(name, library string, text []byte, want *wanted, previous *name } ref := want.references[key] spellings := referenceSpellings(ref.qualified) + if ref.qualifiedOnly { + spellings = qualifiedSpellings(spellings) + } if previous != nil { spellings = fromWritten(spellings, ref.written) } @@ -248,17 +303,74 @@ func addParserAlias(aliases map[string]string, parsed, identity string) { // declaration itself, or the one whose expression body declares that declaration. func (e *encoder) memberOf(ref resolve.Reference) string { if ref.Within != nil { - return e.fqn[ref.Within] + return e.qualifiedMemberName(ref.Within) + } + if member := e.triggerMembers[ref.Member]; member != "" { + return member } // The type of `flow of T` is the typing of the payload feature the flow // owns, which the graph states it from. if u, ok := ref.Member.(*ast.Usage); ok && u.FlowEnds != nil && u.FlowEnds.PayloadDecl == nil && ref.QN != nil && ast.Node(ref.QN) == u.FlowEnds.Payload { if payload := e.payloadOf(u); payload != nil { - return e.fqn[payload] + return e.qualifiedMemberName(payload) + } + } + return e.qualifiedMemberName(ref.Member) +} + +func (e *encoder) memberOfCandidates(ref resolve.Reference) [][]string { + if ref.Within != nil { + return [][]string{e.memberNameCandidates(ref.Within)} + } + if member := e.triggerMembers[ref.Member]; member != "" { + return [][]string{{member}} + } + if u, ok := ref.Member.(*ast.Usage); ok && u.FlowEnds != nil && u.FlowEnds.PayloadDecl == nil && + ref.QN != nil && ast.Node(ref.QN) == u.FlowEnds.Payload { + if payload := e.payloadOf(u); payload != nil { + return [][]string{e.memberNameCandidates(payload), e.memberNameCandidates(ref.Member)} + } + } + return [][]string{e.memberNameCandidates(ref.Member)} +} + +func (e *encoder) memberNameCandidates(node ast.Node) []string { + qualified, positional := e.qualifiedMemberName(node), e.fqn[node] + if qualified != positional { + return []string{qualified, positional} + } + return []string{qualified} +} + +func (e *encoder) qualifiedMemberName(node ast.Node) string { + fqn := e.fqn[node] + sym := e.ids.declSym[node] + if sym == nil || fqn == "" { + return fqn + } + var chain []*symbols.Symbol + for current := sym; current != nil; { + chain = append(chain, current) + if current.OwnerScope == nil { + break + } + owner := current.OwnerScope.Owner() + if owner == current { + break + } + current = owner + } + segments := identitySegments(fqn) + if len(segments) != len(chain) { + return fqn + } + for i, current := range chain { + if current.EffectiveName() { + segments[len(chain)-1-i] = identitySegment(current.Name) } } - return e.fqn[ref.Member] + return strings.Join(segments, "::") } // writtenKeys indexes the wanted references by the member and the spelling @@ -434,6 +546,17 @@ func segmentSpellings(name, target string) []string { // fromWritten is spellings from the one written on: kept first, then only the // longer ones, so a choice checked in its own rendering never shortens again. +// qualifiedSpellings are the spellings of more than one segment. +func qualifiedSpellings(spellings []string) []string { + var out []string + for _, spelling := range spellings { + if len(identitySegments(strings.TrimPrefix(spelling, "$::"))) > 1 || strings.HasPrefix(spelling, "$::") { + out = append(out, spelling) + } + } + return out +} + func fromWritten(spellings []string, written string) []string { for i, spelling := range spellings { if spelling == written { @@ -503,19 +626,62 @@ func respelledOperand(node ast.Node, chosen map[*ast.QualifiedName]string) (ast. // graph names in the body it is written in. func (e *encoder) checkStarts(starts map[string]string, declared map[string]ast.Node) error { for fqn, target := range starts { - initial, ok := declared[fqn].(*ast.InitialNode) - if !ok { + switch initial := declared[fqn].(type) { + case *ast.InitialNode: + if _, reached, ok := e.linked(e.res.InitialSymbol(initial)); ok && reached == target { + continue + } + return &UnsupportedError{ + What: fmt.Sprintf("the initial node %s", fqn), + Note: fmt.Sprintf("`first %s` does not name %s in the body it is written in, so the notation cannot state it", nameText(initial.Name()), target), + } + case *ast.Usage: + if initial.Kind == ast.UsageSuccession && len(initial.ConnectorEnds) == 2 { + if source, ok := initial.ConnectorEnds[0].Target.(*ast.QualifiedName); ok { + if _, reached, ok := e.linked(e.res.EndSymbol(source)); ok { + if reached == target { + continue + } + return &UnsupportedError{ + What: fmt.Sprintf("the initial node %s", fqn), + Note: fmt.Sprintf("`first %s` does not name %s in the body it is written in, so the notation cannot state it", qualifiedText(source), target), + } + } + } + } + default: return &UnsupportedError{ What: fmt.Sprintf("the initial node %s", fqn), Note: "the notation written for it does not read back as an initial node, so its start cannot be checked", } } - if _, reached, ok := e.linked(e.res.InitialSymbol(initial)); ok && reached == target { - continue - } return &UnsupportedError{ What: fmt.Sprintf("the initial node %s", fqn), - Note: fmt.Sprintf("`first %s` does not name %s in the body it is written in, so the notation cannot state it", nameText(initial.Name()), target), + Note: "the notation written for it does not read back as an initial node, so its start cannot be checked", + } + } + return nil +} + +// checkVariants refuses a `variant x;` written for a variant whose x does not +// reach, from the variation, the feature the variant references. +func (e *encoder) checkVariants(variants map[string]string, declared map[string]ast.Node) error { + for fqn, target := range variants { + usage, ok := declared[fqn].(*ast.Usage) + if !ok || !usage.IsVariantReference() || referencesFeature(usage) { + return &UnsupportedError{ + What: fmt.Sprintf("the variant %s", fqn), + Note: "the notation written for it does not read back as a variant reference, so the feature it names cannot be checked", + } + } + if sym := e.ids.declSym[usage]; sym != nil { + if _, reached, ok := e.linked(e.ids.model.ReferencedFeature(sym), true); ok && reached == target { + continue + } + } + return &UnsupportedError{ + What: fmt.Sprintf("the variant %s", fqn), + Note: fmt.Sprintf("`variant %s` does not name %s from the variation it is written in, so the notation cannot state it", nameText(usage.Ident.Name), target), } } return nil diff --git a/internal/translate/export/rdf_expr.go b/internal/translate/export/rdf_expr.go index 8e5c86bae3..11d1ac1ef9 100644 --- a/internal/translate/export/rdf_expr.go +++ b/internal/translate/export/rdf_expr.go @@ -55,7 +55,7 @@ const ( ) // Properties this mapping adds: argument order, which RDF does not carry, and -// parts the 202407 metamodel rendering has no property for. +// parts the metamodel has no property for. const ( xArgumentIndex = "argumentIndex" xArgumentName = "argumentName" diff --git a/internal/translate/export/rdf_in.go b/internal/translate/export/rdf_in.go index 6c9f02a064..c2542b547f 100644 --- a/internal/translate/export/rdf_in.go +++ b/internal/translate/export/rdf_in.go @@ -85,9 +85,30 @@ type element struct { // UnsupportedError: a converted file that dropped an element would be worse // than a failed conversion. func ToSysML(graph *rdf.Graph) ([]byte, error) { + return ToSysMLWarn(graph, nil) +} + +// ToSysMLWarn converts a graph to notation and reports non-fatal resolutions. +func ToSysMLWarn(graph *rdf.Graph, warn func(string)) ([]byte, error) { + return toSysML(graph, warn, false) +} + +// APIJSONToSysML reads an API element document and converts its owned graph. +func APIJSONToSysML(data []byte, warn func(string)) ([]byte, error) { + graph, err := ReadAPIJSON(data) + if err != nil { + return nil, &APIJSONReadError{err: err} + } + return toSysML(graph, warn, true) +} + +func toSysML(graph *rdf.Graph, warn func(string), owned bool) ([]byte, error) { if graph == nil || graph.Len() == 0 { return nil, &UnsupportedError{What: "an empty graph", Note: "nothing to convert"} } + if !owned { + graph = rdf.NewGraphOf(slices.Clone(graph.Triples()), graph.Prefixes) + } if err := checkExtensionNamespace(graph); err != nil { return nil, err } @@ -105,6 +126,7 @@ func ToSysML(graph *rdf.Graph) ([]byte, error) { if err != nil { return nil, err } + graph.Compact() graph, err = rdf.ReconcileCollections(graph) if err != nil { var malformed *rdf.AnnotationError @@ -122,10 +144,18 @@ func ToSysML(graph *rdf.Graph) ([]byte, error) { if err := checkValueFlags(graph); err != nil { return nil, err } + graph.Compact() + warned := map[string]bool{} + report := func(message string) { + if warn != nil && !warned[message] { + warned[message] = true + warn(message) + } + } // The first rendering writes every reference fully qualified; reading it // chooses each the shortest spelling that reaches its element. Later // renderings are re-read the same way until every spelling still does. - first := newDecoder(graph, metaclasses, nil) + first := newDecoder(graph, metaclasses, nil, report) text, roots, err := first.notation() if err != nil { return nil, err @@ -139,7 +169,7 @@ func ToSysML(graph *rdf.Graph) ([]byte, error) { return nil, err } for { - d := newDecoder(graph, metaclasses, names) + d := newDecoder(graph, metaclasses, names, report) if text, _, err = d.notation(); err != nil { return nil, err } @@ -154,27 +184,36 @@ func ToSysML(graph *rdf.Graph) ([]byte, error) { } } -func newDecoder(graph *rdf.Graph, metaclasses map[rdf.Term]string, names *nameChoices) *decoder { +func newDecoder(graph *rdf.Graph, metaclasses map[rdf.Term]string, names *nameChoices, warn func(string)) *decoder { + subjects := graph.Subjects() + meta := func(term rdf.Term) string { return rdf.LocalName(metaclasses[term]) } d := &decoder{ - graph: graph, - metaclasses: metaclasses, - byIRI: map[string]*element{}, - byID: map[string]*element{}, - dupID: map[string]bool{}, - memberships: map[string]membership{}, - owningMembership: map[string]membership{}, - nodeMemberships: map[string]membership{}, - nodeMembership: map[string]bool{}, - expressionNodes: map[string]bool{}, - featureValues: featureValueIndex(graph, metaclasses), - prefixed: map[*element]bool{}, - names: names, - wanted: newWanted(), - demoted: map[*element]bool{}, - demotedExpr: map[string]bool{}, - folded: map[*element]*element{}, - libraryRefs: map[string]*element{}, - } + graph: graph, + metaclasses: metaclasses, + warn: warn, + byIRI: map[string]*element{}, + byID: map[string]*element{}, + dupID: map[string]bool{}, + memberships: map[string]membership{}, + owningMembership: map[string]membership{}, + nodeMemberships: map[string]membership{}, + nodeMembership: map[string]bool{}, + expressionNodes: map[string]bool{}, + featureValues: featureValueIndex(graph, metaclasses, subjects), + portDefinitions: newPortDefinitionIndex(graph, meta, subjects), + referenceSubsettings: referenceSubsettingIndex(graph, meta, subjects), + prefixed: map[*element]bool{}, + names: names, + wanted: newWanted(), + demoted: map[*element]bool{}, + demotedExpr: map[string]bool{}, + folded: map[*element]*element{}, + libraryCatalog: identity.LibraryCatalog(libs.NewModelIndex()), + libraryRefs: map[string]*element{}, + importedMemberships: map[string]*identity.LibraryElement{}, + ambiguousImports: map[string]bool{}, + } + d.indexImportedMemberships(subjects) return d } @@ -269,7 +308,7 @@ func checkTypes(graph *rdf.Graph) (map[rdf.Term]string, error) { } metaclasses := make(map[rdf.Term]string, len(stated)) for _, subject := range subjects { - class, ok := mostSpecific(stated[subject]) + class, ok := ontology.MostSpecific(stated[subject]) if !ok { return nil, &UnsupportedError{ What: fmt.Sprintf("the subject <%s>", subject.Value), @@ -281,31 +320,6 @@ func checkTypes(graph *rdf.Graph) (map[rdf.Term]string, error) { return metaclasses, nil } -// mostSpecific picks the class among those stated that every other is a -// superclass of, reporting false when there is none. -func mostSpecific(classes []string) (string, bool) { - for _, class := range classes { - specific := true - for _, other := range classes { - if !subclassOf(class, other) { - specific = false - break - } - } - if specific { - return class, true - } - } - return "", false -} - -// subclassOf reports whether the class iri is ancestor or a subclass of it in -// the SysML ontology; a class of this mapping's extension has no superclass. -func subclassOf(class, ancestor string) bool { - return class == ancestor || strings.HasPrefix(class, rdf.SysML) && strings.HasPrefix(ancestor, rdf.SysML) && - ontology.IsAncestorOrSelf(rdf.LocalName(class), rdf.LocalName(ancestor)) -} - // metaclass returns the local name of the class subject is written as, or "" // when it states none. func (d *decoder) metaclass(subject rdf.Term) string { @@ -401,7 +415,7 @@ func checkCardinality(graph *rdf.Graph) error { // checkValueFlags refuses sysml:isDefault or sysml:isInitial, whatever its value, // on a subject with no sysml:value, since the flags spell a feature value's operator. func checkValueFlags(graph *rdf.Graph) error { - featureValues := featureValueIndex(graph, nil) + featureValues := featureValueIndex(graph, nil, graph.Subjects()) for _, triple := range graph.Triples() { predicate := triple.Predicate.Value if predicate != rdf.SysML+pIsDefault && predicate != rdf.SysML+pIsInitial { @@ -424,7 +438,7 @@ func checkValueFlags(graph *rdf.Graph) error { } // featureValueIndex maps each feature to its typed FeatureValue membership. -func featureValueIndex(graph *rdf.Graph, metaclasses map[rdf.Term]string) map[string]rdf.Term { +func featureValueIndex(graph *rdf.Graph, metaclasses map[rdf.Term]string, subjects []rdf.Term) map[string]rdf.Term { index := map[string]rdf.Term{} classOf := func(subject rdf.Term) string { if metaclasses != nil { @@ -434,22 +448,19 @@ func featureValueIndex(graph *rdf.Graph, metaclasses map[rdf.Term]string) map[st } return strings.TrimPrefix(graph.Type(subject), rdf.SysML) } - for _, subject := range graph.Subjects() { - if classOf(subject) != mFeatureValue { - continue - } - for _, feature := range graph.Objects(subject, rdf.SysML+pFeatureWithValue) { - if feature.IsIRI() { - index[feature.Value] = subject + for _, subject := range subjects { + if classOf(subject) == mFeatureValue { + for _, feature := range graph.Objects(subject, rdf.SysML+pFeatureWithValue) { + if feature.IsIRI() { + index[feature.Value] = subject + } } } - } - for _, feature := range graph.Subjects() { for _, property := range []string{pOwnedMembership, pOwnedRelationship} { - for _, membership := range graph.Objects(feature, rdf.SysML+property) { + for _, membership := range graph.Objects(subject, rdf.SysML+property) { if membership.IsIRI() && classOf(membership) == mFeatureValue { - if _, exists := index[feature.Value]; !exists { - index[feature.Value] = membership + if _, exists := index[subject.Value]; !exists { + index[subject.Value] = membership } } } @@ -648,12 +659,14 @@ type decoder struct { dupID map[string]bool // memberships is keyed by membership IRI, and owningMembership by the IRI of // the member each one owns. - memberships map[string]membership - owningMembership map[string]membership - nodeMemberships map[string]membership - nodeMembership map[string]bool - expressionNodes map[string]bool - featureValues map[string]rdf.Term + memberships map[string]membership + owningMembership map[string]membership + nodeMemberships map[string]membership + nodeMembership map[string]bool + expressionNodes map[string]bool + featureValues map[string]rdf.Term + portDefinitions portDefinitionIndex + referenceSubsettings map[string][]rdf.Term // chainOwned indexes the FeatureChaining elements by the chain feature // each names its owningRelatedElement, built on first lookup. chainOwned map[string][]rdf.Term @@ -687,7 +700,11 @@ type decoder struct { // its notation is read in that document's place. library string // libraryRefs holds the library elements references reached by normative id. - libraryRefs map[string]*element + libraryRefs map[string]*element + libraryCatalog *identity.Catalog + importedMemberships map[string]*identity.LibraryElement + ambiguousImports map[string]bool + warn func(string) // written records where each element landed in this pass's notation, the // members of one ahead of it. written []writing @@ -727,7 +744,14 @@ type writing struct { // first: they are what tells an owned Expression from an expression node, and // what owns an element whose graph states ownership from the membership alone. func (d *decoder) build() ([]*element, error) { + stubs, err := d.libraryStubs() + if err != nil { + return nil, err + } for _, subject := range d.graph.Subjects() { + if stubs[subject.Value] { + continue + } if d.isMembership(subject) { if err := d.readMembership(subject); err != nil { return nil, err @@ -736,7 +760,7 @@ func (d *decoder) build() ([]*element, error) { } var order []*element for _, subject := range d.graph.Subjects() { - if d.isMembership(subject) || d.isExpressionNode(subject) || d.isFilterPackageNode(subject) { + if stubs[subject.Value] || d.isMembership(subject) || d.isExpressionNode(subject) || d.isFilterPackageNode(subject) { // A node of an expression graph belongs to the declaration that holds // the expression, not to an element of its own; so does a filter package. continue @@ -1235,16 +1259,96 @@ func (d *decoder) referencedElement(iri string) (*element, error) { return target, nil } +// libraryStubs finds references into the bundled library, not declarations. +func (d *decoder) libraryStubs() (map[string]bool, error) { + stubs := map[string]bool{} + for _, subject := range d.graph.Subjects() { + if !LibraryReference(d.graph, subject) { + continue + } + id := rdf.LocalName(subject.Value) + if stated, ok := d.graph.Lexical(subject, rdf.SysML+pElementID); ok { + id = stated + } + if members := d.graph.Objects(subject, rdf.SysML+pMemberElement); len(members) > 0 { + catalog := d.libraryCatalog + owned, ok := catalog.OwningMembership(id) + member := members[0] + memberName, memberNameKind, hasMemberName := d.librarySubjectName(member) + if !ok && len(members) == 1 && member.IsIRI() && hasMemberName { + if candidate, found := catalog.ElementNamed(memberName); found && d.libraryMetaclassCompatible(member, candidate) { + owned, ok = candidate, true + if d.warn != nil { + d.warn(fmt.Sprintf("the library membership <%s> has id %q, which the bundled standard library does not have; resolved by its %s %s to the owning membership with id %q", + subject.Value, id, memberNameKind, memberName, candidate.OwningMembershipID)) + } + } + } + if !ok { + note := fmt.Sprintf("it is marked sysml:isLibraryElement, but the bundled standard library has no owning membership with id %q", id) + if hasMemberName { + note += fmt.Sprintf(" or member %s %s", memberNameKind, memberName) + } + return nil, &UnsupportedError{ + What: fmt.Sprintf("the library membership <%s>", subject.Value), + Note: note, + } + } + memberID := rdf.LocalName(member.Value) + if stated, ok := d.graph.Lexical(member, rdf.SysML+pElementID); ok { + memberID = stated + } + memberMatches := memberID == owned.ID + if !memberMatches && hasMemberName { + if candidate, found := catalog.ElementNamed(memberName); found { + memberMatches = candidate.ID == owned.ID && d.libraryMetaclassCompatible(member, candidate) + } + } + if len(members) != 1 || !member.IsIRI() || !d.graph.BoolValue(member, rdf.SysML+pIsLibraryElement) || !memberMatches { + return nil, &UnsupportedError{ + What: fmt.Sprintf("the library membership <%s>", subject.Value), + Note: fmt.Sprintf("the bundled standard library gives id %q to the owning membership of %s (id %q), and its memberElement is not that library element", id, owned.FQN, owned.ID), + } + } + stubs[subject.Value] = true + continue + } + lib, ok := d.libraryElement(subject.Value, id) + if !ok { + note := fmt.Sprintf("it is marked sysml:isLibraryElement, but the bundled standard library has no element with id %q", id) + if name, kind, stated := d.librarySubjectName(subject); stated { + note += fmt.Sprintf(" or the stated %s %s", kind, name) + } + return nil, &UnsupportedError{ + What: fmt.Sprintf("the library element <%s>", subject.Value), + Note: note, + } + } + if stated, ok := d.graph.Lexical(subject, rdf.SysML+pQualifiedName); ok && stated != lib.qname { + return nil, &UnsupportedError{ + What: fmt.Sprintf("the library element <%s>", subject.Value), + Note: fmt.Sprintf("the graph names it %s, but the bundled standard library gives id %q to %s", stated, id, lib.qname), + } + } + stubs[subject.Value] = true + } + return stubs, nil +} + // libraryElement is the standard library element whose normative id a reference // names, if the norm fixes id for one; the graph need not define it. func (d *decoder) libraryElement(iri, id string) (*element, bool) { if el, ok := d.libraryRefs[iri]; ok { return el, true } - lib, ok := identity.LibraryCatalog(libs.NewModelIndex()).Element(id) + lib, by, name, ok := d.resolveLibraryElement(iri, id) if !ok { return nil, false } + if by != "" && d.warn != nil { + d.warn(fmt.Sprintf("the library element <%s> has id %q, which the bundled standard library does not have; resolved by its %s %s to the element with id %q", + iri, id, by, name, lib.ID)) + } el := &element{iri: iri, qname: lib.FQN, elementID: lib.ID, library: true} if lib.Symbol != nil { el.metaclass = declaredMetaclass(lib.Symbol.Decl) @@ -1256,6 +1360,125 @@ func (d *decoder) libraryElement(iri, id string) (*element, bool) { return el, true } +func (d *decoder) resolveLibraryElement(iri, id string) (*identity.LibraryElement, string, string, bool) { + if d.libraryCatalog == nil { + return nil, "", "", false + } + if lib, ok := d.libraryCatalog.Element(id); ok { + return lib, "", "", d.libraryMetaclassCompatible(rdf.IRI(iri), lib) + } + subject := rdf.IRI(iri) + if name, by, stated := d.librarySubjectName(subject); stated { + if name == "" { + return nil, "", "", false + } + lib, ok := d.libraryCatalog.ElementNamed(name) + if !ok { + lib, ok = d.libraryCatalog.RootNamed(name) + } + if !ok || !d.libraryMetaclassCompatible(subject, lib) { + return nil, "", "", false + } + return lib, by, name, true + } + if lib, ok := d.importedMembershipTarget(iri); ok { + return lib, "qualified name", lib.FQN, true + } + return nil, "", "", false +} + +func (d *decoder) librarySubjectName(subject rdf.Term) (string, string, bool) { + if name, ok := d.graph.Lexical(subject, rdf.SysML+pQualifiedName); ok { + return name, "qualified name", true + } + var names []string + seen := map[string]bool{} + for current := subject; current.IsIRI(); { + if seen[current.Value] { + return "", "", false + } + seen[current.Value] = true + if name, ok := d.graph.Lexical(current, rdf.SysML+pQualifiedName); ok { + return name + qualifiedNameSuffix(names), "name and owners", len(names) > 0 + } + name, ok := d.graph.Lexical(current, rdf.SysML+pDeclaredName) + if !ok || name == "" { + return "", "", false + } + names = append([]string{name}, names...) + current = d.libraryOwner(current) + } + if len(names) == 0 { + return "", "", false + } + return strings.Join(names, "::"), "name and owners", true +} + +func qualifiedNameSuffix(names []string) string { + if len(names) == 0 { + return "" + } + return "::" + strings.Join(names, "::") +} + +func (d *decoder) libraryOwner(subject rdf.Term) rdf.Term { + if owner := firstIRI(d.graph, subject, pOwner, pOwningRelatedElement, pMembershipOwningNamespace, "owningNamespace"); owner.Value != "" { + return owner + } + if relationship := firstIRI(d.graph, subject, pOwningRelationship); relationship.Value != "" { + return firstIRI(d.graph, relationship, pMembershipOwningNamespace, pOwningRelatedElement, pOwner) + } + return rdf.Term{} +} + +func (d *decoder) libraryMetaclassCompatible(subject rdf.Term, lib *identity.LibraryElement) bool { + stated := d.metaclass(subject) + if stated == "" { + return true + } + if lib.Symbol == nil { + return false + } + expected := declaredMetaclass(lib.Symbol.Decl) + return expected != "" && ontology.IsAncestorOrSelf(stated, expected) +} + +func (d *decoder) importedMembershipTarget(iri string) (*identity.LibraryElement, bool) { + if d.ambiguousImports[iri] { + return nil, false + } + target, ok := d.importedMemberships[iri] + return target, ok +} + +func (d *decoder) indexImportedMemberships(subjects []rdf.Term) { + for _, subject := range subjects { + if d.metaclass(subject) != mMembershipImport { + continue + } + membership, ok := d.graph.Object(subject, rdf.SysML+pImportedMembership) + if !ok || !membership.IsIRI() { + continue + } + imported, ok := d.graph.Object(subject, rdf.SysML+pImportedElement) + if !ok || !imported.IsIRI() { + continue + } + candidate, ok := d.libraryCatalog.Element(rdf.LocalName(imported.Value)) + if !ok || !d.libraryMetaclassCompatible(imported, candidate) { + continue + } + if previous := d.importedMemberships[membership.Value]; previous != nil && previous.ID != candidate.ID { + delete(d.importedMemberships, membership.Value) + d.ambiguousImports[membership.Value] = true + continue + } + if !d.ambiguousImports[membership.Value] { + d.importedMemberships[membership.Value] = candidate + } + } +} + // checkMembershipEnds refuses a membership whose end is no element of the graph: // the member would be left out of the output and the edge lost with it. func (d *decoder) checkMembershipEnds() error { @@ -1573,6 +1796,14 @@ func (d *decoder) head(el *element) (string, error) { return d.memberPrefixed(el, head) } +// featuresUndeclaredIn202407 are the SysML Feature metaclasses the 202407 metamodel +// table did not declare, so an earlier mapping never owned them as features. +var featuresUndeclaredIn202407 = map[string]bool{ + "ConstructorExpression": true, "FlowEnd": true, "FlowUsage": true, "IndexExpression": true, + "InstantiationExpression": true, "PayloadFeature": true, "SuccessionFlowUsage": true, + "TerminateActionUsage": true, +} + // typeFeatureMember reports whether a type owns el, a feature, through a plain // OwningMembership rather than a FeatureMembership (KerML.xtext TypeFeatureMember). func (d *decoder) typeFeatureMember(el *element) bool { @@ -1585,6 +1816,11 @@ func (d *decoder) typeFeatureMember(el *element) bool { if d.boolOf(el, rdf.SysML+"isVariant") || d.enumeratedValue(el) || d.ownedCrossFeature(el.owner) == el { return false } + // A mapping predating these metaclasses owned them through a plain + // OwningMembership; SysML has no `member`, so that shape is a plain feature. + if !d.kerml(el) && featuresUndeclaredIn202407[el.metaclass] { + return false + } m, owned := d.owningMembership[el.iri] return owned && d.metaclass(rdf.IRI(m.iri)) == mOwningMembership } @@ -1702,8 +1938,10 @@ func (d *decoder) declarationHead(el *element) (string, error) { // order survives the round trip. A `succession` declaration whose head was // kept verbatim never reaches here — print() writes its source text. // A `succession` declaration that states the form its ends are written in - // is a head that binds ends, not an edge between two members. - if el.metaclass == mSuccession && (!d.statesEnds(el) || d.positionalSuccession(el)) { + // is a head that binds ends, not an edge between two members. The + // keyword-less `first a then b` owns its ends too, and is written by its + // source and target once they agree with them. + if el.metaclass == mSuccession && (!d.statesEnds(el) || d.positionalSuccession(el) || d.initialNode(el)) { return d.successionHead(el) } // A control node, statement, state or region: the behavioral half of the @@ -1769,11 +2007,10 @@ func (d *decoder) definitionHead(el *element, kind ast.DefinitionKind) (string, if keyword := d.visibility(el); keyword != "" { words = append(words, keyword) } - if d.boolOf(el, rdf.SysML+"isAbstract") { + if d.boolOf(el, rdf.SysML+"isAbstract") && kind != ast.DefEnumeration { words = append(words, "abstract") } - // An enumeration definition is a variation by what it is, not by a keyword - // (SysML v2 EnumerationDefinition); its isVariation writes nothing back. + // The enumeration grammar has no `abstract` or `variation` prefix. if d.boolOf(el, rdf.SysML+"isVariation") && kind != ast.DefEnumeration { words = append(words, "variation") } @@ -1859,7 +2096,8 @@ func (d *decoder) usageHead(el *element, kind ast.UsageKind) (string, error) { // without the word, which only an explicit direction earns. words = append(words, direction) } - keyword := d.keywordOr(el, usageKeyword(kind)) + canonicalKeyword := usageKeyword(kind) + keyword := d.keywordOr(el, canonicalKeyword) // A `message` is the flow whose ends are event occurrences it owns as // parameters; their metaclass says `message` where the graph states none. if kind == ast.UsageFlow && keyword == usageKeyword(kind) { @@ -1899,9 +2137,31 @@ func (d *decoder) usageHead(el *element, kind ast.UsageKind) (string, error) { identWords = append(identWords, implicitName) } } - references, err := d.referenceList(el, rdf.SysML+relationshipProperty[ast.RelReferences]) - if err != nil { - return "", err + // An unnamed variant ReferenceUsage that references a feature is a + // VariantReference (SysML-textual-bnf :343-345), written `variant x;` with + // no kind keyword of its own, whether or not the graph records `variant`. + referenceTerms := d.graph.Objects(rdf.IRI(el.iri), rdf.SysML+relationshipProperty[ast.RelReferences]) + variantReference := el.metaclass == mReferenceUsage && d.boolOf(el, rdf.SysML+"isVariant") && + len(identWords) == 0 && len(referenceTerms) > 0 + variantName := "" + if variantReference { + keyword = "variant" + if variantName, err = d.variantName(el, referenceTerms); err != nil { + return "", err + } + } + var references []string + if variantName == "" { + if references, err = d.referenceList(el, rdf.SysML+relationshipProperty[ast.RelReferences]); err != nil { + return "", err + } + } + if variantReference && variantName == "" { + // Written as its reference, a variant's one-segment name would read + // back as `variant x;` naming itself: the reference is qualified. + if references, err = d.qualifiedReferences(el, referenceTerms, references); err != nil { + return "", err + } } portion, err := d.portionKind(el) if err != nil { @@ -1918,6 +2178,11 @@ func (d *decoder) usageHead(el *element, kind ast.UsageKind) (string, error) { if err != nil { return "", err } + // `variant` is a member keyword: the usage prefix it carries follows it + // (`variant ref x;`), so as the head's keyword it is written with the + // modifiers, ahead of them, rather than after them in the keyword's place. + isVariant := d.boolOf(el, rdf.SysML+"isVariant") && !d.enumeratedValue(el) + variantFirst := keyword == "variant" && isVariant for _, flag := range []struct { keyword string set bool @@ -1925,7 +2190,7 @@ func (d *decoder) usageHead(el *element, kind ast.UsageKind) (string, error) { {"variation", d.boolOf(el, rdf.SysML+"isVariation")}, // An enumerated value is a variant by what it is, not by a keyword // (SysML.xtext EnumerationUsageMember); its isVariant writes nothing back. - {"variant", d.boolOf(el, rdf.SysML+"isVariant") && !d.enumeratedValue(el)}, + {"variant", isVariant}, // `portion` is composite and stands in for `composite` // (KerML.xtext BasicFeaturePrefix `isComposite ?= 'composite' | isPortion ?= 'portion'`). {"portion", isPortion}, @@ -1937,11 +2202,12 @@ func (d *decoder) usageHead(el *element, kind ast.UsageKind) (string, error) { {"timeslice", portion == "timeslice"}, {"event", event}, {"end", d.boolOf(el, rdf.SysML+"isEnd")}, - {"ref", d.boolOf(el, rdf.SysML+"isReference")}, + // A VariantReference is a reference usage by what it is. + {"ref", d.boolOf(el, rdf.SysML+"isReference") && !variantReference}, } { // A keyword such as `snapshot` is both a modifier and a kind keyword; // writing it here as well as below would declare it twice. - if flag.keyword == keyword { + if flag.keyword == keyword && !variantFirst { continue } if flag.set { @@ -1959,6 +2225,9 @@ func (d *decoder) usageHead(el *element, kind ast.UsageKind) (string, error) { } } } + if variantFirst { + keyword = "" + } // Prefix metadata ends the usage prefix, ahead of the kind keyword // (SysML.xtext UsagePrefix `UnextendedUsagePrefix UsageExtensionKeyword*`); // a subject, actor, stakeholder or objective takes it after its keyword @@ -2100,6 +2369,20 @@ func (d *decoder) usageHead(el *element, kind ast.UsageKind) (string, error) { } words = append(words, strings.Join(satisfyTargets, ", ")) skip = append(skip, ast.RelSubsets) + subjects, err := d.referenceList(el, rdf.SysML+relationshipProperty[ast.RelSubject]) + if err != nil { + return "", err + } + if len(subjects) > 1 { + return "", &UnsupportedError{ + What: fmt.Sprintf("the satisfy usage <%s>", el.iri), + Note: "its subject parameter states more than one `by` reference", + } + } + if len(subjects) == 1 { + words = append(words, "by", subjects[0]) + skip = append(skip, ast.RelSubject) + } case kind == ast.UsageSatisfy: words = append(words, "requirement") } @@ -2146,7 +2429,7 @@ func (d *decoder) usageHead(el *element, kind ast.UsageKind) (string, error) { // A `perform` or a state's `entry`/`do`/`exit` names the action it performs, // declaring no name of its own (SysML.xtext PerformActionUsageDeclaration), // as `event m.start` and `assert c` name an occurrence or a constraint. - referencing := referenceMemberKeyword(keyword) || keyword == "event" || asserted + referencing := referenceMemberKeyword(keyword) || keyword == "event" || asserted || variantReference if referencing && len(identWords) > 0 && !asserted { // `event e;` names the `e` it refers to; a declared `e` spells its kind // keyword out (`event occurrence e;`), which the graph does not state. @@ -2155,7 +2438,7 @@ func (d *decoder) usageHead(el *element, kind ast.UsageKind) (string, error) { Note: fmt.Sprintf("it declares a name (sysml:declaredName), which `%s` written as the kind keyword cannot: `%s ` names the feature it refers to, and a declaration is written `%s %s `, so the notation would come back as a reference to a different element", keyword, keyword, keyword, usageKeyword(kind)), } } - if referencing && len(identWords) == 0 && len(references) == 0 { + if referencing && len(identWords) == 0 && len(references) == 0 && variantName == "" { // With neither, `perform;` would come back as a feature named `perform`. written := keyword if asserted { @@ -2168,7 +2451,11 @@ func (d *decoder) usageHead(el *element, kind ast.UsageKind) (string, error) { } referenced := referencing && len(identWords) == 0 if referenced { - words = append(words, strings.Join(references, ", ")) + if variantName != "" { + words = append(words, variantName) + } else { + words = append(words, strings.Join(references, ", ")) + } skip = append(skip, ast.RelReferences) // A qualified usage's redefinition follows the reference as `:>>` // (SysML.xtext PerformActionUsageDeclaration & co.); `event` spells it. @@ -2192,7 +2479,7 @@ func (d *decoder) usageHead(el *element, kind ast.UsageKind) (string, error) { if d.boolOf(el, rdf.SysML+"isOrdered") { multPart += " ordered" } - if d.boolOf(el, rdf.SysML+"isNonunique") { + if d.nonunique(el) { multPart += " nonunique" } typed, err := d.referenceList(el, rdf.SysML+relationshipProperty[ast.RelTyping]) @@ -2228,6 +2515,16 @@ func (d *decoder) usageHead(el *element, kind ast.UsageKind) (string, error) { typedPart = "" skip = append(skip, ast.RelTyping) } + if isResult && el.metaclass == mReferenceUsage { + subsets, err := d.referenceList(el, rdf.SysML+relationshipProperty[ast.RelSubsets]) + if err != nil { + return "", err + } + if len(subsets) > 0 { + words = append(words, ":>", strings.Join(subsets, ", ")) + skip = append(skip, ast.RelSubsets) + } + } relationships, err := d.relationshipWords(el, typedPart, skip...) if err != nil { return "", err @@ -2529,7 +2826,11 @@ func (d *decoder) importHead(el *element) (string, error) { return "", err } if imported == "" { - return "", d.missing(target, sysmlPrefix+pImportedNamespace, "an import names the namespace or membership it imports") + property := pImportedNamespace + if target.metaclass == mMembershipImport || target.metaclass == mMembershipExpose { + property = pImportedMembership + } + return "", d.missing(target, sysmlPrefix+property, "an import names the namespace or membership it imports") } // `P::*::**` imports the members of P recursively; `P::**` imports P itself // and, recursively, its members. An older graph states the kind of an @@ -2665,6 +2966,19 @@ func (d *decoder) importedName(el *element) (string, error) { } } if len(memberships) == 0 { + if membershipClass { + elements := d.graph.Objects(subject, rdf.SysML+pImportedElement) + if len(elements) > 1 { + return "", &UnsupportedError{ + What: fmt.Sprintf("the import <%s>", el.iri), + Note: fmt.Sprintf("a membership import names one element, and it states %d %s%s values", len(elements), sysmlPrefix, pImportedElement), + } + } + if len(elements) == 1 { + return d.referenceName(elements[0], el) + } + return "", nil + } return d.referenceText(el, rdf.SysML+pImportedNamespace) } term := memberships[0] @@ -2910,6 +3224,98 @@ func (d *decoder) implicitRedefinitionName(el *element) (string, error) { return nameText(name), nil } +// qualifiedReferences respells, in more than one segment, each written +// reference among el's terms whose element the graph links, and wants every +// later spelling of it qualified too. +func (d *decoder) qualifiedReferences(el *element, terms []rdf.Term, written []string) ([]string, error) { + if len(terms) != len(written) { + return written, nil + } + out := slices.Clone(written) + for i, term := range terms { + if term.IsLiteral() { + continue + } + if isChain, err := d.chainFeatureTerm(term); err != nil { + return nil, err + } else if isChain { + continue + } + target, err := d.referencedElement(term.Value) + if err != nil { + return nil, err + } + key := nameKey{member: d.writtenQName(el), target: target.qname} + ref, ok := d.wanted.references[key] + if !ok { + continue + } + ref.qualifiedOnly = true + if spellings := qualifiedSpellings([]string{ref.written}); len(spellings) == 0 { + if qualified := qualifiedSpellings(referenceSpellings(ref.qualified)); len(qualified) > 0 { + ref.written = qualified[0] + out[i] = qualifiedNameText(ref.written) + } + } + d.wanted.references[key] = ref + } + return out, nil +} + +// literalVariantName writes a variant whose reference the graph keeps as a +// name it does not link (an unresolved `variant x;`): a single name only for +// the variant that answers to it, since `variant x;` is read as that variant. +// A qualified name is written as the reference form; any other single name is +// refused, as no notation states it. +func (d *decoder) literalVariantName(el *element, term rdf.Term) (string, error) { + segments := identitySegments(term.Value) + if len(segments) != 1 { + return "", nil + } + name := identityName(segments[0]) + if lastName(d.writtenQName(el)) == name { + return nameText(name), nil + } + return "", &UnsupportedError{ + What: fmt.Sprintf("the variant <%s>", el.iri), + Note: fmt.Sprintf("it references the name %q, which the graph links to no element: `variant %s;` would be a variant named %s, which it is not, and a single name has no reference form", term.Value, term.Value, term.Value), + } +} + +// lastName is the decoded name of a qualified name's last segment, so a +// quoted `'a::b'` compares as the one name it is. +func lastName(qname string) string { + segments := identitySegments(qname) + return identityName(segments[len(segments)-1]) +} + +// variantName is the name a VariantReference is written by, `variant x;`: the +// name of the one feature it references, when that is also the name the +// variant answers to; the check that x reaches that feature from the variation +// is wanted of the rendering. Empty when the reference is written instead +// (`variant P::x;`, `variant a.b;`). +func (d *decoder) variantName(el *element, terms []rdf.Term) (string, error) { + if len(terms) != 1 { + return "", nil + } + if terms[0].IsLiteral() { + return d.literalVariantName(el, terms[0]) + } + if isChain, err := d.chainFeatureTerm(terms[0]); err != nil || isChain { + return "", err + } + target, name, err := d.namedMember(terms[0]) + if err != nil { + return "", err + } + qname := d.writtenQName(el) + if lastName(qname) != name { + return "", nil + } + d.wanted.variants[qname] = target.qname + return nameText(name), nil +} + // metadataBodyMember reports whether el is a `text = "…"` line inside a // metadata body: a ReferenceUsage owned through a FeatureMembership under a // MetadataUsage, declaring no kind keyword of its own. @@ -3065,6 +3471,11 @@ func (d *decoder) identWords(el *element) []string { // implicit metadata-body name — when the rendering's anonymous index names it, // as the name the member's position reads it as. func (d *decoder) writtenQName(el *element) string { + if el.owner != nil && el.owner.metaclass == mAcceptAction && + d.transitionFeatureKind(el.owner) == "trigger" && + el.owner.owner != nil && el.owner.owner.metaclass == mTransition { + return d.writtenQName(el.owner.owner) + } q := el.qname i := strings.LastIndex(q, "::") if i < 0 || strings.HasPrefix(q[i+len("::"):], "@") { @@ -3274,7 +3685,8 @@ func (d *decoder) bodyChildren(el *element) []*element { payload := d.flowPayload(el) var out []*element for _, child := range el.children { - if child != cross && child != payload && !child.implied && d.metadataSigil(child) != "#" { + headEnd := child.metaclass == mFlowEnd && d.headEnd(child, el) + if child != cross && child != payload && !headEnd && !child.implied && d.metadataSigil(child) != "#" { out = append(out, child) } } @@ -3316,13 +3728,11 @@ func (d *decoder) crossFeatureWords(cross *element) ([]string, error) { case mult != "": words = append(words, mult) } - for _, flag := range []struct { - property string - keyword string - }{{"isOrdered", "ordered"}, {"isNonunique", "nonunique"}} { - if d.boolOf(cross, rdf.SysML+flag.property) { - words = append(words, flag.keyword) - } + if d.boolOf(cross, rdf.SysML+"isOrdered") { + words = append(words, "ordered") + } + if d.nonunique(cross) { + words = append(words, "nonunique") } if len(words) == 0 { return nil, &UnsupportedError{ @@ -3876,6 +4286,15 @@ func (d *decoder) boolOf(el *element, property string) bool { return false } +// nonunique reads `nonunique` from Feature::isUnique false, or from the +// isNonunique an earlier mapping wrote for it. +func (d *decoder) nonunique(el *element) bool { + if unique, stated := d.graph.Lexical(rdf.IRI(el.iri), rdf.SysML+pIsUnique); stated { + return unique == "false" || unique == "0" + } + return d.boolOf(el, rdf.SysML+"isNonunique") +} + // declaresUsage reports whether el is a usage declaration rather than a body // statement of the same metaclass: every declaration states sysx:hasBody. func (d *decoder) declaresUsage(el *element) bool { diff --git a/internal/translate/export/rdf_in_normative.go b/internal/translate/export/rdf_in_normative.go index c96910ab66..770d910244 100644 --- a/internal/translate/export/rdf_in_normative.go +++ b/internal/translate/export/rdf_in_normative.go @@ -26,7 +26,7 @@ func (d *decoder) collapsedTargets(el *element) []rdf.Term { for _, object := range d.graph.Objects(rdf.IRI(el.iri), rdf.SysML+property) { if el.metaclass == mConjugatedPortTyping { if object.IsIRI() { - object = originalPortDefinition(d.graph, d.metaclass, rdf.IRI(el.iri), object) + object = d.portDefinitions.original(d.graph, d.metaclass, rdf.IRI(el.iri), object) } else { object = rdf.String(strings.TrimPrefix(object.Value, "~")) } @@ -125,6 +125,8 @@ func (d *decoder) normativeImplied(el, parent *element) (bool, error) { return true, d.verifyConjugated(el, parent) case parent != nil && parent.metaclass == mTransition: return d.transitionImplied(el, parent) + case parent != nil && parent.metaclass == mFlowEnd: + return d.flowFeatureImplied(el, parent) case d.headEnd(el, parent): return true, nil case el.metaclass == mReferenceUsage: @@ -731,6 +733,18 @@ func (d *decoder) verifyReferentMembership(subject rdf.Term) error { Note: "it owns no element, so the expression it relates cannot be told", } } + // A transition's FeatureChainMember names its source state, the member + // sysml:source restates. + if d.metaclass(owner) == mTransition { + source, ok := d.graph.Object(owner, rdf.SysML+pSource) + if !ok || source == member || !source.IsIRI() { + return nil + } + return &UnsupportedError{ + What: fmt.Sprintf("the membership <%s>", subject.Value), + Note: fmt.Sprintf("its member is <%s>, and the transition <%s> it names the source of states sysml:source <%s>; the notation writes the source once, so writing one would drop the other", member.Value, owner.Value, source.Value), + } + } stated := false for _, property := range []string{pReferent, pTargetFeature, pFunction} { objects := d.graph.Objects(owner, rdf.SysML+property) @@ -808,15 +822,60 @@ func (d *decoder) rangeOwner(subject rdf.Term) (rdf.Term, bool) { return rdf.IRI(m.owner), true } -// headEnd reports whether el is an unnamed end a connector owns through an -// EndFeatureMembership: the head writes it (`connect a to b`, `first a then b`). +// sameEndpoint reports whether a transition's collapsed endpoint and the one +// its structure states agree. A head that is itself a chain names that chain, +// so the structure must state the same links; a head that is a feature is what +// a structural chain (`first a.b`, `then b.c`) reaches, its last link. +func (d *decoder) sameEndpoint(head, structural rdf.Term) (bool, error) { + headLinks, err := d.chainLinksOrSelf(head) + if err != nil { + return false, err + } + links, err := d.chainLinksOrSelf(structural) + if err != nil { + return false, err + } + if len(headLinks) > 1 { + return slices.Equal(headLinks, links), nil + } + return headLinks[0] == links[len(links)-1], nil +} + +// chainLinksOrSelf is the ordered links of a chain feature, or term alone +// when it is no chain. +func (d *decoder) chainLinksOrSelf(term rdf.Term) ([]rdf.Term, error) { + if !term.IsIRI() { + return []rdf.Term{term}, nil + } + isChain, err := d.chainFeatureTerm(term) + if err != nil || !isChain { + return []rdf.Term{term}, err + } + links, err := d.chainSegments(term) + if err != nil || len(links) == 0 { + return []rdf.Term{term}, err + } + return links, nil +} + +// headEnd reports whether an end owned through EndFeatureMembership is written +// in the connector or flow head. func (d *decoder) headEnd(el, parent *element) bool { - if parent == nil || !ontology.IsAncestorOrSelf(parent.metaclass, "Connector") || - !d.boolOf(el, rdf.SysML+pIsEnd) || d.graph.HasProperty(rdf.IRI(el.iri), rdf.SysML+pDeclaredName) { + if parent == nil || !d.boolOf(el, rdf.SysML+pIsEnd) { return false } m, owned := d.owningMembership[el.iri] - return owned && d.metaclass(rdf.IRI(m.iri)) == mEndFeatureMembership + if !owned || d.metaclass(rdf.IRI(m.iri)) != mEndFeatureMembership { + return false + } + if el.metaclass == mFlowEnd { + switch parent.metaclass { + case mFlow, mFlowUsage, mSuccessionFlow, mSuccessionFlowUsage: + return true + } + } + return ontology.IsAncestorOrSelf(parent.metaclass, "Connector") && + !d.graph.HasProperty(rdf.IRI(el.iri), rdf.SysML+pDeclaredName) } // transitionImplied classifies a child of a TransitionUsage against the head @@ -837,7 +896,11 @@ func (d *decoder) transitionImplied(el, parent *element) (bool, error) { if err != nil || !hasHead { return false, err } - if stated != head { + same, err := d.sameEndpoint(head, stated) + if err != nil { + return false, err + } + if !same { return false, &UnsupportedError{ What: what, Note: fmt.Sprintf("its head states <%s> as its %s while its owned %s refers to <%s>, and writing one would drop the other", head.Value, role, el.metaclass, stated.Value), @@ -852,10 +915,64 @@ func (d *decoder) transitionImplied(el, parent *element) (bool, error) { return false, nil } return agree(pSource, source, "source") - case el.metaclass == mReferenceUsage && owning == mParameterMembership: - direction, _ := d.stringOf(el, rdf.SysML+pDirection) - return direction == "in" && !d.graph.HasProperty(subject, rdf.SysML+pDeclaredName) && - len(d.graph.Objects(subject, rdf.SysML+pOwnedRelationship)) == 0, nil + case el.metaclass == mFeature && owning == mOwningMembership: + // `first a.b`: the FeatureChainMember owns the chain it names. + if isChain, err := d.chainFeatureTerm(subject); err != nil || !isChain { + return false, err + } + return agree(pSource, subject, "source") + case el.metaclass == mReferenceUsage && + (owning == mParameterMembership || owning == mFeatureMembership): + direction, stated := d.stringOf(el, rdf.SysML+pDirection) + if (direction != "in" && stated) || d.graph.HasProperty(subject, rdf.SysML+pDeclaredName) || + d.graph.HasProperty(subject, rdf.SysML+pDeclaredShortName) { + return false, nil + } + if len(d.graph.Objects(subject, rdf.SysML+pOwnedRelationship)) == 0 { + return owning == mParameterMembership, nil + } + if parent == nil || parent.metaclass != mTransition { + return false, nil + } + if len(d.graph.Objects(subject, rdf.SysML+pOwnedAnnotation)) > 0 { + return false, nil + } + hasRedefinition, matchesTransitionSource := false, false + for _, relation := range d.graph.Objects(subject, rdf.SysML+pOwnedRelationship) { + relationMeta := d.metaclass(relation) + if relationMeta == mRedefinition { + if !d.graph.BoolValue(relation, rdf.SysML+pIsImplied) { + return false, nil + } + hasRedefinition = true + target := firstIRI(d.graph, relation, "redefinedFeature", pSubsettedFeature, pGeneral, pTarget) + if target.Value != "" { + feature, err := d.referencedElement(target.Value) + if err != nil { + return false, err + } + matchesTransitionSource = matchesTransitionSource || + feature.qname == qualifiedText(libraryTransitionLinkSource) + } + continue + } + if !d.graph.BoolValue(relation, rdf.SysML+pIsImplied) && + !impliedRelationshipMetaclasses[relationMeta] { + return false, nil + } + } + if hasRedefinition { + return matchesTransitionSource, nil + } + if owning != mParameterMembership { + return false, nil + } + name, ok := d.stringOf(el, rdf.SysML+pName) + if !ok || name != "transitionLinkSource" { + return false, nil + } + return d.graph.HasProperty(rdf.IRI(parent.iri), rdf.SysML+pSource) || + d.graph.HasProperty(rdf.IRI(parent.iri), rdf.SysML+pSourceFeature), nil case el.metaclass == mAcceptAction && owning == mTransitionFeatureMembership: kind, _ := d.graph.Lexical(rdf.IRI(m.iri), rdf.SysML+pKind) if kind != "trigger" { diff --git a/internal/translate/export/rdf_in_toolkit.go b/internal/translate/export/rdf_in_toolkit.go index c14c021817..523ff0c31c 100644 --- a/internal/translate/export/rdf_in_toolkit.go +++ b/internal/translate/export/rdf_in_toolkit.go @@ -54,24 +54,54 @@ func firstObject(graph *rdf.Graph, subject rdf.Term, properties ...string) rdf.T return rdf.Term{} } -// originalPortDefinition is the PortDefinition a ConjugatedPortTyping's `~P` -// names: its stated portDefinition when that is a definition (the toolkit -// points it at the typing itself), else the conjugate's original. -func originalPortDefinition(graph *rdf.Graph, meta func(rdf.Term) string, typing, conjugated rdf.Term) rdf.Term { +// portDefinitionIndex keeps the graph order of definitions a conjugated type names. +type portDefinitionIndex map[string][]portDefinitionCandidate + +type portDefinitionCandidate struct { + subject rdf.Term + original rdf.Term + definition bool +} + +func newPortDefinitionIndex(graph *rdf.Graph, meta func(rdf.Term) string, subjects []rdf.Term) portDefinitionIndex { + index := portDefinitionIndex{} + for _, subject := range subjects { + conjugatedType := rdf.Term{} + if meta(subject) == mPortConjugation { + conjugatedType = firstIRI(graph, subject, pConjugatedType) + } + conjugatedDefinition := firstIRI(graph, subject, pConjugatedPortDefinition) + if conjugatedType.Value != "" { + index[conjugatedType.Value] = append(index[conjugatedType.Value], portDefinitionCandidate{ + subject: subject, + original: firstIRI(graph, subject, pOriginalPortDefinition, pOriginalType), + definition: conjugatedDefinition == conjugatedType, + }) + } + if conjugatedDefinition.Value != "" && conjugatedDefinition != conjugatedType { + index[conjugatedDefinition.Value] = append(index[conjugatedDefinition.Value], portDefinitionCandidate{ + subject: subject, + definition: true, + }) + } + } + return index +} + +// original is the PortDefinition a ConjugatedPortTyping's `~P` names. +func (index portDefinitionIndex) original(graph *rdf.Graph, meta func(rdf.Term) string, typing, conjugated rdf.Term) rdf.Term { if stated := firstIRI(graph, typing, pPortDefinition); stated.Value != "" && meta(stated) != mConjugatedPortTyping { return stated } if conjugated.Value == "" || meta(conjugated) != mConjugatedPortDefinition { return conjugated } - for _, subject := range graph.Subjects() { - if meta(subject) == mPortConjugation && firstIRI(graph, subject, pConjugatedType) == conjugated { - if original := firstIRI(graph, subject, pOriginalPortDefinition, pOriginalType); original.Value != "" { - return original - } + for _, candidate := range index[conjugated.Value] { + if candidate.original.Value != "" { + return candidate.original } - if firstIRI(graph, subject, pConjugatedPortDefinition) == conjugated { - return subject + if candidate.definition { + return candidate.subject } } if ms := firstIRI(graph, conjugated, pOwningRelationship, pOwningMembership); ms.Value != "" { @@ -225,10 +255,8 @@ func lastSegmentText(qname string) string { return nameText(identityName(segments[len(segments)-1])) } -// deriveNormativeGraph runs the whole normalization over the graph and -// returns the completed graph: a copy first, since the sparse form also -// states defaults this mapping never writes, and a stated default would -// print the keyword a graph carrying none reads the same way. +// deriveNormativeGraph normalizes the owned graph in place, removing stated +// defaults and deriving the collapsed properties this mapping reads. func deriveNormativeGraph(graph *rdf.Graph, metaclasses map[rdf.Term]string) (*rdf.Graph, error) { meta := func(t rdf.Term) string { return rdf.LocalName(metaclasses[t]) } chainIndex := chainOwnerIndex(graph, meta) @@ -249,10 +277,12 @@ func deriveNormativeGraph(graph *rdf.Graph, metaclasses map[rdf.Term]string) (*r if !elementForm { return graph, nil } + portDefinitions := newPortDefinitionIndex(graph, meta, graph.Subjects()) n := &normalizer{ graph: graph, meta: meta, chainIndex: chainIndex, + portDefinitions: portDefinitions, elementForm: elementForm, memberOwner: map[string]rdf.Term{}, memberMembership: map[string]rdf.Term{}, @@ -293,6 +323,7 @@ type normalizer struct { graph *rdf.Graph meta func(rdf.Term) string chainIndex map[string][]rdf.Term + portDefinitions portDefinitionIndex elementForm bool memberOwner map[string]rdf.Term memberMembership map[string]rdf.Term @@ -482,7 +513,7 @@ func (n *normalizer) collapseRelationships() { if m == mConjugatedPortTyping { // The head writes `~P`: the original definition, the conjugate of // which the typing names as its type. - target = originalPortDefinition(graph, meta, subject, target) + target = n.portDefinitions.original(graph, meta, subject, target) graph.Add(owner, rdf.OpenSysMLTerm(xConjugatedTyping), rdf.Bool(true)) } if target.Value == "" { @@ -675,6 +706,7 @@ func (n *normalizer) deriveSuccessionEnds() { source, target := n.successionEnds(subject) if source.Value != "" { graph.Add(subject, rdf.SysMLTerm(pSourceFeature), source) + graph.Add(subject, rdf.OpenSysMLTerm(xEndVerb), rdf.String("first")) } previous, next := n.sequencedNeighbours(owner, subject) if source.Value == "" && previous.Value != "" && target.Value != "" { @@ -686,10 +718,14 @@ func (n *normalizer) deriveSuccessionEnds() { if source.Value == "" { graph.Add(subject, rdf.OpenSysMLTerm(xEndForm), rdf.String(formThen)) } - case graph.HasProperty(subject, rdf.SysML+pTargetFeature): + case source.Value != "" && graph.HasProperty(subject, rdf.SysML+pTargetFeature): case next.Value != "": - graph.Add(subject, rdf.OpenSysMLTerm(xEndForm), rdf.String(formThen)) - graph.Add(subject, rdf.OpenSysMLTerm(xTargetMember), next) + if source.Value == "" { + graph.Add(subject, rdf.OpenSysMLTerm(xEndForm), rdf.String(formThen)) + graph.Add(subject, rdf.OpenSysMLTerm(xTargetMember), next) + } else { + graph.Add(subject, rdf.SysMLTerm(pTargetFeature), next) + } } } } @@ -720,8 +756,22 @@ func (n *normalizer) successionEnds(subject rdf.Term) (source, target rdf.Term) // feature (or `first` member) before it, which an empty source end sequences // from (SysML v2 1.0 § 7.17.4), and the next, which `then` ahead of it targets. func (n *normalizer) sequencedNeighbours(owner, subject rdf.Term) (previous, next rdf.Term) { + membershipMembers := map[string]bool{} + for _, property := range []string{pOwnedRelationship, pOwnedMembership} { + for _, membership := range n.graph.Objects(owner, rdf.SysML+property) { + if n.meta(membership) != mMembership { + continue + } + if member := firstIRI(n.graph, membership, pMemberElement); member.Value != "" { + membershipMembers[member.Value] = true + } + } + } sequenced := func(t rdf.Term) bool { m := n.meta(t) + if m == "" && membershipMembers[t.Value] { + m = mMembership + } return m != "" && !ontology.IsAncestorOrSelf(m, "Succession") && (m == mMembership || !relationshipLike(m)) } @@ -754,8 +804,14 @@ func (n *normalizer) sequencedNeighbours(owner, subject rdf.Term) (previous, nex // its trailing place is the absence of an index. An owner whose members state // an index keeps it: the order it states is the order it takes. func (n *normalizer) stateMemberIndices() { + subjectsByOwner := make(map[string][]rdf.Term, len(n.ownerMembers)) + for _, subject := range n.graph.Subjects() { + if owner, ok := n.memberOwner[subject.Value]; ok { + subjectsByOwner[owner.Value] = append(subjectsByOwner[owner.Value], subject) + } + } for owner, members := range n.ownerMembers { - all, merged, children, indexed := n.mergedMemberOrder(owner, members) + all, merged, children, indexed := n.mergedMemberOrder(owner, members, subjectsByOwner[owner]) if indexed || sameTerms(all, merged) { continue } @@ -771,17 +827,14 @@ func (n *normalizer) stateMemberIndices() { // mergedMemberOrder is the owner's members in subject order, the same slots // with the positional members in their positional order, the members among // them, and whether one already states an index. -func (n *normalizer) mergedMemberOrder(owner string, members []rdf.Term) (all, merged []rdf.Term, children map[string]bool, indexed bool) { +func (n *normalizer) mergedMemberOrder(owner string, members, subjects []rdf.Term) (all, merged []rdf.Term, children map[string]bool, indexed bool) { positional := map[string]bool{} for _, m := range members { positional[m.Value] = true } children = map[string]bool{} next := 0 - for _, subject := range n.graph.Subjects() { - if o, ok := n.memberOwner[subject.Value]; !ok || o.Value != owner { - continue - } + for _, subject := range subjects { if n.graph.HasProperty(subject, rdf.OpenSysML+xMemberIndex) { return nil, nil, nil, true } @@ -861,10 +914,20 @@ func (n *normalizer) bodiedOwners() map[string]bool { if meta(owner) == mSubaction || meta(memberMembership[member]) == mTransitionFeatureMembership { continue } - // A transition's `then` succession is its head's target, not a body. - if meta(owner) == mTransition && meta(rdf.IRI(member)) == mSuccession { + if flowMetaclasses[meta(owner)] && meta(rdf.IRI(member)) == mPayloadFeature && + meta(memberMembership[member]) == mFeatureMembership { continue } + // A transition's `then` succession is its head's target, and the chain + // of `first a.b` and its EmptyParameterMembers belong to its head too: + // none is a body. + if meta(owner) == mTransition { + m, ms := rdf.IRI(member), meta(memberMembership[member]) + if meta(m) == mSuccession || (meta(m) == mFeature && ms == mOwningMembership) || + (ms == mParameterMembership && !graph.HasProperty(m, rdf.SysML+pDeclaredName)) { + continue + } + } if m := rdf.IRI(member); meta(memberMembership[member]) == mEndFeatureMembership && !graph.HasProperty(m, rdf.SysML+pDeclaredName) { continue @@ -924,7 +987,7 @@ func (n *normalizer) deriveSatisfySubject(subject rdf.Term) { continue } graph.Add(parameter, rdf.SysMLTerm(pValue), value) - target := firstIRI(graph, value, pReferent, pTargetFeature) + target := firstObject(graph, value, pReferent, pTargetFeature) if target.Value != "" { graph.Add(subject, rdf.SysMLTerm("subject"), target) } @@ -1108,7 +1171,7 @@ func (n *normalizer) statePerformedKeyword(subject, ms rdf.Term, m string) { // markImplicitKinds flags the toolkit ReferenceUsages that print no keyword: // ReferenceUsage is the kindless member metaclass — `ref` states the kind when // the keyword is written, and the compact form records no keyword for it. A -// parameter whose membership spells its keyword — a satisfy's `subject` — keeps it. +// return membership states `return`, not a usage kind. func (n *normalizer) markImplicitKinds() { graph, meta := n.graph, n.meta for _, subject := range graph.Subjects() { @@ -1116,7 +1179,8 @@ func (n *normalizer) markImplicitKinds() { continue } membership := firstIRI(graph, subject, pOwningMembership, pOwningRelationship) - if mm := meta(membership); mm != "" && mm != "FeatureMembership" && mm != "OwningMembership" { + if mm := meta(membership); mm != "" && mm != "FeatureMembership" && + mm != "OwningMembership" && mm != mReturnParameterMembership { continue } if !graph.HasProperty(subject, rdf.OpenSysML+xDeclaredKeyword) { @@ -1129,15 +1193,39 @@ func (n *normalizer) markImplicitKinds() { // structure SysML v2 1.0 § 8.3.18.9 gives it: the source Membership, the trigger // AcceptActionUsage, and the SuccessionAsUsage whose second end names the target. func deriveTransitionHeads(graph *rdf.Graph, meta func(rdf.Term) string) { + chains := chainOwnerIndex(graph, meta) + // tail is the feature a chain's last link names; any other term is itself. + tail := func(term rdf.Term) rdf.Term { + if !term.IsIRI() || meta(term) != mFeature { + return term + } + links, err := chainLinksOf(graph, meta, chains, term) + if err != nil || len(links) == 0 { + links = graph.Objects(term, rdf.SysML+pChainingFeature) + } + if len(links) == 0 { + return term + } + return links[len(links)-1] + } for _, subject := range graph.Subjects() { if meta(subject) != mTransition { continue } - for _, ms := range graph.Objects(subject, rdf.SysML+pOwnedRelationship) { + for i, ms := range graph.Objects(subject, rdf.SysML+pOwnedRelationship) { member := firstIRI(graph, ms, pMemberElement, pOwnedMemberElement, pOwnedRelatedElement) if member.Value == "" { continue } + // The first member a transition owns may be its FeatureChainMember + // owning the chain of `first a.b`: the source is the chain's last + // link, and the chain is no body member. + if i == 0 && meta(ms) == mOwningMembership && tail(member) != member { + if !graph.HasProperty(subject, rdf.SysML+pSource) && !graph.HasProperty(subject, rdf.SysML+pSourceFeature) { + graph.Add(subject, rdf.SysMLTerm(pSource), tail(member)) + } + continue + } switch meta(ms) { case mMembership: if !graph.HasProperty(subject, rdf.SysML+pSource) && !graph.HasProperty(subject, rdf.SysML+pSourceFeature) { @@ -1154,7 +1242,7 @@ func deriveTransitionHeads(graph *rdf.Graph, meta func(rdf.Term) string) { ends := successionEndReferents(graph, meta, member) if len(ends) == 2 && ends[1].Value != "" && !graph.HasProperty(subject, rdf.SysML+pTarget) && !graph.HasProperty(subject, rdf.SysML+pTargetFeature) { - graph.Add(subject, rdf.SysMLTerm(pTarget), ends[1]) + graph.Add(subject, rdf.SysMLTerm(pTarget), tail(ends[1])) } continue } @@ -1188,7 +1276,7 @@ func successionEndReferents(graph *rdf.Graph, meta func(rdf.Term) string, succes return out } -// dropStatedDefaults copies the graph without the triples the sparse form +// dropStatedDefaults removes triples the sparse form // writes where this mapping writes nothing: a stated default reads identically // to an absent one, and a printed keyword would declare it twice. func dropStatedDefaults(graph *rdf.Graph, meta func(rdf.Term) string, elementForm bool, chainIndex map[string][]rdf.Term) (*rdf.Graph, error) { @@ -1201,33 +1289,39 @@ func dropStatedDefaults(graph *rdf.Graph, meta func(rdf.Term) string, elementFor if err != nil { return nil, err } - out := rdf.NewGraph() - for _, triple := range graph.Triples() { + var unresolvedTriples []rdf.Triple + graph.RewriteTriples(func(triple *rdf.Triple) bool { if d.dropped(triple.Subject.Value) || d.ownsDroppedMember(triple.Subject) { - continue + return false } object, keep := triple.Object, true if object.IsIRI() { var unresolvedName string - object, unresolvedName, keep = d.iriObject(triple) + object, unresolvedName, keep = d.iriObject(*triple) if keep && unresolvedName != "" { - out.Add(triple.Subject, triple.Predicate, writtenReference(unresolvedName)) - continue + unresolvedTriples = append(unresolvedTriples, rdf.Triple{ + Subject: triple.Subject, Predicate: triple.Predicate, + Object: writtenReference(unresolvedName), + }) + return false } } if keep && !object.IsIRI() { - object, keep = d.literalObject(triple, object) + object, keep = d.literalObject(*triple, object) } if !keep { - continue + return false } triple.Object = object - out.AddTriple(triple) + return true + }) + for _, triple := range unresolvedTriples { + graph.AddTriple(triple) } for member, name := range d.unresolvedRef { - out.Add(rdf.IRI(member), rdf.SysMLTerm(pMemberElement), rdf.String(name)) + graph.Add(rdf.IRI(member), rdf.SysMLTerm(pMemberElement), rdf.String(name)) } - return out, nil + return graph, nil } var ( @@ -1308,7 +1402,7 @@ func newDefaultDropper(graph *rdf.Graph, meta func(rdf.Term) string, chainIndex membershipOwned: membershipOwnedIn(graph, meta), nodeOwned: nodeOwnedIn(graph, meta), membershipSubjects: membershipSubjectsIn(graph, meta), - backed: backedIn(graph, meta), + backed: backedIn(graph, meta, newPortDefinitionIndex(graph, meta, graph.Subjects())), unresolvedRef: unresolvedRef, unresolvedID: unresolvedID, unresolvedTR: unresolvedTR, @@ -1322,6 +1416,28 @@ func newDefaultDropper(graph *rdf.Graph, meta func(rdf.Term) string, chainIndex // dropped reports whether every triple of the subject is dropped: an element // a membership owns, an implied one, or an unresolved-name annotation. func (d *defaultDropper) dropped(v string) bool { + subject := rdf.IRI(v) + if d.implied[v] && d.meta(subject) == mReferenceSubsetting { + referencing := firstIRI(d.graph, subject, pReferencingFeature, pOwningFeature, pOwningRelatedElement, pOwner) + if d.meta(referencing) == mReferenceUsage && + !d.graph.HasProperty(referencing, rdf.SysML+pReferences) { + return d.membershipOwned[v] || d.unresolvedTR[v] + } + } + if d.implied[v] && d.meta(subject) == mRedefinition { + referencing := firstIRI(d.graph, subject, pOwningRelatedElement, pOwner) + membership := firstIRI(d.graph, referencing, pOwningMembership, pOwningRelationship) + owner := firstIRI(d.graph, membership, pOwningRelatedElement, pOwner) + if d.meta(referencing) == mReferenceUsage && + d.meta(membership) == mParameterMembership && + d.meta(owner) == mTransition { + return d.membershipOwned[v] || d.unresolvedTR[v] + } + } + if d.implied[v] && d.meta(subject) == mRedefinition && + d.meta(firstIRI(d.graph, subject, pOwningRelatedElement, pOwner)) == mFlowEnd { + return d.membershipOwned[v] || d.unresolvedTR[v] + } return d.membershipOwned[v] || d.implied[v] || d.unresolvedTR[v] } @@ -1345,7 +1461,9 @@ func (d *defaultDropper) impliedIncluded(subject rdf.Term) bool { func (d *defaultDropper) iriObject(triple rdf.Triple) (object rdf.Term, unresolvedName string, keep bool) { object = triple.Object local := rdf.LocalName(triple.Predicate.Value) - if text, segment := d.chainSegment[object.Value]; segment && !structuralProps[local] { + flowEndReference := local == pReferencedFeature && d.meta(triple.Subject) == mReferenceSubsetting && + d.meta(firstIRI(d.graph, triple.Subject, pReferencingFeature, pOwningRelatedElement, pOwner)) == mFlowEnd + if text, segment := d.chainSegment[object.Value]; segment && !structuralProps[local] && !flowEndReference { object = rdf.TypedLiteral(text, rdf.OpenSysML+dtExpression) } // A reference the writer could not resolve becomes the name it wrote, @@ -1482,7 +1600,7 @@ func (d *defaultDropper) compositeByDefault(subject rdf.Term) bool { // A usage nested in a type is composite unless `ref` (SysML // Usage::isComposite); only one elsewhere writes `composite`. owner := firstIRI(graph, firstIRI(graph, subject, pOwningRelationship), pOwningRelatedElement, pOwner) - return ontology.IsAncestorOrSelf(meta(subject), "Usage") && owner.IsIRI() && + return (meta(subject) == "FlowUsage" || ontology.IsAncestorOrSelf(meta(subject), "Usage")) && owner.IsIRI() && ontology.IsAncestorOrSelf(meta(owner), "Type") } @@ -1547,7 +1665,7 @@ func membershipSubjectsIn(graph *rdf.Graph, meta func(rdf.Term) string) map[stri // relationship element carries is a statement. A derived edge unbacked by one // is dropped — the toolkit marks the elements it derives these for with // isImpliedIncluded. -func backedIn(graph *rdf.Graph, meta func(rdf.Term) string) map[string]map[string]bool { +func backedIn(graph *rdf.Graph, meta func(rdf.Term) string, portDefinitions portDefinitionIndex) map[string]map[string]bool { backed := map[string]map[string]bool{} for _, subject := range graph.Subjects() { m := meta(subject) @@ -1567,7 +1685,7 @@ func backedIn(graph *rdf.Graph, meta func(rdf.Term) string) map[string]map[strin for _, object := range graph.Objects(subject, rdf.SysML+end) { if m == mConjugatedPortTyping && object.IsIRI() { // The head writes `~P`; the derived type `~P` is not what it states. - object = originalPortDefinition(graph, meta, subject, object) + object = portDefinitions.original(graph, meta, subject, object) } if backed[owner.Value] == nil { backed[owner.Value] = map[string]bool{} diff --git a/internal/translate/export/rdf_normative.go b/internal/translate/export/rdf_normative.go index 6b45cbe5f4..9a6ff60f53 100644 --- a/internal/translate/export/rdf_normative.go +++ b/internal/translate/export/rdf_normative.go @@ -25,6 +25,10 @@ const ( mSubsetting = "Subsetting" mSpecialization = "Specialization" mRedefinition = "Redefinition" + mFlow = "Flow" + mFlowUsage = "FlowUsage" + mSuccessionFlow = "SuccessionFlow" + mSuccessionFlowUsage = "SuccessionFlowUsage" mFlowEnd = "FlowEnd" mPayloadFeature = "PayloadFeature" mMultiplicityRange = "MultiplicityRange" @@ -417,9 +421,40 @@ func (e *encoder) subjectParameter(subject rdf.Term, owner string, target ast.No e.graph.Add(subject, e.sysml(pOwnedRelationship), membership) e.graph.Add(subject, e.sysml(pOwnedMember), usage) e.graph.Add(subject, e.sysml(pOwnedMembership), membership) + if chain, ok := target.(*ast.FeatureChainExpr); ok { + return e.subjectFeatureChainValue(usage, target, chain) + } return e.featureValue(usage, owner, target, false, false) } +func (e *encoder) subjectFeatureChainValue(usage rdf.Term, target ast.Node, chainExpr *ast.FeatureChainExpr) error { + expression := e.ids.mintedNode(rdf.ExpressionIRI(usage, "value"), usage, "value") + e.graph.Add(usage, e.sysml(pValue), expression) + e.graph.Add(expression, e.sysx(xSourceText), rdf.String(e.text(target))) + e.graph.Add(expression, e.sysml(pElementID), rdf.String(rdf.LocalName(expression.Value))) + e.typed(expression, mFeatureReference) + + chain := e.ids.mintedNode(rdf.ExpressionIRI(expression, "referent"), expression, "referent") + e.typed(chain, mFeature) + e.graph.Add(chain, e.sysml(pElementID), rdf.String(rdf.LocalName(chain.Value))) + var links []rdf.Term + for _, segment := range featureChainSegments(chainExpr) { + if qualifiedNameHasChain(segment) { + links = append(links, e.qualifiedChainReferences(segment)...) + } else { + links = append(links, e.reference(segment)) + } + } + e.featureChainings(chain, links) + membership := e.ids.minted(rdf.OwningMembershipIRIOf(chain), chain, rdf.OwningMembershipSuffix) + e.emitMembershipCore(membership, chain, expression, mOwningMembership, true) + e.graph.Add(expression, e.sysml(pOwnedRelationship), membership) + e.graph.Add(expression, e.sysml(pOwnedMembership), membership) + e.graph.Add(expression, e.sysml(pReferent), chain) + e.resultParameter(expression) + return e.expressionOwnership(expression, usage, mFeatureValue) +} + // subjectParameters emits a subject parameter per `by` target the head states // (SysML.xtext SatisfyRequirementUsage `subject`); the collapsed `subject` // property the relationships pass wrote stays beside it. diff --git a/internal/translate/export/rdf_normative_test.go b/internal/translate/export/rdf_normative_test.go index 088d678e6f..03d77df15d 100644 --- a/internal/translate/export/rdf_normative_test.go +++ b/internal/translate/export/rdf_normative_test.go @@ -34,6 +34,169 @@ func elmt(name string) rdf.Term { return rdf.IRI("urn:sysmlv2:element:" + name) func meta(graph *rdf.Graph, t rdf.Term) string { return rdf.LocalName(graph.Type(t)) } +func TestDropStatedDefaultsKeepsUncollapsedReferenceSubsetting(t *testing.T) { + graph := rdf.NewGraph() + end := elmt("end") + subsetting := elmt("end__rs") + target := elmt("target") + graph.Add(end, rdf.IRI(rdf.RDFType), rdf.SysMLTerm(mReferenceUsage)) + graph.Add(end, rdf.SysMLTerm("isEnd"), rdf.Bool(true)) + graph.Add(end, rdf.SysMLTerm("isImpliedIncluded"), rdf.Bool(true)) + graph.Add(end, rdf.SysMLTerm(pOwnedReferenceSubsetting), subsetting) + graph.Add(subsetting, rdf.IRI(rdf.RDFType), rdf.SysMLTerm(mReferenceSubsetting)) + graph.Add(subsetting, rdf.SysMLTerm("isImplied"), rdf.Bool(true)) + graph.Add(subsetting, rdf.SysMLTerm("isImpliedIncluded"), rdf.Bool(true)) + graph.Add(subsetting, rdf.SysMLTerm(pReferencingFeature), end) + graph.Add(subsetting, rdf.SysMLTerm(pReferencedFeature), target) + + meta := func(term rdf.Term) string { return rdf.LocalName(graph.Type(term)) } + normalized, err := dropStatedDefaults(graph, meta, true, chainOwnerIndex(graph, meta)) + if err != nil { + t.Fatal(err) + } + if got := normalized.Objects(end, rdf.SysML+pOwnedReferenceSubsetting); len(got) != 1 || got[0] != subsetting { + t.Fatalf("reference usage owns %v, want %s", got, subsetting) + } + if got := normalized.Objects(subsetting, rdf.SysML+pReferencedFeature); len(got) != 1 || got[0] != target { + t.Fatalf("reference subsetting targets %v, want %s", got, target) + } +} + +func TestSuccessionEndsUseExternalMembershipSource(t *testing.T) { + graph := rdf.NewGraph() + owner := elmt("owner") + start := elmt("library-start") + startMembership := elmt("owner__start") + succession := elmt("succession") + successionMembership := elmt("owner__succession") + target := elmt("target") + targetMembership := elmt("owner__target") + sourceEnd := elmt("succession__source") + sourceEndMembership := elmt("succession__source-membership") + targetEnd := elmt("succession__target") + targetEndMembership := elmt("succession__target-membership") + for subject, metaclass := range map[rdf.Term]string{ + owner: "ActionUsage", + startMembership: mMembership, + succession: mSuccession, + successionMembership: mFeatureMembership, + target: "ActionUsage", + targetMembership: mFeatureMembership, + sourceEnd: mReferenceUsage, + sourceEndMembership: mEndFeatureMembership, + targetEnd: mReferenceUsage, + targetEndMembership: mEndFeatureMembership, + } { + graph.Add(subject, rdf.IRI(rdf.RDFType), rdf.SysMLTerm(metaclass)) + } + addMembership := func(membership, parent, member rdf.Term) { + graph.Add(membership, rdf.SysMLTerm(pOwningRelatedElement), parent) + graph.Add(membership, rdf.SysMLTerm(pMemberElement), member) + graph.Add(parent, rdf.SysMLTerm(pOwnedRelationship), membership) + } + addMembership(startMembership, owner, start) + addMembership(successionMembership, owner, succession) + addMembership(targetMembership, owner, target) + addMembership(sourceEndMembership, succession, sourceEnd) + addMembership(targetEndMembership, succession, targetEnd) + graph.Add(targetEnd, rdf.SysMLTerm(pReferences), target) + + meta := func(term rdf.Term) string { return rdf.LocalName(graph.Type(term)) } + n := &normalizer{ + graph: graph, + meta: meta, + memberOwner: map[string]rdf.Term{}, + memberMembership: map[string]rdf.Term{}, + nodeMember: map[string]bool{}, + nodeOwner: map[string]rdf.Term{}, + membershipSubject: map[string]bool{}, + ownerMembers: map[string][]rdf.Term{}, + } + n.indexMemberships() + n.orderMembers() + n.deriveSuccessionEnds() + + if got, ok := graph.Object(succession, rdf.OpenSysML+xSourceMember); !ok || got != start { + t.Fatalf("succession source member %v, want %s", got, start) + } + if got, ok := graph.Object(succession, rdf.OpenSysML+xTargetMember); !ok || got != target { + t.Fatalf("succession target member %v, want %s", got, target) + } +} + +func TestSuccessionEndsFromNamedMembersUseExplicitFirst(t *testing.T) { + graph := rdf.NewGraph() + owner := elmt("owner") + source := elmt("source") + succession := elmt("succession") + target := elmt("target") + sourceEnd := elmt("succession__source") + sourceMembership := elmt("succession__source-membership") + targetEnd := elmt("succession__target") + targetMembership := elmt("succession__target-membership") + for subject, metaclass := range map[rdf.Term]string{ + source: "OccurrenceUsage", + succession: mSuccession, + target: "OccurrenceUsage", + sourceEnd: mReferenceUsage, + sourceMembership: mEndFeatureMembership, + targetEnd: mReferenceUsage, + targetMembership: mEndFeatureMembership, + } { + graph.Add(subject, rdf.IRI(rdf.RDFType), rdf.SysMLTerm(metaclass)) + } + for _, end := range []struct { + membership rdf.Term + element rdf.Term + }{ + {sourceMembership, sourceEnd}, + {targetMembership, targetEnd}, + } { + graph.Add(succession, rdf.SysMLTerm(pOwnedRelationship), end.membership) + graph.Add(end.membership, rdf.SysMLTerm(pMemberElement), end.element) + } + graph.Add(sourceEnd, rdf.SysMLTerm(pReferences), source) + graph.Add(targetEnd, rdf.SysMLTerm(pReferences), target) + + n := &normalizer{ + graph: graph, + meta: func(term rdf.Term) string { + return rdf.LocalName(graph.Type(term)) + }, + memberOwner: map[string]rdf.Term{succession.Value: owner}, + ownerMembers: map[string][]rdf.Term{ + owner.Value: {source, succession, target}, + }, + } + n.deriveSuccessionEnds() + + if got, ok := graph.Object(succession, rdf.OpenSysML+xEndVerb); !ok || got != rdf.String("first") { + t.Fatalf("succession end verb %v, want first", got) + } + if got, ok := graph.Object(succession, rdf.SysML+pTargetFeature); !ok || got != target { + t.Fatalf("succession target %v, want %s", got, target) + } + if graph.HasProperty(succession, rdf.OpenSysML+xEndForm) { + t.Fatal("a named succession source should not use positional then form") + } +} + +func TestSequencesFromMatchesInitialMembershipReferent(t *testing.T) { + graph := rdf.NewGraph() + membership := elmt("initial-membership") + start := elmt("library-start") + succession := elmt("succession") + graph.Add(membership, rdf.SysMLTerm(pMemberElement), start) + graph.Add(succession, rdf.OpenSysMLTerm(xSourceMember), start) + d := &decoder{graph: graph} + from := &element{iri: membership.Value, metaclass: mMembership, membershipKeyword: "first"} + to := &element{iri: succession.Value, metaclass: mSuccession} + + if !d.sequencesFrom(to, from) { + t.Fatal("succession source does not match the initial membership's referent") + } +} + // jsonValues flattens a single value or an array of values. func jsonValues(v any) []any { if arr, ok := v.([]any); ok { @@ -560,3 +723,161 @@ func TestNormativeImplicitMetadataBodyRedefinition(t *testing.T) { targetEnds: []string{"redefinedFeature", "subsettedFeature", "general"}, }) } + +func TestMembershipImportUsesImportedElementWhenMembershipIsUnavailable(t *testing.T) { + graph := rdf.NewGraph() + imported := elmt("imported") + target := elmt("target") + graph.Add(imported, rdf.IRI(rdf.RDFType), rdf.SysMLTerm(mMembershipImport)) + graph.Add(imported, rdf.SysMLTerm(pImportedElement), target) + graph.Add(target, rdf.IRI(rdf.RDFType), rdf.SysMLTerm(mPackage)) + graph.Add(target, rdf.SysMLTerm(pQualifiedName), rdf.String("Base::DataValue")) + graph.Add(target, rdf.SysMLTerm(pDeclaredName), rdf.String("DataValue")) + + metaclasses, err := checkTypes(graph) + if err != nil { + t.Fatal(err) + } + d := newDecoder(graph, metaclasses, nil, nil) + importElement := &element{iri: imported.Value, metaclass: mMembershipImport} + d.byIRI[target.Value] = &element{ + iri: target.Value, metaclass: mPackage, qname: "Base::DataValue", elementID: "target", + } + name, err := d.importedName(importElement) + if err != nil { + t.Fatal(err) + } + if name != "Base::DataValue" { + t.Fatalf("imported name = %q, want %q", name, "Base::DataValue") + } +} + +func TestReferencesInEffectivelyNamedMembersMatchEitherQualifiedNameForm(t *testing.T) { + const model = `package M { + part def Base { + part spacecraft { + part lm { + part stage { + attribute engineStatus : ScalarValues::String; + } + } + } + } + part def Derived :> Base { + part :>> spacecraft { + part :>> lm { + part :>> stage { + attribute engineStatus : ScalarValues::String; + } + } + } + } +}` + for _, test := range []struct { + name string + qname string + }{ + {name: "positional"}, + {name: "effective", qname: "M::Derived::spacecraft::lm::stage::engineStatus"}, + } { + t.Run(test.name, func(t *testing.T) { + graph := normativeGraph(t, model) + var engineStatus rdf.Term + for _, triple := range graph.Triples() { + if triple.Predicate != rdf.SysMLTerm(pQualifiedName) || !strings.HasPrefix(triple.Object.Value, "M::Derived::") || + !strings.HasSuffix(triple.Object.Value, "::engineStatus") { + continue + } + engineStatus = triple.Subject + break + } + if engineStatus.Value == "" { + t.Fatal("the derived engineStatus has no qualified name") + } + if test.qname != "" { + var triples []rdf.Triple + for _, triple := range graph.Triples() { + if triple.Subject == engineStatus && triple.Predicate == rdf.SysMLTerm(pQualifiedName) { + continue + } + triples = append(triples, triple) + } + graph = rdf.NewGraphOf(triples, graph.Prefixes) + graph.Add(engineStatus, rdf.SysMLTerm(pQualifiedName), rdf.String(test.qname)) + } + + notation, err := ToSysML(graph) + if err != nil { + t.Fatalf("back to notation: %v", err) + } + p := parser.New(source.New("m.sysml", notation)) + p.ParseFile() + if len(p.Diagnostics) > 0 { + t.Fatalf("notation does not parse: %v\n%s", p.Diagnostics, notation) + } + }) + } +} + +func TestFlowEndsRoundTripFromFeatureChains(t *testing.T) { + const model = `package P { + item def Fuel; + port def FuelPort { + in item fuel : Fuel; + } + part def Vessel { + port fuelPort : FuelPort; + } + part source : Vessel; + part target : Vessel; + flow of Fuel from source.fuelPort.fuel to target.fuelPort.fuel; +}` + notation, err := ToSysML(normativeGraph(t, model)) + if err != nil { + t.Fatalf("ToSysML: %v", err) + } + p := parser.New(source.New("flow.sysml", notation)) + p.ParseFile() + if len(p.Diagnostics) > 0 { + t.Fatalf("the decoded flow does not parse: %v\n%s", p.Diagnostics, notation) + } +} + +func TestFlowEndNamesAreRefusedInFlowHeads(t *testing.T) { + const model = `package P { + part def Vessel { + part x; + part y; + } + part def Host { + part a : Vessel; + part b : Vessel; + flow from a.x to b.y; + } +}` + for _, property := range []string{pDeclaredName, pDeclaredShortName} { + t.Run(property, func(t *testing.T) { + graph := normativeGraph(t, model) + var end rdf.Term + for _, triple := range graph.Triples() { + if triple.Predicate == rdf.IRI(rdf.RDFType) && triple.Object == rdf.SysMLTerm(mFlowEnd) { + end = triple.Subject + break + } + } + if end.Value == "" { + t.Fatal("flow has no FlowEnd") + } + graph.Add(end, rdf.SysMLTerm(property), rdf.String("outlet")) + + _, err := ToSysML(graph) + var unsupported *UnsupportedError + if !errors.As(err, &unsupported) { + t.Fatalf("ToSysML error = %v, want UnsupportedError", err) + } + if !strings.Contains(err.Error(), end.Value) { + t.Fatalf("error %q does not name flow end %s", err, end.Value) + } + }) + } +} diff --git a/internal/translate/export/rdf_out.go b/internal/translate/export/rdf_out.go index 6f3a1c4627..ec2a1dca06 100644 --- a/internal/translate/export/rdf_out.go +++ b/internal/translate/export/rdf_out.go @@ -20,6 +20,7 @@ import ( // Property names in the SysML vocabulary. const ( pDeclaredName = "declaredName" + pIsLibraryElement = "isLibraryElement" pDeclaredShortName = "declaredShortName" pQualifiedName = "qualifiedName" pElementID = "elementId" @@ -68,6 +69,7 @@ const ( pIsDefault = "isDefault" pIsInitial = "isInitial" pIsEnd = "isEnd" + pIsUnique = "isUnique" pName = "name" pReferences = "references" pConnectorEnd = "connectorEnd" @@ -76,6 +78,7 @@ const ( pOwnedEndFeature = "ownedEndFeature" pImportedNamespace = "importedNamespace" pImportedMembership = "importedMembership" + pImportedElement = "importedElement" pAliasFor = "aliasedElement" // an older mapping's alias target, read only pMemberName = "memberName" pMemberShortName = "memberShortName" @@ -314,6 +317,14 @@ func (m *modelEncoders) declaringEncoder(node ast.Node) *encoder { // root elements name it (sysx:sourceDocument), since one graph no longer keeps // the documents apart. func ModelToRDFWith(documents []ModelDocument, form IDForm) (*rdf.Graph, error) { + out, _, _, err := modelToRDF(documents, form) + return out, err +} + +// modelToRDF is ModelToRDFWith, also returning the resolver the model was +// analyzed with and each document's encoder, whose identity tables are the +// ones the graph's ids were minted from. +func modelToRDF(documents []ModelDocument, form IDForm) (*rdf.Graph, *resolve.Resolver, []*encoder, error) { res, model := analyzeModel(documents) shared := &modelEncoders{declaring: map[ast.Node]*encoder{}} encoders := make([]*encoder, len(documents)) @@ -321,7 +332,7 @@ func ModelToRDFWith(documents []ModelDocument, form IDForm) (*rdf.Graph, error) for i, doc := range documents { e, err := newEncoderOver(doc.File, doc.Root, form, res, model) if err != nil { - return nil, fmt.Errorf("%s: %w", doc.File.Name(), err) + return nil, nil, nil, fmt.Errorf("%s: %w", doc.File.Name(), err) } e.model = shared for node := range e.fqn { @@ -345,11 +356,11 @@ func ModelToRDFWith(documents []ModelDocument, form IDForm) (*rdf.Graph, error) declaredIn := map[string]mintedSubject{} for i, e := range encoders { if err := e.encodeDocument(documents[i].Root); err != nil { - return nil, fmt.Errorf("%s: %w", documents[i].File.Name(), err) + return nil, nil, nil, fmt.Errorf("%s: %w", documents[i].File.Name(), err) } for _, minted := range e.minted { if prior, taken := declaredIn[minted.iri]; taken { - return nil, &UnsupportedError{ + return nil, nil, nil, &UnsupportedError{ What: fmt.Sprintf("the declaration of %s at %s", minted.fqn, minted.at), Note: fmt.Sprintf("its id lands on the same IRI as %s at %s, which another document declares, and merging two elements into one subject would be a different model", prior.fqn, prior.at), } @@ -368,7 +379,7 @@ func ModelToRDFWith(documents []ModelDocument, form IDForm) (*rdf.Graph, error) } } } - return out, nil + return out, res, encoders, nil } // encodeDocument converts a parsed document, returning the encoder that holds @@ -398,6 +409,7 @@ func (e *encoder) encodeDocument(root *ast.RootNamespace) error { if e.idErr != nil { return e.idErr } + e.libraryNames() e.sourceText() if err := rdf.AnnotateCollections(e.graph); err != nil { return err @@ -460,6 +472,7 @@ func newEncoderOver(file *source.SourceFile, root *ast.RootNamespace, form IDFor performed: map[ast.Node]bool{}, effects: map[ast.Node]bool{}, triggerParams: map[ast.Node]string{}, + triggerMembers: map[ast.Node]string{}, payloads: map[*ast.Usage]*ast.Usage{}, payloadFeatures: map[*ast.Usage]bool{}, fqn: map[ast.Node]string{}, @@ -481,10 +494,14 @@ func newEncoderOver(file *source.SourceFile, root *ast.RootNamespace, form IDFor if err := e.collect(root.Members, ""); err != nil { return nil, err } + e.indexTriggerMembers() return e, nil } type encoder struct { + // libraryRefs are the standard library elements the document links to, by + // subject IRI, so the graph can name the ones it references. + libraryRefs map[string]libraryRef // minted lists the subjects minted for this document's declarations, which a // model of several documents checks no other document declares too. minted []mintedSubject @@ -510,7 +527,8 @@ type encoder struct { effects map[ast.Node]bool // triggerParams holds the parameters of a transition's trigger action: each // maps to the AcceptActionUsage property that names it, if any. - triggerParams map[ast.Node]string + triggerParams map[ast.Node]string + triggerMembers map[ast.Node]string // payloads holds the PayloadFeature each flow's `of` clause declares, keyed // by the flow: the declared feature of `of p : T`, or one made up for // `of T`, which states only its typing (SysML-textual-bnf PayloadFeature). @@ -551,6 +569,19 @@ type encoder struct { membershipImports []membershipImport } +func (e *encoder) indexTriggerMembers() { + for node, fqn := range e.fqn { + transition, ok := node.(*ast.TransitionMember) + if !ok || transition.Trigger == nil { + continue + } + e.triggerMembers[transition.Trigger] = fqn + if event, ok := transition.Trigger.(*ast.AcceptEvent); ok && event.Payload != nil { + e.triggerMembers[event.Payload] = fqn + } + } +} + // membershipImport is a membership import's subject and the name it imports. type membershipImport struct { subject rdf.Term @@ -653,6 +684,84 @@ func (e *encoder) importedMembership(name *ast.QualifiedName) rdf.Term { return rdf.String(qualifiedText(name)) } +// libraryRef is a standard library element the document links to: its +// declaration, qualified name and normative subject, and the subject of its +// owning membership where the norm fixes one. +type libraryRef struct { + node ast.Node + fqn string + subject, membership rdf.Term +} + +// libraryNames states, for each standard library element the graph references, +// what the graph cannot otherwise say about it: its metaclass and qualified +// name, marked isLibraryElement (KerML Element::isLibraryElement), so a reader +// without the library can name what a normative id stands for. The library +// itself is not exported: the element's members, relationships and owner stay +// in the library. A library membership the graph references (an import of a +// library member) is stated as the OwningMembership of that element. +func (e *encoder) libraryNames() { + if len(e.libraryRefs) == 0 { + return + } + referenced := map[string]bool{} + for _, t := range e.graph.Triples() { + if t.Object.IsIRI() { + referenced[t.Object.Value] = true + } + } + subjects := make([]string, 0, len(e.libraryRefs)) + for iri := range e.libraryRefs { + subjects = append(subjects, iri) + } + slices.Sort(subjects) + named := map[string]bool{} + // name states ref's element, reporting whether it is named in the graph. + name := func(ref libraryRef) bool { + if done, seen := named[ref.subject.Value]; seen { + return done + } + named[ref.subject.Value] = false + metaclass := declaredMetaclass(ref.node) + switch n := ref.node.(type) { + case *ast.Package: + // `standard library package` (KerML 1.0 § 8.3.4.13.3 LibraryPackage). + metaclass = mPackage + if n.IsLibrary { + metaclass = mLibraryPackage + } + case *ast.Alias: + // An alias is a Membership, which the graph names by the membership + // it is rather than as an element. + return false + } + if metaclass == "" { + return false + } + named[ref.subject.Value] = true + e.graph.Add(ref.subject, rdf.IRI(rdf.RDFType), e.sysml(metaclass)) + e.graph.Add(ref.subject, e.sysml(pElementID), rdf.String(rdf.LocalName(ref.subject.Value))) + e.graph.Add(ref.subject, e.sysml(pQualifiedName), rdf.String(ref.fqn)) + if declared, _ := declaredNameAndMembers(ref.node); declared != "" { + e.graph.Add(ref.subject, e.sysml(pDeclaredName), rdf.String(declared)) + } + e.graph.Add(ref.subject, e.sysml(pIsLibraryElement), rdf.Bool(true)) + return true + } + for _, iri := range subjects { + ref := e.libraryRefs[iri] + if referenced[iri] { + name(ref) + } + if ref.membership.Value != "" && referenced[ref.membership.Value] && name(ref) { + e.graph.Add(ref.membership, rdf.IRI(rdf.RDFType), e.sysml(mOwningMembership)) + e.graph.Add(ref.membership, e.sysml(pElementID), rdf.String(rdf.LocalName(ref.membership.Value))) + e.graph.Add(ref.membership, e.sysml(pMemberElement), ref.subject) + e.graph.Add(ref.membership, e.sysml(pIsLibraryElement), rdf.Bool(true)) + } + } +} + // claimLibrary reserves the IRIs of a library element the document links to, // and of its owning membership, so no element declared here lands on them. func (e *encoder) claimLibrary(node ast.Node, fqn string) { @@ -663,6 +772,14 @@ func (e *encoder) claimLibrary(node ast.Node, fqn string) { e.ids.owningMembershipOf(node, subject).Value, fqn + "'s owning membership", }) } + if e.libraryRefs == nil { + e.libraryRefs = map[string]libraryRef{} + } + ref := libraryRef{node: node, fqn: fqn, subject: subject} + if e.ids.normativeMembership(node) { + ref.membership = e.ids.owningMembershipOf(node, subject) + } + e.libraryRefs[subject.Value] = ref for _, c := range claims { if prior, taken := e.claim(c.iri, c.standsFor); taken && e.idErr == nil { e.idErr = &UnsupportedError{ @@ -1284,11 +1401,21 @@ func (e *encoder) encodeMember(h memberHead, owner string) error { } } implicitTarget := e.implicitMetadataBodyTarget(inBody, n) + variantTarget := e.variantReferenceTarget(n) + // The syntax makes a VariantReference, whether or not its name resolves. + variantReference := n.IsVariantReference() + if variantReference { + // A bare `variant x;` is a VariantReference (SysML-textual-bnf + // :343-345): a ReferenceUsage subsetting the feature x names, which + // names it, rather than a new usage declaring x. + metaclass = mReferenceUsage + } head(rdf.SysMLTerm(metaclass)) if !shorthandRelationship(n) { - if implicitTarget.Value != "" { + if implicitTarget.Value != "" || variantReference { // A metadata body's `name = …` redefines the metadata - // definition's feature of that name; it declares none. + // definition's feature of that name, and a `variant x;` + // references x; neither declares a name. if n.Ident.ShortName != "" { e.graph.Add(subject, e.sysml(pDeclaredShortName), rdf.String(n.Ident.ShortName)) } @@ -1337,11 +1464,11 @@ func (e *encoder) encodeMember(h memberHead, owner string) error { {"isPortion", n.IsPortion || n.Portion != ast.PortionNone}, {"isDerived", n.IsDerived}, {"isOrdered", n.IsOrdered}, - {"isNonunique", n.IsNonunique}, {"isAccept", n.IsAccept}, {"isResult", n.IsResult}, {"isParallel", n.IsParallel}, }) + e.nonunique(subject, n.IsNonunique) // `: ~P` types the port by P's conjugate; the usage owns no Conjugation // of its own, so Type::isConjugated stays false on it. if n.HasConjugatedTyping() { @@ -1387,6 +1514,9 @@ func (e *encoder) encodeMember(h memberHead, owner string) error { e.graph.Add(subject, e.sysml(relationshipProperty[ast.RelRedefines]), implicitTarget) e.graph.Add(subject, e.sysx(xImplicitRedefinition), rdf.Bool(true)) } + if variantTarget.Value != "" { + e.graph.Add(subject, e.sysml(relationshipProperty[ast.RelReferences]), variantTarget) + } if err := e.featureValue(subject, within, n.Value, n.ValueIsDefault, n.ValueIsInitial); err != nil { return err } @@ -1561,12 +1691,7 @@ func (e *encoder) encodeMember(h memberHead, owner string) error { e.graph.Add(subject, e.sysx(xDeclaredKeyword), rdf.String("assume")) } e.flags(subject, []boolProperty{{"isNegated", n.IsNegated}}) - reference, _ := n.Expression.(*ast.QualifiedName) - var expr ast.Node - if reference == nil { - expr = n.Expression - } - return e.condition(subject, fqn, within, expr, reference, n.Body != nil, n.Body) + return e.condition(subject, fqn, within, n.Expression, nil, n.Body != nil, n.Body) case *ast.AssumeMember: // An `assume` member owns its constraint usage through a @@ -1928,6 +2053,13 @@ func isRelationship(metaclass string) bool { // expression, a reference to the constraint it states (`require R { … }`), or a // nested constraint stating its conditions in a body. func (e *encoder) condition(subject rdf.Term, fqn, owner string, expr ast.Node, ref *ast.QualifiedName, hasBody bool, body []ast.Node) error { + // A bare name or feature chain (`require c;`, `assume q.k;`) is the + // reference form: the constraint usage owns a ReferenceSubsetting to the + // feature it names (RequirementConstraintUsage, AssertConstraintUsage). + if target := conditionReference(expr); target != nil { + e.relationships(subject, owner, []*ast.Relationship{{Kind: ast.RelReferences, Target: target}}) + expr = nil + } if expr != nil { return e.expression(subject, e.sysx(xCondition), xCondition, owner, expr) } @@ -1938,6 +2070,22 @@ func (e *encoder) condition(subject rdf.Term, fqn, owner string, expr ast.Node, return e.encode(body, fqn, subject) } +// conditionReference is the feature a bare condition names, as a relationship +// target: a qualified name or a chain of them; nil for any other expression. +func conditionReference(expr ast.Node) ast.Node { + switch x := expr.(type) { + case *ast.QualifiedName: + return x + case *ast.FeatureReference: + return conditionReference(x.Name) + case *ast.FeatureChainExpr: + if x.Member != nil && conditionReference(x.Operand) != nil { + return x + } + } + return nil +} + // requirementConditionDecl is the head an `assume`/`require` member declares // for the constraint usage it owns, besides the condition itself. type requirementConditionDecl struct { @@ -2385,6 +2533,30 @@ func (e *encoder) implicitMetadataBodyTarget(inBody bool, n *ast.Usage) rdf.Term if target == nil || target == sym { return rdf.Term{} } + return e.symbolTerm(target) +} + +// variantReferenceTarget is the term of the feature a bare `variant x;` names: +// the like-named feature visible outside the variation, else the name x in +// the segment form an unresolved reference is kept in (`'a::b'` stays one name); the zero term when n is no +// such reference or states its reference itself (`variant P::x;`, `variant a.b;`). +func (e *encoder) variantReferenceTarget(n *ast.Usage) rdf.Term { + if !n.IsVariantReference() || referencesFeature(n) { + return rdf.Term{} + } + if sym := e.ids.declSym[n]; sym != nil { + if target := e.ids.model.ReferencedFeature(sym); target != nil && target != sym { + if term := e.symbolTerm(target); term.Value != "" { + return term + } + } + } + return rdf.String(identitySegment(n.Ident.Name)) +} + +// symbolTerm is the term of the element a resolved symbol declares, or the zero +// term when it has none the graph can name. +func (e *encoder) symbolTerm(target *symbols.Symbol) rdf.Term { if decl, fqn, ok := e.linked(target, true); ok { return e.ids.subjectForNode(decl, fqn) } @@ -2443,6 +2615,14 @@ func (e *encoder) flags(subject rdf.Term, flags []boolProperty) { } } +// nonunique states `nonunique` as Feature::isUnique false, the metamodel's one +// uniqueness property. +func (e *encoder) nonunique(subject rdf.Term, nonunique bool) { + if nonunique { + e.graph.Add(subject, e.sysml(pIsUnique), rdf.Bool(false)) + } +} + // prefixes maps the `#M` annotations ahead of a declaration as metadata usages // it owns after its body members (PrefixMetadataMember), keyed `#` for the writer. func (e *encoder) prefixes(subject rdf.Term, fqn string, prefixes []*ast.PrefixMetadata, members []ast.Node) error { @@ -2498,8 +2678,8 @@ func (e *encoder) crossFeature(subject rdf.Term, fqn string, n *ast.Usage) error {"isPortion", cross.IsPortion}, {"isDerived", cross.IsDerived}, {"isOrdered", cross.IsOrdered}, - {"isNonunique", cross.IsNonunique}, }) + e.nonunique(crossSubject, cross.IsNonunique) if keyword := directionKeyword(cross.Direction); keyword != "" { e.graph.Add(crossSubject, e.sysml(pDirection), rdf.String(keyword)) } diff --git a/internal/translate/export/root_namespace.go b/internal/translate/export/root_namespace.go index a4f9de7341..a91287201a 100644 --- a/internal/translate/export/root_namespace.go +++ b/internal/translate/export/root_namespace.go @@ -117,12 +117,13 @@ func withoutRootNamespace(graph *rdf.Graph) *rdf.Graph { dropped := map[string]bool{} droppedMemberIndexes := map[string]bool{} var indexes []rootIndex - for _, subject := range graph.Subjects() { + subjects := graph.Subjects() + for _, subject := range subjects { if !transparentRootSubject(graph, subject) { continue } dropped[subject.Value] = true - restated, dropIndexes := rootMemberIndexes(graph, rootNamespaceMembers(graph, subject)) + restated, dropIndexes := rootMemberIndexes(graph, rootNamespaceMembers(graph, subject), subjects) indexes = append(indexes, restated...) if dropIndexes { for _, index := range restated { @@ -138,22 +139,15 @@ func withoutRootNamespace(graph *rdf.Graph) *rdf.Graph { if len(dropped) == 0 { return graph } - out := rdf.NewGraph() - for prefix, iri := range graph.Prefixes { - out.Prefixes[prefix] = iri - } - for _, triple := range graph.Triples() { - if dropped[triple.Subject.Value] || - dropped[triple.Object.Value] && triple.Object.IsIRI() || - droppedMemberIndexes[triple.Subject.Value] && triple.Predicate.Value == rdf.OpenSysML+xMemberIndex { - continue - } - out.AddTriple(triple) - } + graph.RewriteTriples(func(triple *rdf.Triple) bool { + return !dropped[triple.Subject.Value] && + !(dropped[triple.Object.Value] && triple.Object.IsIRI()) && + !(droppedMemberIndexes[triple.Subject.Value] && triple.Predicate.Value == rdf.OpenSysML+xMemberIndex) + }) for _, index := range indexes { - out.Add(index.member, rdf.OpenSysMLTerm(xMemberIndex), rdf.Int(index.index)) + graph.Add(index.member, rdf.OpenSysMLTerm(xMemberIndex), rdf.Int(index.index)) } - return out + return graph } type rootIndex struct { @@ -165,7 +159,7 @@ type rootIndex struct { // wrapper's order is dropped, and whether the indexes the members state are // replaced: none when the members all state one, or state none and appear in // the wrapper's order already. -func rootMemberIndexes(graph *rdf.Graph, members []rdf.Term) ([]rootIndex, bool) { +func rootMemberIndexes(graph *rdf.Graph, members, subjects []rdf.Term) ([]rootIndex, bool) { indexed := 0 listed := make(map[string]bool, len(members)) for _, member := range members { @@ -179,7 +173,7 @@ func rootMemberIndexes(graph *rdf.Graph, members []rdf.Term) ([]rootIndex, bool) return nil, false case indexed > 0: return rootIndexesOf(members), true - case inSubjectOrder(graph, members, listed): + case inSubjectOrder(subjects, members, listed): return nil, false } return rootIndexesOf(members), false @@ -195,9 +189,9 @@ func rootIndexesOf(members []rdf.Term) []rootIndex { // inSubjectOrder reports whether the graph lists the members as subjects in // the given order. -func inSubjectOrder(graph *rdf.Graph, members []rdf.Term, listed map[string]bool) bool { +func inSubjectOrder(subjects, members []rdf.Term, listed map[string]bool) bool { var subjectOrder []rdf.Term - for _, candidate := range graph.Subjects() { + for _, candidate := range subjects { if listed[candidate.Value] { subjectOrder = append(subjectOrder, candidate) } @@ -256,7 +250,9 @@ func unownedElements(graph *rdf.Graph) []rdf.Term { if !strings.HasPrefix(subject.Value, rdf.Element) || !strings.HasPrefix(graph.Type(subject), rdf.SysML) { continue } - if hasOwner(graph, subject) { + // A library element the graph names is owned in the library, not + // here: the document's namespace does not take it. + if hasOwner(graph, subject) || LibraryReference(graph, subject) { continue } roots = append(roots, subject) @@ -264,6 +260,14 @@ func unownedElements(graph *rdf.Graph) []rdf.Term { return roots } +// LibraryReference reports whether subject names a library element the graph +// references rather than declares: it has no owner or owned relationships. +func LibraryReference(graph *rdf.Graph, subject rdf.Term) bool { + return graph.BoolValue(subject, rdf.SysML+pIsLibraryElement) && !hasOwner(graph, subject) && + !graph.HasProperty(subject, rdf.SysML+pMembershipOwningNamespace) && + !graph.HasProperty(subject, rdf.SysML+pOwnedRelationship) +} + func hasOwner(graph *rdf.Graph, subject rdf.Term) bool { return graph.HasProperty(subject, rdf.SysML+pOwner) || graph.HasProperty(subject, rdf.SysML+pOwningRelationship) || diff --git a/internal/translate/interop/reposync/diff.go b/internal/translate/interop/reposync/diff.go index b13921a648..3c6d74058d 100644 --- a/internal/translate/interop/reposync/diff.go +++ b/internal/translate/interop/reposync/diff.go @@ -351,8 +351,17 @@ func viewOf(g *rdf.Graph, rep Carrier) (map[string]*subjectView, []UncarriedProp } views := map[string]*subjectView{} uncarried := map[string]int{} + // A library element the graph names (isLibraryElement) is a reference into + // the standard library, not an element of the model: it is never created, + // changed or deleted in a repository. + library := map[string]bool{} + for _, subject := range g.Subjects() { + if export.LibraryReference(g, subject) { + library[subject.Value] = true + } + } for _, triple := range g.Triples() { - if !triple.Subject.IsIRI() { + if !triple.Subject.IsIRI() || library[triple.Subject.Value] { continue } id := rdf.LocalName(triple.Subject.Value) diff --git a/internal/translate/migrate/activity.go b/internal/translate/migrate/activity.go index 2fd8051c05..319650b4a1 100644 --- a/internal/translate/migrate/activity.go +++ b/internal/translate/migrate/activity.go @@ -1555,7 +1555,7 @@ func (a *activity) declarePins(n *sysmlv1.Element, ins, outs []*sysmlv1.Element, } mult, mnote := a.m.multiplicity(pin) note = joinNotes(note, mnote) - decl += shaped(mult, pin, dir != "") + decl += shaped(mult, pin, dir != "", false) if v := firstOwned(pin, "value"); v != nil && pin.Type == "ValuePin" { expr, ok, vnote := a.m.typedBehaviorValue(v, pin, n) if ok { diff --git a/internal/translate/migrate/behavior.go b/internal/translate/migrate/behavior.go index f554d107e1..ab5f566870 100644 --- a/internal/translate/migrate/behavior.go +++ b/internal/translate/migrate/behavior.go @@ -290,10 +290,10 @@ func (m *migration) parameter(p, scope *sysmlv1.Element, declared map[string]boo } mult, mnote := m.multiplicity(p) tm := m.typeModifier(p) - if shape := tm.shape(); shape != "" { + if shape := tm.shape(false); shape != "" { mult, mnote = shape, "" } else { - mult = shaped(mult, p, dir != "") + mult = shaped(mult, p, dir != "", false) } b.WriteString(mult) note = joinNotes(joinNotes(note, mnote), tm.note()) diff --git a/internal/translate/migrate/metadata.go b/internal/translate/migrate/metadata.go index 68af74fa24..db89eb4915 100644 --- a/internal/translate/migrate/metadata.go +++ b/internal/translate/migrate/metadata.go @@ -101,7 +101,7 @@ func (m *migration) metadataAttribute(p *sysmlv1.Element) { } mult, mnote := m.declaredMultiplicity(p) note = joinNotes(note, mnote) - decl += mult + collection(p) + decl += mult + collection(p, false) m.add(p, verdictFor(note), m.v2Name(p), note) m.w.block(decl, func() { saved := m.scope diff --git a/internal/translate/migrate/migrate.go b/internal/translate/migrate/migrate.go index 46cacbbadb..52454dcaf3 100644 --- a/internal/translate/migrate/migrate.go +++ b/internal/translate/migrate/migrate.go @@ -179,6 +179,7 @@ func FromModelOptions(name string, model *sysmlv1.Model, opts Options) *Result { fileContents: map[string]string{}, pending: map[*sysmlv1.Element]*pendingNotes{}, regionUsed: map[*sysmlv1.Element]map[string]bool{}, + entries: map[*sysmlv1.Element]*regionEntry{}, stateUsed: map[*sysmlv1.Element]map[string]bool{}, nestedIn: map[*sysmlv1.Element]string{}, vertexNames: map[*sysmlv1.Element]string{}, @@ -518,6 +519,8 @@ type migration struct { observed map[*sysmlv1.Element][]*sysmlv1.Element // regionUsed holds the vertex names each region's body has taken. regionUsed map[*sysmlv1.Element]map[string]bool + // entries holds what enters each region of the machines named so far. + entries map[*sysmlv1.Element]*regionEntry // stateUsed holds the member names each state's body has taken. stateUsed map[*sysmlv1.Element]map[string]bool // nestedIn names the generated action a state's behavior is written @@ -1740,14 +1743,14 @@ func (m *migration) instanceOf(classifiers []*sysmlv1.Element, t *sysmlv1.Elemen } // slotConflict notes how slot values contradict their feature: a count outside -// its multiplicity or a repeat on a unique feature. Both v1 and v2 reject them. +// its multiplicity or a repeat on a feature written unique. v2 rejects both. func (m *migration) slotConflict(f *sysmlv1.Element, vals []string) string { n := len(vals) lower, upper, ok := bounds(f) if ok && (n < lower || (upper >= 0 && n > upper)) { return fmt.Sprintf("the slot holds %d value(s) for a feature of multiplicity %s", n, boundsText(lower, upper)) } - if dup := repeated(vals); dup != "" && f.Attrs["isUnique"] != "false" { + if dup := repeated(vals); dup != "" && m.featureWrittenUnique(f, map[*sysmlv1.Element]bool{}) { return "the slot repeats the value " + dup + " on a unique feature" } return "" @@ -1963,7 +1966,7 @@ func (m *migration) associationEnd(e, end *sysmlv1.Element) { decl += m.typing(t) + typ } mult, mnote := m.multiplicity(end) - decl += mult + collection(end) + ";" + decl += mult + collection(end, false) + ";" tnote = joinNotes(tnote, mnote) m.w.line(decl) m.madeUp(end, writeName(endName)) @@ -2139,13 +2142,17 @@ func (m *migration) feature(p *sysmlv1.Element) { ind, indNote := m.typingIndividual(p, kw) m.featureTyping(&b, p, ind, payload, typ) mult, mnote := m.multiplicity(p) - if shape := tm.shape(); shape != "" { + unique := m.writtenUnique(p, kw, prefix, dir, ownerCat) + if shape := tm.shape(unique != ""); shape != "" { mult, mnote = shape, "" } else { - mult = shaped(mult, p, param || dir != "") + mult = shaped(mult, p, param || dir != "", unique != "") } b.WriteString(mult) note = joinNotes(joinNotes(note, mnote), tm.note()) + if unique != "" && (p.Attrs["isUnique"] == "false" || tm.shape(false) != "") { + note = joinNotes(note, "nonunique is not written: "+unique) + } note = m.featureRedefinitions(&b, p, note) note = m.featureShadow(&b, p, kw, note) note = joinNotes(note, m.dangling(p, "redefinedProperty", "subsettedProperty")) @@ -2281,8 +2288,7 @@ func (m *migration) featureModifiers(b *strings.Builder, p *sysmlv1.Element, own b.WriteString("constant ") } } - if ownerCat == catPortDef && dir == "" && prefix == "" && (kw == "item" || kw == "part") { - // An interface block's usages other than ports must not be composite. + if interfaceReference(ownerCat, kw, dir, prefix) { prefix = "ref " note = joinNotes(note, "the undirected "+kw+" of an interface block is written as a reference") } @@ -2711,32 +2717,33 @@ func (m *migration) declaredMultiplicity(p *sysmlv1.Element) (string, string) { // modifiers after it. A v1 parameter writing no multiplicity means a single // value, where §7.6.3 gives a bare v2 parameter [0..*], so a parameter states // the one it meant before any modifier. -func shaped(mult string, p *sysmlv1.Element, parameter bool) string { +func shaped(mult string, p *sysmlv1.Element, parameter, unique bool) string { if mult == "" && parameter { mult = "[1]" } - return mult + collection(p) + return mult + collection(p, unique) } // parameterShape is the multiplicity a redeclaration of parameter p writes: // the one p's own declaration does, so the callee's range carries over rather // than a bare parameter's [0..*]. func (m *migration) parameterShape(p *sysmlv1.Element) string { - if shape := m.typeModifier(p).shape(); shape != "" { + if shape := m.typeModifier(p).shape(false); shape != "" { return shape } mult, _ := m.multiplicity(p) - return shaped(mult, p, true) + return shaped(mult, p, true, false) } // collection writes the ordered and nonunique modifiers of a property; UML and // v2 share the defaults (unordered, unique), so only a departure is written. -func collection(p *sysmlv1.Element) string { +// A usage that must be unique (writtenUnique) is written without nonunique. +func collection(p *sysmlv1.Element, unique bool) string { s := "" if p.Attrs["isOrdered"] == "true" { s += " ordered" } - if p.Attrs["isUnique"] == "false" { + if p.Attrs["isUnique"] == "false" && !unique { s += " nonunique" } return s diff --git a/internal/translate/migrate/states.go b/internal/translate/migrate/states.go index b665176df8..2d627ce171 100644 --- a/internal/translate/migrate/states.go +++ b/internal/translate/migrate/states.go @@ -93,6 +93,7 @@ func (m *migration) nameMachine(sm *sysmlv1.Element) map[string]bool { } m.regionUsed[sm] = used m.indexTransitions(sm) + m.planEntries(sm) for _, cp := range sm.Owned("connectionPoint") { m.nameVertex(cp, sm, used) } @@ -313,11 +314,12 @@ func (m *migration) entryPointForm(v, owner *sysmlv1.Element) pointForm { out := m.outgoing[v] if len(out) == 0 { note := "no transition leaves the entry point, so entering through it enters " + describe(owner) + " by its default entry; a transition to it is written to the state" - if without := regionsWithoutInitial(m.populatedRegions(owner)); len(without) > 0 { - note += "; no initial pseudostate starts the " + pluralRegion(len(without)) + " " + strings.Join(without, ", ") + ", which v1 too leaves inactive on entering the state" + withoutInitial, withoutEntry := m.regionsWithoutEntry(m.populatedRegions(owner)) + if len(withoutInitial) > 0 { + note += "; no initial pseudostate starts the " + pluralRegion(len(withoutInitial)) + " " + strings.Join(withoutInitial, ", ") + ", which v1 too leaves inactive on entering the state" } - if without := m.regionsWithoutOrthogonalInitialEntry(m.populatedRegions(owner)); len(without) > 0 { - note += "; the initial target in the " + pluralRegion(len(without)) + " " + strings.Join(without, ", ") + " is in an orthogonal region, so no entry is written for it" + if len(withoutEntry) > 0 { + note += "; no initial pseudostate of the " + pluralRegion(len(withoutEntry)) + " " + strings.Join(withoutEntry, ", ") + " enters it, so no entry is written for it" } return pointForm{defaultEntry: true, note: note} } @@ -612,16 +614,15 @@ func (m *migration) regions(owner *sysmlv1.Element, regions []*sysmlv1.Element, st.write() default: name := m.parallel[regions[0]] - withoutInitial := regionsWithoutInitial(regions) - withoutOrthogonal := m.regionsWithoutOrthogonalInitialEntry(regions) - withoutEntry := slices.Concat(withoutInitial, withoutOrthogonal) - if len(withoutEntry) == 0 { + withoutInitial, withoutEntry := m.regionsWithoutEntry(regions) + switch { + case len(withoutInitial) == 0 && len(withoutEntry) == 0: m.w.line(entryThen(entered, "", writeName(name))) - } else if len(withoutOrthogonal) == 0 { + case len(withoutEntry) == 0: m.w.lines(commentLines("no default entry: the " + pluralRegion(len(withoutInitial)) + " " + strings.Join(withoutInitial, ", ") + " have no initial pseudostate, so only a fork or a transition naming a nested state enters the regions")) - } else { - m.w.lines(commentLines("no default entry: these regions have no written entry: " + strings.Join(withoutEntry, ", ") + + default: + m.w.lines(commentLines("no default entry: these regions have no written entry: " + strings.Join(slices.Concat(withoutInitial, withoutEntry), ", ") + "; only a fork or a transition naming a nested state enters them")) } between() @@ -642,49 +643,195 @@ func (m *migration) regions(owner *sysmlv1.Element, regions []*sysmlv1.Element, } } -// regionsWithoutInitial names the regions no initial pseudostate starts. -func regionsWithoutInitial(regions []*sysmlv1.Element) []string { - var out []string +// regionsWithoutEntry names the regions nothing enters: those no initial pseudostate +// starts, and apart those whose initial pseudostates enter other regions or nothing. +func (m *migration) regionsWithoutEntry(regions []*sysmlv1.Element) (withoutInitial, withoutEntry []string) { for _, r := range regions { - has := false - for _, v := range r.Owned("subvertex") { - if pseudoKind(v) == "initial" { - has = true - } - } - if !has { - out = append(out, describe(r)) + e := m.regionEntry(r) + switch { + case e.init != nil: + case len(e.strays) == 0 && len(e.dangling) == 0: + withoutInitial = append(withoutInitial, describe(r)) + default: + withoutEntry = append(withoutEntry, describe(r)) } } - return out + return withoutInitial, withoutEntry +} + +// regionEntry is what enters a region: the initial pseudostate written as its +// entry — one of the region's own whose transition enters it, or one a stray +// initial of an orthogonal region donates, its donor — with the region's further +// initials: duplicates entering it, strays entering other regions, and dangling +// ones no transition leaves. +type regionEntry struct { + init, transition, donor *sysmlv1.Element + duplicates, dangling []*sysmlv1.Element + strays []*strayInitial +} + +// strayInitial is an initial pseudostate whose transition enters another region, +// into. One entering an orthogonal region is donated to it as its entry when it has +// none of its own, coincides with its entry into the same vertex, or conflicts with +// one into another, ownTarget — an entry of into's own, or one donated by ownDonor. +// One entering a region of another state is foreign: refused. +type strayInitial struct { + init, transition, target, into, ownTarget, ownDonor *sysmlv1.Element + fate strayFate } -// regionsWithoutOrthogonalInitialEntry names regions whose initial targets an orthogonal region. -func (m *migration) regionsWithoutOrthogonalInitialEntry(regions []*sysmlv1.Element) []string { - var out []string +type strayFate int + +const ( + strayDonated strayFate = iota + strayCoincides + strayConflicts + strayForeign +) + +// planEntries settles what enters each region of a machine before any is written, so +// the writer, the owner's default-entry note and the ledger agree: a region's own initial +// entering it comes first; a stray initial entering an orthogonal region is written +// there when that region has no entry of its own. +func (m *migration) planEntries(sm *sysmlv1.Element) { + var regions []*sysmlv1.Element + var walk func(e *sysmlv1.Element) + walk = func(e *sysmlv1.Element) { + for _, c := range e.Children { + if c.Type == "StateMachine" { + continue + } + if c.Type == "Region" { + regions = append(regions, c) + } + walk(c) + } + } + walk(sm) for _, r := range regions { - var initial *sysmlv1.Element + e := ®ionEntry{} + m.entries[r] = e for _, v := range r.Owned("subvertex") { - if pseudoKind(v) == "initial" { - initial = v - break + if pseudoKind(v) != "initial" { + continue } - } - if initial == nil { - continue - } - for _, t := range r.Owned("transition") { - if m.model.Ref(t, "source") == initial { - if isOrthogonalRegionTarget(r, m.model.Ref(t, "target")) { - out = append(out, describe(r)) + out := m.initialTransitions(v) + if len(out) == 0 { + e.dangling = append(e.dangling, v) + continue + } + tgt := m.model.Ref(out[0], "target") + if foreign := foreignRegionOf(r, tgt); foreign != nil { + st := &strayInitial{init: v, transition: out[0], target: tgt, into: foreign} + if !isOrthogonal(r, foreign) { + st.fate = strayForeign } - break + e.strays = append(e.strays, st) + continue + } + if e.init != nil { + e.duplicates = append(e.duplicates, v) + continue + } + e.init, e.transition = v, out[0] + } + } + for _, r := range regions { + for _, st := range m.entries[r].strays { + if st.fate == strayForeign { + continue + } + into := m.entries[st.into] + switch { + case into.init == nil: + into.init, into.transition, into.donor = st.init, st.transition, r + case m.model.Ref(into.transition, "target") == st.target: + st.fate = strayCoincides + default: + st.fate = strayConflicts + st.ownDonor = into.donor + st.ownTarget = m.model.Ref(into.transition, "target") } } } +} + +// regionEntry returns what planEntries settled enters region r. +func (m *migration) regionEntry(r *sysmlv1.Element) *regionEntry { + if e, ok := m.entries[r]; ok { + return e + } + if sm := machineOf(r); sm != nil { + m.planEntries(sm) + if e, ok := m.entries[r]; ok { + return e + } + } + e := ®ionEntry{} + m.entries[r] = e + return e +} + +// initialTransitions lists the transitions of the initial pseudostate's region that leave it. +func (m *migration) initialTransitions(init *sysmlv1.Element) []*sysmlv1.Element { + var out []*sysmlv1.Element + if init.Parent == nil { + return nil + } + for _, t := range init.Parent.Owned("transition") { + if m.model.Ref(t, "source") == init { + out = append(out, t) + } + } return out } +// foreignRegionOf returns the region owning target when it is neither region nor +// nested in it nor one of its ancestors; nil otherwise. +func foreignRegionOf(region, target *sysmlv1.Element) *sysmlv1.Element { + var targetRegion *sysmlv1.Element + for cur := target; cur != nil; cur = cur.Parent { + if cur.Type == "Region" { + targetRegion = cur + break + } + } + if targetRegion == nil || targetRegion == region { + return nil + } + for cur := targetRegion.Parent; cur != nil; cur = cur.Parent { + if cur == region { + return nil + } + } + for cur := region.Parent; cur != nil; cur = cur.Parent { + if cur == targetRegion { + return nil + } + } + return targetRegion +} + +// isOrthogonal reports whether other lies in another region of region's owner: +// an orthogonal region of region's, or one nested below it. +func isOrthogonal(region, other *sysmlv1.Element) bool { + for cur := other; cur != nil && cur != region.Parent; cur = cur.Parent { + if cur.Type == "Region" && cur.Parent == region.Parent && cur != region { + return true + } + } + return false +} + +// regionLabel names a region as it is written: the sub-state of a parallel +// state, or the body of the state or machine whose one region it is. +func (m *migration) regionLabel(r *sysmlv1.Element) string { + if name, ok := m.names[r]; ok { + return name + } + return "the body of " + describe(r.Parent) +} + func pluralRegion(n int) string { if n == 1 { return "region" @@ -747,7 +894,7 @@ type stateRegion struct { // enter writes the region's entry succession. func (s *stateRegion) enter(entered bool) { - s.initial(s.r.Owned("subvertex"), s.r.Owned("transition"), entered) + s.initial(entered) } // write writes the region's states and transitions; enter comes first. @@ -786,54 +933,46 @@ func pseudoKind(v *sysmlv1.Element) string { return "initial" } -// initial writes the region's entry: `entry; then s` from its initial -// pseudostate, with the initial transition's effect as the entry action -// unless the body wrote its own, which entered says. -func (s *stateRegion) initial(vertices, transitions []*sysmlv1.Element, entered bool) { - var init *sysmlv1.Element - for _, v := range vertices { - if pseudoKind(v) == "initial" { - if init != nil { - s.m.unmapped(v, "a region has one initial pseudostate; "+describe(init)+" is written as it") - continue - } - init = v - } +// initial writes the region's entry: `entry; then s` from the initial +// pseudostate planEntries settled on, with the initial transition's effect as +// the entry action unless the body wrote its own, which entered says. +func (s *stateRegion) initial(entered bool) { + e := s.m.regionEntry(s.r) + for _, v := range e.dangling { + s.m.unmapped(v, "no transition leaves the initial pseudostate") } - if init == nil { - s.m.w.lines(commentLines("the region has no initial pseudostate: nothing enters it")) - return + for _, v := range e.duplicates { + s.m.unmapped(v, "a region has one initial pseudostate; "+describe(e.init)+" is written as it") } - var out []*sysmlv1.Element - for _, t := range transitions { - if s.m.model.Ref(t, "source") == init { - out = append(out, t) - } + for _, st := range e.strays { + s.stray(st) } - if len(out) == 0 { - s.m.unmapped(init, "no transition leaves the initial pseudostate") + init := e.init + if init == nil { + switch { + case len(e.strays) > 0: + s.m.w.lines(commentLines("every initial pseudostate of the region enters another region: nothing enters this one")) + case len(e.dangling) > 0: + s.m.w.lines(commentLines("no transition leaves the region's initial pseudostate: nothing enters the region")) + default: + s.m.w.lines(commentLines("the region has no initial pseudostate: nothing enters it")) + } return } - t := out[0] - for _, other := range out[1:] { - s.m.unmapped(other, "an initial pseudostate has one outgoing transition; "+describe(t)+" is written as it") + t := e.transition + for _, other := range s.m.initialTransitions(init) { + if other != t { + s.m.unmapped(other, "an initial pseudostate has one outgoing transition; "+describe(t)+" is written as it") + } } tgt := s.m.model.Ref(t, "target") - orthogonalTarget := isOrthogonalRegionTarget(s.r, tgt) - var to string - var ok bool - if !orthogonalTarget { - to, ok = s.target(t, tgt) - } + to, ok := s.target(t, tgt) if !ok { s.m.unmapped(init, "the initial transition's target has no v2 form here") if tgt == nil { s.m.unmapped(t, joinNotes(s.m.dangling(t, "target"), "the transition lacks a target")) } else { why := "the target " + describe(tgt) + isA + kindOf(tgt) + outsideRegion - if orthogonalTarget { - why = "its target lies in an orthogonal region" - } s.m.unmapped(t, why) if s.m.strict { s.refusedParts(t, why) @@ -866,33 +1005,61 @@ func (s *stateRegion) initial(vertices, transitions []*sysmlv1.Element, entered s.m.unbound(eff, "an initial transition accepts no signal") s.m.w.line(entryThen(s.m.inlineBehavior("entry action", eff, t), name, to)) } - s.m.add(init, Mapped, "", "written as the entry of the region") + if e.donor == nil { + s.m.add(init, Mapped, "", "written as the entry of the region") + } else { + here := s.m.regionLabel(s.r) + s.m.add(init, Approximated, "", "written as the entry of "+here+", which owns its target "+describe(tgt)+", not of "+s.m.regionLabel(e.donor)+", the orthogonal region that owns the pseudostate") + note = joinNotes(note, "its target "+describe(tgt)+" lies in "+here+", an orthogonal region of the pseudostate's, so it is written as the entry of "+here) + } s.m.add(t, verdictFor(note), s.m.edgeTarget(t), note) } -// isOrthogonalRegionTarget reports whether target belongs to a region unrelated to region. -func isOrthogonalRegionTarget(region, target *sysmlv1.Element) bool { - var targetRegion *sysmlv1.Element - for cur := target; cur != nil; cur = cur.Parent { - if cur.Type == "Region" { - targetRegion = cur - break - } - } - if targetRegion == nil || targetRegion == region { - return false - } - for cur := targetRegion.Parent; cur != nil; cur = cur.Parent { - if cur == region { - return false +// stray accounts for an initial pseudostate of the region whose transition enters +// another region: one donated to an orthogonal region is written and ledgered +// there; one coinciding with that region's own entry adds nothing to it; one in +// conflict with it is refused, since the region's own initial is kept; one entering +// a region of another state is refused. +func (s *stateRegion) stray(st *strayInitial) { + into := s.m.regionLabel(st.into) + switch st.fate { + case strayDonated: + case strayCoincides: + note := "coincides with " + into + "'s own entry into " + describe(st.target) + ", which its transition also enters from this orthogonal region" + if d := s.m.entries[st.into].donor; d != nil { + note = "coincides with the entry of " + into + " donated by " + s.m.regionLabel(d) + "'s initial pseudostate into " + describe(st.target) + ", which its transition also enters from this orthogonal region" + } + s.m.add(st.init, Approximated, "", note) + s.m.add(st.transition, Approximated, s.m.edgeTarget(st.transition), note) + s.m.wroteNoMember(st.transition) + for _, tr := range st.transition.Owned("trigger") { + s.m.add(tr, Unmapped, "", "a trigger of an initial transition, which takes none, is dropped") + } + if g := s.m.guardOf(st.transition); g != nil { + s.m.add(g, Unmapped, "", "a guard of an initial transition, which takes none, is dropped") + } + if eff := s.m.behaviorIn(st.transition, "effect"); eff != nil { + s.m.unmapped(eff, "the effect of an initial transition that coincides with "+into+"'s own entry is dropped: that entry's effect is written") + } + case strayConflicts: + own := "whose own initial pseudostate enters " + describe(st.ownTarget) + if st.ownDonor != nil { + own = "whose entry, donated by " + s.m.regionLabel(st.ownDonor) + "'s initial pseudostate, enters " + describe(st.ownTarget) + } + why := "its target " + describe(st.target) + " lies in " + into + ", an orthogonal region " + own + "; that entry is kept" + s.m.unmapped(st.init, "the initial transition's target has no v2 form here") + s.m.unmapped(st.transition, why) + if s.m.strict { + s.refusedParts(st.transition, why) } - } - for cur := region.Parent; cur != nil; cur = cur.Parent { - if cur == targetRegion { - return false + case strayForeign: + why := "its target " + describe(st.target) + " lies in " + describe(st.into) + ", a region of " + describe(st.into.Parent) + " and no orthogonal region of the pseudostate's; an initial transition enters its own region" + s.m.unmapped(st.init, "the initial transition's target has no v2 form here") + s.m.unmapped(st.transition, why) + if s.m.strict { + s.refusedParts(st.transition, why) } } - return true } // initialName is the name the initial transition t is declared under when a diff --git a/internal/translate/migrate/typemodifier.go b/internal/translate/migrate/typemodifier.go index 5aa3e8a81a..a278a50938 100644 --- a/internal/translate/migrate/typemodifier.go +++ b/internal/translate/migrate/typemodifier.go @@ -116,11 +116,15 @@ func kwArticle(kw string) string { } // shape is the multiplicity the type modifier writes in place of the declared -// one, "" when it writes none: a v1 array is ordered and admits repeated values. -func (tm *typeModifier) shape() string { +// one, "" when it writes none: a v1 array is ordered and admits repeated +// values, which a usage that must be unique (writtenUnique) does not say. +func (tm *typeModifier) shape(unique bool) string { if tm == nil || tm.mult == "" { return "" } + if unique { + return tm.mult + " ordered" + } return tm.mult + " ordered nonunique" } diff --git a/internal/translate/migrate/uniqueness.go b/internal/translate/migrate/uniqueness.go new file mode 100644 index 0000000000..3d3a19b910 --- /dev/null +++ b/internal/translate/migrate/uniqueness.go @@ -0,0 +1,150 @@ +package migrate + +import ( + "sync" + + "github.com/Open-MBEE/OpenSysML/internal/semantic/resolve" + "github.com/Open-MBEE/OpenSysML/internal/semantic/semantics" + "github.com/Open-MBEE/OpenSysML/internal/syntax/ast" + "github.com/Open-MBEE/OpenSysML/internal/translate/xmi/sysmlv1" + "github.com/Open-MBEE/OpenSysML/internal/workspace/libs" +) + +// usageKinds are the kinds of the usage keywords featureKeyword writes; a +// keyword-less `ref` is a default reference usage, which the parser reads as +// an attribute. +var usageKinds = map[string]ast.UsageKind{ + "attribute": ast.UsageAttribute, + "ref": ast.UsageAttribute, + "part": ast.UsagePart, + "item": ast.UsageItem, + "port": ast.UsagePort, + "action": ast.UsageAction, + "state": ast.UsageState, + "calc": ast.UsageCalc, + "constraint": ast.UsageConstraint, + "requirement": ast.UsageRequirement, + "use case": ast.UsageUseCase, + "actor": ast.UsageActor, + "view": ast.UsageView, + "viewpoint": ast.UsageViewpoint, +} + +// nestedOwners are the declaration kinds the categories a feature's owner can +// take are written as. +var nestedOwners = map[category]semantics.NestedOwner{ + catPartDef: {Def: ast.DefPart, IsDef: true}, + catPortDef: {Def: ast.DefPort, IsDef: true}, + catAttributeDef: {Def: ast.DefAttribute, IsDef: true}, + catEnumDef: {Def: ast.DefEnumeration, IsDef: true}, + catConstraintDef: {Def: ast.DefConstraint, IsDef: true}, + catRequirementDef: {Def: ast.DefRequirement, IsDef: true}, + catConnectionDef: {Def: ast.DefConnection, IsDef: true}, + catIndividualDef: {Def: ast.DefIndividual, IsDef: true}, + catVerificationDef: {Def: ast.DefVerificationCase, IsDef: true}, + catItemDef: {Def: ast.DefItem, IsDef: true}, + catActionDef: {Def: ast.DefAction, IsDef: true}, + catSimConfig: {Def: ast.DefAction, IsDef: true}, + catCalcDef: {Def: ast.DefCalc, IsDef: true}, + catStateDef: {Def: ast.DefState, IsDef: true}, + catUseCaseDef: {Def: ast.DefUseCase, IsDef: true}, + catMetadataDef: {Def: ast.DefMetadata, IsDef: true}, + catView: {Usage: ast.UsageView}, + catViewpoint: {Usage: ast.UsageViewpoint}, + catValue: {Usage: ast.UsageAttribute}, +} + +// implicitlyUnique is the unique library feature a usage written as prefix+kw +// in an owner of category owner implicitly subsets, which forbids it the +// nonunique modifier (subsetting-uniqueness-conformance); "" when it may be +// nonunique. A directed usage is a parameter, which subsets nothing implicitly. +func implicitlyUnique(kw, prefix, dir string, owner category) string { + kind, ok := usageKinds[kw] + o, known := nestedOwners[owner] + if !ok || !known || dir != "" { + return "" + } + u := semantics.NestedUsage{Kind: kind, Composite: prefix == ""} + for _, fqn := range semantics.ImplicitSubsettingCandidates(u, o) { + if libraryUnique(fqn) { + return fqn + } + } + return "" +} + +// library is a semantic model over the shared standard library, built once. +var library = sync.OnceValue(func() *semantics.Model { + resolver := resolve.New(libs.SharedBase()) + m := semantics.NewModel(resolver) + resolver.SetModel(m) + return m +}) + +// libraryUnique reports whether the standard library declares the feature fqn +// unique; a name it does not declare constrains nothing. +func libraryUnique(fqn string) bool { + syms := libs.SharedBase().LookupQualified(fqn) + return len(syms) == 1 && library().IsUnique(syms[0]) +} + +// writtenUnique is why the usage written for p must be unique, "" when it may +// keep a declared nonunique: the unique library feature it implicitly subsets, +// or a written redefinition or subsetting of a feature that is itself written +// unique, whose uniqueness conformance it must then keep. +func (m *migration) writtenUnique(p *sysmlv1.Element, kw, prefix, dir string, owner category) string { + return m.uniqueReason(p, kw, prefix, dir, owner, map[*sysmlv1.Element]bool{p: true}) +} + +func (m *migration) uniqueReason(p *sysmlv1.Element, kw, prefix, dir string, owner category, seen map[*sysmlv1.Element]bool) string { + if fqn := implicitlyUnique(kw, prefix, dir, owner); fqn != "" { + return kwArticle(prefix+kw) + " in " + kwArticle(owner.keyword()) + " implicitly subsets " + fqn + ", which is unique" + } + for role, verb := range map[string]string{"redefinedProperty": "redefines", "subsettedProperty": "subsets"} { + for _, r := range m.model.Refs(p, role) { + if m.written(r) && m.featureWrittenUnique(r, seen) { + return "it " + verb + " " + m.featureRef(r) + ", which is written unique" + } + } + } + if r, redefinable := m.shadowed(p); redefinable && m.featureWrittenUnique(r, seen) { + return "it redefines the inherited " + m.featureRef(r) + ", which is written unique" + } + return "" +} + +// featureWrittenUnique reports whether the usage written for r is unique: v1 +// declares it so and no array type modifier says otherwise, or writtenUnique +// forces it. A cycle of subsettings settles on what is declared. +func (m *migration) featureWrittenUnique(r *sysmlv1.Element, seen map[*sysmlv1.Element]bool) bool { + if r.Attrs["isUnique"] != "false" && m.typeModifier(r).shape(false) == "" { + return true + } + if seen[r] { + return false + } + seen[r] = true + owner := m.classifyParent(r) + kw, prefix, _ := m.featureKeyword(r, owner) + dir, _ := m.featureDirection(r, owner, kw) + return m.uniqueReason(r, kw, m.referencePrefix(r, owner, kw, dir, prefix), dir, owner, seen) != "" +} + +// referencePrefix is the prefix a usage ends up with once an interface block +// (featureModifiers) or a pointer type modifier (typeModifier.ref) forces a +// reference. +func (m *migration) referencePrefix(p *sysmlv1.Element, owner category, kw, dir, prefix string) string { + if tm := m.typeModifier(p); tm != nil && tm.ref { + return "ref " + } + if interfaceReference(owner, kw, dir, prefix) { + return "ref " + } + return prefix +} + +// interfaceReference reports whether a usage of an interface block is forced +// a reference: its usages other than ports must not be composite. +func interfaceReference(owner category, kw, dir, prefix string) bool { + return owner == catPortDef && dir == "" && prefix == "" && (kw == "item" || kw == "part") +} diff --git a/internal/translate/migrate/uniqueness_test.go b/internal/translate/migrate/uniqueness_test.go new file mode 100644 index 0000000000..988d5d84b4 --- /dev/null +++ b/internal/translate/migrate/uniqueness_test.go @@ -0,0 +1,61 @@ +package migrate + +import ( + "strings" + "testing" + + "github.com/Open-MBEE/OpenSysML/internal/syntax/diag" + "github.com/Open-MBEE/OpenSysML/internal/workspace/model" +) + +// implicitlyUnique agrees with the checker: for every usage keyword the migrator +// writes in every owner it writes it in, the usage may be declared nonunique +// exactly when the checker accepts it so (subsetting-uniqueness-conformance). +func TestImplicitlyUniqueAgreesWithTheChecker(t *testing.T) { + checked := 0 + for owner := range nestedOwners { + for kw := range usageKinds { + for _, prefix := range []string{"", "ref "} { + usage := prefix + kw + " x[*]" + if errs := validate(owner.keyword() + " O { " + usage + "; }"); len(errs) > 0 { + continue // not a usage the owner admits; nonunique is not the question + } + errs := validate(owner.keyword() + " O { " + usage + " nonunique; }") + unique := implicitlyUnique(kw, prefix, "", owner) + switch { + case len(errs) > 0 && unique == "": + t.Errorf("%s in %s: the checker refuses nonunique (%v) but the migrator writes it", usage, owner.keyword(), errs) + case len(errs) == 0 && unique != "": + t.Errorf("%s in %s: the checker accepts nonunique but the migrator drops it for %s", usage, owner.keyword(), unique) + } + checked++ + } + } + } + if checked < 20 { + t.Errorf("only %d cases checked", checked) + } + for _, c := range []struct{ kw, prefix, dir string }{{"part", "", "in "}, {"part", "ref ", ""}, {"attribute", "", ""}} { + if got := implicitlyUnique(c.kw, c.prefix, c.dir, catPartDef); got != "" { + t.Errorf("%s%s%s in a part def: %q, want nothing", c.dir, c.prefix, c.kw, got) + } + } + if !libraryUnique("Items::Item::subparts") || libraryUnique("Base::dataValues") || libraryUnique("Nowhere::nothing") { + t.Error("libraryUnique misreads the library") + } +} + +func validate(body string) []string { + ws := model.NewWorkspace() + ws.Open("t.sysml", []byte("package P { "+body+" }"), 1) + var errs []string + for _, d := range ws.Diagnostics("t.sysml") { + if d.Severity == diag.SeverityError { + errs = append(errs, d.Message) + } + } + if len(errs) == 0 { + return nil + } + return []string{strings.Join(errs, "; ")} +} diff --git a/internal/translate/rdf/graph_fastpath_test.go b/internal/translate/rdf/graph_fastpath_test.go index fa3e2f3cad..500a3a2afc 100644 --- a/internal/translate/rdf/graph_fastpath_test.go +++ b/internal/translate/rdf/graph_fastpath_test.go @@ -30,6 +30,165 @@ func TestNewGraphOfDropsDuplicatesOnceAddedTo(t *testing.T) { } } +func TestGraphBuilderPreservesOrderAndDropsDuplicates(t *testing.T) { + p := IRI(Element + "P") + first := Triple{Subject: p, Predicate: SysMLTerm("declaredName"), Object: String("P")} + second := Triple{Subject: p, Predicate: SysMLTerm("ownedMember"), Object: IRI(Element + "P__A")} + builder := NewGraphBuilder(3) + builder.AddTriple(first) + builder.AddTriple(second) + builder.AddTriple(first) + + graph := builder.Build() + if !slices.Equal(graph.Triples(), []Triple{first, second}) { + t.Fatalf("built triples = %v, want %v", graph.Triples(), []Triple{first, second}) + } + if graph.Prefixes["sysml"] != SysML || !graph.Has(first) { + t.Fatalf("built graph prefixes or membership are incorrect: %v", graph.Prefixes) + } + builder.Add(IRI(Element+"Q"), SysMLTerm("declaredName"), String("Q")) + if !slices.Equal(graph.Triples(), []Triple{first, second}) { + t.Fatalf("adding to a used builder changed its graph: %v", graph.Triples()) + } +} + +func TestHasBuildsIndexWhenNoCacheExists(t *testing.T) { + triple := Triple{Subject: IRI(Element + "P"), Predicate: SysMLTerm("declaredName"), Object: String("P")} + graph := NewGraphOf([]Triple{triple}, nil) + if graph.index != nil || !graph.Has(triple) || graph.index == nil { + t.Fatalf("Has did not build and use the subject index: index=%v", graph.index) + } +} + +func TestCompactKeepsGraphQueriesAndDropsDuplicateSet(t *testing.T) { + p := IRI(Element + "P") + t1 := Triple{Subject: p, Predicate: SysMLTerm("declaredName"), Object: String("P")} + t2 := Triple{Subject: p, Predicate: SysMLTerm("ownedMember"), Object: IRI(Element + "P__A")} + g := NewGraphOf([]Triple{t1, t2}, map[string]string{"sysml": SysML}) + if got := g.Objects(p, SysML+"ownedMember"); !slices.Equal(got, []Term{t2.Object}) { + t.Fatalf("ownedMember before compact = %v", got) + } + g.Compact() + if !g.Has(t1) || g.Has(Triple{Subject: p, Predicate: SysMLTerm("ownedMember"), Object: IRI(Element + "P__B")}) { + t.Fatal("Has changed after compact") + } + g.AddTriple(t2) + if !slices.Equal(g.Triples(), []Triple{t1, t2}) { + t.Fatalf("adding a held triple after compact changed the graph: %v", g.Triples()) + } +} + +func TestCompactReleasesExcessTripleCapacity(t *testing.T) { + builder := NewGraphBuilder(10) + builder.Add(IRI(Element+"A"), SysMLTerm("declaredName"), String("A")) + builder.Add(IRI(Element+"B"), SysMLTerm("declaredName"), String("B")) + graph := builder.Build() + if cap(graph.triples) <= len(graph.triples)+len(graph.triples)/2 { + t.Fatalf("test graph capacity %d is not excessive for %d triples", cap(graph.triples), len(graph.triples)) + } + + graph.Compact() + if cap(graph.triples) != len(graph.triples) { + t.Fatalf("compacted capacity = %d, want %d", cap(graph.triples), len(graph.triples)) + } +} + +func TestRewriteTriplesRebuildsGraphIndexesAndDuplicateSet(t *testing.T) { + a, b := IRI(Element+"A"), IRI(Element+"B") + predicate := SysMLTerm("declaredName") + first := Triple{Subject: a, Predicate: predicate, Object: String("A")} + second := Triple{Subject: a, Predicate: predicate, Object: String("B")} + removed := Triple{Subject: b, Predicate: predicate, Object: String("B")} + g := NewGraph() + g.AddTriple(first) + g.AddTriple(second) + g.AddTriple(removed) + g.Subjects() + g.Objects(a, predicate.Value) + + g.RewriteTriples(func(triple *Triple) bool { + if got := g.Objects(a, predicate.Value); !slices.Equal(got, []Term{first.Object, second.Object}) { + t.Errorf("lookup during rewrite = %v, want the original objects", got) + } + if triple.Subject == b { + return false + } + triple.Object = first.Object + return true + }) + if got := g.Triples(); !slices.Equal(got, []Triple{first}) { + t.Fatalf("rewritten triples = %v, want the duplicate-free first triple", got) + } + if got := g.Subjects(); !slices.Equal(got, []Term{a}) { + t.Fatalf("rewritten subjects = %v, want only %v", got, a) + } + g.AddTriple(first) + g.AddTriple(second) + if got := g.Triples(); !slices.Equal(got, []Triple{first, second}) { + t.Fatalf("adding after rewrite = %v, want the original and a new triple", got) + } +} + +func TestRewriteTriplesDoesNotBuildDuplicateSetForUnchangedUniqueTriples(t *testing.T) { + a, b := IRI(Element+"A"), IRI(Element+"B") + graph := NewGraphOf([]Triple{ + {Subject: a, Predicate: SysMLTerm("declaredName"), Object: String("A")}, + {Subject: b, Predicate: SysMLTerm("declaredName"), Object: String("B")}, + }, nil) + graph.Subjects() + + graph.RewriteTriples(func(triple *Triple) bool { + return triple.Subject == a + }) + if graph.seen != nil { + t.Fatal("rewrite built a duplicate set for unchanged unique triples") + } + if got := graph.Triples(); !slices.Equal(got, []Triple{ + {Subject: a, Predicate: SysMLTerm("declaredName"), Object: String("A")}, + }) { + t.Fatalf("rewritten triples = %v, want only subject %v", got, a) + } +} + +func TestSubjectsCachesInsertionOrderAcrossGraphGrowth(t *testing.T) { + a, b := IRI(Element+"A"), IRI(Element+"B") + g := NewGraphOf([]Triple{ + {Subject: a, Predicate: SysMLTerm("declaredName"), Object: String("A")}, + {Subject: b, Predicate: SysMLTerm("declaredName"), Object: String("B")}, + }, nil) + got := g.Subjects() + got[0] = b + g.Add(a, SysMLTerm("qualifiedName"), String("A")) + g.Add(IRI(Element+"C"), SysMLTerm("declaredName"), String("C")) + if want := []Term{a, b, IRI(Element + "C")}; !slices.Equal(g.Subjects(), want) { + t.Fatalf("Subjects after mutation = %v, want %v", g.Subjects(), want) + } +} + +func TestSubjectsDeduplicatesBySubjectValue(t *testing.T) { + iri := IRI(Element + "same") + literal := String(iri.Value) + other := IRI(Element + "other") + graph := NewGraphOf([]Triple{ + {Subject: iri, Predicate: SysMLTerm("declaredName"), Object: String("same")}, + }, nil) + graph.Subjects() + graph.Add(literal, SysMLTerm("declaredName"), String("literal subject")) + graph.Add(other, SysMLTerm("declaredName"), String("other")) + if got, want := graph.Subjects(), []Term{iri, other}; !slices.Equal(got, want) { + t.Fatalf("Subjects = %v, want %v", got, want) + } + graph.RewriteTriples(func(triple *Triple) bool { + if triple.Subject == other { + triple.Subject = String(iri.Value) + } + return true + }) + if got, want := graph.Subjects(), []Term{iri}; !slices.Equal(got, want) { + t.Fatalf("Subjects after rewrite = %v, want %v", got, want) + } +} + // A graph whose typed triples already state each annotated collection in // annotation order is returned as it is; one whose annotation orders them // differently is rewritten in annotation order, leaving the input alone. diff --git a/internal/translate/rdf/ontology/README.md b/internal/translate/rdf/ontology/README.md index 91f7b8e3df..1c5d3136ad 100644 --- a/internal/translate/rdf/ontology/README.md +++ b/internal/translate/rdf/ontology/README.md @@ -1,69 +1,75 @@ -# SysML v2 ontology term table +# SysML v2 metamodel term table -`table.go` is generated from the OMG SysML v2 metamodel as -[Open-MBEE/sysmlv2-rdf-ontology](https://github.com/Open-MBEE/sysmlv2-rdf-ontology) -renders it in OWL — `sysml2/owl/www.omg.org/spec/SysML.owl`, version `202407`, -generated there from `SysML.ecore` — plus the checkout's `sysml2/ecore/SysML.ecore` -itself, which supplies each property's upper multiplicity. Neither file is -vendored here (the OWL alone is ~624 KB of third-party RDF/XML): the generator -reads them from a local checkout and records the upstream commit SHA in the -generated header, so the table is reproducible from a header alone. +`table.go` is generated from the OMG SysML v2 metamodel as the pilot implementation +([Systems-Modeling/SysML-v2-Pilot-Implementation](https://github.com/Systems-Modeling/SysML-v2-Pilot-Implementation)) +publishes it: `org.omg.sysml/model/SysML.ecore`, at the release and commit +[`scripts/pilot-pin.sh`](../../../../scripts/pilot-pin.sh) pins for every other pilot input. +The metamodel version is the date in the ecore's namespace URI +(`https://www.omg.org/spec/SysML/20250201` → `20250201`). The ecore is not vendored +(~620 KB of third-party XMI); the generated header records the pilot tag, commit and namespace +URI, so the table is reproducible from the header alone. -The table holds, per property, the unqualified local name this tool's encoder -writes (`declaredName`), the metaclass that defines it (`Element`), the full -ontology IRI (`https://www.omg.org/spec/SysML#Element_declaredName`), whether it -is an `owl:ObjectProperty` or an `owl:DatatypeProperty`, its declared -`rdfs:range`, and whether its ecore upper bound is unbounded (`Many` — the -multiplicity the API JSON form spells as an array). It also holds every -`owl:Class` and its named `rdfs:subClassOf` parents, which `IsAncestorOrSelf` -walks for the domain check in `validate.go` and which `PropertyOf` uses to -pick the declaration a given metaclass inherits a name from. +Each ecore `EStructuralFeature` becomes one property, named as the OWL rendering of the +metamodel names it — `https://www.omg.org/spec/SysML#_` — and holding: -The table's contents are counted in one place, -[docs/project/roadmap.md](../../../../docs/project/roadmap.md) § D8, together with -what the gate finds. Some unqualified names are declared by more than one -metaclass, so `LookupProperty` returns every declaration and `AmbiguousNames` -reports those names rather than one being picked silently. - -## What the ontology does not carry +| Field | From the ecore | +|-------|----------------| +| `Name`, `DefiningClass`, `IRI` | the feature's name and the `EClass` declaring it | +| `Kind` | `ObjectProperty` for an `EReference`, `DatatypeProperty` for an `EAttribute` | +| `Range` | the referenced class, the attribute's enumeration, or the XSD/OWL datatype of its primitive (`Boolean` → `xsd:boolean`, `String` → `xsd:string`, `Integer` → `xsd:int`, `Real` → `owl:real`) | +| `Many` | `upperBound="-1"`: the API JSON form spells it as an array | +| `Ordered` | a multi-valued feature without `ordered="false"` (ecore's default is ordered) | +| `Derived` | `derived="true"` | +| `Redefines`, `Subsets` | the `redefines` / `subsets` annotations' references, as `Class::feature` | +| `Opposite` | `eOpposite`, as `Class::feature` | -`SysML.owl` records no ecore abstractness. The only abstractness in the file is -the metamodel's own `Type::isAbstract` property (`sysml:Type_isAbstract`, a -`Type`-domained `owl:DatatypeProperty` about modeled types, not about -metaclasses); the `owl:Class` declarations themselves carry no -abstract/concrete marker. A "the metaclass must be concrete" check is therefore -not possible from this table and is not implemented — see -`docs/project/roadmap.md` § D7 for the abstract-`sysml:Import` finding that check -would otherwise have caught. +Each ecore `EEnum` becomes an `Enumeration`. Its literals keep their declaration order; +enumerations are ordered by name in the generated table. Datatype properties whose range is +in the SysML namespace refer to one of these declarations. -## Regenerating +`Property.QualifiedName` gives the same `Class::feature` spelling, so the three reference fields +can be looked up with `PropertyOf`. Every `EClass` becomes a `Class` with its `eSuperTypes`, which +`IsAncestorOrSelf` walks for the domain check in `validate.go` and `PropertyOf` uses to pick the +declaration a metaclass inherits a name from, and `Abstract` for `abstract="true"`, which the check +reports as an `abstract-class` violation. -Clone the ontology (any revision; the SHA is recorded, not pinned): +The table's contents are counted in one place, +[docs/project/roadmap.md](../../../../docs/project/roadmap.md) § D8, together with what the gate +finds. Some unqualified names are declared by more than one metaclass, so `LookupProperty` returns +every declaration and `AmbiguousNames` reports those names rather than one being picked silently. -```bash -git clone https://github.com/Open-MBEE/sysmlv2-rdf-ontology.git -``` +## Regenerating and checking -Then, from the repository root: +From the repository root: ```bash -go run -C tools ./gen/ontology -ontology /path/to/sysmlv2-rdf-ontology +make ontology-table # ./scripts/download-pilot-metamodel.sh && go run -C tools ./gen/ontology +make ontology-table-check # the same with -check, as CI runs it ``` -or, equivalently, with the checkout in `$SYSMLV2_RDF_ONTOLOGY`: +`scripts/download-pilot-metamodel.sh` fetches the pinned pilot's `org.omg.sysml/model` into +`build/pilot-metamodel/` and stamps it with the pin; the generator refuses a download whose stamp +is not the current pin. It also refuses an ecore whose namespace URI is not +`https://www.omg.org/spec/SysML/`, a feature whose type, opposite, redefined or subsetted +feature names nothing in the ecore, a primitive it has no datatype for, and a name containing `_`, +which would make an IRI ambiguous. `-check` writes nothing and fails when the committed table +differs from what the pin generates. `TestTableFollowsThePilotPin` (`tests/ontology`) fails, with +no download needed, when the pin moves and the table's header still names the previous one. -```bash -SYSMLV2_RDF_ONTOLOGY=/path/to/sysmlv2-rdf-ontology go generate ./internal/translate/rdf/ontology -``` +## Bumping + +The table follows the pilot pin; there is no separate ontology pin to bump. -The generator lives in the `tools/` module and writes the table under the -repository root it finds above its working directory; pass the checkout as an -absolute path. It reads the ontology version from the checkout's `sysml2/README.md` -and the commit SHA from the checkout's on-disk Git metadata. It does not need a -`git` binary, refuses to write a table if any property has no `rdfs:domain` or -if a property IRI disagrees with its domain or names no eStructuralFeature in -the ecore, and overwrites `table.go` in place. -Review the diff, then run -`go test ./internal/translate/rdf/ontology/... ./internal/translate/export/...` — the -export gate compares the golden graphs against the new table and will report -anything the ontology bump changed. +1. Move `PILOT_TAG` and `PILOT_COMMIT` in `scripts/pilot-pin.sh` (see + [docs/project/pilot-corpora.md](../../../../docs/project/pilot-corpora.md) for what else that + moves). +2. `make ontology-table`, then review the diff of `table.go`: classes and properties added, + removed or renamed, and new flags. +3. Update the counts in `tests/ontology/ontology_test.go` and `docs/project/roadmap.md` § D8. +4. `go test ./internal/translate/... ./tests/ontology ./tests/export ./tests/migrate` and the + RDF and API-JSON corpus round-trip gates (`docs/project/rdf-corpus-roundtrip.md`). The export + gate `TestGoldenGraphsMatchOntology` compares the golden graphs against the new table: a + metaclass the export writes that the metamodel renamed, or a property it dropped, appears as a + new violation, and an entry of `tests/export/testdata/ontology-known-violations.txt` the new + table resolves as one to remove. Fix the mapping rather than listing a new violation, and keep + graphs earlier releases wrote readable. diff --git a/internal/translate/rdf/ontology/ontology.go b/internal/translate/rdf/ontology/ontology.go index 0686173cc2..128f98d71b 100644 --- a/internal/translate/rdf/ontology/ontology.go +++ b/internal/translate/rdf/ontology/ontology.go @@ -1,12 +1,11 @@ // Package ontology holds the SysML v2 metamodel term table generated from the -// Open-MBEE OWL rendering, plus the domain/range check built on it. The ontology -// qualifies each property by its defining metaclass (sysml:Element_declaredName) -// where this tool writes the unqualified name (sysml:declaredName), so the table -// records both spellings. It records no ecore abstractness, so a "the metaclass -// must be concrete" check is not possible here. See README.md. +// OMG metamodel's SysML.ecore, plus the domain/range check built on it. The +// table qualifies each property by its defining metaclass in OWL style +// (sysml:Element_declaredName) where this tool writes the unqualified name +// (sysml:declaredName), so it records both spellings. See README.md. package ontology -//go:generate go run -C ../../../../tools ./gen/ontology -ontology $SYSMLV2_RDF_ONTOLOGY +//go:generate go run -C ../../../../tools ./gen/ontology import ( "strings" @@ -31,7 +30,7 @@ func (k PropertyKind) String() string { return "owl:ObjectProperty" } -// Property is one metamodel property as the ontology declares it. +// Property is one metamodel property, an ecore eStructuralFeature. type Property struct { // Name is the unqualified name this tool's encoder writes ("declaredName"). Name string @@ -41,33 +40,70 @@ type Property struct { IRI string // Kind is owl:ObjectProperty or owl:DatatypeProperty. Kind PropertyKind - // Range is the declared rdfs:range IRI, empty when none is declared. + // Range is the rdfs:range IRI: a metaclass or enumeration in the SysML + // namespace, or the XSD/OWL datatype of an ecore primitive. Range string - // Many reports an unbounded upper multiplicity (ecore upperBound -1): - // the API JSON shape is an array. + // Many reports an upper multiplicity above 1 or unbounded (ecore upperBound + // -1): the API JSON shape is an array. Many bool + // Ordered reports a Many property whose values are ordered (ecore + // ordered, which defaults to true); a single-valued property is never Ordered. + Ordered bool + // Derived reports a property the metamodel computes (ecore derived="true") + // rather than one an element owns. + Derived bool + // Redefines and Subsets name the properties this one redefines or subsets, + // as "DefiningClass::name" ("Type::ownedFeature"), when the metamodel states any. + Redefines []string + Subsets []string + // Opposite is the "DefiningClass::name" of the ecore eOpposite, the + // navigable property at the other end of the same association, if any. + Opposite string } -// Class is one metaclass and its named rdfs:subClassOf parents; the anonymous -// cardinality restrictions the ontology also states are not recorded. +// QualifiedName returns the property as "DefiningClass::name", the form +// Redefines, Subsets and Opposite name properties in. +func (p Property) QualifiedName() string { return p.DefiningClass + "::" + p.Name } + +// Class is one metaclass, an ecore EClass, and its eSuperTypes. type Class struct { // Name is the metaclass name ("PartUsage"), its local name in the namespace. Name string + // Abstract reports an abstract metaclass (ecore abstract="true"), one no + // element is an instance of directly. + Abstract bool // Parents are the metaclass names of the declared direct superclasses. Parents []string } +// Enumeration is one metamodel enumeration, an ecore EEnum, with its literals in declaration order. +type Enumeration struct { + Name string + Literals []string +} + // Properties returns every declared property, ordered by IRI. func Properties() []Property { return properties } // Classes returns every declared metaclass, ordered by name. func Classes() []Class { return classes } +// Enumerations returns every declared enumeration, ordered by name. +func Enumerations() []Enumeration { + out := make([]Enumeration, len(enumerations)) + for i, enumeration := range enumerations { + out[i] = enumeration + out[i].Literals = append([]string(nil), enumeration.Literals...) + } + return out +} + // Indexes over the immutable generated table, built once on first lookup. var ( - indexOnce sync.Once - propertiesByName map[string][]Property - classesByName map[string]Class + indexOnce sync.Once + propertiesByName map[string][]Property + classesByName map[string]Class + enumerationsByName map[string]Enumeration ) func index() { @@ -80,6 +116,10 @@ func index() { for _, c := range classes { classesByName[c.Name] = c } + enumerationsByName = make(map[string]Enumeration, len(enumerations)) + for _, enumeration := range enumerations { + enumerationsByName[enumeration.Name] = enumeration + } }) } @@ -97,6 +137,16 @@ func LookupClass(name string) (Class, bool) { return c, ok } +// LookupEnumeration returns the enumeration of a name and whether it is declared. +func LookupEnumeration(name string) (Enumeration, bool) { + index() + enumeration, ok := enumerationsByName[name] + if ok { + enumeration.Literals = append([]string(nil), enumeration.Literals...) + } + return enumeration, ok +} + // PropertyOf returns the declaration of an unqualified property name whose // defining metaclass is metaclass or one of its ancestors; when several // declarations qualify, the one declared on the most specific class. It diff --git a/internal/translate/rdf/ontology/table.go b/internal/translate/rdf/ontology/table.go index 858567bfe3..46eeaf548d 100644 --- a/internal/translate/rdf/ontology/table.go +++ b/internal/translate/rdf/ontology/table.go @@ -1,440 +1,457 @@ // Code generated by tools/gen/ontology. DO NOT EDIT. // -// Source: Open-MBEE/sysmlv2-rdf-ontology, sysml2/owl/www.omg.org/spec/SysML.owl -// Ecore: sysml2/ecore/SysML.ecore (property multiplicities) -// Ontology: SysML v2 metamodel version 202407 (generated from SysML.ecore) -// Commit: a1fda2623d4a0a7b7ace855e12e799dbd5cbaa82 +// Source: https://github.com/Systems-Modeling/SysML-v2-Pilot-Implementation.git 2026-08, org.omg.sysml/model/SysML.ecore +// Commit: 692170b71867353b8f90341e61556f49a5beb0e5 +// Metamodel: https://www.omg.org/spec/SysML/20250201 // // Regenerate with (see README.md): // -// go run -C tools ./gen/ontology -ontology +// ./scripts/download-pilot-metamodel.sh +// go run -C tools ./gen/ontology package ontology -// Version is the OMG SysML v2 metamodel version the table was generated from. -const Version = "202407" +// Version is the OMG SysML v2 metamodel version the table was generated from, +// the date in the ecore's namespace URI. +const Version = "20250201" -// SourceCommit is the sysmlv2-rdf-ontology commit the table was generated from. -const SourceCommit = "a1fda2623d4a0a7b7ace855e12e799dbd5cbaa82" +// SourceTag is the pilot implementation release the table was generated from. +const SourceTag = "2026-08" -// properties holds every owl:ObjectProperty and owl:DatatypeProperty the -// ontology declares, ordered by IRI. +// SourceCommit is the pilot implementation commit the table was generated from. +const SourceCommit = "692170b71867353b8f90341e61556f49a5beb0e5" + +// properties holds every eStructuralFeature the metamodel declares, ordered by IRI. var properties = []Property{ - {Name: "payloadArgument", DefiningClass: "AcceptActionUsage", IRI: "https://www.omg.org/spec/SysML#AcceptActionUsage_payloadArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "payloadParameter", DefiningClass: "AcceptActionUsage", IRI: "https://www.omg.org/spec/SysML#AcceptActionUsage_payloadParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ReferenceUsage"}, - {Name: "receiverArgument", DefiningClass: "AcceptActionUsage", IRI: "https://www.omg.org/spec/SysML#AcceptActionUsage_receiverArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "action", DefiningClass: "ActionDefinition", IRI: "https://www.omg.org/spec/SysML#ActionDefinition_action", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Many: true}, - {Name: "actionDefinition", DefiningClass: "ActionUsage", IRI: "https://www.omg.org/spec/SysML#ActionUsage_actionDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Behavior", Many: true}, - {Name: "ownedActorParameter", DefiningClass: "ActorMembership", IRI: "https://www.omg.org/spec/SysML#ActorMembership_ownedActorParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage"}, - {Name: "allocation", DefiningClass: "AllocationDefinition", IRI: "https://www.omg.org/spec/SysML#AllocationDefinition_allocation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AllocationUsage", Many: true}, - {Name: "allocationDefinition", DefiningClass: "AllocationUsage", IRI: "https://www.omg.org/spec/SysML#AllocationUsage_allocationDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AllocationDefinition", Many: true}, - {Name: "resultExpression", DefiningClass: "AnalysisCaseDefinition", IRI: "https://www.omg.org/spec/SysML#AnalysisCaseDefinition_resultExpression", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "analysisCaseDefinition", DefiningClass: "AnalysisCaseUsage", IRI: "https://www.omg.org/spec/SysML#AnalysisCaseUsage_analysisCaseDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AnalysisCaseDefinition"}, - {Name: "resultExpression", DefiningClass: "AnalysisCaseUsage", IRI: "https://www.omg.org/spec/SysML#AnalysisCaseUsage_resultExpression", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "annotatedElement", DefiningClass: "AnnotatingElement", IRI: "https://www.omg.org/spec/SysML#AnnotatingElement_annotatedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true}, - {Name: "annotation", DefiningClass: "AnnotatingElement", IRI: "https://www.omg.org/spec/SysML#AnnotatingElement_annotation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Annotation", Many: true}, - {Name: "ownedAnnotatingRelationship", DefiningClass: "AnnotatingElement", IRI: "https://www.omg.org/spec/SysML#AnnotatingElement_ownedAnnotatingRelationship", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Annotation", Many: true}, - {Name: "annotatedElement", DefiningClass: "Annotation", IRI: "https://www.omg.org/spec/SysML#Annotation_annotatedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element"}, - {Name: "annotatingElement", DefiningClass: "Annotation", IRI: "https://www.omg.org/spec/SysML#Annotation_annotatingElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AnnotatingElement"}, - {Name: "owningAnnotatedElement", DefiningClass: "Annotation", IRI: "https://www.omg.org/spec/SysML#Annotation_owningAnnotatedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element"}, - {Name: "owningAnnotatingElement", DefiningClass: "Annotation", IRI: "https://www.omg.org/spec/SysML#Annotation_owningAnnotatingElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AnnotatingElement"}, - {Name: "assertedConstraint", DefiningClass: "AssertConstraintUsage", IRI: "https://www.omg.org/spec/SysML#AssertConstraintUsage_assertedConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage"}, - {Name: "referent", DefiningClass: "AssignmentActionUsage", IRI: "https://www.omg.org/spec/SysML#AssignmentActionUsage_referent", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "targetArgument", DefiningClass: "AssignmentActionUsage", IRI: "https://www.omg.org/spec/SysML#AssignmentActionUsage_targetArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "valueExpression", DefiningClass: "AssignmentActionUsage", IRI: "https://www.omg.org/spec/SysML#AssignmentActionUsage_valueExpression", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "associationEnd", DefiningClass: "Association", IRI: "https://www.omg.org/spec/SysML#Association_associationEnd", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true}, - {Name: "relatedType", DefiningClass: "Association", IRI: "https://www.omg.org/spec/SysML#Association_relatedType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Many: true}, - {Name: "sourceType", DefiningClass: "Association", IRI: "https://www.omg.org/spec/SysML#Association_sourceType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "targetType", DefiningClass: "Association", IRI: "https://www.omg.org/spec/SysML#Association_targetType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Many: true}, - {Name: "attributeDefinition", DefiningClass: "AttributeUsage", IRI: "https://www.omg.org/spec/SysML#AttributeUsage_attributeDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#DataType", Many: true}, - {Name: "parameter", DefiningClass: "Behavior", IRI: "https://www.omg.org/spec/SysML#Behavior_parameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true}, - {Name: "step", DefiningClass: "Behavior", IRI: "https://www.omg.org/spec/SysML#Behavior_step", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Step", Many: true}, - {Name: "predicate", DefiningClass: "BooleanExpression", IRI: "https://www.omg.org/spec/SysML#BooleanExpression_predicate", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Predicate"}, - {Name: "calculation", DefiningClass: "CalculationDefinition", IRI: "https://www.omg.org/spec/SysML#CalculationDefinition_calculation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#CalculationUsage", Many: true}, - {Name: "calculationDefinition", DefiningClass: "CalculationUsage", IRI: "https://www.omg.org/spec/SysML#CalculationUsage_calculationDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Function"}, - {Name: "actorParameter", DefiningClass: "CaseDefinition", IRI: "https://www.omg.org/spec/SysML#CaseDefinition_actorParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true}, - {Name: "objectiveRequirement", DefiningClass: "CaseDefinition", IRI: "https://www.omg.org/spec/SysML#CaseDefinition_objectiveRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage"}, - {Name: "subjectParameter", DefiningClass: "CaseDefinition", IRI: "https://www.omg.org/spec/SysML#CaseDefinition_subjectParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage"}, - {Name: "actorParameter", DefiningClass: "CaseUsage", IRI: "https://www.omg.org/spec/SysML#CaseUsage_actorParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true}, - {Name: "caseDefinition", DefiningClass: "CaseUsage", IRI: "https://www.omg.org/spec/SysML#CaseUsage_caseDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#CaseDefinition"}, - {Name: "objectiveRequirement", DefiningClass: "CaseUsage", IRI: "https://www.omg.org/spec/SysML#CaseUsage_objectiveRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage"}, - {Name: "subjectParameter", DefiningClass: "CaseUsage", IRI: "https://www.omg.org/spec/SysML#CaseUsage_subjectParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage"}, - {Name: "ownedSubclassification", DefiningClass: "Classifier", IRI: "https://www.omg.org/spec/SysML#Classifier_ownedSubclassification", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Subclassification", Many: true}, + {Name: "payloadArgument", DefiningClass: "AcceptActionUsage", IRI: "https://www.omg.org/spec/SysML#AcceptActionUsage_payloadArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true}, + {Name: "payloadParameter", DefiningClass: "AcceptActionUsage", IRI: "https://www.omg.org/spec/SysML#AcceptActionUsage_payloadParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ReferenceUsage", Derived: true, Subsets: []string{"Usage::nestedReference", "Step::parameter"}}, + {Name: "receiverArgument", DefiningClass: "AcceptActionUsage", IRI: "https://www.omg.org/spec/SysML#AcceptActionUsage_receiverArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true}, + {Name: "action", DefiningClass: "ActionDefinition", IRI: "https://www.omg.org/spec/SysML#ActionDefinition_action", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Behavior::step", "Definition::usage"}}, + {Name: "actionDefinition", DefiningClass: "ActionUsage", IRI: "https://www.omg.org/spec/SysML#ActionUsage_actionDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Behavior", Many: true, Ordered: true, Derived: true, Redefines: []string{"Step::behavior", "OccurrenceUsage::occurrenceDefinition"}}, + {Name: "ownedActorParameter", DefiningClass: "ActorMembership", IRI: "https://www.omg.org/spec/SysML#ActorMembership_ownedActorParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Derived: true, Redefines: []string{"ParameterMembership::ownedMemberParameter"}}, + {Name: "allocation", DefiningClass: "AllocationDefinition", IRI: "https://www.omg.org/spec/SysML#AllocationDefinition_allocation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AllocationUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::usage"}}, + {Name: "allocationDefinition", DefiningClass: "AllocationUsage", IRI: "https://www.omg.org/spec/SysML#AllocationUsage_allocationDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AllocationDefinition", Many: true, Ordered: true, Derived: true, Redefines: []string{"ConnectionUsage::connectionDefinition"}}, + {Name: "resultExpression", DefiningClass: "AnalysisCaseDefinition", IRI: "https://www.omg.org/spec/SysML#AnalysisCaseDefinition_resultExpression", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true, Subsets: []string{"Function::expression", "Type::ownedFeature"}}, + {Name: "analysisCaseDefinition", DefiningClass: "AnalysisCaseUsage", IRI: "https://www.omg.org/spec/SysML#AnalysisCaseUsage_analysisCaseDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AnalysisCaseDefinition", Derived: true, Redefines: []string{"CaseUsage::caseDefinition"}}, + {Name: "resultExpression", DefiningClass: "AnalysisCaseUsage", IRI: "https://www.omg.org/spec/SysML#AnalysisCaseUsage_resultExpression", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true, Subsets: []string{"Type::ownedFeature"}}, + {Name: "annotatedElement", DefiningClass: "AnnotatingElement", IRI: "https://www.omg.org/spec/SysML#AnnotatingElement_annotatedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true, Ordered: true, Derived: true}, + {Name: "annotation", DefiningClass: "AnnotatingElement", IRI: "https://www.omg.org/spec/SysML#AnnotatingElement_annotation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Annotation", Many: true, Ordered: true, Derived: true, Opposite: "Annotation::annotatingElement"}, + {Name: "ownedAnnotatingRelationship", DefiningClass: "AnnotatingElement", IRI: "https://www.omg.org/spec/SysML#AnnotatingElement_ownedAnnotatingRelationship", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Annotation", Many: true, Ordered: true, Derived: true, Subsets: []string{"AnnotatingElement::annotation", "Element::ownedRelationship"}, Opposite: "Annotation::owningAnnotatingElement"}, + {Name: "owningAnnotatingRelationship", DefiningClass: "AnnotatingElement", IRI: "https://www.omg.org/spec/SysML#AnnotatingElement_owningAnnotatingRelationship", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Annotation", Derived: true, Subsets: []string{"Element::owningRelationship", "AnnotatingElement::annotation"}, Opposite: "Annotation::ownedAnnotatingElement"}, + {Name: "annotatedElement", DefiningClass: "Annotation", IRI: "https://www.omg.org/spec/SysML#Annotation_annotatedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Redefines: []string{"Relationship::target"}}, + {Name: "annotatingElement", DefiningClass: "Annotation", IRI: "https://www.omg.org/spec/SysML#Annotation_annotatingElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AnnotatingElement", Derived: true, Redefines: []string{"Relationship::source"}, Opposite: "AnnotatingElement::annotation"}, + {Name: "ownedAnnotatingElement", DefiningClass: "Annotation", IRI: "https://www.omg.org/spec/SysML#Annotation_ownedAnnotatingElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AnnotatingElement", Derived: true, Subsets: []string{"Annotation::annotatingElement", "Relationship::ownedRelatedElement"}, Opposite: "AnnotatingElement::owningAnnotatingRelationship"}, + {Name: "owningAnnotatedElement", DefiningClass: "Annotation", IRI: "https://www.omg.org/spec/SysML#Annotation_owningAnnotatedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Derived: true, Subsets: []string{"Annotation::annotatedElement", "Relationship::owningRelatedElement"}, Opposite: "Element::ownedAnnotation"}, + {Name: "owningAnnotatingElement", DefiningClass: "Annotation", IRI: "https://www.omg.org/spec/SysML#Annotation_owningAnnotatingElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AnnotatingElement", Derived: true, Subsets: []string{"Annotation::annotatingElement", "Relationship::owningRelatedElement"}, Opposite: "AnnotatingElement::ownedAnnotatingRelationship"}, + {Name: "assertedConstraint", DefiningClass: "AssertConstraintUsage", IRI: "https://www.omg.org/spec/SysML#AssertConstraintUsage_assertedConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage", Derived: true}, + {Name: "referent", DefiningClass: "AssignmentActionUsage", IRI: "https://www.omg.org/spec/SysML#AssignmentActionUsage_referent", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true, Subsets: []string{"Namespace::member"}}, + {Name: "targetArgument", DefiningClass: "AssignmentActionUsage", IRI: "https://www.omg.org/spec/SysML#AssignmentActionUsage_targetArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true}, + {Name: "valueExpression", DefiningClass: "AssignmentActionUsage", IRI: "https://www.omg.org/spec/SysML#AssignmentActionUsage_valueExpression", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true}, + {Name: "associationEnd", DefiningClass: "Association", IRI: "https://www.omg.org/spec/SysML#Association_associationEnd", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true, Derived: true, Redefines: []string{"Type::endFeature"}}, + {Name: "relatedType", DefiningClass: "Association", IRI: "https://www.omg.org/spec/SysML#Association_relatedType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Many: true, Ordered: true, Derived: true, Redefines: []string{"Relationship::relatedElement"}}, + {Name: "sourceType", DefiningClass: "Association", IRI: "https://www.omg.org/spec/SysML#Association_sourceType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Derived: true, Redefines: []string{"Relationship::source"}, Subsets: []string{"Association::relatedType"}}, + {Name: "targetType", DefiningClass: "Association", IRI: "https://www.omg.org/spec/SysML#Association_targetType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Many: true, Derived: true, Redefines: []string{"Relationship::target"}, Subsets: []string{"Association::relatedType"}}, + {Name: "attributeDefinition", DefiningClass: "AttributeUsage", IRI: "https://www.omg.org/spec/SysML#AttributeUsage_attributeDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#DataType", Many: true, Ordered: true, Derived: true, Redefines: []string{"Usage::definition"}}, + {Name: "parameter", DefiningClass: "Behavior", IRI: "https://www.omg.org/spec/SysML#Behavior_parameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true, Ordered: true, Derived: true, Redefines: []string{"Type::directedFeature"}}, + {Name: "step", DefiningClass: "Behavior", IRI: "https://www.omg.org/spec/SysML#Behavior_step", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Step", Many: true, Derived: true, Subsets: []string{"Type::feature"}}, + {Name: "predicate", DefiningClass: "BooleanExpression", IRI: "https://www.omg.org/spec/SysML#BooleanExpression_predicate", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Predicate", Derived: true, Redefines: []string{"Expression::function"}}, + {Name: "calculation", DefiningClass: "CalculationDefinition", IRI: "https://www.omg.org/spec/SysML#CalculationDefinition_calculation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#CalculationUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"ActionDefinition::action", "Function::expression"}}, + {Name: "calculationDefinition", DefiningClass: "CalculationUsage", IRI: "https://www.omg.org/spec/SysML#CalculationUsage_calculationDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Function", Derived: true, Redefines: []string{"Expression::function", "ActionUsage::actionDefinition"}}, + {Name: "actorParameter", DefiningClass: "CaseDefinition", IRI: "https://www.omg.org/spec/SysML#CaseDefinition_actorParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Behavior::parameter", "Definition::usage"}}, + {Name: "objectiveRequirement", DefiningClass: "CaseDefinition", IRI: "https://www.omg.org/spec/SysML#CaseDefinition_objectiveRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage", Derived: true, Subsets: []string{"Definition::usage"}}, + {Name: "subjectParameter", DefiningClass: "CaseDefinition", IRI: "https://www.omg.org/spec/SysML#CaseDefinition_subjectParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Derived: true, Subsets: []string{"Behavior::parameter", "Definition::usage"}}, + {Name: "actorParameter", DefiningClass: "CaseUsage", IRI: "https://www.omg.org/spec/SysML#CaseUsage_actorParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Step::parameter", "Usage::usage"}}, + {Name: "caseDefinition", DefiningClass: "CaseUsage", IRI: "https://www.omg.org/spec/SysML#CaseUsage_caseDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#CaseDefinition", Derived: true, Redefines: []string{"CalculationUsage::calculationDefinition"}}, + {Name: "objectiveRequirement", DefiningClass: "CaseUsage", IRI: "https://www.omg.org/spec/SysML#CaseUsage_objectiveRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage", Derived: true, Subsets: []string{"Usage::usage"}}, + {Name: "subjectParameter", DefiningClass: "CaseUsage", IRI: "https://www.omg.org/spec/SysML#CaseUsage_subjectParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Derived: true, Subsets: []string{"Step::parameter", "Usage::usage"}}, + {Name: "ownedSubclassification", DefiningClass: "Classifier", IRI: "https://www.omg.org/spec/SysML#Classifier_ownedSubclassification", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Subclassification", Many: true, Derived: true, Subsets: []string{"Type::ownedSpecialization"}, Opposite: "Subclassification::owningClassifier"}, {Name: "body", DefiningClass: "Comment", IRI: "https://www.omg.org/spec/SysML#Comment_body", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, {Name: "locale", DefiningClass: "Comment", IRI: "https://www.omg.org/spec/SysML#Comment_locale", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, - {Name: "concernDefinition", DefiningClass: "ConcernUsage", IRI: "https://www.omg.org/spec/SysML#ConcernUsage_concernDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConcernDefinition"}, - {Name: "originalPortDefinition", DefiningClass: "ConjugatedPortDefinition", IRI: "https://www.omg.org/spec/SysML#ConjugatedPortDefinition_originalPortDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PortDefinition"}, - {Name: "ownedPortConjugator", DefiningClass: "ConjugatedPortDefinition", IRI: "https://www.omg.org/spec/SysML#ConjugatedPortDefinition_ownedPortConjugator", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PortConjugation"}, - {Name: "conjugatedPortDefinition", DefiningClass: "ConjugatedPortTyping", IRI: "https://www.omg.org/spec/SysML#ConjugatedPortTyping_conjugatedPortDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConjugatedPortDefinition"}, - {Name: "portDefinition", DefiningClass: "ConjugatedPortTyping", IRI: "https://www.omg.org/spec/SysML#ConjugatedPortTyping_portDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PortDefinition"}, - {Name: "conjugatedType", DefiningClass: "Conjugation", IRI: "https://www.omg.org/spec/SysML#Conjugation_conjugatedType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "originalType", DefiningClass: "Conjugation", IRI: "https://www.omg.org/spec/SysML#Conjugation_originalType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "owningType", DefiningClass: "Conjugation", IRI: "https://www.omg.org/spec/SysML#Conjugation_owningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "connectionEnd", DefiningClass: "ConnectionDefinition", IRI: "https://www.omg.org/spec/SysML#ConnectionDefinition_connectionEnd", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true}, - {Name: "connectionDefinition", DefiningClass: "ConnectionUsage", IRI: "https://www.omg.org/spec/SysML#ConnectionUsage_connectionDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AssociationStructure", Many: true}, - {Name: "association", DefiningClass: "Connector", IRI: "https://www.omg.org/spec/SysML#Connector_association", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Association", Many: true}, - {Name: "connectorEnd", DefiningClass: "Connector", IRI: "https://www.omg.org/spec/SysML#Connector_connectorEnd", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true}, - {Name: "relatedFeature", DefiningClass: "Connector", IRI: "https://www.omg.org/spec/SysML#Connector_relatedFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true}, - {Name: "sourceFeature", DefiningClass: "Connector", IRI: "https://www.omg.org/spec/SysML#Connector_sourceFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "targetFeature", DefiningClass: "Connector", IRI: "https://www.omg.org/spec/SysML#Connector_targetFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true}, - {Name: "constraintDefinition", DefiningClass: "ConstraintUsage", IRI: "https://www.omg.org/spec/SysML#ConstraintUsage_constraintDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Predicate"}, - {Name: "directedUsage", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_directedUsage", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true}, + {Name: "concernDefinition", DefiningClass: "ConcernUsage", IRI: "https://www.omg.org/spec/SysML#ConcernUsage_concernDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConcernDefinition", Derived: true, Redefines: []string{"RequirementUsage::requirementDefinition"}}, + {Name: "originalPortDefinition", DefiningClass: "ConjugatedPortDefinition", IRI: "https://www.omg.org/spec/SysML#ConjugatedPortDefinition_originalPortDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PortDefinition", Derived: true, Redefines: []string{"Element::owningNamespace"}, Opposite: "PortDefinition::conjugatedPortDefinition"}, + {Name: "ownedPortConjugator", DefiningClass: "ConjugatedPortDefinition", IRI: "https://www.omg.org/spec/SysML#ConjugatedPortDefinition_ownedPortConjugator", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PortConjugation", Derived: true, Redefines: []string{"Type::ownedConjugator"}, Opposite: "PortConjugation::conjugatedPortDefinition"}, + {Name: "conjugatedPortDefinition", DefiningClass: "ConjugatedPortTyping", IRI: "https://www.omg.org/spec/SysML#ConjugatedPortTyping_conjugatedPortDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConjugatedPortDefinition", Redefines: []string{"FeatureTyping::type"}}, + {Name: "portDefinition", DefiningClass: "ConjugatedPortTyping", IRI: "https://www.omg.org/spec/SysML#ConjugatedPortTyping_portDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PortDefinition", Derived: true}, + {Name: "conjugatedType", DefiningClass: "Conjugation", IRI: "https://www.omg.org/spec/SysML#Conjugation_conjugatedType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Redefines: []string{"Relationship::source"}}, + {Name: "originalType", DefiningClass: "Conjugation", IRI: "https://www.omg.org/spec/SysML#Conjugation_originalType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Redefines: []string{"Relationship::target"}}, + {Name: "owningType", DefiningClass: "Conjugation", IRI: "https://www.omg.org/spec/SysML#Conjugation_owningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Derived: true, Subsets: []string{"Conjugation::conjugatedType", "Relationship::owningRelatedElement"}, Opposite: "Type::ownedConjugator"}, + {Name: "connectionEnd", DefiningClass: "ConnectionDefinition", IRI: "https://www.omg.org/spec/SysML#ConnectionDefinition_connectionEnd", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true, Ordered: true, Derived: true, Redefines: []string{"Association::associationEnd"}}, + {Name: "connectionDefinition", DefiningClass: "ConnectionUsage", IRI: "https://www.omg.org/spec/SysML#ConnectionUsage_connectionDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AssociationStructure", Many: true, Ordered: true, Derived: true, Redefines: []string{"Connector::association"}, Subsets: []string{"ItemUsage::itemDefinition"}}, + {Name: "association", DefiningClass: "Connector", IRI: "https://www.omg.org/spec/SysML#Connector_association", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Association", Many: true, Ordered: true, Derived: true, Redefines: []string{"Feature::type"}}, + {Name: "connectorEnd", DefiningClass: "Connector", IRI: "https://www.omg.org/spec/SysML#Connector_connectorEnd", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true, Ordered: true, Derived: true, Redefines: []string{"Type::endFeature"}}, + {Name: "defaultFeaturingType", DefiningClass: "Connector", IRI: "https://www.omg.org/spec/SysML#Connector_defaultFeaturingType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Derived: true}, + {Name: "relatedFeature", DefiningClass: "Connector", IRI: "https://www.omg.org/spec/SysML#Connector_relatedFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true, Ordered: true, Derived: true, Redefines: []string{"Relationship::relatedElement"}}, + {Name: "sourceFeature", DefiningClass: "Connector", IRI: "https://www.omg.org/spec/SysML#Connector_sourceFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true, Redefines: []string{"Relationship::source"}, Subsets: []string{"Connector::relatedFeature"}}, + {Name: "targetFeature", DefiningClass: "Connector", IRI: "https://www.omg.org/spec/SysML#Connector_targetFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true, Ordered: true, Derived: true, Redefines: []string{"Relationship::target"}, Subsets: []string{"Connector::relatedFeature"}}, + {Name: "constraintDefinition", DefiningClass: "ConstraintUsage", IRI: "https://www.omg.org/spec/SysML#ConstraintUsage_constraintDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Predicate", Derived: true, Redefines: []string{"BooleanExpression::predicate"}}, + {Name: "crossedFeature", DefiningClass: "CrossSubsetting", IRI: "https://www.omg.org/spec/SysML#CrossSubsetting_crossedFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Redefines: []string{"Subsetting::subsettedFeature"}}, + {Name: "crossingFeature", DefiningClass: "CrossSubsetting", IRI: "https://www.omg.org/spec/SysML#CrossSubsetting_crossingFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true, Redefines: []string{"Subsetting::owningFeature", "Subsetting::subsettingFeature"}, Opposite: "Feature::ownedCrossSubsetting"}, + {Name: "directedUsage", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_directedUsage", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Type::directedFeature", "Definition::usage"}}, {Name: "isVariation", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_isVariation", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "ownedAction", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Many: true}, - {Name: "ownedAllocation", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedAllocation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AllocationUsage", Many: true}, - {Name: "ownedAnalysisCase", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedAnalysisCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AnalysisCaseUsage", Many: true}, - {Name: "ownedAttribute", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedAttribute", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AttributeUsage", Many: true}, - {Name: "ownedCalculation", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedCalculation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#CalculationUsage", Many: true}, - {Name: "ownedCase", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#CaseUsage", Many: true}, - {Name: "ownedConcern", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedConcern", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConcernUsage", Many: true}, - {Name: "ownedConnection", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedConnection", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConnectorAsUsage", Many: true}, - {Name: "ownedConstraint", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage", Many: true}, - {Name: "ownedEnumeration", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedEnumeration", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#EnumerationUsage", Many: true}, - {Name: "ownedFlow", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedFlow", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FlowConnectionUsage", Many: true}, - {Name: "ownedInterface", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedInterface", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#InterfaceUsage", Many: true}, - {Name: "ownedItem", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedItem", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ItemUsage", Many: true}, - {Name: "ownedMetadata", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedMetadata", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#MetadataUsage", Many: true}, - {Name: "ownedOccurrence", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedOccurrence", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#OccurrenceUsage", Many: true}, - {Name: "ownedPart", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedPart", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true}, - {Name: "ownedPort", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedPort", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PortUsage", Many: true}, - {Name: "ownedReference", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedReference", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ReferenceUsage", Many: true}, - {Name: "ownedRendering", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedRendering", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RenderingUsage", Many: true}, - {Name: "ownedRequirement", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage", Many: true}, - {Name: "ownedState", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedState", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#StateUsage", Many: true}, - {Name: "ownedTransition", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedTransition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#TransitionUsage", Many: true}, - {Name: "ownedUsage", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedUsage", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true}, - {Name: "ownedUseCase", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedUseCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#UseCaseUsage", Many: true}, - {Name: "ownedVerificationCase", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedVerificationCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#VerificationCaseUsage", Many: true}, - {Name: "ownedView", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedView", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewUsage", Many: true}, - {Name: "ownedViewpoint", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedViewpoint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewpointUsage", Many: true}, - {Name: "usage", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_usage", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true}, - {Name: "variant", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_variant", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true}, - {Name: "variantMembership", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_variantMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#VariantMembership", Many: true}, - {Name: "client", DefiningClass: "Dependency", IRI: "https://www.omg.org/spec/SysML#Dependency_client", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true}, - {Name: "supplier", DefiningClass: "Dependency", IRI: "https://www.omg.org/spec/SysML#Dependency_supplier", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true}, - {Name: "differencingType", DefiningClass: "Differencing", IRI: "https://www.omg.org/spec/SysML#Differencing_differencingType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "typeDifferenced", DefiningClass: "Differencing", IRI: "https://www.omg.org/spec/SysML#Differencing_typeDifferenced", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "disjoiningType", DefiningClass: "Disjoining", IRI: "https://www.omg.org/spec/SysML#Disjoining_disjoiningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "owningType", DefiningClass: "Disjoining", IRI: "https://www.omg.org/spec/SysML#Disjoining_owningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "typeDisjoined", DefiningClass: "Disjoining", IRI: "https://www.omg.org/spec/SysML#Disjoining_typeDisjoined", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "documentedElement", DefiningClass: "Documentation", IRI: "https://www.omg.org/spec/SysML#Documentation_documentedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element"}, - {Name: "condition", DefiningClass: "ElementFilterMembership", IRI: "https://www.omg.org/spec/SysML#ElementFilterMembership_condition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "aliasIds", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_aliasIds", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string", Many: true}, + {Name: "ownedAction", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedOccurrence"}}, + {Name: "ownedAllocation", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedAllocation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AllocationUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedConnection"}}, + {Name: "ownedAnalysisCase", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedAnalysisCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AnalysisCaseUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedCase"}}, + {Name: "ownedAttribute", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedAttribute", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AttributeUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedUsage"}}, + {Name: "ownedCalculation", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedCalculation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#CalculationUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedAction"}}, + {Name: "ownedCase", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#CaseUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedCalculation"}}, + {Name: "ownedConcern", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedConcern", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConcernUsage", Many: true, Derived: true, Subsets: []string{"Definition::ownedRequirement"}}, + {Name: "ownedConnection", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedConnection", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConnectorAsUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedUsage"}}, + {Name: "ownedConstraint", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedOccurrence"}}, + {Name: "ownedEnumeration", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedEnumeration", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#EnumerationUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedAttribute"}}, + {Name: "ownedFlow", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedFlow", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FlowUsage", Many: true, Derived: true, Subsets: []string{"Definition::ownedConnection"}}, + {Name: "ownedInterface", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedInterface", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#InterfaceUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedConnection"}}, + {Name: "ownedItem", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedItem", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ItemUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedOccurrence"}}, + {Name: "ownedMetadata", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedMetadata", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#MetadataUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedItem"}}, + {Name: "ownedOccurrence", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedOccurrence", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#OccurrenceUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedUsage"}}, + {Name: "ownedPart", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedPart", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedItem"}}, + {Name: "ownedPort", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedPort", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PortUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedUsage"}}, + {Name: "ownedReference", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedReference", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ReferenceUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedUsage"}}, + {Name: "ownedRendering", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedRendering", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RenderingUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedPart"}}, + {Name: "ownedRequirement", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedConstraint"}}, + {Name: "ownedState", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedState", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#StateUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedAction"}}, + {Name: "ownedTransition", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedTransition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#TransitionUsage", Many: true, Derived: true, Subsets: []string{"Definition::ownedUsage"}}, + {Name: "ownedUsage", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedUsage", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Type::ownedFeature", "Definition::usage"}, Opposite: "Usage::owningDefinition"}, + {Name: "ownedUseCase", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedUseCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#UseCaseUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedCase"}}, + {Name: "ownedVerificationCase", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedVerificationCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#VerificationCaseUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedCase"}}, + {Name: "ownedView", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedView", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedPart"}}, + {Name: "ownedViewpoint", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_ownedViewpoint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewpointUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedRequirement"}}, + {Name: "usage", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_usage", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Type::feature"}}, + {Name: "variant", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_variant", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true, Derived: true, Subsets: []string{"Namespace::ownedMember"}}, + {Name: "variantMembership", DefiningClass: "Definition", IRI: "https://www.omg.org/spec/SysML#Definition_variantMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#VariantMembership", Many: true, Derived: true, Subsets: []string{"Namespace::ownedMembership"}}, + {Name: "client", DefiningClass: "Dependency", IRI: "https://www.omg.org/spec/SysML#Dependency_client", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true, Ordered: true, Redefines: []string{"Relationship::source"}}, + {Name: "supplier", DefiningClass: "Dependency", IRI: "https://www.omg.org/spec/SysML#Dependency_supplier", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true, Ordered: true, Redefines: []string{"Relationship::target"}}, + {Name: "differencingType", DefiningClass: "Differencing", IRI: "https://www.omg.org/spec/SysML#Differencing_differencingType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Redefines: []string{"Relationship::target"}}, + {Name: "typeDifferenced", DefiningClass: "Differencing", IRI: "https://www.omg.org/spec/SysML#Differencing_typeDifferenced", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Derived: true, Redefines: []string{"Relationship::source"}, Subsets: []string{"Relationship::owningRelatedElement"}, Opposite: "Type::ownedDifferencing"}, + {Name: "disjoiningType", DefiningClass: "Disjoining", IRI: "https://www.omg.org/spec/SysML#Disjoining_disjoiningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Redefines: []string{"Relationship::target"}}, + {Name: "owningType", DefiningClass: "Disjoining", IRI: "https://www.omg.org/spec/SysML#Disjoining_owningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Derived: true, Subsets: []string{"Relationship::owningRelatedElement", "Disjoining::typeDisjoined"}, Opposite: "Type::ownedDisjoining"}, + {Name: "typeDisjoined", DefiningClass: "Disjoining", IRI: "https://www.omg.org/spec/SysML#Disjoining_typeDisjoined", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Redefines: []string{"Relationship::source"}}, + {Name: "documentedElement", DefiningClass: "Documentation", IRI: "https://www.omg.org/spec/SysML#Documentation_documentedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Derived: true, Redefines: []string{"AnnotatingElement::annotatedElement"}, Subsets: []string{"Element::owner"}, Opposite: "Element::documentation"}, + {Name: "condition", DefiningClass: "ElementFilterMembership", IRI: "https://www.omg.org/spec/SysML#ElementFilterMembership_condition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true, Redefines: []string{"OwningMembership::ownedMemberElement"}}, + {Name: "aliasIds", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_aliasIds", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string", Many: true, Ordered: true}, {Name: "declaredName", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_declaredName", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, {Name: "declaredShortName", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_declaredShortName", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, - {Name: "documentation", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_documentation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Documentation", Many: true}, + {Name: "documentation", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_documentation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Documentation", Many: true, Ordered: true, Derived: true, Subsets: []string{"Element::ownedElement"}, Opposite: "Documentation::documentedElement"}, {Name: "elementId", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_elementId", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, {Name: "isImpliedIncluded", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_isImpliedIncluded", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "isLibraryElement", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_isLibraryElement", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "name", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_name", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, - {Name: "ownedAnnotation", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_ownedAnnotation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Annotation", Many: true}, - {Name: "ownedElement", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_ownedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true}, - {Name: "ownedRelationship", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_ownedRelationship", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Relationship", Many: true}, - {Name: "owner", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_owner", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element"}, - {Name: "owningMembership", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_owningMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#OwningMembership"}, - {Name: "owningNamespace", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_owningNamespace", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Namespace"}, - {Name: "owningRelationship", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_owningRelationship", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Relationship"}, - {Name: "qualifiedName", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_qualifiedName", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, - {Name: "shortName", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_shortName", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, - {Name: "textualRepresentation", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_textualRepresentation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#TextualRepresentation", Many: true}, - {Name: "enumeratedValue", DefiningClass: "EnumerationDefinition", IRI: "https://www.omg.org/spec/SysML#EnumerationDefinition_enumeratedValue", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#EnumerationUsage", Many: true}, - {Name: "enumerationDefinition", DefiningClass: "EnumerationUsage", IRI: "https://www.omg.org/spec/SysML#EnumerationUsage_enumerationDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#EnumerationDefinition"}, - {Name: "eventOccurrence", DefiningClass: "EventOccurrenceUsage", IRI: "https://www.omg.org/spec/SysML#EventOccurrenceUsage_eventOccurrence", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#OccurrenceUsage"}, - {Name: "exhibitedState", DefiningClass: "ExhibitStateUsage", IRI: "https://www.omg.org/spec/SysML#ExhibitStateUsage_exhibitedState", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#StateUsage"}, - {Name: "function", DefiningClass: "Expression", IRI: "https://www.omg.org/spec/SysML#Expression_function", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Function"}, - {Name: "isModelLevelEvaluable", DefiningClass: "Expression", IRI: "https://www.omg.org/spec/SysML#Expression_isModelLevelEvaluable", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "result", DefiningClass: "Expression", IRI: "https://www.omg.org/spec/SysML#Expression_result", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "targetFeature", DefiningClass: "FeatureChainExpression", IRI: "https://www.omg.org/spec/SysML#FeatureChainExpression_targetFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "chainingFeature", DefiningClass: "FeatureChaining", IRI: "https://www.omg.org/spec/SysML#FeatureChaining_chainingFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "featureChained", DefiningClass: "FeatureChaining", IRI: "https://www.omg.org/spec/SysML#FeatureChaining_featureChained", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "featureInverted", DefiningClass: "FeatureInverting", IRI: "https://www.omg.org/spec/SysML#FeatureInverting_featureInverted", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "invertingFeature", DefiningClass: "FeatureInverting", IRI: "https://www.omg.org/spec/SysML#FeatureInverting_invertingFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "owningFeature", DefiningClass: "FeatureInverting", IRI: "https://www.omg.org/spec/SysML#FeatureInverting_owningFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "ownedMemberFeature", DefiningClass: "FeatureMembership", IRI: "https://www.omg.org/spec/SysML#FeatureMembership_ownedMemberFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "owningType", DefiningClass: "FeatureMembership", IRI: "https://www.omg.org/spec/SysML#FeatureMembership_owningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "referent", DefiningClass: "FeatureReferenceExpression", IRI: "https://www.omg.org/spec/SysML#FeatureReferenceExpression_referent", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "owningFeature", DefiningClass: "FeatureTyping", IRI: "https://www.omg.org/spec/SysML#FeatureTyping_owningFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "type", DefiningClass: "FeatureTyping", IRI: "https://www.omg.org/spec/SysML#FeatureTyping_type", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "typedFeature", DefiningClass: "FeatureTyping", IRI: "https://www.omg.org/spec/SysML#FeatureTyping_typedFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "featureWithValue", DefiningClass: "FeatureValue", IRI: "https://www.omg.org/spec/SysML#FeatureValue_featureWithValue", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, + {Name: "isLibraryElement", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_isLibraryElement", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean", Derived: true}, + {Name: "name", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_name", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string", Derived: true}, + {Name: "ownedAnnotation", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_ownedAnnotation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Annotation", Many: true, Ordered: true, Derived: true, Subsets: []string{"Element::ownedRelationship"}, Opposite: "Annotation::owningAnnotatedElement"}, + {Name: "ownedElement", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_ownedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true, Ordered: true, Derived: true, Opposite: "Element::owner"}, + {Name: "ownedRelationship", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_ownedRelationship", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Relationship", Many: true, Ordered: true, Opposite: "Relationship::owningRelatedElement"}, + {Name: "owner", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_owner", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Derived: true, Opposite: "Element::ownedElement"}, + {Name: "owningMembership", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_owningMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#OwningMembership", Derived: true, Subsets: []string{"Element::owningRelationship"}, Opposite: "OwningMembership::ownedMemberElement"}, + {Name: "owningNamespace", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_owningNamespace", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Namespace", Derived: true, Opposite: "Namespace::ownedMember"}, + {Name: "owningRelationship", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_owningRelationship", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Relationship", Opposite: "Relationship::ownedRelatedElement"}, + {Name: "qualifiedName", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_qualifiedName", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string", Derived: true}, + {Name: "shortName", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_shortName", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string", Derived: true}, + {Name: "textualRepresentation", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_textualRepresentation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#TextualRepresentation", Many: true, Ordered: true, Derived: true, Subsets: []string{"Element::ownedElement"}, Opposite: "TextualRepresentation::representedElement"}, + {Name: "enumeratedValue", DefiningClass: "EnumerationDefinition", IRI: "https://www.omg.org/spec/SysML#EnumerationDefinition_enumeratedValue", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#EnumerationUsage", Many: true, Ordered: true, Derived: true, Redefines: []string{"Definition::variant"}}, + {Name: "enumerationDefinition", DefiningClass: "EnumerationUsage", IRI: "https://www.omg.org/spec/SysML#EnumerationUsage_enumerationDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#EnumerationDefinition", Derived: true, Redefines: []string{"AttributeUsage::attributeDefinition"}}, + {Name: "eventOccurrence", DefiningClass: "EventOccurrenceUsage", IRI: "https://www.omg.org/spec/SysML#EventOccurrenceUsage_eventOccurrence", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#OccurrenceUsage", Derived: true}, + {Name: "exhibitedState", DefiningClass: "ExhibitStateUsage", IRI: "https://www.omg.org/spec/SysML#ExhibitStateUsage_exhibitedState", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#StateUsage", Derived: true, Redefines: []string{"PerformActionUsage::performedAction"}}, + {Name: "function", DefiningClass: "Expression", IRI: "https://www.omg.org/spec/SysML#Expression_function", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Function", Derived: true, Redefines: []string{"Step::behavior"}}, + {Name: "isModelLevelEvaluable", DefiningClass: "Expression", IRI: "https://www.omg.org/spec/SysML#Expression_isModelLevelEvaluable", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean", Derived: true}, + {Name: "result", DefiningClass: "Expression", IRI: "https://www.omg.org/spec/SysML#Expression_result", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true, Subsets: []string{"Type::output", "Step::parameter"}}, + {Name: "targetFeature", DefiningClass: "FeatureChainExpression", IRI: "https://www.omg.org/spec/SysML#FeatureChainExpression_targetFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true, Subsets: []string{"Namespace::member"}}, + {Name: "chainingFeature", DefiningClass: "FeatureChaining", IRI: "https://www.omg.org/spec/SysML#FeatureChaining_chainingFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Redefines: []string{"Relationship::target"}}, + {Name: "featureChained", DefiningClass: "FeatureChaining", IRI: "https://www.omg.org/spec/SysML#FeatureChaining_featureChained", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true, Redefines: []string{"Relationship::source"}, Subsets: []string{"Relationship::owningRelatedElement"}, Opposite: "Feature::ownedFeatureChaining"}, + {Name: "featureInverted", DefiningClass: "FeatureInverting", IRI: "https://www.omg.org/spec/SysML#FeatureInverting_featureInverted", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Redefines: []string{"Relationship::source"}}, + {Name: "invertingFeature", DefiningClass: "FeatureInverting", IRI: "https://www.omg.org/spec/SysML#FeatureInverting_invertingFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Redefines: []string{"Relationship::target"}}, + {Name: "owningFeature", DefiningClass: "FeatureInverting", IRI: "https://www.omg.org/spec/SysML#FeatureInverting_owningFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true, Subsets: []string{"FeatureInverting::featureInverted", "Relationship::owningRelatedElement"}, Opposite: "Feature::ownedFeatureInverting"}, + {Name: "ownedMemberFeature", DefiningClass: "FeatureMembership", IRI: "https://www.omg.org/spec/SysML#FeatureMembership_ownedMemberFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true, Redefines: []string{"OwningMembership::ownedMemberElement"}, Opposite: "Feature::owningFeatureMembership"}, + {Name: "owningType", DefiningClass: "FeatureMembership", IRI: "https://www.omg.org/spec/SysML#FeatureMembership_owningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Derived: true, Redefines: []string{"Membership::membershipOwningNamespace"}, Opposite: "Type::ownedFeatureMembership"}, + {Name: "referent", DefiningClass: "FeatureReferenceExpression", IRI: "https://www.omg.org/spec/SysML#FeatureReferenceExpression_referent", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true, Subsets: []string{"Namespace::member"}}, + {Name: "owningFeature", DefiningClass: "FeatureTyping", IRI: "https://www.omg.org/spec/SysML#FeatureTyping_owningFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true, Redefines: []string{"Specialization::owningType"}, Subsets: []string{"FeatureTyping::typedFeature"}, Opposite: "Feature::ownedTyping"}, + {Name: "type", DefiningClass: "FeatureTyping", IRI: "https://www.omg.org/spec/SysML#FeatureTyping_type", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Redefines: []string{"Specialization::general"}}, + {Name: "typedFeature", DefiningClass: "FeatureTyping", IRI: "https://www.omg.org/spec/SysML#FeatureTyping_typedFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Redefines: []string{"Specialization::specific"}}, + {Name: "featureWithValue", DefiningClass: "FeatureValue", IRI: "https://www.omg.org/spec/SysML#FeatureValue_featureWithValue", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true, Subsets: []string{"Membership::membershipOwningNamespace"}}, {Name: "isDefault", DefiningClass: "FeatureValue", IRI: "https://www.omg.org/spec/SysML#FeatureValue_isDefault", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, {Name: "isInitial", DefiningClass: "FeatureValue", IRI: "https://www.omg.org/spec/SysML#FeatureValue_isInitial", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "value", DefiningClass: "FeatureValue", IRI: "https://www.omg.org/spec/SysML#FeatureValue_value", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "chainingFeature", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_chainingFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true}, + {Name: "value", DefiningClass: "FeatureValue", IRI: "https://www.omg.org/spec/SysML#FeatureValue_value", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true, Redefines: []string{"OwningMembership::ownedMemberElement"}}, + {Name: "chainingFeature", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_chainingFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true, Ordered: true, Derived: true}, + {Name: "crossFeature", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_crossFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true}, {Name: "direction", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_direction", Kind: DatatypeProperty, Range: "https://www.omg.org/spec/SysML#FeatureDirectionKind"}, - {Name: "endOwningType", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_endOwningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "featureTarget", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_featureTarget", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "featuringType", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_featuringType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Many: true}, + {Name: "endOwningType", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_endOwningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Derived: true, Subsets: []string{"Feature::owningType"}, Opposite: "Type::ownedEndFeature"}, + {Name: "featureTarget", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_featureTarget", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true}, + {Name: "featuringType", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_featuringType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Many: true, Ordered: true, Derived: true}, {Name: "isComposite", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_isComposite", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, + {Name: "isConstant", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_isConstant", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, {Name: "isDerived", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_isDerived", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, {Name: "isEnd", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_isEnd", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "isNonunique", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_isNonunique", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, {Name: "isOrdered", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_isOrdered", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, {Name: "isPortion", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_isPortion", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "isReadOnly", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_isReadOnly", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, {Name: "isUnique", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_isUnique", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "ownedFeatureChaining", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_ownedFeatureChaining", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FeatureChaining", Many: true}, - {Name: "ownedFeatureInverting", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_ownedFeatureInverting", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FeatureInverting", Many: true}, - {Name: "ownedRedefinition", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_ownedRedefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Redefinition", Many: true}, - {Name: "ownedReferenceSubsetting", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_ownedReferenceSubsetting", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ReferenceSubsetting"}, - {Name: "ownedSubsetting", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_ownedSubsetting", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Subsetting", Many: true}, - {Name: "ownedTypeFeaturing", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_ownedTypeFeaturing", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#TypeFeaturing", Many: true}, - {Name: "ownedTyping", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_ownedTyping", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FeatureTyping", Many: true}, - {Name: "owningFeatureMembership", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_owningFeatureMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FeatureMembership"}, - {Name: "owningType", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_owningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "type", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_type", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Many: true}, - {Name: "feature", DefiningClass: "Featuring", IRI: "https://www.omg.org/spec/SysML#Featuring_feature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "type", DefiningClass: "Featuring", IRI: "https://www.omg.org/spec/SysML#Featuring_type", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "flowConnectionDefinition", DefiningClass: "FlowConnectionUsage", IRI: "https://www.omg.org/spec/SysML#FlowConnectionUsage_flowConnectionDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Interaction", Many: true}, - {Name: "loopVariable", DefiningClass: "ForLoopActionUsage", IRI: "https://www.omg.org/spec/SysML#ForLoopActionUsage_loopVariable", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ReferenceUsage"}, - {Name: "seqArgument", DefiningClass: "ForLoopActionUsage", IRI: "https://www.omg.org/spec/SysML#ForLoopActionUsage_seqArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "ownedConcern", DefiningClass: "FramedConcernMembership", IRI: "https://www.omg.org/spec/SysML#FramedConcernMembership_ownedConcern", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConcernUsage"}, - {Name: "referencedConcern", DefiningClass: "FramedConcernMembership", IRI: "https://www.omg.org/spec/SysML#FramedConcernMembership_referencedConcern", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConcernUsage"}, - {Name: "expression", DefiningClass: "Function", IRI: "https://www.omg.org/spec/SysML#Function_expression", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Many: true}, - {Name: "isModelLevelEvaluable", DefiningClass: "Function", IRI: "https://www.omg.org/spec/SysML#Function_isModelLevelEvaluable", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "result", DefiningClass: "Function", IRI: "https://www.omg.org/spec/SysML#Function_result", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "elseAction", DefiningClass: "IfActionUsage", IRI: "https://www.omg.org/spec/SysML#IfActionUsage_elseAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage"}, - {Name: "ifArgument", DefiningClass: "IfActionUsage", IRI: "https://www.omg.org/spec/SysML#IfActionUsage_ifArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "thenAction", DefiningClass: "IfActionUsage", IRI: "https://www.omg.org/spec/SysML#IfActionUsage_thenAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage"}, - {Name: "importOwningNamespace", DefiningClass: "Import", IRI: "https://www.omg.org/spec/SysML#Import_importOwningNamespace", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Namespace"}, - {Name: "importedElement", DefiningClass: "Import", IRI: "https://www.omg.org/spec/SysML#Import_importedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element"}, + {Name: "isVariable", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_isVariable", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, + {Name: "ownedCrossSubsetting", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_ownedCrossSubsetting", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#CrossSubsetting", Derived: true, Subsets: []string{"Feature::ownedSubsetting"}, Opposite: "CrossSubsetting::crossingFeature"}, + {Name: "ownedFeatureChaining", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_ownedFeatureChaining", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FeatureChaining", Many: true, Ordered: true, Derived: true, Subsets: []string{"Element::ownedRelationship"}, Opposite: "FeatureChaining::featureChained"}, + {Name: "ownedFeatureInverting", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_ownedFeatureInverting", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FeatureInverting", Many: true, Derived: true, Subsets: []string{"Element::ownedRelationship"}, Opposite: "FeatureInverting::owningFeature"}, + {Name: "ownedRedefinition", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_ownedRedefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Redefinition", Many: true, Derived: true, Subsets: []string{"Feature::ownedSubsetting"}}, + {Name: "ownedReferenceSubsetting", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_ownedReferenceSubsetting", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ReferenceSubsetting", Derived: true, Subsets: []string{"Feature::ownedSubsetting"}, Opposite: "ReferenceSubsetting::referencingFeature"}, + {Name: "ownedSubsetting", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_ownedSubsetting", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Subsetting", Many: true, Derived: true, Subsets: []string{"Type::ownedSpecialization"}, Opposite: "Subsetting::owningFeature"}, + {Name: "ownedTypeFeaturing", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_ownedTypeFeaturing", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#TypeFeaturing", Many: true, Ordered: true, Derived: true, Subsets: []string{"Element::ownedRelationship"}, Opposite: "TypeFeaturing::owningFeatureOfType"}, + {Name: "ownedTyping", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_ownedTyping", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FeatureTyping", Many: true, Ordered: true, Derived: true, Subsets: []string{"Type::ownedSpecialization"}, Opposite: "FeatureTyping::owningFeature"}, + {Name: "owningFeatureMembership", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_owningFeatureMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FeatureMembership", Derived: true, Subsets: []string{"Element::owningMembership"}, Opposite: "FeatureMembership::ownedMemberFeature"}, + {Name: "owningType", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_owningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Derived: true, Subsets: []string{"Element::owningNamespace", "Feature::featuringType"}, Opposite: "Type::ownedFeature"}, + {Name: "type", DefiningClass: "Feature", IRI: "https://www.omg.org/spec/SysML#Feature_type", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Many: true, Ordered: true, Derived: true}, + {Name: "flowEnd", DefiningClass: "FlowDefinition", IRI: "https://www.omg.org/spec/SysML#FlowDefinition_flowEnd", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true, Derived: true, Redefines: []string{"Association::associationEnd"}}, + {Name: "flowDefinition", DefiningClass: "FlowUsage", IRI: "https://www.omg.org/spec/SysML#FlowUsage_flowDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Interaction", Many: true, Ordered: true, Derived: true, Redefines: []string{"ActionUsage::actionDefinition", "Flow::interaction"}}, + {Name: "flowEnd", DefiningClass: "Flow", IRI: "https://www.omg.org/spec/SysML#Flow_flowEnd", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FlowEnd", Many: true, Ordered: true, Derived: true, Subsets: []string{"Connector::connectorEnd"}}, + {Name: "interaction", DefiningClass: "Flow", IRI: "https://www.omg.org/spec/SysML#Flow_interaction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Interaction", Many: true, Ordered: true, Derived: true, Redefines: []string{"Connector::association", "Step::behavior"}}, + {Name: "payloadFeature", DefiningClass: "Flow", IRI: "https://www.omg.org/spec/SysML#Flow_payloadFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PayloadFeature", Derived: true, Subsets: []string{"Type::ownedFeature"}}, + {Name: "payloadType", DefiningClass: "Flow", IRI: "https://www.omg.org/spec/SysML#Flow_payloadType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Classifier", Many: true, Ordered: true, Derived: true}, + {Name: "sourceOutputFeature", DefiningClass: "Flow", IRI: "https://www.omg.org/spec/SysML#Flow_sourceOutputFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true}, + {Name: "targetInputFeature", DefiningClass: "Flow", IRI: "https://www.omg.org/spec/SysML#Flow_targetInputFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true}, + {Name: "loopVariable", DefiningClass: "ForLoopActionUsage", IRI: "https://www.omg.org/spec/SysML#ForLoopActionUsage_loopVariable", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ReferenceUsage", Derived: true}, + {Name: "seqArgument", DefiningClass: "ForLoopActionUsage", IRI: "https://www.omg.org/spec/SysML#ForLoopActionUsage_seqArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true}, + {Name: "ownedConcern", DefiningClass: "FramedConcernMembership", IRI: "https://www.omg.org/spec/SysML#FramedConcernMembership_ownedConcern", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConcernUsage", Derived: true, Redefines: []string{"RequirementConstraintMembership::ownedConstraint"}}, + {Name: "referencedConcern", DefiningClass: "FramedConcernMembership", IRI: "https://www.omg.org/spec/SysML#FramedConcernMembership_referencedConcern", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConcernUsage", Derived: true, Redefines: []string{"RequirementConstraintMembership::referencedConstraint"}}, + {Name: "expression", DefiningClass: "Function", IRI: "https://www.omg.org/spec/SysML#Function_expression", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Many: true, Derived: true, Subsets: []string{"Behavior::step"}}, + {Name: "isModelLevelEvaluable", DefiningClass: "Function", IRI: "https://www.omg.org/spec/SysML#Function_isModelLevelEvaluable", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean", Derived: true}, + {Name: "result", DefiningClass: "Function", IRI: "https://www.omg.org/spec/SysML#Function_result", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true, Subsets: []string{"Type::output", "Behavior::parameter"}}, + {Name: "elseAction", DefiningClass: "IfActionUsage", IRI: "https://www.omg.org/spec/SysML#IfActionUsage_elseAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Derived: true}, + {Name: "ifArgument", DefiningClass: "IfActionUsage", IRI: "https://www.omg.org/spec/SysML#IfActionUsage_ifArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true}, + {Name: "thenAction", DefiningClass: "IfActionUsage", IRI: "https://www.omg.org/spec/SysML#IfActionUsage_thenAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Derived: true}, + {Name: "importOwningNamespace", DefiningClass: "Import", IRI: "https://www.omg.org/spec/SysML#Import_importOwningNamespace", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Namespace", Derived: true, Redefines: []string{"Relationship::source"}, Subsets: []string{"Relationship::owningRelatedElement"}, Opposite: "Namespace::ownedImport"}, + {Name: "importedElement", DefiningClass: "Import", IRI: "https://www.omg.org/spec/SysML#Import_importedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Derived: true}, {Name: "isImportAll", DefiningClass: "Import", IRI: "https://www.omg.org/spec/SysML#Import_isImportAll", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, {Name: "isRecursive", DefiningClass: "Import", IRI: "https://www.omg.org/spec/SysML#Import_isRecursive", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, {Name: "visibility", DefiningClass: "Import", IRI: "https://www.omg.org/spec/SysML#Import_visibility", Kind: DatatypeProperty, Range: "https://www.omg.org/spec/SysML#VisibilityKind"}, - {Name: "useCaseIncluded", DefiningClass: "IncludeUseCaseUsage", IRI: "https://www.omg.org/spec/SysML#IncludeUseCaseUsage_useCaseIncluded", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#UseCaseUsage"}, - {Name: "interfaceEnd", DefiningClass: "InterfaceDefinition", IRI: "https://www.omg.org/spec/SysML#InterfaceDefinition_interfaceEnd", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PortUsage", Many: true}, - {Name: "interfaceDefinition", DefiningClass: "InterfaceUsage", IRI: "https://www.omg.org/spec/SysML#InterfaceUsage_interfaceDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#InterfaceDefinition", Many: true}, - {Name: "intersectingType", DefiningClass: "Intersecting", IRI: "https://www.omg.org/spec/SysML#Intersecting_intersectingType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "typeIntersected", DefiningClass: "Intersecting", IRI: "https://www.omg.org/spec/SysML#Intersecting_typeIntersected", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, + {Name: "useCaseIncluded", DefiningClass: "IncludeUseCaseUsage", IRI: "https://www.omg.org/spec/SysML#IncludeUseCaseUsage_useCaseIncluded", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#UseCaseUsage", Derived: true, Redefines: []string{"PerformActionUsage::performedAction"}}, + {Name: "argument", DefiningClass: "InstantiationExpression", IRI: "https://www.omg.org/spec/SysML#InstantiationExpression_argument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Many: true, Ordered: true, Derived: true}, + {Name: "instantiatedType", DefiningClass: "InstantiationExpression", IRI: "https://www.omg.org/spec/SysML#InstantiationExpression_instantiatedType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Derived: true, Subsets: []string{"Namespace::member"}}, + {Name: "interfaceEnd", DefiningClass: "InterfaceDefinition", IRI: "https://www.omg.org/spec/SysML#InterfaceDefinition_interfaceEnd", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PortUsage", Many: true, Ordered: true, Derived: true, Redefines: []string{"ConnectionDefinition::connectionEnd"}}, + {Name: "interfaceDefinition", DefiningClass: "InterfaceUsage", IRI: "https://www.omg.org/spec/SysML#InterfaceUsage_interfaceDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#InterfaceDefinition", Many: true, Derived: true, Redefines: []string{"ConnectionUsage::connectionDefinition"}}, + {Name: "intersectingType", DefiningClass: "Intersecting", IRI: "https://www.omg.org/spec/SysML#Intersecting_intersectingType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Redefines: []string{"Relationship::target"}}, + {Name: "typeIntersected", DefiningClass: "Intersecting", IRI: "https://www.omg.org/spec/SysML#Intersecting_typeIntersected", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Derived: true, Redefines: []string{"Relationship::source"}, Subsets: []string{"Relationship::owningRelatedElement"}, Opposite: "Type::ownedIntersecting"}, {Name: "isNegated", DefiningClass: "Invariant", IRI: "https://www.omg.org/spec/SysML#Invariant_isNegated", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "argument", DefiningClass: "InvocationExpression", IRI: "https://www.omg.org/spec/SysML#InvocationExpression_argument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Many: true}, - {Name: "operand", DefiningClass: "InvocationExpression", IRI: "https://www.omg.org/spec/SysML#InvocationExpression_operand", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Many: true}, - {Name: "interaction", DefiningClass: "ItemFlow", IRI: "https://www.omg.org/spec/SysML#ItemFlow_interaction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Interaction", Many: true}, - {Name: "itemFeature", DefiningClass: "ItemFlow", IRI: "https://www.omg.org/spec/SysML#ItemFlow_itemFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ItemFeature"}, - {Name: "itemFlowEnd", DefiningClass: "ItemFlow", IRI: "https://www.omg.org/spec/SysML#ItemFlow_itemFlowEnd", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ItemFlowEnd"}, - {Name: "itemType", DefiningClass: "ItemFlow", IRI: "https://www.omg.org/spec/SysML#ItemFlow_itemType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Classifier", Many: true}, - {Name: "sourceOutputFeature", DefiningClass: "ItemFlow", IRI: "https://www.omg.org/spec/SysML#ItemFlow_sourceOutputFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "targetInputFeature", DefiningClass: "ItemFlow", IRI: "https://www.omg.org/spec/SysML#ItemFlow_targetInputFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "itemDefinition", DefiningClass: "ItemUsage", IRI: "https://www.omg.org/spec/SysML#ItemUsage_itemDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Structure", Many: true}, + {Name: "operand", DefiningClass: "InvocationExpression", IRI: "https://www.omg.org/spec/SysML#InvocationExpression_operand", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Many: true, Ordered: true, Derived: true}, + {Name: "itemDefinition", DefiningClass: "ItemUsage", IRI: "https://www.omg.org/spec/SysML#ItemUsage_itemDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Structure", Many: true, Ordered: true, Derived: true, Subsets: []string{"OccurrenceUsage::occurrenceDefinition"}}, {Name: "isStandard", DefiningClass: "LibraryPackage", IRI: "https://www.omg.org/spec/SysML#LibraryPackage_isStandard", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, {Name: "value", DefiningClass: "LiteralBoolean", IRI: "https://www.omg.org/spec/SysML#LiteralBoolean_value", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, {Name: "value", DefiningClass: "LiteralInteger", IRI: "https://www.omg.org/spec/SysML#LiteralInteger_value", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#int"}, {Name: "value", DefiningClass: "LiteralRational", IRI: "https://www.omg.org/spec/SysML#LiteralRational_value", Kind: DatatypeProperty, Range: "http://www.w3.org/2002/07/owl#real"}, {Name: "value", DefiningClass: "LiteralString", IRI: "https://www.omg.org/spec/SysML#LiteralString_value", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, - {Name: "bodyAction", DefiningClass: "LoopActionUsage", IRI: "https://www.omg.org/spec/SysML#LoopActionUsage_bodyAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage"}, - {Name: "importedMembership", DefiningClass: "MembershipImport", IRI: "https://www.omg.org/spec/SysML#MembershipImport_importedMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Membership"}, - {Name: "memberElement", DefiningClass: "Membership", IRI: "https://www.omg.org/spec/SysML#Membership_memberElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element"}, - {Name: "memberElementId", DefiningClass: "Membership", IRI: "https://www.omg.org/spec/SysML#Membership_memberElementId", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, + {Name: "bodyAction", DefiningClass: "LoopActionUsage", IRI: "https://www.omg.org/spec/SysML#LoopActionUsage_bodyAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Derived: true}, + {Name: "importedMembership", DefiningClass: "MembershipImport", IRI: "https://www.omg.org/spec/SysML#MembershipImport_importedMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Membership", Redefines: []string{"Relationship::target"}}, + {Name: "memberElement", DefiningClass: "Membership", IRI: "https://www.omg.org/spec/SysML#Membership_memberElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Redefines: []string{"Relationship::target"}}, + {Name: "memberElementId", DefiningClass: "Membership", IRI: "https://www.omg.org/spec/SysML#Membership_memberElementId", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string", Derived: true}, {Name: "memberName", DefiningClass: "Membership", IRI: "https://www.omg.org/spec/SysML#Membership_memberName", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, {Name: "memberShortName", DefiningClass: "Membership", IRI: "https://www.omg.org/spec/SysML#Membership_memberShortName", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, - {Name: "membershipOwningNamespace", DefiningClass: "Membership", IRI: "https://www.omg.org/spec/SysML#Membership_membershipOwningNamespace", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Namespace"}, + {Name: "membershipOwningNamespace", DefiningClass: "Membership", IRI: "https://www.omg.org/spec/SysML#Membership_membershipOwningNamespace", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Namespace", Derived: true, Redefines: []string{"Relationship::source"}, Subsets: []string{"Relationship::owningRelatedElement"}, Opposite: "Namespace::ownedMembership"}, {Name: "visibility", DefiningClass: "Membership", IRI: "https://www.omg.org/spec/SysML#Membership_visibility", Kind: DatatypeProperty, Range: "https://www.omg.org/spec/SysML#VisibilityKind"}, - {Name: "referencedElement", DefiningClass: "MetadataAccessExpression", IRI: "https://www.omg.org/spec/SysML#MetadataAccessExpression_referencedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element"}, - {Name: "metaclass", DefiningClass: "MetadataFeature", IRI: "https://www.omg.org/spec/SysML#MetadataFeature_metaclass", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Metaclass"}, - {Name: "metadataDefinition", DefiningClass: "MetadataUsage", IRI: "https://www.omg.org/spec/SysML#MetadataUsage_metadataDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Metaclass"}, - {Name: "bound", DefiningClass: "MultiplicityRange", IRI: "https://www.omg.org/spec/SysML#MultiplicityRange_bound", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "lowerBound", DefiningClass: "MultiplicityRange", IRI: "https://www.omg.org/spec/SysML#MultiplicityRange_lowerBound", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "upperBound", DefiningClass: "MultiplicityRange", IRI: "https://www.omg.org/spec/SysML#MultiplicityRange_upperBound", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "importedNamespace", DefiningClass: "NamespaceImport", IRI: "https://www.omg.org/spec/SysML#NamespaceImport_importedNamespace", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Namespace"}, - {Name: "importedMembership", DefiningClass: "Namespace", IRI: "https://www.omg.org/spec/SysML#Namespace_importedMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Membership", Many: true}, - {Name: "member", DefiningClass: "Namespace", IRI: "https://www.omg.org/spec/SysML#Namespace_member", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true}, - {Name: "membership", DefiningClass: "Namespace", IRI: "https://www.omg.org/spec/SysML#Namespace_membership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Membership", Many: true}, - {Name: "ownedImport", DefiningClass: "Namespace", IRI: "https://www.omg.org/spec/SysML#Namespace_ownedImport", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Import", Many: true}, - {Name: "ownedMember", DefiningClass: "Namespace", IRI: "https://www.omg.org/spec/SysML#Namespace_ownedMember", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true}, - {Name: "ownedMembership", DefiningClass: "Namespace", IRI: "https://www.omg.org/spec/SysML#Namespace_ownedMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Membership", Many: true}, - {Name: "ownedObjectiveRequirement", DefiningClass: "ObjectiveMembership", IRI: "https://www.omg.org/spec/SysML#ObjectiveMembership_ownedObjectiveRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage"}, + {Name: "referencedElement", DefiningClass: "MetadataAccessExpression", IRI: "https://www.omg.org/spec/SysML#MetadataAccessExpression_referencedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Derived: true, Subsets: []string{"Namespace::member"}}, + {Name: "metaclass", DefiningClass: "MetadataFeature", IRI: "https://www.omg.org/spec/SysML#MetadataFeature_metaclass", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Metaclass", Derived: true, Subsets: []string{"Feature::type"}}, + {Name: "metadataDefinition", DefiningClass: "MetadataUsage", IRI: "https://www.omg.org/spec/SysML#MetadataUsage_metadataDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Metaclass", Derived: true, Redefines: []string{"ItemUsage::itemDefinition", "MetadataFeature::metaclass"}}, + {Name: "bound", DefiningClass: "MultiplicityRange", IRI: "https://www.omg.org/spec/SysML#MultiplicityRange_bound", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Many: true, Ordered: true, Derived: true, Subsets: []string{"Namespace::ownedMember"}}, + {Name: "lowerBound", DefiningClass: "MultiplicityRange", IRI: "https://www.omg.org/spec/SysML#MultiplicityRange_lowerBound", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true, Subsets: []string{"MultiplicityRange::bound"}}, + {Name: "upperBound", DefiningClass: "MultiplicityRange", IRI: "https://www.omg.org/spec/SysML#MultiplicityRange_upperBound", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true, Subsets: []string{"MultiplicityRange::bound"}}, + {Name: "importedNamespace", DefiningClass: "NamespaceImport", IRI: "https://www.omg.org/spec/SysML#NamespaceImport_importedNamespace", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Namespace", Redefines: []string{"Relationship::target"}}, + {Name: "importedMembership", DefiningClass: "Namespace", IRI: "https://www.omg.org/spec/SysML#Namespace_importedMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Membership", Many: true, Ordered: true, Derived: true, Subsets: []string{"Namespace::membership"}}, + {Name: "member", DefiningClass: "Namespace", IRI: "https://www.omg.org/spec/SysML#Namespace_member", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true, Ordered: true, Derived: true}, + {Name: "membership", DefiningClass: "Namespace", IRI: "https://www.omg.org/spec/SysML#Namespace_membership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Membership", Many: true, Ordered: true, Derived: true}, + {Name: "ownedImport", DefiningClass: "Namespace", IRI: "https://www.omg.org/spec/SysML#Namespace_ownedImport", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Import", Many: true, Ordered: true, Derived: true, Subsets: []string{"Element::ownedRelationship"}, Opposite: "Import::importOwningNamespace"}, + {Name: "ownedMember", DefiningClass: "Namespace", IRI: "https://www.omg.org/spec/SysML#Namespace_ownedMember", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true, Ordered: true, Derived: true, Subsets: []string{"Namespace::member"}, Opposite: "Element::owningNamespace"}, + {Name: "ownedMembership", DefiningClass: "Namespace", IRI: "https://www.omg.org/spec/SysML#Namespace_ownedMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Membership", Many: true, Ordered: true, Derived: true, Subsets: []string{"Namespace::membership", "Element::ownedRelationship"}, Opposite: "Membership::membershipOwningNamespace"}, + {Name: "ownedObjectiveRequirement", DefiningClass: "ObjectiveMembership", IRI: "https://www.omg.org/spec/SysML#ObjectiveMembership_ownedObjectiveRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage", Derived: true, Redefines: []string{"FeatureMembership::ownedMemberFeature"}}, {Name: "isIndividual", DefiningClass: "OccurrenceDefinition", IRI: "https://www.omg.org/spec/SysML#OccurrenceDefinition_isIndividual", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "lifeClass", DefiningClass: "OccurrenceDefinition", IRI: "https://www.omg.org/spec/SysML#OccurrenceDefinition_lifeClass", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#LifeClass"}, - {Name: "individualDefinition", DefiningClass: "OccurrenceUsage", IRI: "https://www.omg.org/spec/SysML#OccurrenceUsage_individualDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#OccurrenceDefinition"}, + {Name: "individualDefinition", DefiningClass: "OccurrenceUsage", IRI: "https://www.omg.org/spec/SysML#OccurrenceUsage_individualDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#OccurrenceDefinition", Derived: true, Subsets: []string{"OccurrenceUsage::occurrenceDefinition"}}, {Name: "isIndividual", DefiningClass: "OccurrenceUsage", IRI: "https://www.omg.org/spec/SysML#OccurrenceUsage_isIndividual", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "occurrenceDefinition", DefiningClass: "OccurrenceUsage", IRI: "https://www.omg.org/spec/SysML#OccurrenceUsage_occurrenceDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Class", Many: true}, + {Name: "occurrenceDefinition", DefiningClass: "OccurrenceUsage", IRI: "https://www.omg.org/spec/SysML#OccurrenceUsage_occurrenceDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Class", Many: true, Ordered: true, Derived: true, Redefines: []string{"Usage::definition"}}, {Name: "portionKind", DefiningClass: "OccurrenceUsage", IRI: "https://www.omg.org/spec/SysML#OccurrenceUsage_portionKind", Kind: DatatypeProperty, Range: "https://www.omg.org/spec/SysML#PortionKind"}, {Name: "operator", DefiningClass: "OperatorExpression", IRI: "https://www.omg.org/spec/SysML#OperatorExpression_operator", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, - {Name: "ownedMemberElement", DefiningClass: "OwningMembership", IRI: "https://www.omg.org/spec/SysML#OwningMembership_ownedMemberElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element"}, - {Name: "ownedMemberElementId", DefiningClass: "OwningMembership", IRI: "https://www.omg.org/spec/SysML#OwningMembership_ownedMemberElementId", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, - {Name: "ownedMemberName", DefiningClass: "OwningMembership", IRI: "https://www.omg.org/spec/SysML#OwningMembership_ownedMemberName", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, - {Name: "ownedMemberShortName", DefiningClass: "OwningMembership", IRI: "https://www.omg.org/spec/SysML#OwningMembership_ownedMemberShortName", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, - {Name: "filterCondition", DefiningClass: "Package", IRI: "https://www.omg.org/spec/SysML#Package_filterCondition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Many: true}, - {Name: "ownedMemberParameter", DefiningClass: "ParameterMembership", IRI: "https://www.omg.org/spec/SysML#ParameterMembership_ownedMemberParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "partDefinition", DefiningClass: "PartUsage", IRI: "https://www.omg.org/spec/SysML#PartUsage_partDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartDefinition", Many: true}, - {Name: "performedAction", DefiningClass: "PerformActionUsage", IRI: "https://www.omg.org/spec/SysML#PerformActionUsage_performedAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage"}, - {Name: "conjugatedPortDefinition", DefiningClass: "PortConjugation", IRI: "https://www.omg.org/spec/SysML#PortConjugation_conjugatedPortDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConjugatedPortDefinition"}, - {Name: "originalPortDefinition", DefiningClass: "PortConjugation", IRI: "https://www.omg.org/spec/SysML#PortConjugation_originalPortDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PortDefinition"}, - {Name: "conjugatedPortDefinition", DefiningClass: "PortDefinition", IRI: "https://www.omg.org/spec/SysML#PortDefinition_conjugatedPortDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConjugatedPortDefinition"}, - {Name: "portDefinition", DefiningClass: "PortUsage", IRI: "https://www.omg.org/spec/SysML#PortUsage_portDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PortDefinition", Many: true}, - {Name: "redefinedFeature", DefiningClass: "Redefinition", IRI: "https://www.omg.org/spec/SysML#Redefinition_redefinedFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "redefiningFeature", DefiningClass: "Redefinition", IRI: "https://www.omg.org/spec/SysML#Redefinition_redefiningFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "referencedFeature", DefiningClass: "ReferenceSubsetting", IRI: "https://www.omg.org/spec/SysML#ReferenceSubsetting_referencedFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "referencingFeature", DefiningClass: "ReferenceSubsetting", IRI: "https://www.omg.org/spec/SysML#ReferenceSubsetting_referencingFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, + {Name: "ownedMemberElement", DefiningClass: "OwningMembership", IRI: "https://www.omg.org/spec/SysML#OwningMembership_ownedMemberElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Derived: true, Redefines: []string{"Membership::memberElement"}, Subsets: []string{"Relationship::ownedRelatedElement"}, Opposite: "Element::owningMembership"}, + {Name: "ownedMemberElementId", DefiningClass: "OwningMembership", IRI: "https://www.omg.org/spec/SysML#OwningMembership_ownedMemberElementId", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string", Derived: true, Redefines: []string{"Membership::memberElementId"}}, + {Name: "ownedMemberName", DefiningClass: "OwningMembership", IRI: "https://www.omg.org/spec/SysML#OwningMembership_ownedMemberName", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string", Derived: true, Redefines: []string{"Membership::memberName"}}, + {Name: "ownedMemberShortName", DefiningClass: "OwningMembership", IRI: "https://www.omg.org/spec/SysML#OwningMembership_ownedMemberShortName", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string", Derived: true, Redefines: []string{"Membership::memberShortName"}}, + {Name: "filterCondition", DefiningClass: "Package", IRI: "https://www.omg.org/spec/SysML#Package_filterCondition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Many: true, Ordered: true, Derived: true, Subsets: []string{"Namespace::ownedMember"}}, + {Name: "ownedMemberParameter", DefiningClass: "ParameterMembership", IRI: "https://www.omg.org/spec/SysML#ParameterMembership_ownedMemberParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true, Redefines: []string{"FeatureMembership::ownedMemberFeature"}}, + {Name: "partDefinition", DefiningClass: "PartUsage", IRI: "https://www.omg.org/spec/SysML#PartUsage_partDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartDefinition", Many: true, Ordered: true, Derived: true, Subsets: []string{"ItemUsage::itemDefinition"}}, + {Name: "performedAction", DefiningClass: "PerformActionUsage", IRI: "https://www.omg.org/spec/SysML#PerformActionUsage_performedAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Derived: true, Redefines: []string{"EventOccurrenceUsage::eventOccurrence"}}, + {Name: "conjugatedPortDefinition", DefiningClass: "PortConjugation", IRI: "https://www.omg.org/spec/SysML#PortConjugation_conjugatedPortDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConjugatedPortDefinition", Derived: true, Redefines: []string{"Conjugation::owningType"}, Opposite: "ConjugatedPortDefinition::ownedPortConjugator"}, + {Name: "originalPortDefinition", DefiningClass: "PortConjugation", IRI: "https://www.omg.org/spec/SysML#PortConjugation_originalPortDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PortDefinition", Redefines: []string{"Conjugation::originalType"}}, + {Name: "conjugatedPortDefinition", DefiningClass: "PortDefinition", IRI: "https://www.omg.org/spec/SysML#PortDefinition_conjugatedPortDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConjugatedPortDefinition", Derived: true, Subsets: []string{"Namespace::ownedMember"}, Opposite: "ConjugatedPortDefinition::originalPortDefinition"}, + {Name: "portDefinition", DefiningClass: "PortUsage", IRI: "https://www.omg.org/spec/SysML#PortUsage_portDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PortDefinition", Many: true, Ordered: true, Derived: true, Redefines: []string{"OccurrenceUsage::occurrenceDefinition"}}, + {Name: "redefinedFeature", DefiningClass: "Redefinition", IRI: "https://www.omg.org/spec/SysML#Redefinition_redefinedFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Redefines: []string{"Subsetting::subsettedFeature"}}, + {Name: "redefiningFeature", DefiningClass: "Redefinition", IRI: "https://www.omg.org/spec/SysML#Redefinition_redefiningFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Redefines: []string{"Subsetting::subsettingFeature"}}, + {Name: "referencedFeature", DefiningClass: "ReferenceSubsetting", IRI: "https://www.omg.org/spec/SysML#ReferenceSubsetting_referencedFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Redefines: []string{"Subsetting::subsettedFeature"}}, + {Name: "referencingFeature", DefiningClass: "ReferenceSubsetting", IRI: "https://www.omg.org/spec/SysML#ReferenceSubsetting_referencingFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true, Redefines: []string{"Subsetting::owningFeature", "Subsetting::subsettingFeature"}, Opposite: "Feature::ownedReferenceSubsetting"}, {Name: "isImplied", DefiningClass: "Relationship", IRI: "https://www.omg.org/spec/SysML#Relationship_isImplied", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "ownedRelatedElement", DefiningClass: "Relationship", IRI: "https://www.omg.org/spec/SysML#Relationship_ownedRelatedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true}, - {Name: "owningRelatedElement", DefiningClass: "Relationship", IRI: "https://www.omg.org/spec/SysML#Relationship_owningRelatedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element"}, - {Name: "relatedElement", DefiningClass: "Relationship", IRI: "https://www.omg.org/spec/SysML#Relationship_relatedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true}, - {Name: "source", DefiningClass: "Relationship", IRI: "https://www.omg.org/spec/SysML#Relationship_source", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true}, - {Name: "target", DefiningClass: "Relationship", IRI: "https://www.omg.org/spec/SysML#Relationship_target", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true}, - {Name: "rendering", DefiningClass: "RenderingDefinition", IRI: "https://www.omg.org/spec/SysML#RenderingDefinition_rendering", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RenderingUsage", Many: true}, - {Name: "renderingDefinition", DefiningClass: "RenderingUsage", IRI: "https://www.omg.org/spec/SysML#RenderingUsage_renderingDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RenderingDefinition"}, + {Name: "ownedRelatedElement", DefiningClass: "Relationship", IRI: "https://www.omg.org/spec/SysML#Relationship_ownedRelatedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true, Ordered: true, Subsets: []string{"Relationship::relatedElement"}, Opposite: "Element::owningRelationship"}, + {Name: "owningRelatedElement", DefiningClass: "Relationship", IRI: "https://www.omg.org/spec/SysML#Relationship_owningRelatedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Subsets: []string{"Relationship::relatedElement"}, Opposite: "Element::ownedRelationship"}, + {Name: "relatedElement", DefiningClass: "Relationship", IRI: "https://www.omg.org/spec/SysML#Relationship_relatedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true, Ordered: true, Derived: true}, + {Name: "source", DefiningClass: "Relationship", IRI: "https://www.omg.org/spec/SysML#Relationship_source", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true, Ordered: true, Subsets: []string{"Relationship::relatedElement"}}, + {Name: "target", DefiningClass: "Relationship", IRI: "https://www.omg.org/spec/SysML#Relationship_target", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true, Ordered: true, Subsets: []string{"Relationship::relatedElement"}}, + {Name: "rendering", DefiningClass: "RenderingDefinition", IRI: "https://www.omg.org/spec/SysML#RenderingDefinition_rendering", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RenderingUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::usage"}}, + {Name: "renderingDefinition", DefiningClass: "RenderingUsage", IRI: "https://www.omg.org/spec/SysML#RenderingUsage_renderingDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RenderingDefinition", Derived: true, Redefines: []string{"PartUsage::partDefinition"}}, {Name: "kind", DefiningClass: "RequirementConstraintMembership", IRI: "https://www.omg.org/spec/SysML#RequirementConstraintMembership_kind", Kind: DatatypeProperty, Range: "https://www.omg.org/spec/SysML#RequirementConstraintKind"}, - {Name: "ownedConstraint", DefiningClass: "RequirementConstraintMembership", IRI: "https://www.omg.org/spec/SysML#RequirementConstraintMembership_ownedConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage"}, - {Name: "referencedConstraint", DefiningClass: "RequirementConstraintMembership", IRI: "https://www.omg.org/spec/SysML#RequirementConstraintMembership_referencedConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage"}, - {Name: "actorParameter", DefiningClass: "RequirementDefinition", IRI: "https://www.omg.org/spec/SysML#RequirementDefinition_actorParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true}, - {Name: "assumedConstraint", DefiningClass: "RequirementDefinition", IRI: "https://www.omg.org/spec/SysML#RequirementDefinition_assumedConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage", Many: true}, - {Name: "framedConcern", DefiningClass: "RequirementDefinition", IRI: "https://www.omg.org/spec/SysML#RequirementDefinition_framedConcern", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConcernUsage", Many: true}, - {Name: "reqId", DefiningClass: "RequirementDefinition", IRI: "https://www.omg.org/spec/SysML#RequirementDefinition_reqId", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, - {Name: "requiredConstraint", DefiningClass: "RequirementDefinition", IRI: "https://www.omg.org/spec/SysML#RequirementDefinition_requiredConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage", Many: true}, - {Name: "stakeholderParameter", DefiningClass: "RequirementDefinition", IRI: "https://www.omg.org/spec/SysML#RequirementDefinition_stakeholderParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true}, - {Name: "subjectParameter", DefiningClass: "RequirementDefinition", IRI: "https://www.omg.org/spec/SysML#RequirementDefinition_subjectParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage"}, - {Name: "text", DefiningClass: "RequirementDefinition", IRI: "https://www.omg.org/spec/SysML#RequirementDefinition_text", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string", Many: true}, - {Name: "actorParameter", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_actorParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true}, - {Name: "assumedConstraint", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_assumedConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage", Many: true}, - {Name: "framedConcern", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_framedConcern", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConcernUsage", Many: true}, - {Name: "reqId", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_reqId", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, - {Name: "requiredConstraint", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_requiredConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage", Many: true}, - {Name: "requirementDefinition", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_requirementDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementDefinition"}, - {Name: "stakeholderParameter", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_stakeholderParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true}, - {Name: "subjectParameter", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_subjectParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage"}, - {Name: "text", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_text", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string", Many: true}, - {Name: "ownedRequirement", DefiningClass: "RequirementVerificationMembership", IRI: "https://www.omg.org/spec/SysML#RequirementVerificationMembership_ownedRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage"}, - {Name: "verifiedRequirement", DefiningClass: "RequirementVerificationMembership", IRI: "https://www.omg.org/spec/SysML#RequirementVerificationMembership_verifiedRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage"}, - {Name: "ownedResultExpression", DefiningClass: "ResultExpressionMembership", IRI: "https://www.omg.org/spec/SysML#ResultExpressionMembership_ownedResultExpression", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "satisfiedRequirement", DefiningClass: "SatisfyRequirementUsage", IRI: "https://www.omg.org/spec/SysML#SatisfyRequirementUsage_satisfiedRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage"}, - {Name: "satisfyingFeature", DefiningClass: "SatisfyRequirementUsage", IRI: "https://www.omg.org/spec/SysML#SatisfyRequirementUsage_satisfyingFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "payloadArgument", DefiningClass: "SendActionUsage", IRI: "https://www.omg.org/spec/SysML#SendActionUsage_payloadArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "receiverArgument", DefiningClass: "SendActionUsage", IRI: "https://www.omg.org/spec/SysML#SendActionUsage_receiverArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "senderArgument", DefiningClass: "SendActionUsage", IRI: "https://www.omg.org/spec/SysML#SendActionUsage_senderArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "general", DefiningClass: "Specialization", IRI: "https://www.omg.org/spec/SysML#Specialization_general", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "owningType", DefiningClass: "Specialization", IRI: "https://www.omg.org/spec/SysML#Specialization_owningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "specific", DefiningClass: "Specialization", IRI: "https://www.omg.org/spec/SysML#Specialization_specific", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "ownedStakeholderParameter", DefiningClass: "StakeholderMembership", IRI: "https://www.omg.org/spec/SysML#StakeholderMembership_ownedStakeholderParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage"}, - {Name: "doAction", DefiningClass: "StateDefinition", IRI: "https://www.omg.org/spec/SysML#StateDefinition_doAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage"}, - {Name: "entryAction", DefiningClass: "StateDefinition", IRI: "https://www.omg.org/spec/SysML#StateDefinition_entryAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage"}, - {Name: "exitAction", DefiningClass: "StateDefinition", IRI: "https://www.omg.org/spec/SysML#StateDefinition_exitAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage"}, + {Name: "ownedConstraint", DefiningClass: "RequirementConstraintMembership", IRI: "https://www.omg.org/spec/SysML#RequirementConstraintMembership_ownedConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage", Derived: true, Redefines: []string{"FeatureMembership::ownedMemberFeature"}}, + {Name: "referencedConstraint", DefiningClass: "RequirementConstraintMembership", IRI: "https://www.omg.org/spec/SysML#RequirementConstraintMembership_referencedConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage", Derived: true}, + {Name: "actorParameter", DefiningClass: "RequirementDefinition", IRI: "https://www.omg.org/spec/SysML#RequirementDefinition_actorParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Behavior::parameter", "Definition::usage"}}, + {Name: "assumedConstraint", DefiningClass: "RequirementDefinition", IRI: "https://www.omg.org/spec/SysML#RequirementDefinition_assumedConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Type::ownedFeature"}}, + {Name: "framedConcern", DefiningClass: "RequirementDefinition", IRI: "https://www.omg.org/spec/SysML#RequirementDefinition_framedConcern", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConcernUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"RequirementDefinition::requiredConstraint"}}, + {Name: "reqId", DefiningClass: "RequirementDefinition", IRI: "https://www.omg.org/spec/SysML#RequirementDefinition_reqId", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string", Redefines: []string{"Element::declaredShortName"}}, + {Name: "requiredConstraint", DefiningClass: "RequirementDefinition", IRI: "https://www.omg.org/spec/SysML#RequirementDefinition_requiredConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Type::ownedFeature"}}, + {Name: "stakeholderParameter", DefiningClass: "RequirementDefinition", IRI: "https://www.omg.org/spec/SysML#RequirementDefinition_stakeholderParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Behavior::parameter", "Definition::usage"}}, + {Name: "subjectParameter", DefiningClass: "RequirementDefinition", IRI: "https://www.omg.org/spec/SysML#RequirementDefinition_subjectParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Derived: true, Subsets: []string{"Behavior::parameter", "Definition::usage"}}, + {Name: "text", DefiningClass: "RequirementDefinition", IRI: "https://www.omg.org/spec/SysML#RequirementDefinition_text", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string", Many: true, Derived: true}, + {Name: "actorParameter", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_actorParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Step::parameter", "Usage::usage"}}, + {Name: "assumedConstraint", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_assumedConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Type::ownedFeature"}}, + {Name: "framedConcern", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_framedConcern", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConcernUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"RequirementUsage::requiredConstraint"}}, + {Name: "reqId", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_reqId", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string", Redefines: []string{"Element::declaredShortName"}}, + {Name: "requiredConstraint", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_requiredConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Type::ownedFeature"}}, + {Name: "requirementDefinition", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_requirementDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementDefinition", Derived: true, Redefines: []string{"ConstraintUsage::constraintDefinition"}}, + {Name: "stakeholderParameter", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_stakeholderParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Step::parameter", "Usage::usage"}}, + {Name: "subjectParameter", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_subjectParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Derived: true, Subsets: []string{"Step::parameter", "Usage::usage"}}, + {Name: "text", DefiningClass: "RequirementUsage", IRI: "https://www.omg.org/spec/SysML#RequirementUsage_text", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string", Many: true, Derived: true}, + {Name: "ownedRequirement", DefiningClass: "RequirementVerificationMembership", IRI: "https://www.omg.org/spec/SysML#RequirementVerificationMembership_ownedRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage", Derived: true, Redefines: []string{"RequirementConstraintMembership::ownedConstraint"}}, + {Name: "verifiedRequirement", DefiningClass: "RequirementVerificationMembership", IRI: "https://www.omg.org/spec/SysML#RequirementVerificationMembership_verifiedRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage", Derived: true, Redefines: []string{"RequirementConstraintMembership::referencedConstraint"}}, + {Name: "ownedResultExpression", DefiningClass: "ResultExpressionMembership", IRI: "https://www.omg.org/spec/SysML#ResultExpressionMembership_ownedResultExpression", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true, Redefines: []string{"FeatureMembership::ownedMemberFeature"}}, + {Name: "satisfiedRequirement", DefiningClass: "SatisfyRequirementUsage", IRI: "https://www.omg.org/spec/SysML#SatisfyRequirementUsage_satisfiedRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage", Derived: true, Redefines: []string{"AssertConstraintUsage::assertedConstraint"}}, + {Name: "satisfyingFeature", DefiningClass: "SatisfyRequirementUsage", IRI: "https://www.omg.org/spec/SysML#SatisfyRequirementUsage_satisfyingFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true}, + {Name: "payloadArgument", DefiningClass: "SendActionUsage", IRI: "https://www.omg.org/spec/SysML#SendActionUsage_payloadArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true}, + {Name: "receiverArgument", DefiningClass: "SendActionUsage", IRI: "https://www.omg.org/spec/SysML#SendActionUsage_receiverArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true}, + {Name: "senderArgument", DefiningClass: "SendActionUsage", IRI: "https://www.omg.org/spec/SysML#SendActionUsage_senderArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true}, + {Name: "general", DefiningClass: "Specialization", IRI: "https://www.omg.org/spec/SysML#Specialization_general", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Redefines: []string{"Relationship::target"}}, + {Name: "owningType", DefiningClass: "Specialization", IRI: "https://www.omg.org/spec/SysML#Specialization_owningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Derived: true, Subsets: []string{"Relationship::owningRelatedElement", "Specialization::specific"}, Opposite: "Type::ownedSpecialization"}, + {Name: "specific", DefiningClass: "Specialization", IRI: "https://www.omg.org/spec/SysML#Specialization_specific", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Redefines: []string{"Relationship::source"}}, + {Name: "ownedStakeholderParameter", DefiningClass: "StakeholderMembership", IRI: "https://www.omg.org/spec/SysML#StakeholderMembership_ownedStakeholderParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Derived: true, Redefines: []string{"ParameterMembership::ownedMemberParameter"}}, + {Name: "doAction", DefiningClass: "StateDefinition", IRI: "https://www.omg.org/spec/SysML#StateDefinition_doAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Derived: true}, + {Name: "entryAction", DefiningClass: "StateDefinition", IRI: "https://www.omg.org/spec/SysML#StateDefinition_entryAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Derived: true}, + {Name: "exitAction", DefiningClass: "StateDefinition", IRI: "https://www.omg.org/spec/SysML#StateDefinition_exitAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Derived: true}, {Name: "isParallel", DefiningClass: "StateDefinition", IRI: "https://www.omg.org/spec/SysML#StateDefinition_isParallel", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "state", DefiningClass: "StateDefinition", IRI: "https://www.omg.org/spec/SysML#StateDefinition_state", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#StateUsage", Many: true}, - {Name: "action", DefiningClass: "StateSubactionMembership", IRI: "https://www.omg.org/spec/SysML#StateSubactionMembership_action", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage"}, + {Name: "state", DefiningClass: "StateDefinition", IRI: "https://www.omg.org/spec/SysML#StateDefinition_state", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#StateUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"ActionDefinition::action"}}, + {Name: "action", DefiningClass: "StateSubactionMembership", IRI: "https://www.omg.org/spec/SysML#StateSubactionMembership_action", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Derived: true, Redefines: []string{"FeatureMembership::ownedMemberFeature"}}, {Name: "kind", DefiningClass: "StateSubactionMembership", IRI: "https://www.omg.org/spec/SysML#StateSubactionMembership_kind", Kind: DatatypeProperty, Range: "https://www.omg.org/spec/SysML#StateSubactionKind"}, - {Name: "doAction", DefiningClass: "StateUsage", IRI: "https://www.omg.org/spec/SysML#StateUsage_doAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage"}, - {Name: "entryAction", DefiningClass: "StateUsage", IRI: "https://www.omg.org/spec/SysML#StateUsage_entryAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage"}, - {Name: "exitAction", DefiningClass: "StateUsage", IRI: "https://www.omg.org/spec/SysML#StateUsage_exitAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage"}, + {Name: "doAction", DefiningClass: "StateUsage", IRI: "https://www.omg.org/spec/SysML#StateUsage_doAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Derived: true}, + {Name: "entryAction", DefiningClass: "StateUsage", IRI: "https://www.omg.org/spec/SysML#StateUsage_entryAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Derived: true}, + {Name: "exitAction", DefiningClass: "StateUsage", IRI: "https://www.omg.org/spec/SysML#StateUsage_exitAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Derived: true}, {Name: "isParallel", DefiningClass: "StateUsage", IRI: "https://www.omg.org/spec/SysML#StateUsage_isParallel", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "stateDefinition", DefiningClass: "StateUsage", IRI: "https://www.omg.org/spec/SysML#StateUsage_stateDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Behavior", Many: true}, - {Name: "behavior", DefiningClass: "Step", IRI: "https://www.omg.org/spec/SysML#Step_behavior", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Behavior", Many: true}, - {Name: "parameter", DefiningClass: "Step", IRI: "https://www.omg.org/spec/SysML#Step_parameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true}, - {Name: "owningClassifier", DefiningClass: "Subclassification", IRI: "https://www.omg.org/spec/SysML#Subclassification_owningClassifier", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Classifier"}, - {Name: "subclassifier", DefiningClass: "Subclassification", IRI: "https://www.omg.org/spec/SysML#Subclassification_subclassifier", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Classifier"}, - {Name: "superclassifier", DefiningClass: "Subclassification", IRI: "https://www.omg.org/spec/SysML#Subclassification_superclassifier", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Classifier"}, - {Name: "ownedSubjectParameter", DefiningClass: "SubjectMembership", IRI: "https://www.omg.org/spec/SysML#SubjectMembership_ownedSubjectParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage"}, - {Name: "owningFeature", DefiningClass: "Subsetting", IRI: "https://www.omg.org/spec/SysML#Subsetting_owningFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "subsettedFeature", DefiningClass: "Subsetting", IRI: "https://www.omg.org/spec/SysML#Subsetting_subsettedFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "subsettingFeature", DefiningClass: "Subsetting", IRI: "https://www.omg.org/spec/SysML#Subsetting_subsettingFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "effectStep", DefiningClass: "Succession", IRI: "https://www.omg.org/spec/SysML#Succession_effectStep", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Step", Many: true}, - {Name: "guardExpression", DefiningClass: "Succession", IRI: "https://www.omg.org/spec/SysML#Succession_guardExpression", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Many: true}, - {Name: "transitionStep", DefiningClass: "Succession", IRI: "https://www.omg.org/spec/SysML#Succession_transitionStep", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Step"}, - {Name: "triggerStep", DefiningClass: "Succession", IRI: "https://www.omg.org/spec/SysML#Succession_triggerStep", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Step", Many: true}, + {Name: "stateDefinition", DefiningClass: "StateUsage", IRI: "https://www.omg.org/spec/SysML#StateUsage_stateDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Behavior", Many: true, Ordered: true, Derived: true, Redefines: []string{"ActionUsage::actionDefinition"}}, + {Name: "behavior", DefiningClass: "Step", IRI: "https://www.omg.org/spec/SysML#Step_behavior", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Behavior", Many: true, Ordered: true, Derived: true, Subsets: []string{"Feature::type"}}, + {Name: "parameter", DefiningClass: "Step", IRI: "https://www.omg.org/spec/SysML#Step_parameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true, Ordered: true, Derived: true, Redefines: []string{"Type::directedFeature"}}, + {Name: "owningClassifier", DefiningClass: "Subclassification", IRI: "https://www.omg.org/spec/SysML#Subclassification_owningClassifier", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Classifier", Derived: true, Redefines: []string{"Specialization::owningType"}, Opposite: "Classifier::ownedSubclassification"}, + {Name: "subclassifier", DefiningClass: "Subclassification", IRI: "https://www.omg.org/spec/SysML#Subclassification_subclassifier", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Classifier", Redefines: []string{"Specialization::specific"}}, + {Name: "superclassifier", DefiningClass: "Subclassification", IRI: "https://www.omg.org/spec/SysML#Subclassification_superclassifier", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Classifier", Redefines: []string{"Specialization::general"}}, + {Name: "ownedSubjectParameter", DefiningClass: "SubjectMembership", IRI: "https://www.omg.org/spec/SysML#SubjectMembership_ownedSubjectParameter", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Derived: true, Redefines: []string{"ParameterMembership::ownedMemberParameter"}}, + {Name: "owningFeature", DefiningClass: "Subsetting", IRI: "https://www.omg.org/spec/SysML#Subsetting_owningFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true, Redefines: []string{"Specialization::owningType"}, Subsets: []string{"Subsetting::subsettingFeature"}, Opposite: "Feature::ownedSubsetting"}, + {Name: "subsettedFeature", DefiningClass: "Subsetting", IRI: "https://www.omg.org/spec/SysML#Subsetting_subsettedFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Redefines: []string{"Specialization::general"}}, + {Name: "subsettingFeature", DefiningClass: "Subsetting", IRI: "https://www.omg.org/spec/SysML#Subsetting_subsettingFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Redefines: []string{"Specialization::specific"}}, + {Name: "terminatedOccurrenceArgument", DefiningClass: "TerminateActionUsage", IRI: "https://www.omg.org/spec/SysML#TerminateActionUsage_terminatedOccurrenceArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true}, {Name: "body", DefiningClass: "TextualRepresentation", IRI: "https://www.omg.org/spec/SysML#TextualRepresentation_body", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, {Name: "language", DefiningClass: "TextualRepresentation", IRI: "https://www.omg.org/spec/SysML#TextualRepresentation_language", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, - {Name: "representedElement", DefiningClass: "TextualRepresentation", IRI: "https://www.omg.org/spec/SysML#TextualRepresentation_representedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element"}, + {Name: "representedElement", DefiningClass: "TextualRepresentation", IRI: "https://www.omg.org/spec/SysML#TextualRepresentation_representedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Derived: true, Redefines: []string{"AnnotatingElement::annotatedElement"}, Subsets: []string{"Element::owner"}, Opposite: "Element::textualRepresentation"}, {Name: "kind", DefiningClass: "TransitionFeatureMembership", IRI: "https://www.omg.org/spec/SysML#TransitionFeatureMembership_kind", Kind: DatatypeProperty, Range: "https://www.omg.org/spec/SysML#TransitionFeatureKind"}, - {Name: "transitionFeature", DefiningClass: "TransitionFeatureMembership", IRI: "https://www.omg.org/spec/SysML#TransitionFeatureMembership_transitionFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Step"}, - {Name: "effectAction", DefiningClass: "TransitionUsage", IRI: "https://www.omg.org/spec/SysML#TransitionUsage_effectAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Many: true}, - {Name: "guardExpression", DefiningClass: "TransitionUsage", IRI: "https://www.omg.org/spec/SysML#TransitionUsage_guardExpression", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Many: true}, - {Name: "source", DefiningClass: "TransitionUsage", IRI: "https://www.omg.org/spec/SysML#TransitionUsage_source", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage"}, - {Name: "succession", DefiningClass: "TransitionUsage", IRI: "https://www.omg.org/spec/SysML#TransitionUsage_succession", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Succession"}, - {Name: "target", DefiningClass: "TransitionUsage", IRI: "https://www.omg.org/spec/SysML#TransitionUsage_target", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage"}, - {Name: "triggerAction", DefiningClass: "TransitionUsage", IRI: "https://www.omg.org/spec/SysML#TransitionUsage_triggerAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AcceptActionUsage", Many: true}, + {Name: "transitionFeature", DefiningClass: "TransitionFeatureMembership", IRI: "https://www.omg.org/spec/SysML#TransitionFeatureMembership_transitionFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Step", Derived: true, Redefines: []string{"FeatureMembership::ownedMemberFeature"}}, + {Name: "effectAction", DefiningClass: "TransitionUsage", IRI: "https://www.omg.org/spec/SysML#TransitionUsage_effectAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Many: true, Derived: true, Subsets: []string{"Type::feature"}}, + {Name: "guardExpression", DefiningClass: "TransitionUsage", IRI: "https://www.omg.org/spec/SysML#TransitionUsage_guardExpression", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Many: true, Derived: true, Subsets: []string{"Type::ownedFeature"}}, + {Name: "source", DefiningClass: "TransitionUsage", IRI: "https://www.omg.org/spec/SysML#TransitionUsage_source", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Derived: true}, + {Name: "succession", DefiningClass: "TransitionUsage", IRI: "https://www.omg.org/spec/SysML#TransitionUsage_succession", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Succession", Derived: true, Subsets: []string{"Namespace::ownedMember"}}, + {Name: "target", DefiningClass: "TransitionUsage", IRI: "https://www.omg.org/spec/SysML#TransitionUsage_target", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Derived: true}, + {Name: "triggerAction", DefiningClass: "TransitionUsage", IRI: "https://www.omg.org/spec/SysML#TransitionUsage_triggerAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AcceptActionUsage", Many: true, Derived: true, Subsets: []string{"Type::ownedFeature"}}, {Name: "kind", DefiningClass: "TriggerInvocationExpression", IRI: "https://www.omg.org/spec/SysML#TriggerInvocationExpression_kind", Kind: DatatypeProperty, Range: "https://www.omg.org/spec/SysML#TriggerKind"}, - {Name: "featureOfType", DefiningClass: "TypeFeaturing", IRI: "https://www.omg.org/spec/SysML#TypeFeaturing_featureOfType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "featuringType", DefiningClass: "TypeFeaturing", IRI: "https://www.omg.org/spec/SysML#TypeFeaturing_featuringType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "owningFeatureOfType", DefiningClass: "TypeFeaturing", IRI: "https://www.omg.org/spec/SysML#TypeFeaturing_owningFeatureOfType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature"}, - {Name: "differencingType", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_differencingType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Many: true}, - {Name: "directedFeature", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_directedFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true}, - {Name: "endFeature", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_endFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true}, - {Name: "feature", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_feature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true}, - {Name: "featureMembership", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_featureMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FeatureMembership", Many: true}, - {Name: "inheritedFeature", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_inheritedFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true}, - {Name: "inheritedMembership", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_inheritedMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Membership", Many: true}, - {Name: "input", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_input", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true}, - {Name: "intersectingType", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_intersectingType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Many: true}, + {Name: "featureOfType", DefiningClass: "TypeFeaturing", IRI: "https://www.omg.org/spec/SysML#TypeFeaturing_featureOfType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Redefines: []string{"Relationship::source"}}, + {Name: "featuringType", DefiningClass: "TypeFeaturing", IRI: "https://www.omg.org/spec/SysML#TypeFeaturing_featuringType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Redefines: []string{"Relationship::target"}}, + {Name: "owningFeatureOfType", DefiningClass: "TypeFeaturing", IRI: "https://www.omg.org/spec/SysML#TypeFeaturing_owningFeatureOfType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Derived: true, Subsets: []string{"Relationship::owningRelatedElement", "TypeFeaturing::featureOfType"}, Opposite: "Feature::ownedTypeFeaturing"}, + {Name: "differencingType", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_differencingType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Many: true, Ordered: true, Derived: true}, + {Name: "directedFeature", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_directedFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true, Ordered: true, Derived: true, Subsets: []string{"Type::feature"}}, + {Name: "endFeature", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_endFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true, Ordered: true, Derived: true, Subsets: []string{"Type::feature"}}, + {Name: "feature", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_feature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true, Ordered: true, Derived: true, Subsets: []string{"Namespace::member"}}, + {Name: "featureMembership", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_featureMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FeatureMembership", Many: true, Ordered: true, Derived: true}, + {Name: "inheritedFeature", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_inheritedFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true, Ordered: true, Derived: true, Subsets: []string{"Type::feature"}}, + {Name: "inheritedMembership", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_inheritedMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Membership", Many: true, Ordered: true, Derived: true, Subsets: []string{"Namespace::membership"}}, + {Name: "input", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_input", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true, Ordered: true, Derived: true, Subsets: []string{"Type::directedFeature"}}, + {Name: "intersectingType", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_intersectingType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Many: true, Ordered: true, Derived: true}, {Name: "isAbstract", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_isAbstract", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "isConjugated", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_isConjugated", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, + {Name: "isConjugated", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_isConjugated", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean", Derived: true}, {Name: "isSufficient", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_isSufficient", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "multiplicity", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_multiplicity", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Multiplicity"}, - {Name: "output", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_output", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true}, - {Name: "ownedConjugator", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedConjugator", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Conjugation"}, - {Name: "ownedDifferencing", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedDifferencing", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Differencing", Many: true}, - {Name: "ownedDisjoining", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedDisjoining", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Disjoining", Many: true}, - {Name: "ownedEndFeature", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedEndFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true}, - {Name: "ownedFeature", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true}, - {Name: "ownedFeatureMembership", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedFeatureMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FeatureMembership", Many: true}, - {Name: "ownedIntersecting", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedIntersecting", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Intersecting", Many: true}, - {Name: "ownedSpecialization", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedSpecialization", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Specialization", Many: true}, - {Name: "ownedUnioning", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedUnioning", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Unioning", Many: true}, - {Name: "unioningType", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_unioningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Many: true}, - {Name: "typeUnioned", DefiningClass: "Unioning", IRI: "https://www.omg.org/spec/SysML#Unioning_typeUnioned", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "unioningType", DefiningClass: "Unioning", IRI: "https://www.omg.org/spec/SysML#Unioning_unioningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type"}, - {Name: "definition", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_definition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Classifier", Many: true}, - {Name: "directedUsage", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_directedUsage", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true}, - {Name: "isReference", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_isReference", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, + {Name: "multiplicity", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_multiplicity", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Multiplicity", Derived: true, Subsets: []string{"Namespace::ownedMember"}}, + {Name: "output", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_output", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true, Ordered: true, Derived: true, Subsets: []string{"Type::directedFeature"}}, + {Name: "ownedConjugator", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedConjugator", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Conjugation", Derived: true, Subsets: []string{"Element::ownedRelationship"}, Opposite: "Conjugation::owningType"}, + {Name: "ownedDifferencing", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedDifferencing", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Differencing", Many: true, Ordered: true, Derived: true, Subsets: []string{"Element::ownedRelationship"}, Opposite: "Differencing::typeDifferenced"}, + {Name: "ownedDisjoining", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedDisjoining", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Disjoining", Many: true, Derived: true, Subsets: []string{"Element::ownedRelationship"}, Opposite: "Disjoining::owningType"}, + {Name: "ownedEndFeature", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedEndFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true, Ordered: true, Derived: true, Subsets: []string{"Type::endFeature", "Type::ownedFeature"}, Opposite: "Feature::endOwningType"}, + {Name: "ownedFeature", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedFeature", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Feature", Many: true, Ordered: true, Derived: true, Subsets: []string{"Namespace::ownedMember"}, Opposite: "Feature::owningType"}, + {Name: "ownedFeatureMembership", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedFeatureMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FeatureMembership", Many: true, Ordered: true, Derived: true, Subsets: []string{"Namespace::ownedMembership", "Type::featureMembership"}, Opposite: "FeatureMembership::owningType"}, + {Name: "ownedIntersecting", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedIntersecting", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Intersecting", Many: true, Ordered: true, Derived: true, Subsets: []string{"Element::ownedRelationship"}, Opposite: "Intersecting::typeIntersected"}, + {Name: "ownedSpecialization", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedSpecialization", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Specialization", Many: true, Ordered: true, Derived: true, Subsets: []string{"Element::ownedRelationship"}, Opposite: "Specialization::owningType"}, + {Name: "ownedUnioning", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_ownedUnioning", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Unioning", Many: true, Ordered: true, Derived: true, Subsets: []string{"Element::ownedRelationship"}, Opposite: "Unioning::typeUnioned"}, + {Name: "unioningType", DefiningClass: "Type", IRI: "https://www.omg.org/spec/SysML#Type_unioningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Many: true, Ordered: true, Derived: true}, + {Name: "typeUnioned", DefiningClass: "Unioning", IRI: "https://www.omg.org/spec/SysML#Unioning_typeUnioned", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Derived: true, Redefines: []string{"Relationship::source"}, Subsets: []string{"Relationship::owningRelatedElement"}, Opposite: "Type::ownedUnioning"}, + {Name: "unioningType", DefiningClass: "Unioning", IRI: "https://www.omg.org/spec/SysML#Unioning_unioningType", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Type", Redefines: []string{"Relationship::target"}}, + {Name: "definition", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_definition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Classifier", Many: true, Ordered: true, Derived: true, Redefines: []string{"Feature::type"}}, + {Name: "directedUsage", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_directedUsage", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Type::directedFeature", "Usage::usage"}}, + {Name: "isReference", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_isReference", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean", Derived: true}, {Name: "isVariation", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_isVariation", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, - {Name: "nestedAction", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Many: true}, - {Name: "nestedAllocation", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedAllocation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AllocationUsage", Many: true}, - {Name: "nestedAnalysisCase", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedAnalysisCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AnalysisCaseUsage", Many: true}, - {Name: "nestedAttribute", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedAttribute", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AttributeUsage", Many: true}, - {Name: "nestedCalculation", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedCalculation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#CalculationUsage", Many: true}, - {Name: "nestedCase", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#CaseUsage", Many: true}, - {Name: "nestedConcern", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedConcern", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConcernUsage", Many: true}, - {Name: "nestedConnection", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedConnection", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConnectorAsUsage", Many: true}, - {Name: "nestedConstraint", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage", Many: true}, - {Name: "nestedEnumeration", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedEnumeration", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#EnumerationUsage", Many: true}, - {Name: "nestedFlow", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedFlow", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FlowConnectionUsage", Many: true}, - {Name: "nestedInterface", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedInterface", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#InterfaceUsage", Many: true}, - {Name: "nestedItem", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedItem", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ItemUsage", Many: true}, - {Name: "nestedMetadata", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedMetadata", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#MetadataUsage", Many: true}, - {Name: "nestedOccurrence", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedOccurrence", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#OccurrenceUsage", Many: true}, - {Name: "nestedPart", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedPart", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true}, - {Name: "nestedPort", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedPort", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PortUsage", Many: true}, - {Name: "nestedReference", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedReference", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ReferenceUsage", Many: true}, - {Name: "nestedRendering", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedRendering", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RenderingUsage", Many: true}, - {Name: "nestedRequirement", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage", Many: true}, - {Name: "nestedState", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedState", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#StateUsage", Many: true}, - {Name: "nestedTransition", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedTransition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#TransitionUsage", Many: true}, - {Name: "nestedUsage", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedUsage", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true}, - {Name: "nestedUseCase", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedUseCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#UseCaseUsage", Many: true}, - {Name: "nestedVerificationCase", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedVerificationCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#VerificationCaseUsage", Many: true}, - {Name: "nestedView", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedView", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewUsage", Many: true}, - {Name: "nestedViewpoint", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedViewpoint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewpointUsage", Many: true}, - {Name: "owningDefinition", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_owningDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Definition"}, - {Name: "owningUsage", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_owningUsage", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage"}, - {Name: "usage", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_usage", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true}, - {Name: "variant", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_variant", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true}, - {Name: "variantMembership", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_variantMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#VariantMembership", Many: true}, - {Name: "includedUseCase", DefiningClass: "UseCaseDefinition", IRI: "https://www.omg.org/spec/SysML#UseCaseDefinition_includedUseCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#UseCaseUsage", Many: true}, - {Name: "includedUseCase", DefiningClass: "UseCaseUsage", IRI: "https://www.omg.org/spec/SysML#UseCaseUsage_includedUseCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#UseCaseUsage", Many: true}, - {Name: "useCaseDefinition", DefiningClass: "UseCaseUsage", IRI: "https://www.omg.org/spec/SysML#UseCaseUsage_useCaseDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#UseCaseDefinition"}, - {Name: "ownedVariantUsage", DefiningClass: "VariantMembership", IRI: "https://www.omg.org/spec/SysML#VariantMembership_ownedVariantUsage", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage"}, - {Name: "verifiedRequirement", DefiningClass: "VerificationCaseDefinition", IRI: "https://www.omg.org/spec/SysML#VerificationCaseDefinition_verifiedRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage", Many: true}, - {Name: "verificationCaseDefinition", DefiningClass: "VerificationCaseUsage", IRI: "https://www.omg.org/spec/SysML#VerificationCaseUsage_verificationCaseDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#VerificationCaseDefinition"}, - {Name: "verifiedRequirement", DefiningClass: "VerificationCaseUsage", IRI: "https://www.omg.org/spec/SysML#VerificationCaseUsage_verifiedRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage", Many: true}, - {Name: "satisfiedViewpoint", DefiningClass: "ViewDefinition", IRI: "https://www.omg.org/spec/SysML#ViewDefinition_satisfiedViewpoint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewpointUsage", Many: true}, - {Name: "view", DefiningClass: "ViewDefinition", IRI: "https://www.omg.org/spec/SysML#ViewDefinition_view", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewUsage", Many: true}, - {Name: "viewCondition", DefiningClass: "ViewDefinition", IRI: "https://www.omg.org/spec/SysML#ViewDefinition_viewCondition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Many: true}, - {Name: "viewRendering", DefiningClass: "ViewDefinition", IRI: "https://www.omg.org/spec/SysML#ViewDefinition_viewRendering", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RenderingUsage"}, - {Name: "ownedRendering", DefiningClass: "ViewRenderingMembership", IRI: "https://www.omg.org/spec/SysML#ViewRenderingMembership_ownedRendering", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RenderingUsage"}, - {Name: "referencedRendering", DefiningClass: "ViewRenderingMembership", IRI: "https://www.omg.org/spec/SysML#ViewRenderingMembership_referencedRendering", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RenderingUsage"}, - {Name: "exposedElement", DefiningClass: "ViewUsage", IRI: "https://www.omg.org/spec/SysML#ViewUsage_exposedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true}, - {Name: "satisfiedViewpoint", DefiningClass: "ViewUsage", IRI: "https://www.omg.org/spec/SysML#ViewUsage_satisfiedViewpoint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewpointUsage", Many: true}, - {Name: "viewCondition", DefiningClass: "ViewUsage", IRI: "https://www.omg.org/spec/SysML#ViewUsage_viewCondition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Many: true}, - {Name: "viewDefinition", DefiningClass: "ViewUsage", IRI: "https://www.omg.org/spec/SysML#ViewUsage_viewDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewDefinition"}, - {Name: "viewRendering", DefiningClass: "ViewUsage", IRI: "https://www.omg.org/spec/SysML#ViewUsage_viewRendering", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RenderingUsage"}, - {Name: "viewpointStakeholder", DefiningClass: "ViewpointDefinition", IRI: "https://www.omg.org/spec/SysML#ViewpointDefinition_viewpointStakeholder", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true}, - {Name: "viewpointDefinition", DefiningClass: "ViewpointUsage", IRI: "https://www.omg.org/spec/SysML#ViewpointUsage_viewpointDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewpointDefinition"}, - {Name: "viewpointStakeholder", DefiningClass: "ViewpointUsage", IRI: "https://www.omg.org/spec/SysML#ViewpointUsage_viewpointStakeholder", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true}, - {Name: "untilArgument", DefiningClass: "WhileLoopActionUsage", IRI: "https://www.omg.org/spec/SysML#WhileLoopActionUsage_untilArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, - {Name: "whileArgument", DefiningClass: "WhileLoopActionUsage", IRI: "https://www.omg.org/spec/SysML#WhileLoopActionUsage_whileArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression"}, + {Name: "mayTimeVary", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_mayTimeVary", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean", Derived: true, Redefines: []string{"Feature::isVariable"}}, + {Name: "nestedAction", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedAction", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ActionUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedOccurrence"}}, + {Name: "nestedAllocation", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedAllocation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AllocationUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedConnection"}}, + {Name: "nestedAnalysisCase", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedAnalysisCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AnalysisCaseUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedCase"}}, + {Name: "nestedAttribute", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedAttribute", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#AttributeUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedUsage"}}, + {Name: "nestedCalculation", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedCalculation", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#CalculationUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedAction"}}, + {Name: "nestedCase", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#CaseUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedCalculation"}}, + {Name: "nestedConcern", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedConcern", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConcernUsage", Many: true, Derived: true, Subsets: []string{"Usage::nestedRequirement"}}, + {Name: "nestedConnection", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedConnection", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConnectorAsUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedUsage"}}, + {Name: "nestedConstraint", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedConstraint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ConstraintUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedOccurrence"}}, + {Name: "nestedEnumeration", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedEnumeration", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#EnumerationUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedAttribute"}}, + {Name: "nestedFlow", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedFlow", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#FlowUsage", Many: true, Derived: true, Subsets: []string{"Usage::nestedConnection"}}, + {Name: "nestedInterface", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedInterface", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#InterfaceUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedConnection"}}, + {Name: "nestedItem", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedItem", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ItemUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedOccurrence"}}, + {Name: "nestedMetadata", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedMetadata", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#MetadataUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedItem"}}, + {Name: "nestedOccurrence", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedOccurrence", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#OccurrenceUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedUsage"}}, + {Name: "nestedPart", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedPart", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedItem"}}, + {Name: "nestedPort", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedPort", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PortUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedUsage"}}, + {Name: "nestedReference", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedReference", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ReferenceUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedUsage"}}, + {Name: "nestedRendering", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedRendering", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RenderingUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedPart"}}, + {Name: "nestedRequirement", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedConstraint"}}, + {Name: "nestedState", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedState", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#StateUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedAction"}}, + {Name: "nestedTransition", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedTransition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#TransitionUsage", Many: true, Derived: true, Subsets: []string{"Usage::nestedUsage"}}, + {Name: "nestedUsage", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedUsage", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Type::ownedFeature", "Usage::usage"}, Opposite: "Usage::owningUsage"}, + {Name: "nestedUseCase", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedUseCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#UseCaseUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedCase"}}, + {Name: "nestedVerificationCase", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedVerificationCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#VerificationCaseUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedCase"}}, + {Name: "nestedView", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedView", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedPart"}}, + {Name: "nestedViewpoint", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_nestedViewpoint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewpointUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedRequirement"}}, + {Name: "owningDefinition", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_owningDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Definition", Derived: true, Subsets: []string{"Feature::owningType"}, Opposite: "Definition::ownedUsage"}, + {Name: "owningUsage", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_owningUsage", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Derived: true, Subsets: []string{"Feature::owningType"}, Opposite: "Usage::nestedUsage"}, + {Name: "usage", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_usage", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Type::feature"}}, + {Name: "variant", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_variant", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Many: true, Derived: true, Subsets: []string{"Namespace::ownedMember"}}, + {Name: "variantMembership", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_variantMembership", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#VariantMembership", Many: true, Derived: true, Subsets: []string{"Namespace::ownedMembership"}}, + {Name: "includedUseCase", DefiningClass: "UseCaseDefinition", IRI: "https://www.omg.org/spec/SysML#UseCaseDefinition_includedUseCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#UseCaseUsage", Many: true, Ordered: true, Derived: true}, + {Name: "includedUseCase", DefiningClass: "UseCaseUsage", IRI: "https://www.omg.org/spec/SysML#UseCaseUsage_includedUseCase", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#UseCaseUsage", Many: true, Ordered: true, Derived: true}, + {Name: "useCaseDefinition", DefiningClass: "UseCaseUsage", IRI: "https://www.omg.org/spec/SysML#UseCaseUsage_useCaseDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#UseCaseDefinition", Derived: true, Redefines: []string{"CaseUsage::caseDefinition"}}, + {Name: "ownedVariantUsage", DefiningClass: "VariantMembership", IRI: "https://www.omg.org/spec/SysML#VariantMembership_ownedVariantUsage", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Usage", Derived: true, Redefines: []string{"OwningMembership::ownedMemberElement"}}, + {Name: "verifiedRequirement", DefiningClass: "VerificationCaseDefinition", IRI: "https://www.omg.org/spec/SysML#VerificationCaseDefinition_verifiedRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage", Many: true, Ordered: true, Derived: true}, + {Name: "verificationCaseDefinition", DefiningClass: "VerificationCaseUsage", IRI: "https://www.omg.org/spec/SysML#VerificationCaseUsage_verificationCaseDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#VerificationCaseDefinition", Derived: true, Subsets: []string{"CaseUsage::caseDefinition"}}, + {Name: "verifiedRequirement", DefiningClass: "VerificationCaseUsage", IRI: "https://www.omg.org/spec/SysML#VerificationCaseUsage_verifiedRequirement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RequirementUsage", Many: true, Ordered: true, Derived: true}, + {Name: "satisfiedViewpoint", DefiningClass: "ViewDefinition", IRI: "https://www.omg.org/spec/SysML#ViewDefinition_satisfiedViewpoint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewpointUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::ownedRequirement"}}, + {Name: "view", DefiningClass: "ViewDefinition", IRI: "https://www.omg.org/spec/SysML#ViewDefinition_view", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Definition::usage"}}, + {Name: "viewCondition", DefiningClass: "ViewDefinition", IRI: "https://www.omg.org/spec/SysML#ViewDefinition_viewCondition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Many: true, Ordered: true, Derived: true, Subsets: []string{"Namespace::ownedMember"}}, + {Name: "viewRendering", DefiningClass: "ViewDefinition", IRI: "https://www.omg.org/spec/SysML#ViewDefinition_viewRendering", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RenderingUsage", Derived: true}, + {Name: "ownedRendering", DefiningClass: "ViewRenderingMembership", IRI: "https://www.omg.org/spec/SysML#ViewRenderingMembership_ownedRendering", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RenderingUsage", Derived: true, Redefines: []string{"FeatureMembership::ownedMemberFeature"}}, + {Name: "referencedRendering", DefiningClass: "ViewRenderingMembership", IRI: "https://www.omg.org/spec/SysML#ViewRenderingMembership_referencedRendering", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RenderingUsage", Derived: true}, + {Name: "exposedElement", DefiningClass: "ViewUsage", IRI: "https://www.omg.org/spec/SysML#ViewUsage_exposedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true, Ordered: true, Derived: true, Subsets: []string{"Namespace::member"}}, + {Name: "satisfiedViewpoint", DefiningClass: "ViewUsage", IRI: "https://www.omg.org/spec/SysML#ViewUsage_satisfiedViewpoint", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewpointUsage", Many: true, Ordered: true, Derived: true, Subsets: []string{"Usage::nestedRequirement"}}, + {Name: "viewCondition", DefiningClass: "ViewUsage", IRI: "https://www.omg.org/spec/SysML#ViewUsage_viewCondition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Many: true, Ordered: true, Derived: true, Subsets: []string{"Namespace::ownedMember"}}, + {Name: "viewDefinition", DefiningClass: "ViewUsage", IRI: "https://www.omg.org/spec/SysML#ViewUsage_viewDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewDefinition", Derived: true, Redefines: []string{"PartUsage::partDefinition"}}, + {Name: "viewRendering", DefiningClass: "ViewUsage", IRI: "https://www.omg.org/spec/SysML#ViewUsage_viewRendering", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#RenderingUsage", Derived: true}, + {Name: "viewpointStakeholder", DefiningClass: "ViewpointDefinition", IRI: "https://www.omg.org/spec/SysML#ViewpointDefinition_viewpointStakeholder", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true, Ordered: true, Derived: true}, + {Name: "viewpointDefinition", DefiningClass: "ViewpointUsage", IRI: "https://www.omg.org/spec/SysML#ViewpointUsage_viewpointDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#ViewpointDefinition", Derived: true, Redefines: []string{"RequirementUsage::requirementDefinition"}}, + {Name: "viewpointStakeholder", DefiningClass: "ViewpointUsage", IRI: "https://www.omg.org/spec/SysML#ViewpointUsage_viewpointStakeholder", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true, Ordered: true, Derived: true}, + {Name: "untilArgument", DefiningClass: "WhileLoopActionUsage", IRI: "https://www.omg.org/spec/SysML#WhileLoopActionUsage_untilArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true}, + {Name: "whileArgument", DefiningClass: "WhileLoopActionUsage", IRI: "https://www.omg.org/spec/SysML#WhileLoopActionUsage_whileArgument", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Expression", Derived: true}, +} + +// enumerations holds every EEnum and its literals in declaration order, ordered by name. +var enumerations = []Enumeration{ + {Name: "FeatureDirectionKind", Literals: []string{"in", "inout", "out"}}, + {Name: "PortionKind", Literals: []string{"timeslice", "snapshot"}}, + {Name: "RequirementConstraintKind", Literals: []string{"assumption", "requirement"}}, + {Name: "StateSubactionKind", Literals: []string{"entry", "do", "exit"}}, + {Name: "TransitionFeatureKind", Literals: []string{"trigger", "guard", "effect"}}, + {Name: "TriggerKind", Literals: []string{"when", "at", "after"}}, + {Name: "VisibilityKind", Literals: []string{"private", "protected", "public"}}, } -// classes holds every owl:Class the ontology declares with its named -// rdfs:subClassOf parents, ordered by name. +// classes holds every EClass the metamodel declares with its eSuperTypes, ordered by name. var classes = []Class{ {Name: "AcceptActionUsage", Parents: []string{"ActionUsage"}}, {Name: "ActionDefinition", Parents: []string{"Behavior", "OccurrenceDefinition"}}, @@ -472,10 +489,12 @@ var classes = []Class{ {Name: "ConnectionDefinition", Parents: []string{"AssociationStructure", "PartDefinition"}}, {Name: "ConnectionUsage", Parents: []string{"ConnectorAsUsage", "PartUsage"}}, {Name: "Connector", Parents: []string{"Feature", "Relationship"}}, - {Name: "ConnectorAsUsage", Parents: []string{"Connector", "Usage"}}, + {Name: "ConnectorAsUsage", Abstract: true, Parents: []string{"Connector", "Usage"}}, {Name: "ConstraintDefinition", Parents: []string{"OccurrenceDefinition", "Predicate"}}, {Name: "ConstraintUsage", Parents: []string{"BooleanExpression", "OccurrenceUsage"}}, - {Name: "ControlNode", Parents: []string{"ActionUsage"}}, + {Name: "ConstructorExpression", Parents: []string{"InstantiationExpression"}}, + {Name: "ControlNode", Abstract: true, Parents: []string{"ActionUsage"}}, + {Name: "CrossSubsetting", Parents: []string{"Subsetting"}}, {Name: "DataType", Parents: []string{"Classifier"}}, {Name: "DecisionNode", Parents: []string{"ControlNode"}}, {Name: "Definition", Parents: []string{"Classifier"}}, @@ -483,54 +502,53 @@ var classes = []Class{ {Name: "Differencing", Parents: []string{"Relationship"}}, {Name: "Disjoining", Parents: []string{"Relationship"}}, {Name: "Documentation", Parents: []string{"Comment"}}, - {Name: "Element"}, + {Name: "Element", Abstract: true}, {Name: "ElementFilterMembership", Parents: []string{"OwningMembership"}}, {Name: "EndFeatureMembership", Parents: []string{"FeatureMembership"}}, {Name: "EnumerationDefinition", Parents: []string{"AttributeDefinition"}}, {Name: "EnumerationUsage", Parents: []string{"AttributeUsage"}}, {Name: "EventOccurrenceUsage", Parents: []string{"OccurrenceUsage"}}, {Name: "ExhibitStateUsage", Parents: []string{"PerformActionUsage", "StateUsage"}}, - {Name: "Expose", Parents: []string{"Import"}}, + {Name: "Expose", Abstract: true, Parents: []string{"Import"}}, {Name: "Expression", Parents: []string{"Step"}}, {Name: "Feature", Parents: []string{"Type"}}, {Name: "FeatureChainExpression", Parents: []string{"OperatorExpression"}}, {Name: "FeatureChaining", Parents: []string{"Relationship"}}, {Name: "FeatureInverting", Parents: []string{"Relationship"}}, - {Name: "FeatureMembership", Parents: []string{"Featuring", "OwningMembership"}}, + {Name: "FeatureMembership", Parents: []string{"OwningMembership"}}, {Name: "FeatureReferenceExpression", Parents: []string{"Expression"}}, {Name: "FeatureTyping", Parents: []string{"Specialization"}}, {Name: "FeatureValue", Parents: []string{"OwningMembership"}}, - {Name: "Featuring", Parents: []string{"Relationship"}}, - {Name: "FlowConnectionDefinition", Parents: []string{"ActionDefinition", "ConnectionDefinition", "Interaction"}}, - {Name: "FlowConnectionUsage", Parents: []string{"ActionUsage", "ConnectionUsage", "ItemFlow"}}, + {Name: "Flow", Parents: []string{"Connector", "Step"}}, + {Name: "FlowDefinition", Parents: []string{"ActionDefinition", "Interaction"}}, + {Name: "FlowEnd", Parents: []string{"Feature"}}, + {Name: "FlowUsage", Parents: []string{"ActionUsage", "ConnectorAsUsage", "Flow"}}, {Name: "ForLoopActionUsage", Parents: []string{"LoopActionUsage"}}, {Name: "ForkNode", Parents: []string{"ControlNode"}}, {Name: "FramedConcernMembership", Parents: []string{"RequirementConstraintMembership"}}, {Name: "Function", Parents: []string{"Behavior"}}, {Name: "IfActionUsage", Parents: []string{"ActionUsage"}}, - {Name: "Import", Parents: []string{"Relationship"}}, + {Name: "Import", Abstract: true, Parents: []string{"Relationship"}}, {Name: "IncludeUseCaseUsage", Parents: []string{"PerformActionUsage", "UseCaseUsage"}}, + {Name: "IndexExpression", Parents: []string{"OperatorExpression"}}, + {Name: "InstantiationExpression", Abstract: true, Parents: []string{"Expression"}}, {Name: "Interaction", Parents: []string{"Association", "Behavior"}}, {Name: "InterfaceDefinition", Parents: []string{"ConnectionDefinition"}}, {Name: "InterfaceUsage", Parents: []string{"ConnectionUsage"}}, {Name: "Intersecting", Parents: []string{"Relationship"}}, {Name: "Invariant", Parents: []string{"BooleanExpression"}}, - {Name: "InvocationExpression", Parents: []string{"Expression"}}, + {Name: "InvocationExpression", Parents: []string{"InstantiationExpression"}}, {Name: "ItemDefinition", Parents: []string{"OccurrenceDefinition", "Structure"}}, - {Name: "ItemFeature", Parents: []string{"Feature"}}, - {Name: "ItemFlow", Parents: []string{"Connector", "Step"}}, - {Name: "ItemFlowEnd", Parents: []string{"Feature"}}, {Name: "ItemUsage", Parents: []string{"OccurrenceUsage"}}, {Name: "JoinNode", Parents: []string{"ControlNode"}}, {Name: "LibraryPackage", Parents: []string{"Package"}}, - {Name: "LifeClass", Parents: []string{"Class"}}, {Name: "LiteralBoolean", Parents: []string{"LiteralExpression"}}, {Name: "LiteralExpression", Parents: []string{"Expression"}}, {Name: "LiteralInfinity", Parents: []string{"LiteralExpression"}}, {Name: "LiteralInteger", Parents: []string{"LiteralExpression"}}, {Name: "LiteralRational", Parents: []string{"LiteralExpression"}}, {Name: "LiteralString", Parents: []string{"LiteralExpression"}}, - {Name: "LoopActionUsage", Parents: []string{"ActionUsage"}}, + {Name: "LoopActionUsage", Abstract: true, Parents: []string{"ActionUsage"}}, {Name: "Membership", Parents: []string{"Relationship"}}, {Name: "MembershipExpose", Parents: []string{"Expose", "MembershipImport"}}, {Name: "MembershipImport", Parents: []string{"Import"}}, @@ -555,6 +573,7 @@ var classes = []Class{ {Name: "ParameterMembership", Parents: []string{"FeatureMembership"}}, {Name: "PartDefinition", Parents: []string{"ItemDefinition"}}, {Name: "PartUsage", Parents: []string{"ItemUsage"}}, + {Name: "PayloadFeature", Parents: []string{"Feature"}}, {Name: "PerformActionUsage", Parents: []string{"ActionUsage", "EventOccurrenceUsage"}}, {Name: "PortConjugation", Parents: []string{"Conjugation"}}, {Name: "PortDefinition", Parents: []string{"OccurrenceDefinition", "Structure"}}, @@ -563,7 +582,7 @@ var classes = []Class{ {Name: "Redefinition", Parents: []string{"Subsetting"}}, {Name: "ReferenceSubsetting", Parents: []string{"Subsetting"}}, {Name: "ReferenceUsage", Parents: []string{"Usage"}}, - {Name: "Relationship", Parents: []string{"Element"}}, + {Name: "Relationship", Abstract: true, Parents: []string{"Element"}}, {Name: "RenderingDefinition", Parents: []string{"PartDefinition"}}, {Name: "RenderingUsage", Parents: []string{"PartUsage"}}, {Name: "RequirementConstraintMembership", Parents: []string{"FeatureMembership"}}, @@ -587,14 +606,15 @@ var classes = []Class{ {Name: "Subsetting", Parents: []string{"Specialization"}}, {Name: "Succession", Parents: []string{"Connector"}}, {Name: "SuccessionAsUsage", Parents: []string{"ConnectorAsUsage", "Succession"}}, - {Name: "SuccessionFlowConnectionUsage", Parents: []string{"FlowConnectionUsage", "SuccessionItemFlow"}}, - {Name: "SuccessionItemFlow", Parents: []string{"ItemFlow", "Succession"}}, + {Name: "SuccessionFlow", Parents: []string{"Flow", "Succession"}}, + {Name: "SuccessionFlowUsage", Parents: []string{"FlowUsage", "SuccessionFlow"}}, + {Name: "TerminateActionUsage", Parents: []string{"ActionUsage"}}, {Name: "TextualRepresentation", Parents: []string{"AnnotatingElement"}}, {Name: "TransitionFeatureMembership", Parents: []string{"FeatureMembership"}}, {Name: "TransitionUsage", Parents: []string{"ActionUsage"}}, {Name: "TriggerInvocationExpression", Parents: []string{"InvocationExpression"}}, {Name: "Type", Parents: []string{"Namespace"}}, - {Name: "TypeFeaturing", Parents: []string{"Featuring"}}, + {Name: "TypeFeaturing", Parents: []string{"Relationship"}}, {Name: "Unioning", Parents: []string{"Relationship"}}, {Name: "Usage", Parents: []string{"Feature"}}, {Name: "UseCaseDefinition", Parents: []string{"CaseDefinition"}}, diff --git a/internal/translate/rdf/ontology/validate.go b/internal/translate/rdf/ontology/validate.go index 67d69bf699..16efc3d28b 100644 --- a/internal/translate/rdf/ontology/validate.go +++ b/internal/translate/rdf/ontology/validate.go @@ -13,6 +13,9 @@ type ViolationKind string const ( // UnknownClass is an rdf:type the ontology declares no owl:Class for. UnknownClass ViolationKind = "unknown-class" + // AbstractClass is an rdf:type the metamodel declares abstract, which no + // element instantiates directly. + AbstractClass ViolationKind = "abstract-class" // UntypedSubject carries SysML properties with no rdf:type, which leaves // their domain uncheckable. UntypedSubject ViolationKind = "untyped-subject" @@ -57,8 +60,7 @@ const missing = "-" // Check reports every way the triples of g disagree with the ontology. Only // SysML-namespace predicates are checked; the RDF vocabulary and this tool's own -// extension namespace are out of the ontology's scope. The ontology records no -// abstractness, so an abstract metaclass is not a violation here. +// extension namespace are out of the ontology's scope. func Check(g *rdf.Graph) []Violation { var out []Violation hasSysMLProperty := make(map[rdf.Term]bool) @@ -68,8 +70,10 @@ func Check(g *rdf.Graph) []Violation { } } declared := make(map[rdf.Term]bool) + types := make(map[rdf.Term]string) for _, subject := range g.Subjects() { - typeIRI := g.Type(subject) + typeIRI := subjectType(g, subject) + types[subject] = typeIRI if typeIRI == "" { if hasSysMLProperty[subject] { out = append(out, Violation{ @@ -79,8 +83,14 @@ func Check(g *rdf.Graph) []Violation { } continue } - if _, ok := LookupClass(classNameOf(typeIRI)); ok { + if class, ok := LookupClass(classNameOf(typeIRI)); ok { declared[subject] = true + if class.Abstract { + out = append(out, Violation{ + Kind: AbstractClass, Class: class.Name, Property: missing, Subject: subject.Value, + Detail: fmt.Sprintf("rdf:type %s is abstract in the metamodel", typeIRI), + }) + } continue } out = append(out, Violation{ @@ -92,7 +102,7 @@ func Check(g *rdf.Graph) []Violation { if !strings.HasPrefix(triple.Predicate.Value, rdf.SysML) { continue } - class := classNameOf(g.Type(triple.Subject)) + class := classNameOf(types[triple.Subject]) if class == "" { continue // already reported as an untyped subject } @@ -158,6 +168,47 @@ func objectMatchesKind(kind PropertyKind, object rdf.Term) bool { // classNameOf returns the local name of an rdf:type IRI, or "" when there is // none. An IRI outside the SysML namespace is kept whole, to stay recognizable. +// MostSpecific picks the class IRI among those stated that every other is a +// superclass of, reporting false when there is none. +func MostSpecific(classIRIs []string) (string, bool) { + for _, class := range classIRIs { + specific := true + for _, other := range classIRIs { + if !subclassOf(class, other) { + specific = false + break + } + } + if specific { + return class, true + } + } + return "", false +} + +// subclassOf reports whether the class iri is ancestor or a subclass of it in +// the SysML ontology; a class outside the SysML namespace has no superclass. +func subclassOf(class, ancestor string) bool { + return class == ancestor || strings.HasPrefix(class, rdf.SysML) && strings.HasPrefix(ancestor, rdf.SysML) && + IsAncestorOrSelf(rdf.LocalName(class), rdf.LocalName(ancestor)) +} + +// subjectType returns the class subject is read as: its most specific stated +// rdf:type, or the first one when the stated types are unrelated. +func subjectType(g *rdf.Graph, subject rdf.Term) string { + var stated []string + for _, object := range g.Objects(subject, rdf.RDFType) { + stated = append(stated, object.Value) + } + if len(stated) == 0 { + return "" + } + if class, ok := MostSpecific(stated); ok { + return class + } + return stated[0] +} + func classNameOf(typeIRI string) string { if typeIRI == "" { return "" diff --git a/internal/translate/rdf/term.go b/internal/translate/rdf/term.go index 5c99fd8612..ba67fd9016 100644 --- a/internal/translate/rdf/term.go +++ b/internal/translate/rdf/term.go @@ -11,6 +11,7 @@ package rdf import ( "fmt" + "hash/maphash" "strings" ) @@ -105,24 +106,119 @@ type Graph struct { // index groups statements by subject. It is built on the first lookup and // kept current as triples are added. index map[Term]*subjectIndex + // subjectOrder caches distinct subjects in insertion order once requested. + subjectOrder []Term + subjectSet map[string]struct{} + subjectsReady bool +} + +// GraphBuilder collects triples without building the graph's lookup indexes. +type GraphBuilder struct { + triples []Triple + prefixes map[string]string } // subjectIndex holds one subject's statements, keeping predicates in insertion // order so serialization stays stable. type subjectIndex struct { predicates []string - objects map[string][]Term + objects map[string][]int } // NewGraph returns an empty graph carrying the SysML prefix bindings. func NewGraph() *Graph { - g := &Graph{seen: make(map[Triple]bool), Prefixes: make(map[string]string)} + return NewGraphWithCapacity(0) +} + +// NewGraphWithCapacity returns an empty graph with space for capacity triples. +func NewGraphWithCapacity(capacity int) *Graph { + g := &Graph{ + triples: make([]Triple, 0, capacity), + seen: make(map[Triple]bool, capacity), + Prefixes: make(map[string]string), + } for prefix, ns := range DefaultPrefixes { g.Prefixes[prefix] = ns } return g } +// NewGraphBuilder returns a bulk graph builder with space for capacity triples. +func NewGraphBuilder(capacity int) *GraphBuilder { + prefixes := make(map[string]string, len(DefaultPrefixes)) + for prefix, ns := range DefaultPrefixes { + prefixes[prefix] = ns + } + return &GraphBuilder{triples: make([]Triple, 0, capacity), prefixes: prefixes} +} + +// SetPrefix sets a namespace binding on the graph being built. +func (b *GraphBuilder) SetPrefix(prefix, namespace string) { + b.prefixes[prefix] = namespace +} + +// Add appends a triple to the builder. +func (b *GraphBuilder) Add(subject, predicate, object Term) { + b.AddTriple(Triple{Subject: subject, Predicate: predicate, Object: object}) +} + +// AddTriple appends a triple to the builder. +func (b *GraphBuilder) AddTriple(triple Triple) { + b.triples = append(b.triples, triple) +} + +// Build returns a graph with duplicate triples removed in insertion order. +func (b *GraphBuilder) Build() *Graph { + seed := maphash.MakeSeed() + seen := make(map[uint64]int, len(b.triples)) + var collisions map[uint64][]int + triples := b.triples[:0] + for _, triple := range b.triples { + hash := tripleHash(triple, seed) + if first, exists := seen[hash]; exists { + duplicate := triples[first] == triple + if !duplicate { + for _, index := range collisions[hash] { + if triples[index] == triple { + duplicate = true + break + } + } + } + if duplicate { + continue + } + if collisions == nil { + collisions = make(map[uint64][]int) + } + collisions[hash] = append(collisions[hash], len(triples)) + } else { + seen[hash] = len(triples) + } + triples = append(triples, triple) + } + b.triples = nil + return NewGraphOf(triples, b.prefixes) +} + +func tripleHash(triple Triple, seed maphash.Seed) uint64 { + var hash maphash.Hash + hash.SetSeed(seed) + write := func(term Term) { + _ = hash.WriteByte(byte(term.Kind)) + _, _ = hash.WriteString(term.Value) + _ = hash.WriteByte(0) + _, _ = hash.WriteString(term.Datatype) + _ = hash.WriteByte(0) + _, _ = hash.WriteString(term.Lang) + _ = hash.WriteByte(0xff) + } + write(triple.Subject) + write(triple.Predicate) + write(triple.Object) + return hash.Sum64() +} + // NewGraphOf returns a graph holding triples, in order, with prefixes. The // triples must be distinct: the set that drops duplicates is built only when a // triple is added or looked up, so a graph assembled from a known-distinct list @@ -153,27 +249,48 @@ func (g *Graph) Add(subject, predicate, object Term) { // AddTriple appends t unless the graph already contains it. func (g *Graph) AddTriple(t Triple) { - seen := g.set() - if seen[t] { - return + if g.seen != nil { + if g.seen[t] { + return + } + g.seen[t] = true + } else if g.index != nil { + if si := g.index[t.Subject]; si != nil { + for _, index := range si.objects[t.Predicate.Value] { + if g.triples[index].Object == t.Object { + return + } + } + } + } else { + seen := g.set() + if seen[t] { + return + } + seen[t] = true } - seen[t] = true g.triples = append(g.triples, t) + if g.subjectsReady { + if _, exists := g.subjectSet[t.Subject.Value]; !exists { + g.subjectSet[t.Subject.Value] = struct{}{} + g.subjectOrder = append(g.subjectOrder, t.Subject) + } + } if g.index != nil { - g.index[t.Subject] = indexTriple(g.index[t.Subject], t) + g.index[t.Subject] = indexTriple(g.index[t.Subject], t, len(g.triples)-1) } } // indexTriple records t under its subject's index entry, creating the entry // when si is nil. -func indexTriple(si *subjectIndex, t Triple) *subjectIndex { +func indexTriple(si *subjectIndex, t Triple, index int) *subjectIndex { if si == nil { - si = &subjectIndex{objects: make(map[string][]Term)} + si = &subjectIndex{objects: make(map[string][]int)} } - if _, seen := si.objects[t.Predicate.Value]; !seen { + if len(si.objects[t.Predicate.Value]) == 0 { si.predicates = append(si.predicates, t.Predicate.Value) } - si.objects[t.Predicate.Value] = append(si.objects[t.Predicate.Value], t.Object) + si.objects[t.Predicate.Value] = append(si.objects[t.Predicate.Value], index) return si } @@ -185,8 +302,8 @@ func (g *Graph) subjects() map[Term]*subjectIndex { return g.index } g.index = make(map[Term]*subjectIndex) - for _, t := range g.triples { - g.index[t.Subject] = indexTriple(g.index[t.Subject], t) + for i, t := range g.triples { + g.index[t.Subject] = indexTriple(g.index[t.Subject], t, i) } return g.index } @@ -196,22 +313,158 @@ func (g *Graph) subjects() map[Term]*subjectIndex { func (g *Graph) Triples() []Triple { return g.triples } // Has reports whether the graph contains t. -func (g *Graph) Has(t Triple) bool { return g.set()[t] } +func (g *Graph) Has(t Triple) bool { + if g.seen != nil { + return g.seen[t] + } + if g.index != nil { + si := g.index[t.Subject] + if si == nil { + return false + } + for _, index := range si.objects[t.Predicate.Value] { + if g.triples[index].Object == t.Object { + return true + } + } + return false + } + si := g.subjects()[t.Subject] + if si == nil { + return false + } + for _, index := range si.objects[t.Predicate.Value] { + if g.triples[index].Object == t.Object { + return true + } + } + return false +} + +// Compact releases duplicate detection and excess triple storage. +func (g *Graph) Compact() { + g.seen = nil + if cap(g.triples)-len(g.triples) > len(g.triples)/2 { + g.triples = append([]Triple(nil), g.triples...) + } +} + +// RewriteTriples rewrites the graph in order, removing triples the callback +// declines. Graph lookups during the rewrite see the original statements. +func (g *Graph) RewriteTriples(rewrite func(*Triple) bool) { + if g.index == nil { + g.subjects() + } + triples := g.triples + keep := make([]bool, len(triples)) + type update struct { + index int + triple Triple + } + var updates []update + removed := false + changed := false + for i := range triples { + triple := triples[i] + if !rewrite(&triple) { + removed = true + continue + } + keep[i] = true + if triple != triples[i] { + changed = true + updates = append(updates, update{index: i, triple: triple}) + } + } + if !removed && !changed { + return + } + retained := triples[:0] + nextUpdate := 0 + for i, triple := range triples { + if !keep[i] { + continue + } + if nextUpdate < len(updates) && updates[nextUpdate].index == i { + triple = updates[nextUpdate].triple + nextUpdate++ + } + retained = append(retained, triple) + } + seen := g.seen + if seen != nil { + clear(seen) + } + unique := retained + if seen != nil || changed { + if seen == nil { + seen = make(map[Triple]bool, len(retained)) + } + unique = retained[:0] + for _, triple := range retained { + if seen[triple] { + continue + } + seen[triple] = true + unique = append(unique, triple) + } + } + g.triples = unique + g.seen = nil + for _, index := range g.index { + for predicate, objects := range index.objects { + index.objects[predicate] = objects[:0] + } + index.predicates = index.predicates[:0] + } + for i, triple := range unique { + g.index[triple.Subject] = indexTriple(g.index[triple.Subject], triple, i) + } + for subject, index := range g.index { + for predicate, objects := range index.objects { + if len(objects) == 0 { + delete(index.objects, predicate) + } + } + if len(index.predicates) == 0 { + delete(g.index, subject) + } + } + g.subjectOrder = g.subjectOrder[:0] + if g.subjectSet == nil { + g.subjectSet = make(map[string]struct{}, len(unique)) + } else { + clear(g.subjectSet) + } + for _, triple := range unique { + if _, exists := g.subjectSet[triple.Subject.Value]; exists { + continue + } + g.subjectSet[triple.Subject.Value] = struct{}{} + g.subjectOrder = append(g.subjectOrder, triple.Subject) + } + g.subjectsReady = true +} // Len returns the number of triples. func (g *Graph) Len() int { return len(g.triples) } // Subjects returns every distinct subject IRI in insertion order. func (g *Graph) Subjects() []Term { - var out []Term - seen := make(map[string]bool) - for _, t := range g.triples { - if seen[t.Subject.Value] { - continue + if !g.subjectsReady { + g.subjectOrder = make([]Term, 0) + g.subjectSet = make(map[string]struct{}) + for _, t := range g.triples { + if _, exists := g.subjectSet[t.Subject.Value]; exists { + continue + } + g.subjectSet[t.Subject.Value] = struct{}{} + g.subjectOrder = append(g.subjectOrder, t.Subject) } - seen[t.Subject.Value] = true - out = append(out, t.Subject) + g.subjectsReady = true } + out := make([]Term, len(g.subjectOrder)) + copy(out, g.subjectOrder) return out } @@ -239,7 +492,9 @@ func (g *Graph) Objects(subject Term, predicate string) []Term { } // Copied so a caller appending to the result cannot reach into the index. out := make([]Term, len(found)) - copy(out, found) + for i, index := range found { + out[i] = g.triples[index].Object + } return out } @@ -251,7 +506,7 @@ func (g *Graph) Object(subject Term, predicate string) (Term, bool) { return Term{}, false } if found := si.objects[predicate]; len(found) > 0 { - return found[0], true + return g.triples[found[0]].Object, true } return Term{}, false } diff --git a/internal/translate/rdf/turtle_write.go b/internal/translate/rdf/turtle_write.go index 580689a716..3f4fad3c75 100644 --- a/internal/translate/rdf/turtle_write.go +++ b/internal/translate/rdf/turtle_write.go @@ -50,8 +50,8 @@ func writeSubject(b *strings.Builder, g *Graph, subject Term) { }) for i, predicate := range predicates { objects := make([]string, 0, len(byPredicate[predicate])) - for _, object := range byPredicate[predicate] { - objects = append(objects, g.term(object)) + for _, index := range byPredicate[predicate] { + objects = append(objects, g.term(g.triples[index].Object)) } name := g.term(IRI(predicate)) if predicate == RDFType { diff --git a/internal/workspace/model/examples_test.go b/internal/workspace/model/examples_test.go index 8474410296..3071f88824 100644 --- a/internal/workspace/model/examples_test.go +++ b/internal/workspace/model/examples_test.go @@ -12,12 +12,6 @@ import ( const examplesDir = "../../../examples" -// examplesKnownFailures records the shipped examples that are expected to -// report errors, keyed by path with the reason. README and the guide point new -// users at examples/, so an example that does not analyse cleanly is a bug -// unless it is listed here on purpose. -var examplesKnownFailures = map[string]string{} - // Every example the repository ships must analyse cleanly, so the CLI's // -validate exit status stays meaningful for the files the docs point at. func TestExamplesAnalyseCleanly(t *testing.T) { @@ -46,13 +40,7 @@ func TestExamplesAnalyseCleanly(t *testing.T) { } } - reason, known := examplesKnownFailures[rel] - switch { - case known && len(errs) == 0: - t.Errorf("listed as a known failure (%s) but analyses cleanly; remove it from examplesKnownFailures", reason) - case known: - t.Logf("known failure (%s): %s", reason, strings.Join(errs, "; ")) - case len(errs) > 0: + if len(errs) > 0 { t.Errorf("%d error(s): %s", len(errs), strings.Join(errs, "; ")) } }) diff --git a/internal/workspace/model/workspace.go b/internal/workspace/model/workspace.go index 2f0f8559fc..82fc225bc4 100644 --- a/internal/workspace/model/workspace.go +++ b/internal/workspace/model/workspace.go @@ -14,6 +14,7 @@ import ( "github.com/Open-MBEE/OpenSysML/internal/semantic/symbols" "github.com/Open-MBEE/OpenSysML/internal/syntax/ast" "github.com/Open-MBEE/OpenSysML/internal/syntax/diag" + "github.com/Open-MBEE/OpenSysML/internal/syntax/parser" "github.com/Open-MBEE/OpenSysML/internal/syntax/source" "github.com/Open-MBEE/OpenSysML/internal/workspace/libs" ) @@ -606,27 +607,7 @@ func (w *Workspace) diagnosticsLocked(name string, doc *Document) []diag.Diagnos // and the batch only, so documents can be analyzed at once; the reads returned // are that context's (the shared one's are the resolver's, see ReadsOf). func (w *Workspace) analyze(name string, doc *Document, batch *passes.Batch) ([]diag.Diagnostic, *resolve.Reads) { - parseDiags := make([]diag.Diagnostic, 0, len(doc.ParseDiagnostics)+len(doc.ParseWarnings)) - for _, pd := range doc.ParseDiagnostics { - parseDiags = append(parseDiags, diag.Diagnostic{ - Severity: diag.SeverityError, - Span: pd.Span, - Message: pd.Message, - Code: "syntax", - Source: "syntax", - Fixes: pd.Fixes, - }) - } - for _, pw := range doc.ParseWarnings { - parseDiags = append(parseDiags, diag.Diagnostic{ - Severity: diag.SeverityWarning, - Span: pw.Span, - Message: pw.Message, - Code: pw.Code, - Source: "syntax", - Fixes: pw.Fixes, - }) - } + parseDiags := parser.AsDiagnostics(doc.ParseDiagnostics, doc.ParseWarnings) if batch != nil { return passes.AnalyzeInBatch(name, source.KindOf(name), doc.AST, parseDiags, w.index, w.analysis, batch) } diff --git a/mkdocs.yml b/mkdocs.yml index 83f9b669bd..106d4f671e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -128,6 +128,7 @@ exclude_docs: | project/performance-release-0.6-vs-0.4.2.md project/performance-release-0.8-vs-0.7.0.md project/performance-release-0.9.1-vs-0.9.0.md + project/performance-release-0.9.2-vs-0.9.1.md project/satellite-network-stress-test.md project/large-model-scaling-design.md project/native-compilation.md @@ -207,6 +208,7 @@ nav: - Client libraries: reference/clients.md - Go packages: reference/api.md - Python API: reference/python-api.md + - Python metamodel classes: reference/python-metamodel.md - Node API: reference/node-api.md - Java API: reference/java-api.md - Rust API: reference/rust-api.md diff --git a/scripts/download-pilot-metamodel.sh b/scripts/download-pilot-metamodel.sh new file mode 100755 index 0000000000..aa4389d419 --- /dev/null +++ b/scripts/download-pilot-metamodel.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +# Download the OMG SysML v2 metamodel, the pilot implementation's +# org.omg.sysml/model/SysML.ecore, into build/pilot-metamodel/, for +# tools/gen/ontology, which generates internal/translate/rdf/ontology/table.go +# from it and, with -check, fails when the committed table has drifted. +# +# The metamodel is not vendored: it belongs to the OMG pilot implementation and +# is licensed there. It is pinned by scripts/pilot-pin.sh like every other pilot +# input, so the table moves with the pilot release the rest of the tree is +# measured against. The download records that pin in a .pilot-pin stamp, which +# the generator writes into the table's header, and is re-fetched when the stamp +# does not match. +set -euo pipefail + +# shellcheck source=scripts/pilot-pin.sh +. "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/pilot-pin.sh" + +repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +target="$repo_root/build/pilot-metamodel" + +PILOT_FETCH_GLOBS=('SysML.ecore') +pilot_fetch_subtrees "org.omg.sysml/model:$target" + +echo "Regenerate or check the metamodel table against it with:" +echo " go run -C tools ./gen/ontology [-check]" diff --git a/sonar-project.properties b/sonar-project.properties index 73d9563609..1f558ca6ab 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -13,11 +13,12 @@ sonar.test.inclusions=**/*_test.go,scripts/*-test.py,client/python/tests/**,clie # hand-written source; scripts/ and .github/ stay in scope on purpose. The # clients' protobuf and Connect stubs are generated by buf and guarded by a # drift check in CI, so they belong here with **/*.pb.go rather than in a -# quality profile no one can act on. The header partial is a verbatim copy of the +# quality profile no one can act on, as do the Python metamodel classes +# tools/gen/pymetamodel writes and `make python-metamodel-check` guards. The header partial is a verbatim copy of the # theme's own, kept in step by scripts/mkdocs_header_menu.py, so it is not ours to # edit either. The editors' API stubs mirror vendor signatures for compiling only # and cannot change without diverging from the vendor API. -sonar.exclusions=overrides/partials/header.html,**/*_test.go,**/testdata/**,examples/**,client/python/tests/**,**/*.pb.go,internal/translate/rdf/ontology/table.go,client/node/src/generated/**,client/python/opensysml/proto/**,client/java/opensysml-client/src/main/java/org/openmbee/opensysml/proto/**,client/java/opensysml-client/src/main/java/org/openmbee/opensysml/internal/Protos.java,client/rust/opensysml/src/proto/**,editors/cameo/openapi-stubs/**,editors/syson/syson-api-stubs/** +sonar.exclusions=overrides/partials/header.html,**/*_test.go,**/testdata/**,examples/**,client/python/tests/**,**/*.pb.go,internal/translate/rdf/ontology/table.go,client/node/src/generated/**,client/python/opensysml/proto/**,client/python/opensysml/metamodel/_generated.py,client/java/opensysml-client/src/main/java/org/openmbee/opensysml/proto/**,client/java/opensysml-client/src/main/java/org/openmbee/opensysml/internal/Protos.java,client/rust/opensysml/src/proto/**,editors/cameo/openapi-stubs/**,editors/syson/syson-api-stubs/** sonar.test.exclusions=**/testdata/**,examples/**,client/python/tests/golden/** # Each language's test job writes its report and persists it to the workspace, @@ -119,6 +120,8 @@ sonar.issue.ignore.multicriteria.tableDrivenTests.resourceKey=**/*_test.go # runner holds the plan's context because the runtime's ToolRunner interface it # implements is called from executors that carry none. The Python editor's # add_member takes one keyword per notation clause, which is its public interface. +# The built-against release tags are a sequence of candidates, one or two depending +# on the version form, not a record. sonar.issue.ignore.multicriteria.pinnedDigests.ruleKey=python:S1192 sonar.issue.ignore.multicriteria.pinnedDigests.resourceKey=client/python/opensysml/binary.py sonar.issue.ignore.multicriteria.standaloneDrivers.ruleKey=java:S1598 @@ -159,3 +162,5 @@ sonar.issue.ignore.multicriteria.toolRunnerContext.ruleKey=godre:S8242 sonar.issue.ignore.multicriteria.toolRunnerContext.resourceKey=internal/exec/analysis/tool_runner.go sonar.issue.ignore.multicriteria.keywordAuthoring.ruleKey=python:S107 sonar.issue.ignore.multicriteria.keywordAuthoring.resourceKey=client/python/opensysml/edit.py +sonar.issue.ignore.multicriteria.candidateTags.ruleKey=python:S8495 +sonar.issue.ignore.multicriteria.candidateTags.resourceKey=client/python/opensysml/binary.py diff --git a/tests/export/behavior_test.go b/tests/export/behavior_test.go index bf1ab0d452..55e09afb2c 100644 --- a/tests/export/behavior_test.go +++ b/tests/export/behavior_test.go @@ -1,6 +1,7 @@ package export_test import ( + "encoding/json" "errors" "fmt" "os" @@ -397,6 +398,242 @@ func TestFirstThenLinksItsSourceLikeASuccession(t *testing.T) { } } +// `first a then b;` is a SuccessionAsUsage owning its two ends +// (SysML-textual-bnf SuccessionAsUsage, :714-718): each a ConnectorEnd under +// an EndFeatureMembership whose ReferenceSubsetting references the feature it +// names (ConnectorEnd, :693-696), as `succession first a then b;` is. The +// source of `first start then a;` is the library's Actions::Action::start. +// The graph alone reads back as the notation, and in the API's JSON each +// succession's connectorEnd lists both ends. +func TestFirstThenOwnsItsConnectorEnds(t *testing.T) { + src := "package P {\n action def Step;\n action def A {\n action a : Step;\n action b : Step;\n" + + " first start then a;\n first a then b;\n }\n}\n" + turtle, err := convert.Convert("m.sysml", []byte(src), convert.FormatSysML, convert.FormatTurtle) + if err != nil { + t.Fatalf("to turtle: %v", err) + } + graph := string(turtle) + for _, want := range []string{ + "sysml:referencedFeature elmt:P__A__a", + "sysml:referencedFeature elmt:P__A__b", + // Actions::Action::start, by its normative id. + "sysml:referencedFeature ", + } { + if !strings.Contains(graph, want) { + t.Errorf("the graph should state %q:\n%s", want, graph) + } + } + if n := strings.Count(graph, "a sysml:EndFeatureMembership"); n != 4 { + t.Errorf("the two successions should own two ends each, found %d end memberships:\n%s", n, graph) + } + back, err := convert.Convert("m.ttl", withoutTriples(t, turtle, "sysx:sourceText"), convert.FormatTurtle, convert.FormatSysML) + if err != nil { + t.Fatalf("back to notation from the mapping alone: %v\n%s", err, turtle) + } + if string(back) != src { + t.Fatalf("the notation changed\n--- want ---\n%s\n--- got ---\n%s", src, back) + } + + doc, err := convert.Convert("m.sysml", []byte(src), convert.FormatSysML, convert.FormatAPIJSON) + if err != nil { + t.Fatalf("to api-json: %v", err) + } + var elements []map[string]any + if err := json.Unmarshal(doc, &elements); err != nil { + t.Fatal(err) + } + ids := map[string]bool{} + for _, e := range elements { + id, _ := e["@id"].(string) + ids[id] = true + } + successions := 0 + for _, e := range elements { + if e["@type"] != "SuccessionAsUsage" { + continue + } + successions++ + ends, _ := e["connectorEnd"].([]any) + if len(ends) != 2 { + t.Errorf("%v: connectorEnd %v, want two ends", e["@id"], e["connectorEnd"]) + continue + } + for _, end := range ends { + if id, _ := end.(map[string]any)["@id"].(string); !ids[id] { + t.Errorf("%v: connector end %v is not in the output", e["@id"], end) + } + } + } + if successions != 2 { + t.Errorf("want two SuccessionAsUsages, found %d", successions) + } + if _, err := convert.Convert("m.json", doc, convert.FormatAPIJSON, convert.FormatSysML); err != nil { + t.Errorf("the API JSON did not read back: %v", err) + } +} + +// A `first a then b` whose connector ends and sysml:sourceFeature/targetFeature +// name different features is refused, with or without its source text: the +// notation states each end once, so writing one would drop the other. +func TestFirstThenWithDisagreeingEndsIsRefused(t *testing.T) { + src := "package P {\n action def Step;\n action def A {\n action a : Step;\n action b : Step;\n" + + " action c : Step;\n first a then b;\n }\n}\n" + turtle, err := convert.Convert("m.sysml", []byte(src), convert.FormatSysML, convert.FormatTurtle) + if err != nil { + t.Fatalf("to turtle: %v", err) + } + const succession = "elmt:P__A___403" + // retarget rewrites b as c in the blocks whose subject edit selects. + retarget := func(graph string, edit func(subject string) bool) string { + blocks := strings.Split(graph, "\n\n") + for i, block := range blocks { + if subject, _, _ := strings.Cut(block, "\n"); edit(subject) { + block = strings.ReplaceAll(block, "elmt:P__A__b ", "elmt:P__A__c ") + blocks[i] = strings.ReplaceAll(block, `\"P__A__b\"`, `\"P__A__c\"`) + } + } + edited := strings.Join(blocks, "\n\n") + if edited == graph { + t.Fatalf("nothing was retargeted:\n%s", graph) + } + return edited + } + for _, tc := range []struct { + name string + edit func(subject string) bool + want string + }{ + {"edited end", func(subject string) bool { return strings.HasPrefix(subject, "expr:P__A___403_pend1") }, "references and its sysml:targetFeature is "}, + {"edited targetFeature", func(subject string) bool { return subject == succession }, "references and its sysml:targetFeature is "}, + } { + for _, graph := range []struct { + name string + turtle string + }{ + {"with source text", string(turtle)}, + {"graph only", string(withoutTriples(t, turtle, "sysx:sourceText"))}, + } { + t.Run(tc.name+", "+graph.name, func(t *testing.T) { + _, err := convert.Convert("m.ttl", []byte(retarget(graph.turtle, tc.edit)), convert.FormatTurtle, convert.FormatSysML) + var unsupported *export.UnsupportedError + if !errors.As(err, &unsupported) || !strings.Contains(err.Error(), tc.want) { + t.Errorf("expected the disagreement to be refused with %q, got %v", tc.want, err) + } + }) + } + } +} + +// A `first a then b` end with no ReferenceSubsetting or sysml:references +// target is refused, with or without its source text: the notation would +// invent the end's target from sysml:sourceFeature/targetFeature. +func TestFirstThenWithAnUntargetedEndIsRefused(t *testing.T) { + src := "package P {\n action def Step;\n action def A {\n action a : Step;\n action b : Step;\n" + + " first a then b;\n }\n}\n" + turtle, err := convert.Convert("m.sysml", []byte(src), convert.FormatSysML, convert.FormatTurtle) + if err != nil { + t.Fatalf("to turtle: %v", err) + } + const subsetting = "P__A___402_pend1_prs" + // untarget drops the second end's ReferenceSubsetting and every triple naming it. + untarget := func(graph string) string { + var blocks []string + for _, block := range strings.Split(graph, "\n\n") { + if strings.HasPrefix(block, "expr:"+subsetting+"\n") { + continue + } + var kept []string + for _, line := range strings.Split(block, "\n") { + if !strings.Contains(line, subsetting) { + kept = append(kept, line) + } + } + for i := len(kept) - 1; i >= 0; i-- { + if trimmed := strings.TrimRight(kept[i], "\n"); strings.HasSuffix(trimmed, " ;") { + kept[i] = strings.TrimSuffix(trimmed, " ;") + " ." + break + } else if strings.HasSuffix(trimmed, " .") { + break + } + } + blocks = append(blocks, strings.Join(kept, "\n")) + } + edited := strings.Join(blocks, "\n\n") + if edited == graph { + t.Fatalf("nothing was untargeted:\n%s", graph) + } + return edited + } + for _, graph := range []struct { + name string + turtle string + }{ + {"with source text", string(turtle)}, + {"graph only", string(withoutTriples(t, turtle, "sysx:sourceText"))}, + } { + t.Run(graph.name, func(t *testing.T) { + _, err := convert.Convert("m.ttl", []byte(untarget(graph.turtle)), convert.FormatTurtle, convert.FormatSysML) + var unsupported *export.UnsupportedError + const want = "has no ReferenceSubsetting or sysml:references target" + if !errors.As(err, &unsupported) || !strings.Contains(err.Error(), want) { + t.Errorf("expected the untargeted end to be refused with %q, got %v", want, err) + } + }) + } +} + +// A `first a then b` end declaring a name or bounds is refused, with or +// without its source text: the notation writes each end as the bare feature +// it names, so writing it would drop them. The declaring end is the one +// `succession first a then … b;` exports, at the same ids. +func TestFirstThenWithADeclaringEndIsRefused(t *testing.T) { + const prefix = "package P {\n action def Step;\n action def A {\n action a : Step;\n action b : Step;\n " + graph := func(t *testing.T, member string) string { + t.Helper() + turtle, err := convert.Convert("m.sysml", []byte(prefix+member+"\n }\n}\n"), convert.FormatSysML, convert.FormatTurtle) + if err != nil { + t.Fatalf("to turtle: %v", err) + } + return string(turtle) + } + plain := graph(t, "first a then b;") + const end = "expr:P__A___402_pend1" + for _, tc := range []struct{ name, declaring, want string }{ + {"bound", "succession first a then [2] b;", `declares "[2]"`}, + {"name", "succession first a then tgt ::> b;", `declares "tgt ::>"`}, + } { + // Swap the plain end's blocks for the declaring end's. + var declared []string + for _, block := range strings.Split(graph(t, tc.declaring), "\n\n") { + if strings.HasPrefix(block, end) { + declared = append(declared, block) + } + } + var blocks []string + for _, block := range strings.Split(plain, "\n\n") { + if !strings.HasPrefix(block, end) { + blocks = append(blocks, block) + } + } + edited := []byte(strings.Join(append(blocks, declared...), "\n\n")) + for _, form := range []struct { + name string + turtle []byte + }{ + {"with source text", edited}, + {"graph only", withoutTriples(t, edited, "sysx:sourceText")}, + } { + t.Run(tc.name+", "+form.name, func(t *testing.T) { + _, err := convert.Convert("m.ttl", form.turtle, convert.FormatTurtle, convert.FormatSysML) + var unsupported *export.UnsupportedError + if !errors.As(err, &unsupported) || !strings.Contains(err.Error(), tc.want) { + t.Errorf("expected the end to be refused with %q, got %v", tc.want, err) + } + }) + } + } +} + // A member-attached `then done;` is one SuccessionAsUsage (SysML.xtext // TargetSuccessionMember): its target end's ReferenceSubsetting reaches the // library's Actions::Action::done, the same end `succession first x then done;` diff --git a/tests/export/condition_references_test.go b/tests/export/condition_references_test.go index b934ada7c8..75b0457570 100644 --- a/tests/export/condition_references_test.go +++ b/tests/export/condition_references_test.go @@ -1,6 +1,7 @@ package export_test import ( + "encoding/json" "fmt" "os" "path/filepath" @@ -111,3 +112,88 @@ func diagnosticMessages(name string, notation []byte) []string { sort.Strings(lines) return lines } + +// A bare `assume c;`, `require q.k;` or `assert c;` is the reference form of its +// constraint usage (RequirementConstraintUsage, AssertConstraintUsage): the +// usage owns a ReferenceSubsetting to the feature it names, or to the chain of +// features, rather than stating an expression. +func TestBareConditionMembersOwnAReferenceSubsetting(t *testing.T) { + // A member named by reference subsetting takes the referenced feature's + // name, so the features named live outside the bodies naming them. + src := "package P {\n constraint def C;\n constraint c : C;\n part def Q {\n constraint k : C;\n }\n" + + " requirement def R {\n subject q : Q;\n assume c;\n require q.k;\n }\n" + + " constraint def D {\n assert c;\n }\n}\n" + if diagnostics := diagnosticMessages("m.sysml", []byte(src)); len(diagnostics) > 0 { + t.Fatalf("the model should analyse clean:\n%s", strings.Join(diagnostics, "\n")) + } + turtle, err := convert.Convert("m.sysml", []byte(src), convert.FormatSysML, convert.FormatTurtle) + if err != nil { + t.Fatalf("to turtle: %v", err) + } + graph := string(turtle) + if strings.Contains(graph, "sysx:condition") { + t.Errorf("a bare condition member should state no expression:\n%s", graph) + } + for _, want := range []string{ + "sysml:referencedFeature elmt:P__c", + "sysml:referencedFeature ", + "sysml:chainingFeature elmt:P__R__q, elmt:P__Q__k", + } { + if !strings.Contains(graph, want) { + t.Errorf("the graph should state %q:\n%s", want, graph) + } + } + if n := strings.Count(graph, "a sysml:ReferenceSubsetting"); n != 3 { + t.Errorf("each of the three members should own a ReferenceSubsetting, found %d:\n%s", n, graph) + } + back, err := convert.Convert("m.ttl", withoutSourceText(t, turtle), convert.FormatTurtle, convert.FormatSysML) + if err != nil { + t.Fatalf("back to notation from the mapping alone: %v\n%s", err, turtle) + } + if string(back) != src { + t.Fatalf("the notation changed\n--- want ---\n%s\n--- got ---\n%s", src, back) + } + + doc, err := convert.Convert("m.sysml", []byte(src), convert.FormatSysML, convert.FormatAPIJSON) + if err != nil { + t.Fatalf("to api-json: %v", err) + } + var elements []map[string]any + if err := json.Unmarshal(doc, &elements); err != nil { + t.Fatal(err) + } + byID := map[string]map[string]any{} + for _, e := range elements { + id, _ := e["@id"].(string) + byID[id] = e + } + ref := func(v any) string { + id, _ := v.(map[string]any)["@id"].(string) + return id + } + members := 0 + for _, e := range elements { + if e["@type"] != "RequirementConstraintMembership" && e["@type"] != "AssertConstraintUsage" { + continue + } + usage := e + if e["@type"] == "RequirementConstraintMembership" { + usage = byID[ref(e["ownedConstraint"])] + } + members++ + subsetting := byID[ref(usage["ownedReferenceSubsetting"])] + if subsetting == nil || subsetting["@type"] != "ReferenceSubsetting" { + t.Errorf("%v: ownedReferenceSubsetting %v, want a ReferenceSubsetting in the output", usage["@id"], usage["ownedReferenceSubsetting"]) + continue + } + if byID[ref(subsetting["referencedFeature"])] == nil { + t.Errorf("%v: referencedFeature %v is not in the output", subsetting["@id"], subsetting["referencedFeature"]) + } + } + if members != 3 { + t.Errorf("want three condition members, found %d", members) + } + if _, err := convert.Convert("m.json", doc, convert.FormatAPIJSON, convert.FormatSysML); err != nil { + t.Errorf("the API JSON did not read back: %v", err) + } +} diff --git a/tests/export/cross_feature_test.go b/tests/export/cross_feature_test.go index 9130f4bfc9..ca5dcb4647 100644 --- a/tests/export/cross_feature_test.go +++ b/tests/export/cross_feature_test.go @@ -301,19 +301,19 @@ func TestCrossFeatureOrderingComesBackFromTheGraphAlone(t *testing.T) { ` g := turtleOf(t, "crossing", sysml) elmt := func(name string) string { return rdf.ElementIRI(name).Value } - for _, flag := range []struct{ end, cross, property string }{ - {"Crossing::C::x", "Crossing::C::x::x1", "isOrdered"}, - {"Crossing::C::y", "Crossing::C::y::@0", "isOrdered"}, - {"Crossing::C::y", "Crossing::C::y::@0", "isNonunique"}, - {"Crossing::C::z", "Crossing::C::z::@0", "isNonunique"}, - {"Crossing::C::w", "Crossing::C::w::@0", "isNonunique"}, + for _, flag := range []struct{ end, cross, property, value string }{ + {"Crossing::C::x", "Crossing::C::x::x1", "isOrdered", "true"}, + {"Crossing::C::y", "Crossing::C::y::@0", "isOrdered", "true"}, + {"Crossing::C::y", "Crossing::C::y::@0", "isUnique", "false"}, + {"Crossing::C::z", "Crossing::C::z::@0", "isUnique", "false"}, + {"Crossing::C::w", "Crossing::C::w::@0", "isUnique", "false"}, } { - wantLexical(t, g, elmt(flag.cross), rdf.SysML+flag.property, "true") + wantLexical(t, g, elmt(flag.cross), rdf.SysML+flag.property, flag.value) if g.HasProperty(iri(elmt(flag.end)), rdf.SysML+flag.property) { t.Errorf("the end <%s> took its cross feature's %s", flag.end, flag.property) } } - if g.HasProperty(iri(elmt("Crossing::C::x::x1")), rdf.SysML+"isNonunique") { + if g.HasProperty(iri(elmt("Crossing::C::x::x1")), rdf.SysML+"isUnique") { t.Errorf("the ordered cross feature x1 is not nonunique") } if back := toNotation(t, withoutTriples(t, idTurtle(t, sysml), "sysx:sourceText")); back != sysml { diff --git a/tests/export/export_test.go b/tests/export/export_test.go index daf352315a..ca98f39160 100644 --- a/tests/export/export_test.go +++ b/tests/export/export_test.go @@ -1857,12 +1857,14 @@ func TestConditionWithAnUnsupportedKeywordIsReported(t *testing.T) { if got := strings.Count(structural, `sysx:declaredKeyword "constraint" ;`); got != 2 { t.Fatalf("expected two declared constraints in the graph, found %d:\n%s", got, structural) } - // `require C;` reads as an inline condition naming C; the reference form is - // what a graph states through sysml:references. - const inline = `sysx:condition expr:P__R___402_pcondition` - if !strings.Contains(structural, inline) { - t.Fatalf("the inline require member was not found in the graph:\n%s", structural) - } + // `require C;` is the reference form, stated through sysml:references; a + // graph may also state the member's condition inline. + const reference = `sysml:references elmt:P__C ;` + if !strings.Contains(structural, reference) { + t.Fatalf("the reference-form require member was not found in the graph:\n%s", structural) + } + inlined := inlineCondition(t, structural, "elmt:P__R___402") + const inline = `sysx:condition "true"` const declared, assert = `sysx:declaredKeyword "constraint" ;`, `sysx:declaredKeyword "assert" ;` // The two declared constraints are written in source order: c, then d. secondDeclared := strings.Replace(structural, declared, "\x00", 1) @@ -1870,11 +1872,11 @@ func TestConditionWithAnUnsupportedKeywordIsReported(t *testing.T) { for _, tc := range []struct{ name, edited, member string }{ {"bodied assume", strings.Replace(structural, declared, assert, 1), "assume"}, {"bodyless require", secondDeclared, "require"}, - {"inline require", strings.Replace(structural, inline, `sysx:declaredKeyword "verify" ;`+"\n "+inline, 1), "require"}, - {"reference-form require", strings.Replace(structural, inline, `sysx:declaredKeyword "verify" ;`+"\n "+`sysml:references elmt:P__C`, 1), "require"}, + {"inline require", strings.Replace(inlined, inline, `sysx:declaredKeyword "verify" ;`+"\n "+inline, 1), "require"}, + {"reference-form require", strings.Replace(structural, reference, `sysx:declaredKeyword "verify" ;`+"\n "+reference, 1), "require"}, } { t.Run(tc.name, func(t *testing.T) { - if tc.edited == structural { + if tc.edited == structural || tc.edited == inlined { t.Fatal("the graph was not edited") } _, err := convert.Convert("m.ttl", []byte(tc.edited), convert.FormatTurtle, convert.FormatSysML) @@ -1910,14 +1912,11 @@ func TestInlineConditionWithDeclarationFactsIsReported(t *testing.T) { if err != nil { t.Fatalf("to turtle: %v", err) } + // Both members are the reference form; a graph may state their conditions inline. + const require, assert = "elmt:P__R___400", "elmt:P__q___400" structural := string(withoutTriples(t, turtle, "sysx:sourceText")) - const require, assert = `sysx:condition expr:P__R___400_pcondition`, `sysx:condition expr:P__q___400_pcondition` - for _, inline := range []string{require, assert} { - if !strings.Contains(structural, inline) { - t.Fatalf("%s was not found in the graph:\n%s", inline, structural) - } - } - for _, tc := range []struct{ name, inline, added, drops string }{ + structural = inlineCondition(t, inlineCondition(t, structural, require), assert) + for _, tc := range []struct{ name, member, added, drops string }{ {"declared constraint keyword", require, `sysx:declaredKeyword "constraint" ;`, "declares a `constraint`"}, {"stated constraint", require, `sysml:references elmt:P__C ;`, "states a constraint through sysml:references"}, {"body", require, `sysx:hasBody "true"^^xsd:boolean ;`, "has a body"}, @@ -1929,10 +1928,14 @@ func TestInlineConditionWithDeclarationFactsIsReported(t *testing.T) { {"asserted name", assert, `sysml:declaredName "c" ;`, "declares a name"}, } { t.Run(tc.name, func(t *testing.T) { - edited := strings.Replace(structural, tc.inline, tc.added+"\n "+tc.inline, 1) - if edited == structural { - t.Fatal("the graph was not edited") - } + // The added triple goes ahead of the member's own inline condition. + const inline = `sysx:condition "true"` + block := strings.Index(structural, tc.member+"\n") + if block < 0 || !strings.Contains(structural[block:], inline) { + t.Fatalf("%s states no inline condition:\n%s", tc.member, structural) + } + at := block + strings.Index(structural[block:], inline) + edited := structural[:at] + tc.added + "\n " + structural[at:] _, err := convert.Convert("m.ttl", []byte(edited), convert.FormatTurtle, convert.FormatSysML) var unsupported *export.UnsupportedError if !errors.As(err, &unsupported) { @@ -1945,18 +1948,51 @@ func TestInlineConditionWithDeclarationFactsIsReported(t *testing.T) { } }) } - // The unedited graph still round-trips: the inline form alone is the form. + // The inlined graph alone still round-trips: the inline form is one form. back, err := convert.Convert("m.ttl", []byte(structural), convert.FormatTurtle, convert.FormatSysML) if err != nil { t.Fatalf("back to sysml: %v", err) } - for _, want := range []string{"require C;", "assert C;"} { + for _, want := range []string{"require true;", "assert true;"} { if !strings.Contains(string(back), want) { t.Errorf("expected %q in:\n%s", want, back) } } } +// inlineCondition rewrites a reference-form condition member of a Turtle +// document as one stating the condition `true` inline: its sysml:references +// becomes sysx:condition, and the ReferenceSubsetting it owns and its +// sysx:hasBody, which an inline condition does not state, are dropped. +func inlineCondition(t *testing.T, turtle, member string) string { + t.Helper() + rs := member + "_rs" + var lines []string + inMember := false + for _, line := range strings.Split(string(withoutSubjects(t, []byte(turtle), rs)), "\n") { + if !strings.HasPrefix(line, " ") && line != "" { + inMember = line == member + } + trimmed := strings.TrimSpace(line) + switch { + case inMember && strings.HasPrefix(trimmed, "sysml:references "): + line = ` sysx:condition "true" ` + trimmed[len(trimmed)-1:] + case strings.HasSuffix(trimmed, " "+rs+" ;"), inMember && trimmed == `sysx:hasBody "false"^^xsd:boolean ;`: + continue + case strings.HasSuffix(trimmed, " "+rs+" ."), inMember && trimmed == `sysx:hasBody "false"^^xsd:boolean .`: + last := len(lines) - 1 + lines[last] = strings.TrimSuffix(lines[last], ";") + "." + continue + } + lines = append(lines, line) + } + edited := strings.Join(lines, "\n") + if edited == turtle || strings.Contains(edited, rs) { + t.Fatalf("%s is not a reference-form condition member:\n%s", member, turtle) + } + return edited +} + // A head kept as source text writes its prefix annotations in that text; when // the text and the graph disagree, the text is stale and the head is rebuilt // from the graph rather than the annotation lost. @@ -3270,7 +3306,7 @@ func TestElementIRIsEncodeQualifiedNames(t *testing.T) { // the succession a transition owns (`_succession`), the referent memberships an // expression's referent edge restates, and a // filtered import's unnamed `_fp` package with its `_im` import and `_efm` filter. -var materializedSuffixID = regexp.MustCompile(`_(ft|sc|ss|sp|rd|rs)[0-9]*(_om)?$|_(subject|conjugated|pc|referent|preferent|targetFeature|succession)(_om)?$|_fp(_im|_efm)?$|_an$`) +var materializedSuffixID = regexp.MustCompile(`_(ft|sc|ss|sp|rd|rs)[0-9]*(_om)?$|_(subject|conjugated|pc|referent|preferent|targetFeature|succession|linkparam|triggerparam)(_om)?$|_fp(_im|_efm)?$|_an$`) // materializedExprID is the same convention inside an expression node's id. var materializedExprID = regexp.MustCompile(`_(subject|conjugated|pc|referent|preferent|targetFeature|succession)(_|$)|_(ft|sc|ss|sp|rd|rs)[0-9]`) @@ -3291,6 +3327,11 @@ func TestFixtureElementIDsRoundTrip(t *testing.T) { t.Fatalf("%s: %v", path, err) } for _, subject := range graph.Subjects() { + // A library element the graph names keeps the normative id the + // references to it carry; its name is checked against the library. + if export.LibraryReference(graph, subject) { + continue + } if strings.HasPrefix(subject.Value, rdf.Expression) && strings.HasSuffix(subject.Value, "_om") { if _, ok := graph.Object(subject, rdf.SysML+"memberElement"); !ok { t.Errorf("%s: expression membership %s has no member", path, subject.Value) @@ -4020,8 +4061,10 @@ func TestMachineEndpointsLinkAcrossRegionsAndNesting(t *testing.T) { turtle := toTurtle(t, filepath.Join("testdata", "convert", "endpoint_scopes.sysml")) for _, want := range []string{ "sysml:targetFeature elmt:Machines__Lamp__on__heat__warm .", - "sysml:target elmt:Machines__Lamp__on__light__bright .", - "sysml:target elmt:Machines__Lamp__on__heat__hot .", + // A transition's own target, ahead of the order annotations its + // several owned relationships carry. + "sysml:target elmt:Machines__Lamp__on__light__bright ;\n json:ownedRelationship", + "sysml:target elmt:Machines__Lamp__on__heat__hot ;\n json:ownedRelationship", "sysml:source elmt:Machines__Lamp__on__heat__hot ;", } { if !strings.Contains(turtle, want) { diff --git a/tests/export/library_names_test.go b/tests/export/library_names_test.go new file mode 100644 index 0000000000..5fa054930f --- /dev/null +++ b/tests/export/library_names_test.go @@ -0,0 +1,187 @@ +package export_test + +import ( + "encoding/json" + "strings" + "testing" + + "github.com/Open-MBEE/OpenSysML/internal/translate/convert" +) + +const libraryNamesModel = `package L { + private import ScalarValues::Real; + private import ISQ::*; + part def Car { + attribute speed : Real; + attribute weight : MassValue; + attribute count : ScalarValues::Integer; + } +} +` + +// A converted model names each standard library element it references, marked +// isLibraryElement (KerML Element::isLibraryElement), so every @id the output +// references is an element of it; the library itself is not exported, and the +// document's root namespace does not take the library elements (#731). +func TestConvertNamesTheLibraryElementsItReferences(t *testing.T) { + out, err := convert.Convert("l.sysml", []byte(libraryNamesModel), convert.FormatSysML, convert.FormatAPIJSON) + if err != nil { + t.Fatal(err) + } + var elements []map[string]any + if err := json.Unmarshal(out, &elements); err != nil { + t.Fatal(err) + } + ids := map[string]bool{} + library := map[string]map[string]any{} + for _, e := range elements { + id, _ := e["@id"].(string) + ids[id] = true + if e["isLibraryElement"] == true { + library[id] = e + } + } + var dangling []string + var walk func(any) + walk = func(v any) { + switch v := v.(type) { + case map[string]any: + if id, ok := v["@id"].(string); ok && len(v) == 1 && !ids[id] { + dangling = append(dangling, id) + } + for _, x := range v { + walk(x) + } + case []any: + for _, x := range v { + walk(x) + } + } + } + for _, e := range elements { + walk(e) + } + if len(dangling) > 0 { + t.Errorf("the output references ids it does not hold: %v", dangling) + } + want := map[string]string{ + "ScalarValues::Real": "DataType", + "ScalarValues::Integer": "DataType", + "ISQBase::MassValue": "AttributeDefinition", + "ISQ": "LibraryPackage", + } + named := map[string]string{} + memberships := 0 + for _, e := range library { + for _, owned := range []string{"owner", "owningRelationship", "owningNamespace", "owningMembership"} { + if _, ok := e[owned]; ok { + t.Errorf("the library element %v states an owner (%s) in the graph", e["qualifiedName"], owned) + } + } + if e["@type"] == "OwningMembership" { + memberships++ + continue + } + name, _ := e["qualifiedName"].(string) + named[name], _ = e["@type"].(string) + } + for name, typ := range want { + if named[name] != typ { + t.Errorf("%s is named as %q, want a %s", name, named[name], typ) + } + } + if memberships != 1 { + t.Errorf("the membership import of Real names %d library memberships, want 1", memberships) + } +} + +// The names are a record, not declarations: the graph reads back, source text +// stripped, as the notation that produced it, in Turtle and in the API's JSON. +func TestLibraryNamesReadBackAsReferences(t *testing.T) { + _, back := graphOnlyRoundTrip(t, "l.sysml", []byte(libraryNamesModel)) + if string(back) != libraryNamesModel { + t.Errorf("the notation read back changed:\n%s", back) + } + doc, err := convert.Convert("l.sysml", []byte(libraryNamesModel), convert.FormatSysML, convert.FormatAPIJSON) + if err != nil { + t.Fatal(err) + } + fromJSON, err := convert.Convert("l.json", doc, convert.FormatAPIJSON, convert.FormatSysML) + if err != nil { + t.Fatalf("the API JSON did not read back: %v", err) + } + for _, want := range []string{"attribute speed : Real;", "attribute count : ScalarValues::Integer;"} { + if !strings.Contains(string(fromJSON), want) { + t.Errorf("the notation should contain %q:\n%s", want, fromJSON) + } + } + if strings.Contains(string(fromJSON), "datatype") || strings.Contains(string(fromJSON), "library package") { + t.Errorf("a library element was written back as a declaration:\n%s", fromJSON) + } +} + +// A library element named otherwise than the bundled library names its id is +// refused rather than trusted. +func TestLibraryNameThatDisagreesIsRefused(t *testing.T) { + turtle, err := convert.Convert("l.sysml", []byte(libraryNamesModel), convert.FormatSysML, convert.FormatTurtle) + if err != nil { + t.Fatal(err) + } + stated := `sysml:qualifiedName "ScalarValues::Real" ;` + if !strings.Contains(string(turtle), stated) { + t.Fatalf("the graph no longer names %q", stated) + } + renamed := strings.Replace(string(turtle), stated, `sysml:qualifiedName "ScalarValues::Rational" ;`, 1) + if back, err := convert.Convert("l.ttl", []byte(renamed), convert.FormatTurtle, convert.FormatSysML); err == nil { + t.Errorf("a misnamed library element was converted:\n%s", back) + } else if !strings.Contains(err.Error(), "library") { + t.Errorf("refused for another reason: %v", err) + } +} + +// A library membership owns the element the library says its id owns: one +// whose memberElement is another library element is refused, not read as an +// import of either. +func TestLibraryMembershipOwningAnotherElementIsRefused(t *testing.T) { + turtle, err := convert.Convert("l.sysml", []byte(libraryNamesModel), convert.FormatSysML, convert.FormatTurtle) + if err != nil { + t.Fatal(err) + } + real := "sysml:memberElement ;\n sysml:isLibraryElement" + if !strings.Contains(string(turtle), real) { + t.Fatalf("the graph no longer states the library membership of Real") + } + integer := strings.Index(string(turtle), `sysml:qualifiedName "ScalarValues::Integer"`) + if integer < 0 { + t.Fatal("the graph no longer names ScalarValues::Integer") + } + start := strings.LastIndex(string(turtle[:integer]), "\n\n") + 2 + subject := strings.SplitN(string(turtle[start:]), "\n", 2)[0] + swapped := strings.Replace(string(turtle), real, "sysml:memberElement "+subject+" ;\n sysml:isLibraryElement", 1) + if back, err := convert.Convert("l.ttl", []byte(swapped), convert.FormatTurtle, convert.FormatSysML); err == nil { + t.Errorf("a library membership owning another element was converted:\n%s", back) + } else if !strings.Contains(err.Error(), "library membership") { + t.Errorf("refused for another reason: %v", err) + } +} + +// isLibraryElement is an xsd:boolean, so "1" marks a library element as +// "true" does: the element is still a reference, not a declaration. +func TestLibraryMarkerReadsEitherBooleanSpelling(t *testing.T) { + turtle, err := convert.Convert("l.sysml", []byte(libraryNamesModel), convert.FormatSysML, convert.FormatTurtle) + if err != nil { + t.Fatal(err) + } + marked := `sysml:isLibraryElement "true"^^xsd:boolean` + if !strings.Contains(string(turtle), marked) { + t.Fatalf("the graph no longer marks library elements") + } + ones := strings.ReplaceAll(string(turtle), marked, `sysml:isLibraryElement "1"^^xsd:boolean`) + back, err := convert.Convert("l.ttl", []byte(ones), convert.FormatTurtle, convert.FormatSysML) + if err != nil { + t.Fatalf("a graph marking library elements with 1 was refused: %v", err) + } + if strings.Contains(string(back), "datatype") || strings.Contains(string(back), "library package") { + t.Errorf("a library element marked with 1 was written back as a declaration:\n%s", back) + } +} diff --git a/tests/export/testdata/convert/action_nodes.golden.ttl b/tests/export/testdata/convert/action_nodes.golden.ttl index e38568576e..c6a20cd8c0 100644 --- a/tests/export/testdata/convert/action_nodes.golden.ttl +++ b/tests/export/testdata/convert/action_nodes.golden.ttl @@ -164,15 +164,15 @@ elmt:ActionNodes__Drive sysml:ownedMember elmt:ActionNodes__Drive__speed, elmt:ActionNodes__Drive__log, elmt:ActionNodes__Drive__antenna, elmt:ActionNodes__Drive__Stop, elmt:ActionNodes__Drive__brake, elmt:ActionNodes__Drive__split, elmt:ActionNodes__Drive__sync, elmt:ActionNodes__Drive__gather, elmt:ActionNodes__Drive__pick, elmt:ActionNodes__Drive___4010, elmt:ActionNodes__Drive__Brake, elmt:ActionNodes__Drive___4012, elmt:ActionNodes__Drive___4013, elmt:ActionNodes__Drive___4014, elmt:ActionNodes__Drive___4015, elmt:ActionNodes__Drive___4016, elmt:ActionNodes__Drive___4017, elmt:ActionNodes__Drive___4019, elmt:ActionNodes__Drive___4020 ; sysml:ownedMembership elmt:ActionNodes__Drive__speed_om, elmt:ActionNodes__Drive__log_om, elmt:ActionNodes__Drive__antenna_om, elmt:ActionNodes__Drive__Stop_om, elmt:ActionNodes__Drive___404, elmt:ActionNodes__Drive__brake_om, elmt:ActionNodes__Drive__split_om, elmt:ActionNodes__Drive__sync_om, elmt:ActionNodes__Drive__gather_om, elmt:ActionNodes__Drive__pick_om, elmt:ActionNodes__Drive___4010_om, elmt:ActionNodes__Drive__Brake_om, elmt:ActionNodes__Drive___4012_om, elmt:ActionNodes__Drive___4013_om, elmt:ActionNodes__Drive___4014_om, elmt:ActionNodes__Drive___4015_om, elmt:ActionNodes__Drive___4016_om, elmt:ActionNodes__Drive___4017_om, elmt:ActionNodes__Drive___4018, elmt:ActionNodes__Drive___4019_om, elmt:ActionNodes__Drive___4020_om ; sysml:ownedRelationship elmt:ActionNodes__Drive__speed_om, elmt:ActionNodes__Drive__log_om, elmt:ActionNodes__Drive__antenna_om, elmt:ActionNodes__Drive__Stop_om, elmt:ActionNodes__Drive___404, elmt:ActionNodes__Drive__brake_om, elmt:ActionNodes__Drive__split_om, elmt:ActionNodes__Drive__sync_om, elmt:ActionNodes__Drive__gather_om, elmt:ActionNodes__Drive__pick_om, elmt:ActionNodes__Drive___4010_om, elmt:ActionNodes__Drive__Brake_om, elmt:ActionNodes__Drive___4012_om, elmt:ActionNodes__Drive___4013_om, elmt:ActionNodes__Drive___4014_om, elmt:ActionNodes__Drive___4015_om, elmt:ActionNodes__Drive___4016_om, elmt:ActionNodes__Drive___4017_om, elmt:ActionNodes__Drive___4018, elmt:ActionNodes__Drive___4019_om, elmt:ActionNodes__Drive___4020_om ; - sysml:ownedFeature elmt:ActionNodes__Drive__speed, elmt:ActionNodes__Drive__log, elmt:ActionNodes__Drive__antenna, elmt:ActionNodes__Drive__brake, elmt:ActionNodes__Drive__split, elmt:ActionNodes__Drive__sync, elmt:ActionNodes__Drive__gather, elmt:ActionNodes__Drive__pick, elmt:ActionNodes__Drive___4010, elmt:ActionNodes__Drive__Brake, elmt:ActionNodes__Drive___4012, elmt:ActionNodes__Drive___4013, elmt:ActionNodes__Drive___4014, elmt:ActionNodes__Drive___4015, elmt:ActionNodes__Drive___4019, elmt:ActionNodes__Drive___4020 ; - sysml:ownedFeatureMembership elmt:ActionNodes__Drive__speed_om, elmt:ActionNodes__Drive__log_om, elmt:ActionNodes__Drive__antenna_om, elmt:ActionNodes__Drive__brake_om, elmt:ActionNodes__Drive__split_om, elmt:ActionNodes__Drive__sync_om, elmt:ActionNodes__Drive__gather_om, elmt:ActionNodes__Drive__pick_om, elmt:ActionNodes__Drive___4010_om, elmt:ActionNodes__Drive__Brake_om, elmt:ActionNodes__Drive___4012_om, elmt:ActionNodes__Drive___4013_om, elmt:ActionNodes__Drive___4014_om, elmt:ActionNodes__Drive___4015_om, elmt:ActionNodes__Drive___4019_om, elmt:ActionNodes__Drive___4020_om ; + sysml:ownedFeature elmt:ActionNodes__Drive__speed, elmt:ActionNodes__Drive__log, elmt:ActionNodes__Drive__antenna, elmt:ActionNodes__Drive__brake, elmt:ActionNodes__Drive__split, elmt:ActionNodes__Drive__sync, elmt:ActionNodes__Drive__gather, elmt:ActionNodes__Drive__pick, elmt:ActionNodes__Drive___4010, elmt:ActionNodes__Drive__Brake, elmt:ActionNodes__Drive___4012, elmt:ActionNodes__Drive___4013, elmt:ActionNodes__Drive___4014, elmt:ActionNodes__Drive___4015, elmt:ActionNodes__Drive___4016, elmt:ActionNodes__Drive___4017, elmt:ActionNodes__Drive___4019, elmt:ActionNodes__Drive___4020 ; + sysml:ownedFeatureMembership elmt:ActionNodes__Drive__speed_om, elmt:ActionNodes__Drive__log_om, elmt:ActionNodes__Drive__antenna_om, elmt:ActionNodes__Drive__brake_om, elmt:ActionNodes__Drive__split_om, elmt:ActionNodes__Drive__sync_om, elmt:ActionNodes__Drive__gather_om, elmt:ActionNodes__Drive__pick_om, elmt:ActionNodes__Drive___4010_om, elmt:ActionNodes__Drive__Brake_om, elmt:ActionNodes__Drive___4012_om, elmt:ActionNodes__Drive___4013_om, elmt:ActionNodes__Drive___4014_om, elmt:ActionNodes__Drive___4015_om, elmt:ActionNodes__Drive___4016_om, elmt:ActionNodes__Drive___4017_om, elmt:ActionNodes__Drive___4019_om, elmt:ActionNodes__Drive___4020_om ; sysx:sourceText " action def Drive {\n" ; sysx:sourceTail " }\n" ; json:ownedMember "[{\"@id\":\"ActionNodes__Drive__speed\"},{\"@id\":\"ActionNodes__Drive__log\"},{\"@id\":\"ActionNodes__Drive__antenna\"},{\"@id\":\"ActionNodes__Drive__Stop\"},{\"@id\":\"ActionNodes__Drive__brake\"},{\"@id\":\"ActionNodes__Drive__split\"},{\"@id\":\"ActionNodes__Drive__sync\"},{\"@id\":\"ActionNodes__Drive__gather\"},{\"@id\":\"ActionNodes__Drive__pick\"},{\"@id\":\"ActionNodes__Drive___4010\"},{\"@id\":\"ActionNodes__Drive__Brake\"},{\"@id\":\"ActionNodes__Drive___4012\"},{\"@id\":\"ActionNodes__Drive___4013\"},{\"@id\":\"ActionNodes__Drive___4014\"},{\"@id\":\"ActionNodes__Drive___4015\"},{\"@id\":\"ActionNodes__Drive___4016\"},{\"@id\":\"ActionNodes__Drive___4017\"},{\"@id\":\"ActionNodes__Drive___4019\"},{\"@id\":\"ActionNodes__Drive___4020\"}]" ; json:ownedMembership "[{\"@id\":\"ActionNodes__Drive__speed_om\"},{\"@id\":\"ActionNodes__Drive__log_om\"},{\"@id\":\"ActionNodes__Drive__antenna_om\"},{\"@id\":\"ActionNodes__Drive__Stop_om\"},{\"@id\":\"ActionNodes__Drive___404\"},{\"@id\":\"ActionNodes__Drive__brake_om\"},{\"@id\":\"ActionNodes__Drive__split_om\"},{\"@id\":\"ActionNodes__Drive__sync_om\"},{\"@id\":\"ActionNodes__Drive__gather_om\"},{\"@id\":\"ActionNodes__Drive__pick_om\"},{\"@id\":\"ActionNodes__Drive___4010_om\"},{\"@id\":\"ActionNodes__Drive__Brake_om\"},{\"@id\":\"ActionNodes__Drive___4012_om\"},{\"@id\":\"ActionNodes__Drive___4013_om\"},{\"@id\":\"ActionNodes__Drive___4014_om\"},{\"@id\":\"ActionNodes__Drive___4015_om\"},{\"@id\":\"ActionNodes__Drive___4016_om\"},{\"@id\":\"ActionNodes__Drive___4017_om\"},{\"@id\":\"ActionNodes__Drive___4018\"},{\"@id\":\"ActionNodes__Drive___4019_om\"},{\"@id\":\"ActionNodes__Drive___4020_om\"}]" ; json:ownedRelationship "[{\"@id\":\"ActionNodes__Drive__speed_om\"},{\"@id\":\"ActionNodes__Drive__log_om\"},{\"@id\":\"ActionNodes__Drive__antenna_om\"},{\"@id\":\"ActionNodes__Drive__Stop_om\"},{\"@id\":\"ActionNodes__Drive___404\"},{\"@id\":\"ActionNodes__Drive__brake_om\"},{\"@id\":\"ActionNodes__Drive__split_om\"},{\"@id\":\"ActionNodes__Drive__sync_om\"},{\"@id\":\"ActionNodes__Drive__gather_om\"},{\"@id\":\"ActionNodes__Drive__pick_om\"},{\"@id\":\"ActionNodes__Drive___4010_om\"},{\"@id\":\"ActionNodes__Drive__Brake_om\"},{\"@id\":\"ActionNodes__Drive___4012_om\"},{\"@id\":\"ActionNodes__Drive___4013_om\"},{\"@id\":\"ActionNodes__Drive___4014_om\"},{\"@id\":\"ActionNodes__Drive___4015_om\"},{\"@id\":\"ActionNodes__Drive___4016_om\"},{\"@id\":\"ActionNodes__Drive___4017_om\"},{\"@id\":\"ActionNodes__Drive___4018\"},{\"@id\":\"ActionNodes__Drive___4019_om\"},{\"@id\":\"ActionNodes__Drive___4020_om\"}]" ; - json:ownedFeature "[{\"@id\":\"ActionNodes__Drive__speed\"},{\"@id\":\"ActionNodes__Drive__log\"},{\"@id\":\"ActionNodes__Drive__antenna\"},{\"@id\":\"ActionNodes__Drive__brake\"},{\"@id\":\"ActionNodes__Drive__split\"},{\"@id\":\"ActionNodes__Drive__sync\"},{\"@id\":\"ActionNodes__Drive__gather\"},{\"@id\":\"ActionNodes__Drive__pick\"},{\"@id\":\"ActionNodes__Drive___4010\"},{\"@id\":\"ActionNodes__Drive__Brake\"},{\"@id\":\"ActionNodes__Drive___4012\"},{\"@id\":\"ActionNodes__Drive___4013\"},{\"@id\":\"ActionNodes__Drive___4014\"},{\"@id\":\"ActionNodes__Drive___4015\"},{\"@id\":\"ActionNodes__Drive___4019\"},{\"@id\":\"ActionNodes__Drive___4020\"}]" ; - json:ownedFeatureMembership "[{\"@id\":\"ActionNodes__Drive__speed_om\"},{\"@id\":\"ActionNodes__Drive__log_om\"},{\"@id\":\"ActionNodes__Drive__antenna_om\"},{\"@id\":\"ActionNodes__Drive__brake_om\"},{\"@id\":\"ActionNodes__Drive__split_om\"},{\"@id\":\"ActionNodes__Drive__sync_om\"},{\"@id\":\"ActionNodes__Drive__gather_om\"},{\"@id\":\"ActionNodes__Drive__pick_om\"},{\"@id\":\"ActionNodes__Drive___4010_om\"},{\"@id\":\"ActionNodes__Drive__Brake_om\"},{\"@id\":\"ActionNodes__Drive___4012_om\"},{\"@id\":\"ActionNodes__Drive___4013_om\"},{\"@id\":\"ActionNodes__Drive___4014_om\"},{\"@id\":\"ActionNodes__Drive___4015_om\"},{\"@id\":\"ActionNodes__Drive___4019_om\"},{\"@id\":\"ActionNodes__Drive___4020_om\"}]" . + json:ownedFeature "[{\"@id\":\"ActionNodes__Drive__speed\"},{\"@id\":\"ActionNodes__Drive__log\"},{\"@id\":\"ActionNodes__Drive__antenna\"},{\"@id\":\"ActionNodes__Drive__brake\"},{\"@id\":\"ActionNodes__Drive__split\"},{\"@id\":\"ActionNodes__Drive__sync\"},{\"@id\":\"ActionNodes__Drive__gather\"},{\"@id\":\"ActionNodes__Drive__pick\"},{\"@id\":\"ActionNodes__Drive___4010\"},{\"@id\":\"ActionNodes__Drive__Brake\"},{\"@id\":\"ActionNodes__Drive___4012\"},{\"@id\":\"ActionNodes__Drive___4013\"},{\"@id\":\"ActionNodes__Drive___4014\"},{\"@id\":\"ActionNodes__Drive___4015\"},{\"@id\":\"ActionNodes__Drive___4016\"},{\"@id\":\"ActionNodes__Drive___4017\"},{\"@id\":\"ActionNodes__Drive___4019\"},{\"@id\":\"ActionNodes__Drive___4020\"}]" ; + json:ownedFeatureMembership "[{\"@id\":\"ActionNodes__Drive__speed_om\"},{\"@id\":\"ActionNodes__Drive__log_om\"},{\"@id\":\"ActionNodes__Drive__antenna_om\"},{\"@id\":\"ActionNodes__Drive__brake_om\"},{\"@id\":\"ActionNodes__Drive__split_om\"},{\"@id\":\"ActionNodes__Drive__sync_om\"},{\"@id\":\"ActionNodes__Drive__gather_om\"},{\"@id\":\"ActionNodes__Drive__pick_om\"},{\"@id\":\"ActionNodes__Drive___4010_om\"},{\"@id\":\"ActionNodes__Drive__Brake_om\"},{\"@id\":\"ActionNodes__Drive___4012_om\"},{\"@id\":\"ActionNodes__Drive___4013_om\"},{\"@id\":\"ActionNodes__Drive___4014_om\"},{\"@id\":\"ActionNodes__Drive___4015_om\"},{\"@id\":\"ActionNodes__Drive___4016_om\"},{\"@id\":\"ActionNodes__Drive___4017_om\"},{\"@id\":\"ActionNodes__Drive___4019_om\"},{\"@id\":\"ActionNodes__Drive___4020_om\"}]" . elmt:ActionNodes__Drive_om a sysml:OwningMembership ; @@ -1300,14 +1300,16 @@ elmt:ActionNodes__Drive___4016 sysx:sourceText " terminate;\n" . elmt:ActionNodes__Drive___4016_om - a sysml:OwningMembership ; + a sysml:FeatureMembership ; sysml:elementId "ActionNodes__Drive___4016_om" ; sysml:owner elmt:ActionNodes__Drive ; sysml:memberElement elmt:ActionNodes__Drive___4016 ; sysml:ownedMemberElement elmt:ActionNodes__Drive___4016 ; sysml:ownedRelatedElement elmt:ActionNodes__Drive___4016 ; sysml:owningRelatedElement elmt:ActionNodes__Drive ; - sysml:membershipOwningNamespace elmt:ActionNodes__Drive . + sysml:membershipOwningNamespace elmt:ActionNodes__Drive ; + sysml:ownedMemberFeature elmt:ActionNodes__Drive___4016 ; + sysml:owningType elmt:ActionNodes__Drive . elmt:ActionNodes__Drive___4017 a sysml:TerminateActionUsage ; @@ -1328,14 +1330,16 @@ elmt:ActionNodes__Drive___4017 sysx:sourceText " terminate brake;\n" . elmt:ActionNodes__Drive___4017_om - a sysml:OwningMembership ; + a sysml:FeatureMembership ; sysml:elementId "ActionNodes__Drive___4017_om" ; sysml:owner elmt:ActionNodes__Drive ; sysml:memberElement elmt:ActionNodes__Drive___4017 ; sysml:ownedMemberElement elmt:ActionNodes__Drive___4017 ; sysml:ownedRelatedElement elmt:ActionNodes__Drive___4017 ; sysml:owningRelatedElement elmt:ActionNodes__Drive ; - sysml:membershipOwningNamespace elmt:ActionNodes__Drive . + sysml:membershipOwningNamespace elmt:ActionNodes__Drive ; + sysml:ownedMemberFeature elmt:ActionNodes__Drive___4017 ; + sysml:owningType elmt:ActionNodes__Drive . expr:ActionNodes__Drive___4017_pexpression a sysml:FeatureReferenceExpression ; @@ -1744,3 +1748,17 @@ expr:ActionNodes__Drive___4017_pexpression_preferent sysml:memberElement elmt:ActionNodes__Drive__brake ; sysml:owner expr:ActionNodes__Drive___4017_pexpression ; sysml:owningRelatedElement expr:ActionNodes__Drive___4017_pexpression . + + + a sysml:ActionUsage ; + sysml:elementId "0cdc3cd3-b06c-5c32-beda-0cf4ba164a64" ; + sysml:qualifiedName "Actions::Action::done" ; + sysml:declaredName "done" ; + sysml:isLibraryElement "true"^^xsd:boolean . + + + a sysml:ActionUsage ; + sysml:elementId "9a0d2905-0f9c-5bb4-af74-9780d6db1817" ; + sysml:qualifiedName "Actions::Action::start" ; + sysml:declaredName "start" ; + sysml:isLibraryElement "true"^^xsd:boolean . diff --git a/tests/export/testdata/convert/anonymous_portions.golden.ttl b/tests/export/testdata/convert/anonymous_portions.golden.ttl index a4528b099c..63f514b18f 100644 --- a/tests/export/testdata/convert/anonymous_portions.golden.ttl +++ b/tests/export/testdata/convert/anonymous_portions.golden.ttl @@ -719,3 +719,24 @@ elmt:AnonymousPortions__car___404_ft0 sysml:owner elmt:AnonymousPortions__car___404 ; sysml:relatedElement elmt:AnonymousPortions__car___404, elmt:AnonymousPortions__Car ; json:relatedElement "[{\"@id\":\"AnonymousPortions__car___404\"},{\"@id\":\"AnonymousPortions__Car\"}]" . + +elmt:dd677401-a352-5fe3-846a-dad08d3eab06 + a sysml:PartUsage ; + sysml:elementId "dd677401-a352-5fe3-846a-dad08d3eab06" ; + sysml:qualifiedName "Parts::Part::done" ; + sysml:declaredName "done" ; + sysml:isLibraryElement "true"^^xsd:boolean . + +elmt:ed80d442-d498-5236-96ae-71a8a52531d2 + a sysml:PartUsage ; + sysml:elementId "ed80d442-d498-5236-96ae-71a8a52531d2" ; + sysml:qualifiedName "Parts::Part::start" ; + sysml:declaredName "start" ; + sysml:isLibraryElement "true"^^xsd:boolean . + +elmt:fa859d04-71c3-510a-bdb7-d35d7bc10bee + a sysml:AttributeUsage ; + sysml:elementId "fa859d04-71c3-510a-bdb7-d35d7bc10bee" ; + sysml:qualifiedName "Occurrences::Occurrence::portionOfLife" ; + sysml:declaredName "portionOfLife" ; + sysml:isLibraryElement "true"^^xsd:boolean . diff --git a/tests/export/testdata/convert/bounds.golden.ttl b/tests/export/testdata/convert/bounds.golden.ttl index f5336549c7..0d89b37540 100644 --- a/tests/export/testdata/convert/bounds.golden.ttl +++ b/tests/export/testdata/convert/bounds.golden.ttl @@ -380,7 +380,7 @@ elmt:Bounds__Fleet__loose sysml:owningMembership elmt:Bounds__Fleet__loose_om ; sysml:declaredName "loose" ; sysml:isOrdered "true"^^xsd:boolean ; - sysml:isNonunique "true"^^xsd:boolean ; + sysml:isUnique "false"^^xsd:boolean ; sysml:type elmt:Bounds__Vehicle ; sysml:multiplicity expr:Bounds__Fleet__loose_pmultiplicity ; sysml:ownedRelationship expr:Bounds__Fleet__loose_pmultiplicity_om, elmt:Bounds__Fleet__loose_ft0 ; diff --git a/tests/export/testdata/convert/condition_references.golden.ttl b/tests/export/testdata/convert/condition_references.golden.ttl index 33eb3152ad..482c61657b 100644 --- a/tests/export/testdata/convert/condition_references.golden.ttl +++ b/tests/export/testdata/convert/condition_references.golden.ttl @@ -2488,3 +2488,24 @@ expr:ConditionReferences__Rover__inv1___400_pa0_preferent sysml:memberElement elmt:ConditionReferences__Rover__ok ; sysml:owner expr:ConditionReferences__Rover__inv1___400_pa0 ; sysml:owningRelatedElement expr:ConditionReferences__Rover__inv1___400_pa0 . + + + a sysml:DataType ; + sysml:elementId "14c0aa22-5489-59b5-b438-ded26e83ba31" ; + sysml:qualifiedName "ScalarValues::Real" ; + sysml:declaredName "Real" ; + sysml:isLibraryElement "true"^^xsd:boolean . + + + a sysml:LibraryPackage ; + sysml:elementId "40bb440c-5036-58e1-8675-5afccb8b8f1d" ; + sysml:qualifiedName "ScalarValues" ; + sysml:declaredName "ScalarValues" ; + sysml:isLibraryElement "true"^^xsd:boolean . + +elmt:d1e9242d-b2e3-5270-bf69-4f4fb0447193 + a sysml:DataType ; + sysml:elementId "d1e9242d-b2e3-5270-bf69-4f4fb0447193" ; + sysml:qualifiedName "ScalarValues::Boolean" ; + sysml:declaredName "Boolean" ; + sysml:isLibraryElement "true"^^xsd:boolean . diff --git a/tests/export/testdata/convert/constraints.golden.ttl b/tests/export/testdata/convert/constraints.golden.ttl index 3f0ffa49b1..1f8979b7fc 100644 --- a/tests/export/testdata/convert/constraints.golden.ttl +++ b/tests/export/testdata/convert/constraints.golden.ttl @@ -3015,9 +3015,12 @@ elmt:Constraints__Rover__lightEnough___404 sysml:owner elmt:Constraints__Rover__lightEnough ; sysml:owningRelationship elmt:Constraints__Rover__lightEnough___404_om ; sysml:owningMembership elmt:Constraints__Rover__lightEnough___404_om ; - sysx:condition expr:Constraints__Rover__lightEnough___404_pcondition ; - sysml:ownedRelationship expr:Constraints__Rover__lightEnough___404_pcondition_om ; - sysml:ownedMembership expr:Constraints__Rover__lightEnough___404_pcondition_om ; + sysml:references elmt:Constraints__MassLimit ; + sysx:hasBody "false"^^xsd:boolean ; + sysml:ownedReferenceSubsetting elmt:Constraints__Rover__lightEnough___404_rs ; + sysml:ownedSubsetting elmt:Constraints__Rover__lightEnough___404_rs ; + sysml:ownedSpecialization elmt:Constraints__Rover__lightEnough___404_rs ; + sysml:ownedRelationship elmt:Constraints__Rover__lightEnough___404_rs ; sysx:sourceText " require MassLimit;\n" . elmt:Constraints__Rover__lightEnough___404_om @@ -3034,52 +3037,6 @@ elmt:Constraints__Rover__lightEnough___404_om sysml:ownedMemberFeature elmt:Constraints__Rover__lightEnough___404 ; sysml:owningType elmt:Constraints__Rover__lightEnough . -expr:Constraints__Rover__lightEnough___404_pcondition - a sysml:FeatureReferenceExpression ; - sysx:sourceText "MassLimit" ; - sysml:elementId "Constraints__Rover__lightEnough___404_pcondition" ; - sysml:referent elmt:Constraints__MassLimit ; - sysml:ownedRelationship expr:Constraints__Rover__lightEnough___404_pcondition_pout_om, expr:Constraints__Rover__lightEnough___404_pcondition_preferent ; - sysml:ownedMembership expr:Constraints__Rover__lightEnough___404_pcondition_pout_om ; - sysml:ownedFeatureMembership expr:Constraints__Rover__lightEnough___404_pcondition_pout_om ; - sysml:ownedFeature expr:Constraints__Rover__lightEnough___404_pcondition_pout ; - sysml:parameter expr:Constraints__Rover__lightEnough___404_pcondition_pout ; - sysml:result expr:Constraints__Rover__lightEnough___404_pcondition_pout ; - sysml:owner elmt:Constraints__Rover__lightEnough___404 ; - sysml:owningRelationship expr:Constraints__Rover__lightEnough___404_pcondition_om ; - sysml:owningMembership expr:Constraints__Rover__lightEnough___404_pcondition_om ; - json:ownedRelationship "[{\"@id\":\"Constraints__Rover__lightEnough___404_pcondition_pout_om\"},{\"@id\":\"Constraints__Rover__lightEnough___404_pcondition_preferent\"}]" . - -expr:Constraints__Rover__lightEnough___404_pcondition_pout - a sysml:Feature ; - sysml:elementId "Constraints__Rover__lightEnough___404_pcondition_pout" ; - sysml:direction "out" ; - sysml:owner expr:Constraints__Rover__lightEnough___404_pcondition ; - sysml:owningRelationship expr:Constraints__Rover__lightEnough___404_pcondition_pout_om ; - sysml:owningMembership expr:Constraints__Rover__lightEnough___404_pcondition_pout_om . - -expr:Constraints__Rover__lightEnough___404_pcondition_pout_om - a sysml:ReturnParameterMembership ; - sysml:elementId "Constraints__Rover__lightEnough___404_pcondition_pout_om" ; - sysml:owner expr:Constraints__Rover__lightEnough___404_pcondition ; - sysml:memberElement expr:Constraints__Rover__lightEnough___404_pcondition_pout ; - sysml:ownedMemberElement expr:Constraints__Rover__lightEnough___404_pcondition_pout ; - sysml:ownedRelatedElement expr:Constraints__Rover__lightEnough___404_pcondition_pout ; - sysml:owningRelatedElement expr:Constraints__Rover__lightEnough___404_pcondition ; - sysml:membershipOwningNamespace expr:Constraints__Rover__lightEnough___404_pcondition ; - sysml:ownedMemberFeature expr:Constraints__Rover__lightEnough___404_pcondition_pout ; - sysml:ownedMemberParameter expr:Constraints__Rover__lightEnough___404_pcondition_pout . - -expr:Constraints__Rover__lightEnough___404_pcondition_om - a sysml:OwningMembership ; - sysml:elementId "Constraints__Rover__lightEnough___404_pcondition_om" ; - sysml:owner elmt:Constraints__Rover__lightEnough___404 ; - sysml:memberElement expr:Constraints__Rover__lightEnough___404_pcondition ; - sysml:ownedMemberElement expr:Constraints__Rover__lightEnough___404_pcondition ; - sysml:ownedRelatedElement expr:Constraints__Rover__lightEnough___404_pcondition ; - sysml:owningRelatedElement elmt:Constraints__Rover__lightEnough___404 ; - sysml:membershipOwningNamespace elmt:Constraints__Rover__lightEnough___404 . - elmt:Constraints__Rover__lightEnough___405 a sysml:ConstraintUsage ; sysml:qualifiedName "Constraints::Rover::lightEnough::@5" ; @@ -3700,12 +3657,22 @@ expr:Constraints__Rover__lightEnough___403___400_pa0_pa0_preferent sysml:owner expr:Constraints__Rover__lightEnough___403___400_pa0_pa0 ; sysml:owningRelatedElement expr:Constraints__Rover__lightEnough___403___400_pa0_pa0 . -expr:Constraints__Rover__lightEnough___404_pcondition_preferent - a sysml:Membership ; - sysml:elementId "Constraints__Rover__lightEnough___404_pcondition_preferent" ; - sysml:memberElement elmt:Constraints__MassLimit ; - sysml:owner expr:Constraints__Rover__lightEnough___404_pcondition ; - sysml:owningRelatedElement expr:Constraints__Rover__lightEnough___404_pcondition . +elmt:Constraints__Rover__lightEnough___404_rs + a sysml:ReferenceSubsetting ; + sysml:elementId "Constraints__Rover__lightEnough___404_rs" ; + sysml:referencingFeature elmt:Constraints__Rover__lightEnough___404 ; + sysml:subsettingFeature elmt:Constraints__Rover__lightEnough___404 ; + sysml:owningFeature elmt:Constraints__Rover__lightEnough___404 ; + sysml:specific elmt:Constraints__Rover__lightEnough___404 ; + sysml:source elmt:Constraints__Rover__lightEnough___404 ; + sysml:owningRelatedElement elmt:Constraints__Rover__lightEnough___404 ; + sysml:referencedFeature elmt:Constraints__MassLimit ; + sysml:subsettedFeature elmt:Constraints__MassLimit ; + sysml:general elmt:Constraints__MassLimit ; + sysml:target elmt:Constraints__MassLimit ; + sysml:owner elmt:Constraints__Rover__lightEnough___404 ; + sysml:relatedElement elmt:Constraints__Rover__lightEnough___404, elmt:Constraints__MassLimit ; + json:relatedElement "[{\"@id\":\"Constraints__Rover__lightEnough___404\"},{\"@id\":\"Constraints__MassLimit\"}]" . elmt:Constraints__Rover__lightEnough___405_rs a sysml:ReferenceSubsetting ; diff --git a/tests/export/testdata/convert/end_binding_bodies.golden.ttl b/tests/export/testdata/convert/end_binding_bodies.golden.ttl index c31206b40d..6dca1c1597 100644 --- a/tests/export/testdata/convert/end_binding_bodies.golden.ttl +++ b/tests/export/testdata/convert/end_binding_bodies.golden.ttl @@ -1102,15 +1102,15 @@ elmt:Bodies__Ctx sysml:ownedMember elmt:Bodies__Ctx__x, elmt:Bodies__Ctx__y, elmt:Bodies__Ctx__c, elmt:Bodies__Ctx___403, elmt:Bodies__Ctx__f, elmt:Bodies__Ctx__bd, elmt:Bodies__Ctx___406, elmt:Bodies__Ctx__al, elmt:Bodies__Ctx__s, elmt:Bodies__Ctx__Act, elmt:Bodies__Ctx__Machine ; sysml:ownedMembership elmt:Bodies__Ctx__x_om, elmt:Bodies__Ctx__y_om, elmt:Bodies__Ctx__c_om, elmt:Bodies__Ctx___403_om, elmt:Bodies__Ctx__f_om, elmt:Bodies__Ctx__bd_om, elmt:Bodies__Ctx___406_om, elmt:Bodies__Ctx__al_om, elmt:Bodies__Ctx__s_om, elmt:Bodies__Ctx__Act_om, elmt:Bodies__Ctx__Machine_om ; sysml:ownedRelationship elmt:Bodies__Ctx__x_om, elmt:Bodies__Ctx__y_om, elmt:Bodies__Ctx__c_om, elmt:Bodies__Ctx___403_om, elmt:Bodies__Ctx__f_om, elmt:Bodies__Ctx__bd_om, elmt:Bodies__Ctx___406_om, elmt:Bodies__Ctx__al_om, elmt:Bodies__Ctx__s_om, elmt:Bodies__Ctx__Act_om, elmt:Bodies__Ctx__Machine_om ; - sysml:ownedFeature elmt:Bodies__Ctx__x, elmt:Bodies__Ctx__y, elmt:Bodies__Ctx__c, elmt:Bodies__Ctx___403, elmt:Bodies__Ctx__bd, elmt:Bodies__Ctx___406, elmt:Bodies__Ctx__al, elmt:Bodies__Ctx__s ; - sysml:ownedFeatureMembership elmt:Bodies__Ctx__x_om, elmt:Bodies__Ctx__y_om, elmt:Bodies__Ctx__c_om, elmt:Bodies__Ctx___403_om, elmt:Bodies__Ctx__bd_om, elmt:Bodies__Ctx___406_om, elmt:Bodies__Ctx__al_om, elmt:Bodies__Ctx__s_om ; + sysml:ownedFeature elmt:Bodies__Ctx__x, elmt:Bodies__Ctx__y, elmt:Bodies__Ctx__c, elmt:Bodies__Ctx___403, elmt:Bodies__Ctx__f, elmt:Bodies__Ctx__bd, elmt:Bodies__Ctx___406, elmt:Bodies__Ctx__al, elmt:Bodies__Ctx__s ; + sysml:ownedFeatureMembership elmt:Bodies__Ctx__x_om, elmt:Bodies__Ctx__y_om, elmt:Bodies__Ctx__c_om, elmt:Bodies__Ctx___403_om, elmt:Bodies__Ctx__f_om, elmt:Bodies__Ctx__bd_om, elmt:Bodies__Ctx___406_om, elmt:Bodies__Ctx__al_om, elmt:Bodies__Ctx__s_om ; sysx:sourceText " part def Ctx {\n" ; sysx:sourceTail " }\n" ; json:ownedMember "[{\"@id\":\"Bodies__Ctx__x\"},{\"@id\":\"Bodies__Ctx__y\"},{\"@id\":\"Bodies__Ctx__c\"},{\"@id\":\"Bodies__Ctx___403\"},{\"@id\":\"Bodies__Ctx__f\"},{\"@id\":\"Bodies__Ctx__bd\"},{\"@id\":\"Bodies__Ctx___406\"},{\"@id\":\"Bodies__Ctx__al\"},{\"@id\":\"Bodies__Ctx__s\"},{\"@id\":\"Bodies__Ctx__Act\"},{\"@id\":\"Bodies__Ctx__Machine\"}]" ; json:ownedMembership "[{\"@id\":\"Bodies__Ctx__x_om\"},{\"@id\":\"Bodies__Ctx__y_om\"},{\"@id\":\"Bodies__Ctx__c_om\"},{\"@id\":\"Bodies__Ctx___403_om\"},{\"@id\":\"Bodies__Ctx__f_om\"},{\"@id\":\"Bodies__Ctx__bd_om\"},{\"@id\":\"Bodies__Ctx___406_om\"},{\"@id\":\"Bodies__Ctx__al_om\"},{\"@id\":\"Bodies__Ctx__s_om\"},{\"@id\":\"Bodies__Ctx__Act_om\"},{\"@id\":\"Bodies__Ctx__Machine_om\"}]" ; json:ownedRelationship "[{\"@id\":\"Bodies__Ctx__x_om\"},{\"@id\":\"Bodies__Ctx__y_om\"},{\"@id\":\"Bodies__Ctx__c_om\"},{\"@id\":\"Bodies__Ctx___403_om\"},{\"@id\":\"Bodies__Ctx__f_om\"},{\"@id\":\"Bodies__Ctx__bd_om\"},{\"@id\":\"Bodies__Ctx___406_om\"},{\"@id\":\"Bodies__Ctx__al_om\"},{\"@id\":\"Bodies__Ctx__s_om\"},{\"@id\":\"Bodies__Ctx__Act_om\"},{\"@id\":\"Bodies__Ctx__Machine_om\"}]" ; - json:ownedFeature "[{\"@id\":\"Bodies__Ctx__x\"},{\"@id\":\"Bodies__Ctx__y\"},{\"@id\":\"Bodies__Ctx__c\"},{\"@id\":\"Bodies__Ctx___403\"},{\"@id\":\"Bodies__Ctx__bd\"},{\"@id\":\"Bodies__Ctx___406\"},{\"@id\":\"Bodies__Ctx__al\"},{\"@id\":\"Bodies__Ctx__s\"}]" ; - json:ownedFeatureMembership "[{\"@id\":\"Bodies__Ctx__x_om\"},{\"@id\":\"Bodies__Ctx__y_om\"},{\"@id\":\"Bodies__Ctx__c_om\"},{\"@id\":\"Bodies__Ctx___403_om\"},{\"@id\":\"Bodies__Ctx__bd_om\"},{\"@id\":\"Bodies__Ctx___406_om\"},{\"@id\":\"Bodies__Ctx__al_om\"},{\"@id\":\"Bodies__Ctx__s_om\"}]" . + json:ownedFeature "[{\"@id\":\"Bodies__Ctx__x\"},{\"@id\":\"Bodies__Ctx__y\"},{\"@id\":\"Bodies__Ctx__c\"},{\"@id\":\"Bodies__Ctx___403\"},{\"@id\":\"Bodies__Ctx__f\"},{\"@id\":\"Bodies__Ctx__bd\"},{\"@id\":\"Bodies__Ctx___406\"},{\"@id\":\"Bodies__Ctx__al\"},{\"@id\":\"Bodies__Ctx__s\"}]" ; + json:ownedFeatureMembership "[{\"@id\":\"Bodies__Ctx__x_om\"},{\"@id\":\"Bodies__Ctx__y_om\"},{\"@id\":\"Bodies__Ctx__c_om\"},{\"@id\":\"Bodies__Ctx___403_om\"},{\"@id\":\"Bodies__Ctx__f_om\"},{\"@id\":\"Bodies__Ctx__bd_om\"},{\"@id\":\"Bodies__Ctx___406_om\"},{\"@id\":\"Bodies__Ctx__al_om\"},{\"@id\":\"Bodies__Ctx__s_om\"}]" . elmt:Bodies__Ctx_om a sysml:OwningMembership ; @@ -1672,8 +1672,8 @@ elmt:Bodies__Ctx__f sysml:connectorEnd expr:Bodies__Ctx__f_pend0, expr:Bodies__Ctx__f_pend1 ; sysml:ownedRelationship expr:Bodies__Ctx__f_pend0_om, expr:Bodies__Ctx__f_pend1_om, elmt:Bodies__Ctx__f__w_om ; sysml:ownedMembership expr:Bodies__Ctx__f_pend0_om, expr:Bodies__Ctx__f_pend1_om, elmt:Bodies__Ctx__f__w_om ; - sysml:ownedFeatureMembership expr:Bodies__Ctx__f_pend0_om, expr:Bodies__Ctx__f_pend1_om ; - sysml:ownedFeature expr:Bodies__Ctx__f_pend0, expr:Bodies__Ctx__f_pend1 ; + sysml:ownedFeatureMembership expr:Bodies__Ctx__f_pend0_om, expr:Bodies__Ctx__f_pend1_om, elmt:Bodies__Ctx__f__w_om ; + sysml:ownedFeature expr:Bodies__Ctx__f_pend0, expr:Bodies__Ctx__f_pend1, elmt:Bodies__Ctx__f__w ; sysml:ownedEndFeature expr:Bodies__Ctx__f_pend0, expr:Bodies__Ctx__f_pend1 ; sysx:endForm "fromTo" ; sysx:hasBody "true"^^xsd:boolean ; @@ -1683,19 +1683,21 @@ elmt:Bodies__Ctx__f json:connectorEnd "[{\"@id\":\"Bodies__Ctx__f_pend0\"},{\"@id\":\"Bodies__Ctx__f_pend1\"}]" ; json:ownedRelationship "[{\"@id\":\"Bodies__Ctx__f_pend0_om\"},{\"@id\":\"Bodies__Ctx__f_pend1_om\"},{\"@id\":\"Bodies__Ctx__f__w_om\"}]" ; json:ownedMembership "[{\"@id\":\"Bodies__Ctx__f_pend0_om\"},{\"@id\":\"Bodies__Ctx__f_pend1_om\"},{\"@id\":\"Bodies__Ctx__f__w_om\"}]" ; - json:ownedFeatureMembership "[{\"@id\":\"Bodies__Ctx__f_pend0_om\"},{\"@id\":\"Bodies__Ctx__f_pend1_om\"}]" ; - json:ownedFeature "[{\"@id\":\"Bodies__Ctx__f_pend0\"},{\"@id\":\"Bodies__Ctx__f_pend1\"}]" ; + json:ownedFeatureMembership "[{\"@id\":\"Bodies__Ctx__f_pend0_om\"},{\"@id\":\"Bodies__Ctx__f_pend1_om\"},{\"@id\":\"Bodies__Ctx__f__w_om\"}]" ; + json:ownedFeature "[{\"@id\":\"Bodies__Ctx__f_pend0\"},{\"@id\":\"Bodies__Ctx__f_pend1\"},{\"@id\":\"Bodies__Ctx__f__w\"}]" ; json:ownedEndFeature "[{\"@id\":\"Bodies__Ctx__f_pend0\"},{\"@id\":\"Bodies__Ctx__f_pend1\"}]" . elmt:Bodies__Ctx__f_om - a sysml:OwningMembership ; + a sysml:FeatureMembership ; sysml:elementId "Bodies__Ctx__f_om" ; sysml:owner elmt:Bodies__Ctx ; sysml:memberElement elmt:Bodies__Ctx__f ; sysml:ownedMemberElement elmt:Bodies__Ctx__f ; sysml:ownedRelatedElement elmt:Bodies__Ctx__f ; sysml:owningRelatedElement elmt:Bodies__Ctx ; - sysml:membershipOwningNamespace elmt:Bodies__Ctx . + sysml:membershipOwningNamespace elmt:Bodies__Ctx ; + sysml:ownedMemberFeature elmt:Bodies__Ctx__f ; + sysml:owningType elmt:Bodies__Ctx . expr:Bodies__Ctx__f_pend0 a sysml:FlowEnd ; @@ -1853,14 +1855,16 @@ elmt:Bodies__Ctx__f__w sysx:sourceText " attribute w : Prio;\n" . elmt:Bodies__Ctx__f__w_om - a sysml:OwningMembership ; + a sysml:FeatureMembership ; sysml:elementId "Bodies__Ctx__f__w_om" ; sysml:owner elmt:Bodies__Ctx__f ; sysml:memberElement elmt:Bodies__Ctx__f__w ; sysml:ownedMemberElement elmt:Bodies__Ctx__f__w ; sysml:ownedRelatedElement elmt:Bodies__Ctx__f__w ; sysml:owningRelatedElement elmt:Bodies__Ctx__f ; - sysml:membershipOwningNamespace elmt:Bodies__Ctx__f . + sysml:membershipOwningNamespace elmt:Bodies__Ctx__f ; + sysml:ownedMemberFeature elmt:Bodies__Ctx__f__w ; + sysml:owningType elmt:Bodies__Ctx__f . elmt:Bodies__Ctx__bd a sysml:BindingConnectorAsUsage ; @@ -2932,14 +2936,22 @@ elmt:Bodies__Ctx__Act___403 sysx:declaredKeyword "first" ; sysml:sourceFeature elmt:Bodies__Ctx__Act__a1 ; sysml:targetFeature elmt:Bodies__Ctx__Act__a2 ; + sysml:connectorEnd expr:Bodies__Ctx__Act___403_pend0, expr:Bodies__Ctx__Act___403_pend1 ; + sysml:ownedRelationship expr:Bodies__Ctx__Act___403_pend0_om, expr:Bodies__Ctx__Act___403_pend1_om, elmt:Bodies__Ctx__Act___403__w_om ; + sysml:ownedMembership expr:Bodies__Ctx__Act___403_pend0_om, expr:Bodies__Ctx__Act___403_pend1_om, elmt:Bodies__Ctx__Act___403__w_om ; + sysml:ownedFeatureMembership expr:Bodies__Ctx__Act___403_pend0_om, expr:Bodies__Ctx__Act___403_pend1_om, elmt:Bodies__Ctx__Act___403__w_om ; + sysml:ownedFeature expr:Bodies__Ctx__Act___403_pend0, expr:Bodies__Ctx__Act___403_pend1, elmt:Bodies__Ctx__Act___403__w ; + sysml:ownedEndFeature expr:Bodies__Ctx__Act___403_pend0, expr:Bodies__Ctx__Act___403_pend1 ; sysx:hasBody "true"^^xsd:boolean ; sysml:ownedMember elmt:Bodies__Ctx__Act___403__w ; - sysml:ownedMembership elmt:Bodies__Ctx__Act___403__w_om ; - sysml:ownedRelationship elmt:Bodies__Ctx__Act___403__w_om ; - sysml:ownedFeature elmt:Bodies__Ctx__Act___403__w ; - sysml:ownedFeatureMembership elmt:Bodies__Ctx__Act___403__w_om ; sysx:sourceText " first a1 then a2 {\n" ; - sysx:sourceTail " }\n" . + sysx:sourceTail " }\n" ; + json:connectorEnd "[{\"@id\":\"Bodies__Ctx__Act___403_pend0\"},{\"@id\":\"Bodies__Ctx__Act___403_pend1\"}]" ; + json:ownedRelationship "[{\"@id\":\"Bodies__Ctx__Act___403_pend0_om\"},{\"@id\":\"Bodies__Ctx__Act___403_pend1_om\"},{\"@id\":\"Bodies__Ctx__Act___403__w_om\"}]" ; + json:ownedMembership "[{\"@id\":\"Bodies__Ctx__Act___403_pend0_om\"},{\"@id\":\"Bodies__Ctx__Act___403_pend1_om\"},{\"@id\":\"Bodies__Ctx__Act___403__w_om\"}]" ; + json:ownedFeatureMembership "[{\"@id\":\"Bodies__Ctx__Act___403_pend0_om\"},{\"@id\":\"Bodies__Ctx__Act___403_pend1_om\"},{\"@id\":\"Bodies__Ctx__Act___403__w_om\"}]" ; + json:ownedFeature "[{\"@id\":\"Bodies__Ctx__Act___403_pend0\"},{\"@id\":\"Bodies__Ctx__Act___403_pend1\"},{\"@id\":\"Bodies__Ctx__Act___403__w\"}]" ; + json:ownedEndFeature "[{\"@id\":\"Bodies__Ctx__Act___403_pend0\"},{\"@id\":\"Bodies__Ctx__Act___403_pend1\"}]" . elmt:Bodies__Ctx__Act___403_om a sysml:FeatureMembership ; @@ -2953,6 +2965,87 @@ elmt:Bodies__Ctx__Act___403_om sysml:ownedMemberFeature elmt:Bodies__Ctx__Act___403 ; sysml:owningType elmt:Bodies__Ctx__Act . +expr:Bodies__Ctx__Act___403_pend0 + a sysml:ReferenceUsage ; + sysml:elementId "Bodies__Ctx__Act___403_pend0" ; + sysml:isEnd "true"^^xsd:boolean ; + sysml:owner elmt:Bodies__Ctx__Act___403 ; + sysml:owningRelationship expr:Bodies__Ctx__Act___403_pend0_om ; + sysml:owningMembership expr:Bodies__Ctx__Act___403_pend0_om ; + sysml:ownedReferenceSubsetting expr:Bodies__Ctx__Act___403_pend0_prs ; + sysml:ownedSubsetting expr:Bodies__Ctx__Act___403_pend0_prs ; + sysml:ownedSpecialization expr:Bodies__Ctx__Act___403_pend0_prs ; + sysml:ownedRelationship expr:Bodies__Ctx__Act___403_pend0_prs . + +expr:Bodies__Ctx__Act___403_pend0_om + a sysml:EndFeatureMembership ; + sysml:elementId "Bodies__Ctx__Act___403_pend0_om" ; + sysml:owner elmt:Bodies__Ctx__Act___403 ; + sysml:memberElement expr:Bodies__Ctx__Act___403_pend0 ; + sysml:ownedMemberElement expr:Bodies__Ctx__Act___403_pend0 ; + sysml:ownedRelatedElement expr:Bodies__Ctx__Act___403_pend0 ; + sysml:owningRelatedElement elmt:Bodies__Ctx__Act___403 ; + sysml:membershipOwningNamespace elmt:Bodies__Ctx__Act___403 . + +expr:Bodies__Ctx__Act___403_pend0_prs + a sysml:ReferenceSubsetting ; + sysml:elementId "Bodies__Ctx__Act___403_pend0_prs" ; + sysml:referencingFeature expr:Bodies__Ctx__Act___403_pend0 ; + sysml:subsettingFeature expr:Bodies__Ctx__Act___403_pend0 ; + sysml:specific expr:Bodies__Ctx__Act___403_pend0 ; + sysml:source expr:Bodies__Ctx__Act___403_pend0 ; + sysml:owningFeature expr:Bodies__Ctx__Act___403_pend0 ; + sysml:owningType expr:Bodies__Ctx__Act___403_pend0 ; + sysml:referencedFeature elmt:Bodies__Ctx__Act__a1 ; + sysml:subsettedFeature elmt:Bodies__Ctx__Act__a1 ; + sysml:general elmt:Bodies__Ctx__Act__a1 ; + sysml:target elmt:Bodies__Ctx__Act__a1 ; + sysml:relatedElement expr:Bodies__Ctx__Act___403_pend0, elmt:Bodies__Ctx__Act__a1 ; + sysml:owner expr:Bodies__Ctx__Act___403_pend0 ; + sysml:owningRelatedElement expr:Bodies__Ctx__Act___403_pend0 ; + json:relatedElement "[{\"@id\":\"Bodies__Ctx__Act___403_pend0\"},{\"@id\":\"Bodies__Ctx__Act__a1\"}]" . + +expr:Bodies__Ctx__Act___403_pend1 + a sysml:ReferenceUsage ; + sysml:elementId "Bodies__Ctx__Act___403_pend1" ; + sysml:isEnd "true"^^xsd:boolean ; + sysml:owner elmt:Bodies__Ctx__Act___403 ; + sysml:owningRelationship expr:Bodies__Ctx__Act___403_pend1_om ; + sysml:owningMembership expr:Bodies__Ctx__Act___403_pend1_om ; + sysx:sourceText "a2" ; + sysml:ownedReferenceSubsetting expr:Bodies__Ctx__Act___403_pend1_prs ; + sysml:ownedSubsetting expr:Bodies__Ctx__Act___403_pend1_prs ; + sysml:ownedSpecialization expr:Bodies__Ctx__Act___403_pend1_prs ; + sysml:ownedRelationship expr:Bodies__Ctx__Act___403_pend1_prs . + +expr:Bodies__Ctx__Act___403_pend1_om + a sysml:EndFeatureMembership ; + sysml:elementId "Bodies__Ctx__Act___403_pend1_om" ; + sysml:owner elmt:Bodies__Ctx__Act___403 ; + sysml:memberElement expr:Bodies__Ctx__Act___403_pend1 ; + sysml:ownedMemberElement expr:Bodies__Ctx__Act___403_pend1 ; + sysml:ownedRelatedElement expr:Bodies__Ctx__Act___403_pend1 ; + sysml:owningRelatedElement elmt:Bodies__Ctx__Act___403 ; + sysml:membershipOwningNamespace elmt:Bodies__Ctx__Act___403 . + +expr:Bodies__Ctx__Act___403_pend1_prs + a sysml:ReferenceSubsetting ; + sysml:elementId "Bodies__Ctx__Act___403_pend1_prs" ; + sysml:referencingFeature expr:Bodies__Ctx__Act___403_pend1 ; + sysml:subsettingFeature expr:Bodies__Ctx__Act___403_pend1 ; + sysml:specific expr:Bodies__Ctx__Act___403_pend1 ; + sysml:source expr:Bodies__Ctx__Act___403_pend1 ; + sysml:owningFeature expr:Bodies__Ctx__Act___403_pend1 ; + sysml:owningType expr:Bodies__Ctx__Act___403_pend1 ; + sysml:referencedFeature elmt:Bodies__Ctx__Act__a2 ; + sysml:subsettedFeature elmt:Bodies__Ctx__Act__a2 ; + sysml:general elmt:Bodies__Ctx__Act__a2 ; + sysml:target elmt:Bodies__Ctx__Act__a2 ; + sysml:relatedElement expr:Bodies__Ctx__Act___403_pend1, elmt:Bodies__Ctx__Act__a2 ; + sysml:owner expr:Bodies__Ctx__Act___403_pend1 ; + sysml:owningRelatedElement expr:Bodies__Ctx__Act___403_pend1 ; + json:relatedElement "[{\"@id\":\"Bodies__Ctx__Act___403_pend1\"},{\"@id\":\"Bodies__Ctx__Act__a2\"}]" . + elmt:Bodies__Ctx__Act___403__w a sysml:AttributeUsage ; sysml:qualifiedName "Bodies::Ctx::Act::@3::w" ; @@ -3031,8 +3124,20 @@ elmt:Bodies__Ctx__Act___405 sysx:declaredKeyword "first" ; sysml:sourceFeature elmt:Bodies__Ctx__Act__a2 ; sysml:targetFeature elmt:Bodies__Ctx__Act__a3 ; + sysml:connectorEnd expr:Bodies__Ctx__Act___405_pend0, expr:Bodies__Ctx__Act___405_pend1 ; + sysml:ownedRelationship expr:Bodies__Ctx__Act___405_pend0_om, expr:Bodies__Ctx__Act___405_pend1_om ; + sysml:ownedMembership expr:Bodies__Ctx__Act___405_pend0_om, expr:Bodies__Ctx__Act___405_pend1_om ; + sysml:ownedFeatureMembership expr:Bodies__Ctx__Act___405_pend0_om, expr:Bodies__Ctx__Act___405_pend1_om ; + sysml:ownedFeature expr:Bodies__Ctx__Act___405_pend0, expr:Bodies__Ctx__Act___405_pend1 ; + sysml:ownedEndFeature expr:Bodies__Ctx__Act___405_pend0, expr:Bodies__Ctx__Act___405_pend1 ; sysx:hasBody "true"^^xsd:boolean ; - sysx:sourceText " first a2 then a3 {\n }\n" . + sysx:sourceText " first a2 then a3 {\n }\n" ; + json:connectorEnd "[{\"@id\":\"Bodies__Ctx__Act___405_pend0\"},{\"@id\":\"Bodies__Ctx__Act___405_pend1\"}]" ; + json:ownedRelationship "[{\"@id\":\"Bodies__Ctx__Act___405_pend0_om\"},{\"@id\":\"Bodies__Ctx__Act___405_pend1_om\"}]" ; + json:ownedMembership "[{\"@id\":\"Bodies__Ctx__Act___405_pend0_om\"},{\"@id\":\"Bodies__Ctx__Act___405_pend1_om\"}]" ; + json:ownedFeatureMembership "[{\"@id\":\"Bodies__Ctx__Act___405_pend0_om\"},{\"@id\":\"Bodies__Ctx__Act___405_pend1_om\"}]" ; + json:ownedFeature "[{\"@id\":\"Bodies__Ctx__Act___405_pend0\"},{\"@id\":\"Bodies__Ctx__Act___405_pend1\"}]" ; + json:ownedEndFeature "[{\"@id\":\"Bodies__Ctx__Act___405_pend0\"},{\"@id\":\"Bodies__Ctx__Act___405_pend1\"}]" . elmt:Bodies__Ctx__Act___405_om a sysml:FeatureMembership ; @@ -3046,6 +3151,87 @@ elmt:Bodies__Ctx__Act___405_om sysml:ownedMemberFeature elmt:Bodies__Ctx__Act___405 ; sysml:owningType elmt:Bodies__Ctx__Act . +expr:Bodies__Ctx__Act___405_pend0 + a sysml:ReferenceUsage ; + sysml:elementId "Bodies__Ctx__Act___405_pend0" ; + sysml:isEnd "true"^^xsd:boolean ; + sysml:owner elmt:Bodies__Ctx__Act___405 ; + sysml:owningRelationship expr:Bodies__Ctx__Act___405_pend0_om ; + sysml:owningMembership expr:Bodies__Ctx__Act___405_pend0_om ; + sysml:ownedReferenceSubsetting expr:Bodies__Ctx__Act___405_pend0_prs ; + sysml:ownedSubsetting expr:Bodies__Ctx__Act___405_pend0_prs ; + sysml:ownedSpecialization expr:Bodies__Ctx__Act___405_pend0_prs ; + sysml:ownedRelationship expr:Bodies__Ctx__Act___405_pend0_prs . + +expr:Bodies__Ctx__Act___405_pend0_om + a sysml:EndFeatureMembership ; + sysml:elementId "Bodies__Ctx__Act___405_pend0_om" ; + sysml:owner elmt:Bodies__Ctx__Act___405 ; + sysml:memberElement expr:Bodies__Ctx__Act___405_pend0 ; + sysml:ownedMemberElement expr:Bodies__Ctx__Act___405_pend0 ; + sysml:ownedRelatedElement expr:Bodies__Ctx__Act___405_pend0 ; + sysml:owningRelatedElement elmt:Bodies__Ctx__Act___405 ; + sysml:membershipOwningNamespace elmt:Bodies__Ctx__Act___405 . + +expr:Bodies__Ctx__Act___405_pend0_prs + a sysml:ReferenceSubsetting ; + sysml:elementId "Bodies__Ctx__Act___405_pend0_prs" ; + sysml:referencingFeature expr:Bodies__Ctx__Act___405_pend0 ; + sysml:subsettingFeature expr:Bodies__Ctx__Act___405_pend0 ; + sysml:specific expr:Bodies__Ctx__Act___405_pend0 ; + sysml:source expr:Bodies__Ctx__Act___405_pend0 ; + sysml:owningFeature expr:Bodies__Ctx__Act___405_pend0 ; + sysml:owningType expr:Bodies__Ctx__Act___405_pend0 ; + sysml:referencedFeature elmt:Bodies__Ctx__Act__a2 ; + sysml:subsettedFeature elmt:Bodies__Ctx__Act__a2 ; + sysml:general elmt:Bodies__Ctx__Act__a2 ; + sysml:target elmt:Bodies__Ctx__Act__a2 ; + sysml:relatedElement expr:Bodies__Ctx__Act___405_pend0, elmt:Bodies__Ctx__Act__a2 ; + sysml:owner expr:Bodies__Ctx__Act___405_pend0 ; + sysml:owningRelatedElement expr:Bodies__Ctx__Act___405_pend0 ; + json:relatedElement "[{\"@id\":\"Bodies__Ctx__Act___405_pend0\"},{\"@id\":\"Bodies__Ctx__Act__a2\"}]" . + +expr:Bodies__Ctx__Act___405_pend1 + a sysml:ReferenceUsage ; + sysml:elementId "Bodies__Ctx__Act___405_pend1" ; + sysml:isEnd "true"^^xsd:boolean ; + sysml:owner elmt:Bodies__Ctx__Act___405 ; + sysml:owningRelationship expr:Bodies__Ctx__Act___405_pend1_om ; + sysml:owningMembership expr:Bodies__Ctx__Act___405_pend1_om ; + sysx:sourceText "a3" ; + sysml:ownedReferenceSubsetting expr:Bodies__Ctx__Act___405_pend1_prs ; + sysml:ownedSubsetting expr:Bodies__Ctx__Act___405_pend1_prs ; + sysml:ownedSpecialization expr:Bodies__Ctx__Act___405_pend1_prs ; + sysml:ownedRelationship expr:Bodies__Ctx__Act___405_pend1_prs . + +expr:Bodies__Ctx__Act___405_pend1_om + a sysml:EndFeatureMembership ; + sysml:elementId "Bodies__Ctx__Act___405_pend1_om" ; + sysml:owner elmt:Bodies__Ctx__Act___405 ; + sysml:memberElement expr:Bodies__Ctx__Act___405_pend1 ; + sysml:ownedMemberElement expr:Bodies__Ctx__Act___405_pend1 ; + sysml:ownedRelatedElement expr:Bodies__Ctx__Act___405_pend1 ; + sysml:owningRelatedElement elmt:Bodies__Ctx__Act___405 ; + sysml:membershipOwningNamespace elmt:Bodies__Ctx__Act___405 . + +expr:Bodies__Ctx__Act___405_pend1_prs + a sysml:ReferenceSubsetting ; + sysml:elementId "Bodies__Ctx__Act___405_pend1_prs" ; + sysml:referencingFeature expr:Bodies__Ctx__Act___405_pend1 ; + sysml:subsettingFeature expr:Bodies__Ctx__Act___405_pend1 ; + sysml:specific expr:Bodies__Ctx__Act___405_pend1 ; + sysml:source expr:Bodies__Ctx__Act___405_pend1 ; + sysml:owningFeature expr:Bodies__Ctx__Act___405_pend1 ; + sysml:owningType expr:Bodies__Ctx__Act___405_pend1 ; + sysml:referencedFeature elmt:Bodies__Ctx__Act__a3 ; + sysml:subsettedFeature elmt:Bodies__Ctx__Act__a3 ; + sysml:general elmt:Bodies__Ctx__Act__a3 ; + sysml:target elmt:Bodies__Ctx__Act__a3 ; + sysml:relatedElement expr:Bodies__Ctx__Act___405_pend1, elmt:Bodies__Ctx__Act__a3 ; + sysml:owner expr:Bodies__Ctx__Act___405_pend1 ; + sysml:owningRelatedElement expr:Bodies__Ctx__Act___405_pend1 ; + json:relatedElement "[{\"@id\":\"Bodies__Ctx__Act___405_pend1\"},{\"@id\":\"Bodies__Ctx__Act__a3\"}]" . + elmt:Bodies__Ctx__Act__a4 a sysml:ActionUsage ; sysml:qualifiedName "Bodies::Ctx::Act::a4" ; @@ -3389,20 +3575,22 @@ elmt:Bodies__Ctx__Machine__t1 sysml:owningMembership elmt:Bodies__Ctx__Machine__t1_om ; sysml:declaredName "t1" ; sysx:transitionSyntax "first" ; + sysml:ownedRelationship expr:Bodies__Ctx__Machine__t1_psourcemember, elmt:Bodies__Ctx__Machine__t1_linkparam_om, elmt:Bodies__Ctx__Machine__t1_succession_om, elmt:Bodies__Ctx__Machine__t1__w_om ; + sysml:ownedMembership expr:Bodies__Ctx__Machine__t1_psourcemember, elmt:Bodies__Ctx__Machine__t1_linkparam_om, elmt:Bodies__Ctx__Machine__t1_succession_om, elmt:Bodies__Ctx__Machine__t1__w_om ; + sysml:ownedFeatureMembership elmt:Bodies__Ctx__Machine__t1_linkparam_om, elmt:Bodies__Ctx__Machine__t1__w_om ; + sysml:ownedFeature elmt:Bodies__Ctx__Machine__t1_linkparam, elmt:Bodies__Ctx__Machine__t1__w ; sysml:succession elmt:Bodies__Ctx__Machine__t1_succession ; sysx:bodyMember elmt:Bodies__Ctx__Machine__t1__w ; sysx:hasBody "true"^^xsd:boolean ; - sysml:ownedRelationship elmt:Bodies__Ctx__Machine__t1_succession_om, elmt:Bodies__Ctx__Machine__t1__w_om ; - sysml:ownedMembership elmt:Bodies__Ctx__Machine__t1_succession_om, elmt:Bodies__Ctx__Machine__t1__w_om ; sysml:ownedMember elmt:Bodies__Ctx__Machine__t1__w ; - sysml:ownedFeature elmt:Bodies__Ctx__Machine__t1__w ; - sysml:ownedFeatureMembership elmt:Bodies__Ctx__Machine__t1__w_om ; sysml:source elmt:Bodies__Ctx__Machine__off ; sysml:target elmt:Bodies__Ctx__Machine__on ; sysx:sourceText " transition t1 first off then on {\n" ; sysx:sourceTail " }\n" ; - json:ownedRelationship "[{\"@id\":\"Bodies__Ctx__Machine__t1_succession_om\"},{\"@id\":\"Bodies__Ctx__Machine__t1__w_om\"}]" ; - json:ownedMembership "[{\"@id\":\"Bodies__Ctx__Machine__t1_succession_om\"},{\"@id\":\"Bodies__Ctx__Machine__t1__w_om\"}]" . + json:ownedRelationship "[{\"@id\":\"Bodies__Ctx__Machine__t1_psourcemember\"},{\"@id\":\"Bodies__Ctx__Machine__t1_linkparam_om\"},{\"@id\":\"Bodies__Ctx__Machine__t1_succession_om\"},{\"@id\":\"Bodies__Ctx__Machine__t1__w_om\"}]" ; + json:ownedMembership "[{\"@id\":\"Bodies__Ctx__Machine__t1_psourcemember\"},{\"@id\":\"Bodies__Ctx__Machine__t1_linkparam_om\"},{\"@id\":\"Bodies__Ctx__Machine__t1_succession_om\"},{\"@id\":\"Bodies__Ctx__Machine__t1__w_om\"}]" ; + json:ownedFeatureMembership "[{\"@id\":\"Bodies__Ctx__Machine__t1_linkparam_om\"},{\"@id\":\"Bodies__Ctx__Machine__t1__w_om\"}]" ; + json:ownedFeature "[{\"@id\":\"Bodies__Ctx__Machine__t1_linkparam\"},{\"@id\":\"Bodies__Ctx__Machine__t1__w\"}]" . elmt:Bodies__Ctx__Machine__t1_om a sysml:FeatureMembership ; @@ -3416,6 +3604,34 @@ elmt:Bodies__Ctx__Machine__t1_om sysml:ownedMemberFeature elmt:Bodies__Ctx__Machine__t1 ; sysml:owningType elmt:Bodies__Ctx__Machine . +expr:Bodies__Ctx__Machine__t1_psourcemember + a sysml:Membership ; + sysml:elementId "Bodies__Ctx__Machine__t1_psourcemember" ; + sysml:owner elmt:Bodies__Ctx__Machine__t1 ; + sysml:memberElement elmt:Bodies__Ctx__Machine__off ; + sysml:owningRelatedElement elmt:Bodies__Ctx__Machine__t1 ; + sysml:membershipOwningNamespace elmt:Bodies__Ctx__Machine__t1 . + +elmt:Bodies__Ctx__Machine__t1_linkparam + a sysml:ReferenceUsage ; + sysml:elementId "Bodies__Ctx__Machine__t1_linkparam" ; + sysml:direction "in" ; + sysml:owner elmt:Bodies__Ctx__Machine__t1 ; + sysml:owningRelationship elmt:Bodies__Ctx__Machine__t1_linkparam_om ; + sysml:owningMembership elmt:Bodies__Ctx__Machine__t1_linkparam_om . + +elmt:Bodies__Ctx__Machine__t1_linkparam_om + a sysml:ParameterMembership ; + sysml:elementId "Bodies__Ctx__Machine__t1_linkparam_om" ; + sysml:owner elmt:Bodies__Ctx__Machine__t1 ; + sysml:memberElement elmt:Bodies__Ctx__Machine__t1_linkparam ; + sysml:ownedMemberElement elmt:Bodies__Ctx__Machine__t1_linkparam ; + sysml:ownedRelatedElement elmt:Bodies__Ctx__Machine__t1_linkparam ; + sysml:owningRelatedElement elmt:Bodies__Ctx__Machine__t1 ; + sysml:membershipOwningNamespace elmt:Bodies__Ctx__Machine__t1 ; + sysml:ownedMemberFeature elmt:Bodies__Ctx__Machine__t1_linkparam ; + sysml:ownedMemberParameter elmt:Bodies__Ctx__Machine__t1_linkparam . + elmt:Bodies__Ctx__Machine__t1_succession a sysml:SuccessionAsUsage ; sysml:elementId "Bodies__Ctx__Machine__t1_succession" ; @@ -3550,21 +3766,23 @@ elmt:Bodies__Ctx__Machine___403 sysml:owningRelationship elmt:Bodies__Ctx__Machine___403_om ; sysml:owningMembership elmt:Bodies__Ctx__Machine___403_om ; sysx:transitionSyntax "first" ; + sysml:ownedRelationship expr:Bodies__Ctx__Machine___403_psourcemember, elmt:Bodies__Ctx__Machine___403_linkparam_om, elmt:Bodies__Ctx__Machine___403___400_om, elmt:Bodies__Ctx__Machine___403_succession_om ; + sysml:ownedMembership expr:Bodies__Ctx__Machine___403_psourcemember, elmt:Bodies__Ctx__Machine___403_linkparam_om, elmt:Bodies__Ctx__Machine___403___400_om, elmt:Bodies__Ctx__Machine___403_succession_om ; + sysml:ownedFeatureMembership elmt:Bodies__Ctx__Machine___403_linkparam_om, elmt:Bodies__Ctx__Machine___403___400_om ; + sysml:ownedFeature elmt:Bodies__Ctx__Machine___403_linkparam, elmt:Bodies__Ctx__Machine___403___400 ; sysml:succession elmt:Bodies__Ctx__Machine___403_succession ; sysx:hasEffect "true"^^xsd:boolean ; sysx:effectMember elmt:Bodies__Ctx__Machine___403___400 ; sysx:hasBody "true"^^xsd:boolean ; sysml:effectAction elmt:Bodies__Ctx__Machine___403___400 ; sysml:ownedMember elmt:Bodies__Ctx__Machine___403___400 ; - sysml:ownedMembership elmt:Bodies__Ctx__Machine___403___400_om, elmt:Bodies__Ctx__Machine___403_succession_om ; - sysml:ownedRelationship elmt:Bodies__Ctx__Machine___403___400_om, elmt:Bodies__Ctx__Machine___403_succession_om ; - sysml:ownedFeature elmt:Bodies__Ctx__Machine___403___400 ; - sysml:ownedFeatureMembership elmt:Bodies__Ctx__Machine___403___400_om ; sysml:source elmt:Bodies__Ctx__Machine__on ; sysml:target elmt:Bodies__Ctx__Machine__off ; sysx:sourceText " transition first on do assign x.a := 1 then off {\n }\n" ; - json:ownedMembership "[{\"@id\":\"Bodies__Ctx__Machine___403___400_om\"},{\"@id\":\"Bodies__Ctx__Machine___403_succession_om\"}]" ; - json:ownedRelationship "[{\"@id\":\"Bodies__Ctx__Machine___403___400_om\"},{\"@id\":\"Bodies__Ctx__Machine___403_succession_om\"}]" . + json:ownedRelationship "[{\"@id\":\"Bodies__Ctx__Machine___403_psourcemember\"},{\"@id\":\"Bodies__Ctx__Machine___403_linkparam_om\"},{\"@id\":\"Bodies__Ctx__Machine___403___400_om\"},{\"@id\":\"Bodies__Ctx__Machine___403_succession_om\"}]" ; + json:ownedMembership "[{\"@id\":\"Bodies__Ctx__Machine___403_psourcemember\"},{\"@id\":\"Bodies__Ctx__Machine___403_linkparam_om\"},{\"@id\":\"Bodies__Ctx__Machine___403___400_om\"},{\"@id\":\"Bodies__Ctx__Machine___403_succession_om\"}]" ; + json:ownedFeatureMembership "[{\"@id\":\"Bodies__Ctx__Machine___403_linkparam_om\"},{\"@id\":\"Bodies__Ctx__Machine___403___400_om\"}]" ; + json:ownedFeature "[{\"@id\":\"Bodies__Ctx__Machine___403_linkparam\"},{\"@id\":\"Bodies__Ctx__Machine___403___400\"}]" . elmt:Bodies__Ctx__Machine___403_om a sysml:FeatureMembership ; @@ -3578,6 +3796,34 @@ elmt:Bodies__Ctx__Machine___403_om sysml:ownedMemberFeature elmt:Bodies__Ctx__Machine___403 ; sysml:owningType elmt:Bodies__Ctx__Machine . +expr:Bodies__Ctx__Machine___403_psourcemember + a sysml:Membership ; + sysml:elementId "Bodies__Ctx__Machine___403_psourcemember" ; + sysml:owner elmt:Bodies__Ctx__Machine___403 ; + sysml:memberElement elmt:Bodies__Ctx__Machine__on ; + sysml:owningRelatedElement elmt:Bodies__Ctx__Machine___403 ; + sysml:membershipOwningNamespace elmt:Bodies__Ctx__Machine___403 . + +elmt:Bodies__Ctx__Machine___403_linkparam + a sysml:ReferenceUsage ; + sysml:elementId "Bodies__Ctx__Machine___403_linkparam" ; + sysml:direction "in" ; + sysml:owner elmt:Bodies__Ctx__Machine___403 ; + sysml:owningRelationship elmt:Bodies__Ctx__Machine___403_linkparam_om ; + sysml:owningMembership elmt:Bodies__Ctx__Machine___403_linkparam_om . + +elmt:Bodies__Ctx__Machine___403_linkparam_om + a sysml:ParameterMembership ; + sysml:elementId "Bodies__Ctx__Machine___403_linkparam_om" ; + sysml:owner elmt:Bodies__Ctx__Machine___403 ; + sysml:memberElement elmt:Bodies__Ctx__Machine___403_linkparam ; + sysml:ownedMemberElement elmt:Bodies__Ctx__Machine___403_linkparam ; + sysml:ownedRelatedElement elmt:Bodies__Ctx__Machine___403_linkparam ; + sysml:owningRelatedElement elmt:Bodies__Ctx__Machine___403 ; + sysml:membershipOwningNamespace elmt:Bodies__Ctx__Machine___403 ; + sysml:ownedMemberFeature elmt:Bodies__Ctx__Machine___403_linkparam ; + sysml:ownedMemberParameter elmt:Bodies__Ctx__Machine___403_linkparam . + elmt:Bodies__Ctx__Machine___403_succession a sysml:SuccessionAsUsage ; sysml:elementId "Bodies__Ctx__Machine___403_succession" ; @@ -3857,6 +4103,10 @@ elmt:Bodies__Ctx__Machine___404 sysml:owningRelationship elmt:Bodies__Ctx__Machine___404_om ; sysml:owningMembership elmt:Bodies__Ctx__Machine___404_om ; sysx:transitionSyntax "first" ; + sysml:ownedRelationship expr:Bodies__Ctx__Machine___404_psourcemember, elmt:Bodies__Ctx__Machine___404_linkparam_om, elmt:Bodies__Ctx__Machine___404___400_om, elmt:Bodies__Ctx__Machine___404_succession_om, elmt:Bodies__Ctx__Machine___404__w_om ; + sysml:ownedMembership expr:Bodies__Ctx__Machine___404_psourcemember, elmt:Bodies__Ctx__Machine___404_linkparam_om, elmt:Bodies__Ctx__Machine___404___400_om, elmt:Bodies__Ctx__Machine___404_succession_om, elmt:Bodies__Ctx__Machine___404__w_om ; + sysml:ownedFeatureMembership elmt:Bodies__Ctx__Machine___404_linkparam_om, elmt:Bodies__Ctx__Machine___404___400_om, elmt:Bodies__Ctx__Machine___404__w_om ; + sysml:ownedFeature elmt:Bodies__Ctx__Machine___404_linkparam, elmt:Bodies__Ctx__Machine___404___400, elmt:Bodies__Ctx__Machine___404__w ; sysml:succession elmt:Bodies__Ctx__Machine___404_succession ; sysx:hasEffect "true"^^xsd:boolean ; sysx:effectMember elmt:Bodies__Ctx__Machine___404___400 ; @@ -3864,18 +4114,14 @@ elmt:Bodies__Ctx__Machine___404 sysx:hasBody "true"^^xsd:boolean ; sysml:effectAction elmt:Bodies__Ctx__Machine___404___400 ; sysml:ownedMember elmt:Bodies__Ctx__Machine___404___400, elmt:Bodies__Ctx__Machine___404__w ; - sysml:ownedMembership elmt:Bodies__Ctx__Machine___404___400_om, elmt:Bodies__Ctx__Machine___404_succession_om, elmt:Bodies__Ctx__Machine___404__w_om ; - sysml:ownedRelationship elmt:Bodies__Ctx__Machine___404___400_om, elmt:Bodies__Ctx__Machine___404_succession_om, elmt:Bodies__Ctx__Machine___404__w_om ; - sysml:ownedFeature elmt:Bodies__Ctx__Machine___404___400, elmt:Bodies__Ctx__Machine___404__w ; - sysml:ownedFeatureMembership elmt:Bodies__Ctx__Machine___404___400_om, elmt:Bodies__Ctx__Machine___404__w_om ; sysml:source elmt:Bodies__Ctx__Machine__off ; sysml:target elmt:Bodies__Ctx__Machine__on ; sysx:sourceText " transition first off do {\n assign x.a := 2;\n } then on {\n attribute w : Prio;\n }\n" ; - json:ownedMember "[{\"@id\":\"Bodies__Ctx__Machine___404___400\"},{\"@id\":\"Bodies__Ctx__Machine___404__w\"}]" ; - json:ownedMembership "[{\"@id\":\"Bodies__Ctx__Machine___404___400_om\"},{\"@id\":\"Bodies__Ctx__Machine___404_succession_om\"},{\"@id\":\"Bodies__Ctx__Machine___404__w_om\"}]" ; - json:ownedRelationship "[{\"@id\":\"Bodies__Ctx__Machine___404___400_om\"},{\"@id\":\"Bodies__Ctx__Machine___404_succession_om\"},{\"@id\":\"Bodies__Ctx__Machine___404__w_om\"}]" ; - json:ownedFeature "[{\"@id\":\"Bodies__Ctx__Machine___404___400\"},{\"@id\":\"Bodies__Ctx__Machine___404__w\"}]" ; - json:ownedFeatureMembership "[{\"@id\":\"Bodies__Ctx__Machine___404___400_om\"},{\"@id\":\"Bodies__Ctx__Machine___404__w_om\"}]" . + json:ownedRelationship "[{\"@id\":\"Bodies__Ctx__Machine___404_psourcemember\"},{\"@id\":\"Bodies__Ctx__Machine___404_linkparam_om\"},{\"@id\":\"Bodies__Ctx__Machine___404___400_om\"},{\"@id\":\"Bodies__Ctx__Machine___404_succession_om\"},{\"@id\":\"Bodies__Ctx__Machine___404__w_om\"}]" ; + json:ownedMembership "[{\"@id\":\"Bodies__Ctx__Machine___404_psourcemember\"},{\"@id\":\"Bodies__Ctx__Machine___404_linkparam_om\"},{\"@id\":\"Bodies__Ctx__Machine___404___400_om\"},{\"@id\":\"Bodies__Ctx__Machine___404_succession_om\"},{\"@id\":\"Bodies__Ctx__Machine___404__w_om\"}]" ; + json:ownedFeatureMembership "[{\"@id\":\"Bodies__Ctx__Machine___404_linkparam_om\"},{\"@id\":\"Bodies__Ctx__Machine___404___400_om\"},{\"@id\":\"Bodies__Ctx__Machine___404__w_om\"}]" ; + json:ownedFeature "[{\"@id\":\"Bodies__Ctx__Machine___404_linkparam\"},{\"@id\":\"Bodies__Ctx__Machine___404___400\"},{\"@id\":\"Bodies__Ctx__Machine___404__w\"}]" ; + json:ownedMember "[{\"@id\":\"Bodies__Ctx__Machine___404___400\"},{\"@id\":\"Bodies__Ctx__Machine___404__w\"}]" . elmt:Bodies__Ctx__Machine___404_om a sysml:FeatureMembership ; @@ -3889,6 +4135,34 @@ elmt:Bodies__Ctx__Machine___404_om sysml:ownedMemberFeature elmt:Bodies__Ctx__Machine___404 ; sysml:owningType elmt:Bodies__Ctx__Machine . +expr:Bodies__Ctx__Machine___404_psourcemember + a sysml:Membership ; + sysml:elementId "Bodies__Ctx__Machine___404_psourcemember" ; + sysml:owner elmt:Bodies__Ctx__Machine___404 ; + sysml:memberElement elmt:Bodies__Ctx__Machine__off ; + sysml:owningRelatedElement elmt:Bodies__Ctx__Machine___404 ; + sysml:membershipOwningNamespace elmt:Bodies__Ctx__Machine___404 . + +elmt:Bodies__Ctx__Machine___404_linkparam + a sysml:ReferenceUsage ; + sysml:elementId "Bodies__Ctx__Machine___404_linkparam" ; + sysml:direction "in" ; + sysml:owner elmt:Bodies__Ctx__Machine___404 ; + sysml:owningRelationship elmt:Bodies__Ctx__Machine___404_linkparam_om ; + sysml:owningMembership elmt:Bodies__Ctx__Machine___404_linkparam_om . + +elmt:Bodies__Ctx__Machine___404_linkparam_om + a sysml:ParameterMembership ; + sysml:elementId "Bodies__Ctx__Machine___404_linkparam_om" ; + sysml:owner elmt:Bodies__Ctx__Machine___404 ; + sysml:memberElement elmt:Bodies__Ctx__Machine___404_linkparam ; + sysml:ownedMemberElement elmt:Bodies__Ctx__Machine___404_linkparam ; + sysml:ownedRelatedElement elmt:Bodies__Ctx__Machine___404_linkparam ; + sysml:owningRelatedElement elmt:Bodies__Ctx__Machine___404 ; + sysml:membershipOwningNamespace elmt:Bodies__Ctx__Machine___404 ; + sysml:ownedMemberFeature elmt:Bodies__Ctx__Machine___404_linkparam ; + sysml:ownedMemberParameter elmt:Bodies__Ctx__Machine___404_linkparam . + elmt:Bodies__Ctx__Machine___404_succession a sysml:SuccessionAsUsage ; sysml:elementId "Bodies__Ctx__Machine___404_succession" ; diff --git a/tests/export/testdata/convert/endpoint_scopes.golden.ttl b/tests/export/testdata/convert/endpoint_scopes.golden.ttl index 1e515c5280..82d9231229 100644 --- a/tests/export/testdata/convert/endpoint_scopes.golden.ttl +++ b/tests/export/testdata/convert/endpoint_scopes.golden.ttl @@ -325,11 +325,15 @@ elmt:Machines__Lamp__on__heat___404 sysml:owningRelationship elmt:Machines__Lamp__on__heat___404_om ; sysml:owningMembership elmt:Machines__Lamp__on__heat___404_om ; sysx:transitionSyntax "source" ; + sysml:ownedRelationship expr:Machines__Lamp__on__heat___404_psourcemember, elmt:Machines__Lamp__on__heat___404_linkparam_om, elmt:Machines__Lamp__on__heat___404_succession_om ; + sysml:ownedMembership expr:Machines__Lamp__on__heat___404_psourcemember, elmt:Machines__Lamp__on__heat___404_linkparam_om, elmt:Machines__Lamp__on__heat___404_succession_om ; + sysml:ownedFeatureMembership elmt:Machines__Lamp__on__heat___404_linkparam_om ; + sysml:ownedFeature elmt:Machines__Lamp__on__heat___404_linkparam ; sysml:succession elmt:Machines__Lamp__on__heat___404_succession ; - sysml:ownedRelationship elmt:Machines__Lamp__on__heat___404_succession_om ; - sysml:ownedMembership elmt:Machines__Lamp__on__heat___404_succession_om ; sysml:source elmt:Machines__Lamp__on__heat__warm ; - sysml:target elmt:Machines__Lamp__on__heat__hot . + sysml:target elmt:Machines__Lamp__on__heat__hot ; + json:ownedRelationship "[{\"@id\":\"Machines__Lamp__on__heat___404_psourcemember\"},{\"@id\":\"Machines__Lamp__on__heat___404_linkparam_om\"},{\"@id\":\"Machines__Lamp__on__heat___404_succession_om\"}]" ; + json:ownedMembership "[{\"@id\":\"Machines__Lamp__on__heat___404_psourcemember\"},{\"@id\":\"Machines__Lamp__on__heat___404_linkparam_om\"},{\"@id\":\"Machines__Lamp__on__heat___404_succession_om\"}]" . elmt:Machines__Lamp__on__heat___404_om a sysml:FeatureMembership ; @@ -343,6 +347,34 @@ elmt:Machines__Lamp__on__heat___404_om sysml:ownedMemberFeature elmt:Machines__Lamp__on__heat___404 ; sysml:owningType elmt:Machines__Lamp__on__heat . +expr:Machines__Lamp__on__heat___404_psourcemember + a sysml:Membership ; + sysml:elementId "Machines__Lamp__on__heat___404_psourcemember" ; + sysml:owner elmt:Machines__Lamp__on__heat___404 ; + sysml:memberElement elmt:Machines__Lamp__on__heat__warm ; + sysml:owningRelatedElement elmt:Machines__Lamp__on__heat___404 ; + sysml:membershipOwningNamespace elmt:Machines__Lamp__on__heat___404 . + +elmt:Machines__Lamp__on__heat___404_linkparam + a sysml:ReferenceUsage ; + sysml:elementId "Machines__Lamp__on__heat___404_linkparam" ; + sysml:direction "in" ; + sysml:owner elmt:Machines__Lamp__on__heat___404 ; + sysml:owningRelationship elmt:Machines__Lamp__on__heat___404_linkparam_om ; + sysml:owningMembership elmt:Machines__Lamp__on__heat___404_linkparam_om . + +elmt:Machines__Lamp__on__heat___404_linkparam_om + a sysml:ParameterMembership ; + sysml:elementId "Machines__Lamp__on__heat___404_linkparam_om" ; + sysml:owner elmt:Machines__Lamp__on__heat___404 ; + sysml:memberElement elmt:Machines__Lamp__on__heat___404_linkparam ; + sysml:ownedMemberElement elmt:Machines__Lamp__on__heat___404_linkparam ; + sysml:ownedRelatedElement elmt:Machines__Lamp__on__heat___404_linkparam ; + sysml:owningRelatedElement elmt:Machines__Lamp__on__heat___404 ; + sysml:membershipOwningNamespace elmt:Machines__Lamp__on__heat___404 ; + sysml:ownedMemberFeature elmt:Machines__Lamp__on__heat___404_linkparam ; + sysml:ownedMemberParameter elmt:Machines__Lamp__on__heat___404_linkparam . + elmt:Machines__Lamp__on__heat___404_succession a sysml:SuccessionAsUsage ; sysml:elementId "Machines__Lamp__on__heat___404_succession" ; @@ -583,11 +615,15 @@ elmt:Machines__Lamp__on__light___404 sysml:owningRelationship elmt:Machines__Lamp__on__light___404_om ; sysml:owningMembership elmt:Machines__Lamp__on__light___404_om ; sysx:transitionSyntax "source" ; + sysml:ownedRelationship expr:Machines__Lamp__on__light___404_psourcemember, elmt:Machines__Lamp__on__light___404_linkparam_om, elmt:Machines__Lamp__on__light___404_succession_om ; + sysml:ownedMembership expr:Machines__Lamp__on__light___404_psourcemember, elmt:Machines__Lamp__on__light___404_linkparam_om, elmt:Machines__Lamp__on__light___404_succession_om ; + sysml:ownedFeatureMembership elmt:Machines__Lamp__on__light___404_linkparam_om ; + sysml:ownedFeature elmt:Machines__Lamp__on__light___404_linkparam ; sysml:succession elmt:Machines__Lamp__on__light___404_succession ; - sysml:ownedRelationship elmt:Machines__Lamp__on__light___404_succession_om ; - sysml:ownedMembership elmt:Machines__Lamp__on__light___404_succession_om ; sysml:source elmt:Machines__Lamp__on__light__dim ; - sysml:target elmt:Machines__Lamp__on__light__bright . + sysml:target elmt:Machines__Lamp__on__light__bright ; + json:ownedRelationship "[{\"@id\":\"Machines__Lamp__on__light___404_psourcemember\"},{\"@id\":\"Machines__Lamp__on__light___404_linkparam_om\"},{\"@id\":\"Machines__Lamp__on__light___404_succession_om\"}]" ; + json:ownedMembership "[{\"@id\":\"Machines__Lamp__on__light___404_psourcemember\"},{\"@id\":\"Machines__Lamp__on__light___404_linkparam_om\"},{\"@id\":\"Machines__Lamp__on__light___404_succession_om\"}]" . elmt:Machines__Lamp__on__light___404_om a sysml:FeatureMembership ; @@ -601,6 +637,34 @@ elmt:Machines__Lamp__on__light___404_om sysml:ownedMemberFeature elmt:Machines__Lamp__on__light___404 ; sysml:owningType elmt:Machines__Lamp__on__light . +expr:Machines__Lamp__on__light___404_psourcemember + a sysml:Membership ; + sysml:elementId "Machines__Lamp__on__light___404_psourcemember" ; + sysml:owner elmt:Machines__Lamp__on__light___404 ; + sysml:memberElement elmt:Machines__Lamp__on__light__dim ; + sysml:owningRelatedElement elmt:Machines__Lamp__on__light___404 ; + sysml:membershipOwningNamespace elmt:Machines__Lamp__on__light___404 . + +elmt:Machines__Lamp__on__light___404_linkparam + a sysml:ReferenceUsage ; + sysml:elementId "Machines__Lamp__on__light___404_linkparam" ; + sysml:direction "in" ; + sysml:owner elmt:Machines__Lamp__on__light___404 ; + sysml:owningRelationship elmt:Machines__Lamp__on__light___404_linkparam_om ; + sysml:owningMembership elmt:Machines__Lamp__on__light___404_linkparam_om . + +elmt:Machines__Lamp__on__light___404_linkparam_om + a sysml:ParameterMembership ; + sysml:elementId "Machines__Lamp__on__light___404_linkparam_om" ; + sysml:owner elmt:Machines__Lamp__on__light___404 ; + sysml:memberElement elmt:Machines__Lamp__on__light___404_linkparam ; + sysml:ownedMemberElement elmt:Machines__Lamp__on__light___404_linkparam ; + sysml:ownedRelatedElement elmt:Machines__Lamp__on__light___404_linkparam ; + sysml:owningRelatedElement elmt:Machines__Lamp__on__light___404 ; + sysml:membershipOwningNamespace elmt:Machines__Lamp__on__light___404 ; + sysml:ownedMemberFeature elmt:Machines__Lamp__on__light___404_linkparam ; + sysml:ownedMemberParameter elmt:Machines__Lamp__on__light___404_linkparam . + elmt:Machines__Lamp__on__light___404_succession a sysml:SuccessionAsUsage ; sysml:elementId "Machines__Lamp__on__light___404_succession" ; @@ -702,11 +766,15 @@ elmt:Machines__Lamp__on__light___405 sysml:owningRelationship elmt:Machines__Lamp__on__light___405_om ; sysml:owningMembership elmt:Machines__Lamp__on__light___405_om ; sysx:transitionSyntax "source" ; + sysml:ownedRelationship expr:Machines__Lamp__on__light___405_psourcemember, elmt:Machines__Lamp__on__light___405_linkparam_om, elmt:Machines__Lamp__on__light___405_succession_om ; + sysml:ownedMembership expr:Machines__Lamp__on__light___405_psourcemember, elmt:Machines__Lamp__on__light___405_linkparam_om, elmt:Machines__Lamp__on__light___405_succession_om ; + sysml:ownedFeatureMembership elmt:Machines__Lamp__on__light___405_linkparam_om ; + sysml:ownedFeature elmt:Machines__Lamp__on__light___405_linkparam ; sysml:succession elmt:Machines__Lamp__on__light___405_succession ; - sysml:ownedRelationship elmt:Machines__Lamp__on__light___405_succession_om ; - sysml:ownedMembership elmt:Machines__Lamp__on__light___405_succession_om ; sysml:source elmt:Machines__Lamp__on__light__bright ; - sysml:target elmt:Machines__Lamp__on__heat__hot . + sysml:target elmt:Machines__Lamp__on__heat__hot ; + json:ownedRelationship "[{\"@id\":\"Machines__Lamp__on__light___405_psourcemember\"},{\"@id\":\"Machines__Lamp__on__light___405_linkparam_om\"},{\"@id\":\"Machines__Lamp__on__light___405_succession_om\"}]" ; + json:ownedMembership "[{\"@id\":\"Machines__Lamp__on__light___405_psourcemember\"},{\"@id\":\"Machines__Lamp__on__light___405_linkparam_om\"},{\"@id\":\"Machines__Lamp__on__light___405_succession_om\"}]" . elmt:Machines__Lamp__on__light___405_om a sysml:FeatureMembership ; @@ -720,6 +788,34 @@ elmt:Machines__Lamp__on__light___405_om sysml:ownedMemberFeature elmt:Machines__Lamp__on__light___405 ; sysml:owningType elmt:Machines__Lamp__on__light . +expr:Machines__Lamp__on__light___405_psourcemember + a sysml:Membership ; + sysml:elementId "Machines__Lamp__on__light___405_psourcemember" ; + sysml:owner elmt:Machines__Lamp__on__light___405 ; + sysml:memberElement elmt:Machines__Lamp__on__light__bright ; + sysml:owningRelatedElement elmt:Machines__Lamp__on__light___405 ; + sysml:membershipOwningNamespace elmt:Machines__Lamp__on__light___405 . + +elmt:Machines__Lamp__on__light___405_linkparam + a sysml:ReferenceUsage ; + sysml:elementId "Machines__Lamp__on__light___405_linkparam" ; + sysml:direction "in" ; + sysml:owner elmt:Machines__Lamp__on__light___405 ; + sysml:owningRelationship elmt:Machines__Lamp__on__light___405_linkparam_om ; + sysml:owningMembership elmt:Machines__Lamp__on__light___405_linkparam_om . + +elmt:Machines__Lamp__on__light___405_linkparam_om + a sysml:ParameterMembership ; + sysml:elementId "Machines__Lamp__on__light___405_linkparam_om" ; + sysml:owner elmt:Machines__Lamp__on__light___405 ; + sysml:memberElement elmt:Machines__Lamp__on__light___405_linkparam ; + sysml:ownedMemberElement elmt:Machines__Lamp__on__light___405_linkparam ; + sysml:ownedRelatedElement elmt:Machines__Lamp__on__light___405_linkparam ; + sysml:owningRelatedElement elmt:Machines__Lamp__on__light___405 ; + sysml:membershipOwningNamespace elmt:Machines__Lamp__on__light___405 ; + sysml:ownedMemberFeature elmt:Machines__Lamp__on__light___405_linkparam ; + sysml:ownedMemberParameter elmt:Machines__Lamp__on__light___405_linkparam . + elmt:Machines__Lamp__on__light___405_succession a sysml:SuccessionAsUsage ; sysml:elementId "Machines__Lamp__on__light___405_succession" ; @@ -821,11 +917,15 @@ elmt:Machines__Lamp___404 sysml:owningRelationship elmt:Machines__Lamp___404_om ; sysml:owningMembership elmt:Machines__Lamp___404_om ; sysx:transitionSyntax "source" ; + sysml:ownedRelationship expr:Machines__Lamp___404_psourcemember, elmt:Machines__Lamp___404_linkparam_om, elmt:Machines__Lamp___404_succession_om ; + sysml:ownedMembership expr:Machines__Lamp___404_psourcemember, elmt:Machines__Lamp___404_linkparam_om, elmt:Machines__Lamp___404_succession_om ; + sysml:ownedFeatureMembership elmt:Machines__Lamp___404_linkparam_om ; + sysml:ownedFeature elmt:Machines__Lamp___404_linkparam ; sysml:succession elmt:Machines__Lamp___404_succession ; - sysml:ownedRelationship elmt:Machines__Lamp___404_succession_om ; - sysml:ownedMembership elmt:Machines__Lamp___404_succession_om ; sysml:source elmt:Machines__Lamp__off ; - sysml:target elmt:Machines__Lamp__on . + sysml:target elmt:Machines__Lamp__on ; + json:ownedRelationship "[{\"@id\":\"Machines__Lamp___404_psourcemember\"},{\"@id\":\"Machines__Lamp___404_linkparam_om\"},{\"@id\":\"Machines__Lamp___404_succession_om\"}]" ; + json:ownedMembership "[{\"@id\":\"Machines__Lamp___404_psourcemember\"},{\"@id\":\"Machines__Lamp___404_linkparam_om\"},{\"@id\":\"Machines__Lamp___404_succession_om\"}]" . elmt:Machines__Lamp___404_om a sysml:FeatureMembership ; @@ -839,6 +939,34 @@ elmt:Machines__Lamp___404_om sysml:ownedMemberFeature elmt:Machines__Lamp___404 ; sysml:owningType elmt:Machines__Lamp . +expr:Machines__Lamp___404_psourcemember + a sysml:Membership ; + sysml:elementId "Machines__Lamp___404_psourcemember" ; + sysml:owner elmt:Machines__Lamp___404 ; + sysml:memberElement elmt:Machines__Lamp__off ; + sysml:owningRelatedElement elmt:Machines__Lamp___404 ; + sysml:membershipOwningNamespace elmt:Machines__Lamp___404 . + +elmt:Machines__Lamp___404_linkparam + a sysml:ReferenceUsage ; + sysml:elementId "Machines__Lamp___404_linkparam" ; + sysml:direction "in" ; + sysml:owner elmt:Machines__Lamp___404 ; + sysml:owningRelationship elmt:Machines__Lamp___404_linkparam_om ; + sysml:owningMembership elmt:Machines__Lamp___404_linkparam_om . + +elmt:Machines__Lamp___404_linkparam_om + a sysml:ParameterMembership ; + sysml:elementId "Machines__Lamp___404_linkparam_om" ; + sysml:owner elmt:Machines__Lamp___404 ; + sysml:memberElement elmt:Machines__Lamp___404_linkparam ; + sysml:ownedMemberElement elmt:Machines__Lamp___404_linkparam ; + sysml:ownedRelatedElement elmt:Machines__Lamp___404_linkparam ; + sysml:owningRelatedElement elmt:Machines__Lamp___404 ; + sysml:membershipOwningNamespace elmt:Machines__Lamp___404 ; + sysml:ownedMemberFeature elmt:Machines__Lamp___404_linkparam ; + sysml:ownedMemberParameter elmt:Machines__Lamp___404_linkparam . + elmt:Machines__Lamp___404_succession a sysml:SuccessionAsUsage ; sysml:elementId "Machines__Lamp___404_succession" ; @@ -940,11 +1068,15 @@ elmt:Machines__Lamp___405 sysml:owningRelationship elmt:Machines__Lamp___405_om ; sysml:owningMembership elmt:Machines__Lamp___405_om ; sysx:transitionSyntax "source" ; + sysml:ownedRelationship expr:Machines__Lamp___405_psourcemember, elmt:Machines__Lamp___405_linkparam_om, elmt:Machines__Lamp___405_succession_om ; + sysml:ownedMembership expr:Machines__Lamp___405_psourcemember, elmt:Machines__Lamp___405_linkparam_om, elmt:Machines__Lamp___405_succession_om ; + sysml:ownedFeatureMembership elmt:Machines__Lamp___405_linkparam_om ; + sysml:ownedFeature elmt:Machines__Lamp___405_linkparam ; sysml:succession elmt:Machines__Lamp___405_succession ; - sysml:ownedRelationship elmt:Machines__Lamp___405_succession_om ; - sysml:ownedMembership elmt:Machines__Lamp___405_succession_om ; sysml:source elmt:Machines__Lamp__on ; - sysml:target elmt:Machines__Lamp__on__light__bright . + sysml:target elmt:Machines__Lamp__on__light__bright ; + json:ownedRelationship "[{\"@id\":\"Machines__Lamp___405_psourcemember\"},{\"@id\":\"Machines__Lamp___405_linkparam_om\"},{\"@id\":\"Machines__Lamp___405_succession_om\"}]" ; + json:ownedMembership "[{\"@id\":\"Machines__Lamp___405_psourcemember\"},{\"@id\":\"Machines__Lamp___405_linkparam_om\"},{\"@id\":\"Machines__Lamp___405_succession_om\"}]" . elmt:Machines__Lamp___405_om a sysml:FeatureMembership ; @@ -958,6 +1090,34 @@ elmt:Machines__Lamp___405_om sysml:ownedMemberFeature elmt:Machines__Lamp___405 ; sysml:owningType elmt:Machines__Lamp . +expr:Machines__Lamp___405_psourcemember + a sysml:Membership ; + sysml:elementId "Machines__Lamp___405_psourcemember" ; + sysml:owner elmt:Machines__Lamp___405 ; + sysml:memberElement elmt:Machines__Lamp__on ; + sysml:owningRelatedElement elmt:Machines__Lamp___405 ; + sysml:membershipOwningNamespace elmt:Machines__Lamp___405 . + +elmt:Machines__Lamp___405_linkparam + a sysml:ReferenceUsage ; + sysml:elementId "Machines__Lamp___405_linkparam" ; + sysml:direction "in" ; + sysml:owner elmt:Machines__Lamp___405 ; + sysml:owningRelationship elmt:Machines__Lamp___405_linkparam_om ; + sysml:owningMembership elmt:Machines__Lamp___405_linkparam_om . + +elmt:Machines__Lamp___405_linkparam_om + a sysml:ParameterMembership ; + sysml:elementId "Machines__Lamp___405_linkparam_om" ; + sysml:owner elmt:Machines__Lamp___405 ; + sysml:memberElement elmt:Machines__Lamp___405_linkparam ; + sysml:ownedMemberElement elmt:Machines__Lamp___405_linkparam ; + sysml:ownedRelatedElement elmt:Machines__Lamp___405_linkparam ; + sysml:owningRelatedElement elmt:Machines__Lamp___405 ; + sysml:membershipOwningNamespace elmt:Machines__Lamp___405 ; + sysml:ownedMemberFeature elmt:Machines__Lamp___405_linkparam ; + sysml:ownedMemberParameter elmt:Machines__Lamp___405_linkparam . + elmt:Machines__Lamp___405_succession a sysml:SuccessionAsUsage ; sysml:elementId "Machines__Lamp___405_succession" ; @@ -1059,11 +1219,15 @@ elmt:Machines__Lamp___406 sysml:owningRelationship elmt:Machines__Lamp___406_om ; sysml:owningMembership elmt:Machines__Lamp___406_om ; sysx:transitionSyntax "source" ; + sysml:ownedRelationship expr:Machines__Lamp___406_psourcemember, elmt:Machines__Lamp___406_linkparam_om, elmt:Machines__Lamp___406_succession_om ; + sysml:ownedMembership expr:Machines__Lamp___406_psourcemember, elmt:Machines__Lamp___406_linkparam_om, elmt:Machines__Lamp___406_succession_om ; + sysml:ownedFeatureMembership elmt:Machines__Lamp___406_linkparam_om ; + sysml:ownedFeature elmt:Machines__Lamp___406_linkparam ; sysml:succession elmt:Machines__Lamp___406_succession ; - sysml:ownedRelationship elmt:Machines__Lamp___406_succession_om ; - sysml:ownedMembership elmt:Machines__Lamp___406_succession_om ; sysml:source elmt:Machines__Lamp__on__heat__hot ; - sysml:target elmt:Machines__Lamp__off . + sysml:target elmt:Machines__Lamp__off ; + json:ownedRelationship "[{\"@id\":\"Machines__Lamp___406_psourcemember\"},{\"@id\":\"Machines__Lamp___406_linkparam_om\"},{\"@id\":\"Machines__Lamp___406_succession_om\"}]" ; + json:ownedMembership "[{\"@id\":\"Machines__Lamp___406_psourcemember\"},{\"@id\":\"Machines__Lamp___406_linkparam_om\"},{\"@id\":\"Machines__Lamp___406_succession_om\"}]" . elmt:Machines__Lamp___406_om a sysml:FeatureMembership ; @@ -1077,6 +1241,34 @@ elmt:Machines__Lamp___406_om sysml:ownedMemberFeature elmt:Machines__Lamp___406 ; sysml:owningType elmt:Machines__Lamp . +expr:Machines__Lamp___406_psourcemember + a sysml:Membership ; + sysml:elementId "Machines__Lamp___406_psourcemember" ; + sysml:owner elmt:Machines__Lamp___406 ; + sysml:memberElement elmt:Machines__Lamp__on__heat__hot ; + sysml:owningRelatedElement elmt:Machines__Lamp___406 ; + sysml:membershipOwningNamespace elmt:Machines__Lamp___406 . + +elmt:Machines__Lamp___406_linkparam + a sysml:ReferenceUsage ; + sysml:elementId "Machines__Lamp___406_linkparam" ; + sysml:direction "in" ; + sysml:owner elmt:Machines__Lamp___406 ; + sysml:owningRelationship elmt:Machines__Lamp___406_linkparam_om ; + sysml:owningMembership elmt:Machines__Lamp___406_linkparam_om . + +elmt:Machines__Lamp___406_linkparam_om + a sysml:ParameterMembership ; + sysml:elementId "Machines__Lamp___406_linkparam_om" ; + sysml:owner elmt:Machines__Lamp___406 ; + sysml:memberElement elmt:Machines__Lamp___406_linkparam ; + sysml:ownedMemberElement elmt:Machines__Lamp___406_linkparam ; + sysml:ownedRelatedElement elmt:Machines__Lamp___406_linkparam ; + sysml:owningRelatedElement elmt:Machines__Lamp___406 ; + sysml:membershipOwningNamespace elmt:Machines__Lamp___406 ; + sysml:ownedMemberFeature elmt:Machines__Lamp___406_linkparam ; + sysml:ownedMemberParameter elmt:Machines__Lamp___406_linkparam . + elmt:Machines__Lamp___406_succession a sysml:SuccessionAsUsage ; sysml:elementId "Machines__Lamp___406_succession" ; diff --git a/tests/export/testdata/convert/imported_references.golden.ttl b/tests/export/testdata/convert/imported_references.golden.ttl index df27c7a288..62c27f9081 100644 --- a/tests/export/testdata/convert/imported_references.golden.ttl +++ b/tests/export/testdata/convert/imported_references.golden.ttl @@ -1276,11 +1276,15 @@ elmt:R90__Run___403 sysml:owningRelationship elmt:R90__Run___403_om ; sysml:owningMembership elmt:R90__Run___403_om ; sysx:transitionSyntax "source" ; + sysml:ownedRelationship expr:R90__Run___403_psourcemember, elmt:R90__Run___403_linkparam_om, elmt:R90__Run___403_succession_om ; + sysml:ownedMembership expr:R90__Run___403_psourcemember, elmt:R90__Run___403_linkparam_om, elmt:R90__Run___403_succession_om ; + sysml:ownedFeatureMembership elmt:R90__Run___403_linkparam_om ; + sysml:ownedFeature elmt:R90__Run___403_linkparam ; sysml:succession elmt:R90__Run___403_succession ; - sysml:ownedRelationship elmt:R90__Run___403_succession_om ; - sysml:ownedMembership elmt:R90__Run___403_succession_om ; sysml:source elmt:R90__Run__idle ; - sysml:target elmt:R90__Done__done . + sysml:target elmt:R90__Done__done ; + json:ownedRelationship "[{\"@id\":\"R90__Run___403_psourcemember\"},{\"@id\":\"R90__Run___403_linkparam_om\"},{\"@id\":\"R90__Run___403_succession_om\"}]" ; + json:ownedMembership "[{\"@id\":\"R90__Run___403_psourcemember\"},{\"@id\":\"R90__Run___403_linkparam_om\"},{\"@id\":\"R90__Run___403_succession_om\"}]" . elmt:R90__Run___403_om a sysml:FeatureMembership ; @@ -1294,6 +1298,34 @@ elmt:R90__Run___403_om sysml:ownedMemberFeature elmt:R90__Run___403 ; sysml:owningType elmt:R90__Run . +expr:R90__Run___403_psourcemember + a sysml:Membership ; + sysml:elementId "R90__Run___403_psourcemember" ; + sysml:owner elmt:R90__Run___403 ; + sysml:memberElement elmt:R90__Run__idle ; + sysml:owningRelatedElement elmt:R90__Run___403 ; + sysml:membershipOwningNamespace elmt:R90__Run___403 . + +elmt:R90__Run___403_linkparam + a sysml:ReferenceUsage ; + sysml:elementId "R90__Run___403_linkparam" ; + sysml:direction "in" ; + sysml:owner elmt:R90__Run___403 ; + sysml:owningRelationship elmt:R90__Run___403_linkparam_om ; + sysml:owningMembership elmt:R90__Run___403_linkparam_om . + +elmt:R90__Run___403_linkparam_om + a sysml:ParameterMembership ; + sysml:elementId "R90__Run___403_linkparam_om" ; + sysml:owner elmt:R90__Run___403 ; + sysml:memberElement elmt:R90__Run___403_linkparam ; + sysml:ownedMemberElement elmt:R90__Run___403_linkparam ; + sysml:ownedRelatedElement elmt:R90__Run___403_linkparam ; + sysml:owningRelatedElement elmt:R90__Run___403 ; + sysml:membershipOwningNamespace elmt:R90__Run___403 ; + sysml:ownedMemberFeature elmt:R90__Run___403_linkparam ; + sysml:ownedMemberParameter elmt:R90__Run___403_linkparam . + elmt:R90__Run___403_succession a sysml:SuccessionAsUsage ; sysml:elementId "R90__Run___403_succession" ; diff --git a/tests/export/testdata/convert/imports.golden.ttl b/tests/export/testdata/convert/imports.golden.ttl index 9934c76ba1..e37678721f 100644 --- a/tests/export/testdata/convert/imports.golden.ttl +++ b/tests/export/testdata/convert/imports.golden.ttl @@ -138,3 +138,23 @@ elmt:Importer__Deep__Item_om sysml:ownedRelatedElement elmt:Importer__Deep__Item ; sysml:owningRelatedElement elmt:Importer__Deep ; sysml:membershipOwningNamespace elmt:Importer__Deep . + + + a sysml:DataType ; + sysml:elementId "14c0aa22-5489-59b5-b438-ded26e83ba31" ; + sysml:qualifiedName "ScalarValues::Real" ; + sysml:declaredName "Real" ; + sysml:isLibraryElement "true"^^xsd:boolean . + +elmt:ab72a695-5fe9-58a3-9d48-9e9a8711862d + a sysml:OwningMembership ; + sysml:elementId "ab72a695-5fe9-58a3-9d48-9e9a8711862d" ; + sysml:memberElement ; + sysml:isLibraryElement "true"^^xsd:boolean . + + + a sysml:LibraryPackage ; + sysml:elementId "3fcc2ef4-a31c-522b-b69d-717d74bccfa6" ; + sysml:qualifiedName "ISQ" ; + sysml:declaredName "ISQ" ; + sysml:isLibraryElement "true"^^xsd:boolean . diff --git a/tests/export/testdata/convert/invariant_references.golden.ttl b/tests/export/testdata/convert/invariant_references.golden.ttl index ab911b8d3c..c72a36b7f5 100644 --- a/tests/export/testdata/convert/invariant_references.golden.ttl +++ b/tests/export/testdata/convert/invariant_references.golden.ttl @@ -1035,3 +1035,24 @@ elmt:InvariantReferences__Tank__bounded___401_referent sysml:memberElement elmt:InvariantReferences__Tank__ready ; sysml:owner elmt:InvariantReferences__Tank__bounded___401 ; sysml:owningRelatedElement elmt:InvariantReferences__Tank__bounded___401 . + + + a sysml:DataType ; + sysml:elementId "14c0aa22-5489-59b5-b438-ded26e83ba31" ; + sysml:qualifiedName "ScalarValues::Real" ; + sysml:declaredName "Real" ; + sysml:isLibraryElement "true"^^xsd:boolean . + + + a sysml:LibraryPackage ; + sysml:elementId "40bb440c-5036-58e1-8675-5afccb8b8f1d" ; + sysml:qualifiedName "ScalarValues" ; + sysml:declaredName "ScalarValues" ; + sysml:isLibraryElement "true"^^xsd:boolean . + +elmt:d1e9242d-b2e3-5270-bf69-4f4fb0447193 + a sysml:DataType ; + sysml:elementId "d1e9242d-b2e3-5270-bf69-4f4fb0447193" ; + sysml:qualifiedName "ScalarValues::Boolean" ; + sysml:declaredName "Boolean" ; + sysml:isLibraryElement "true"^^xsd:boolean . diff --git a/tests/export/testdata/convert/irregular_layout.golden.ttl b/tests/export/testdata/convert/irregular_layout.golden.ttl index 2fe9571f3e..9df8854888 100644 --- a/tests/export/testdata/convert/irregular_layout.golden.ttl +++ b/tests/export/testdata/convert/irregular_layout.golden.ttl @@ -3043,14 +3043,16 @@ elmt:IrregularLayout__Ops___404 sysml:owningRelationship elmt:IrregularLayout__Ops___404_om ; sysml:owningMembership elmt:IrregularLayout__Ops___404_om ; sysx:transitionSyntax "first" ; + sysml:ownedRelationship expr:IrregularLayout__Ops___404_psourcemember, elmt:IrregularLayout__Ops___404_linkparam_om, expr:IrregularLayout__Ops___404_pguard_om, elmt:IrregularLayout__Ops___404_succession_om ; + sysml:ownedMembership expr:IrregularLayout__Ops___404_psourcemember, elmt:IrregularLayout__Ops___404_linkparam_om, expr:IrregularLayout__Ops___404_pguard_om, elmt:IrregularLayout__Ops___404_succession_om ; + sysml:ownedFeatureMembership elmt:IrregularLayout__Ops___404_linkparam_om ; + sysml:ownedFeature elmt:IrregularLayout__Ops___404_linkparam ; sysml:succession elmt:IrregularLayout__Ops___404_succession ; sysx:guard expr:IrregularLayout__Ops___404_pguard ; - sysml:ownedRelationship expr:IrregularLayout__Ops___404_pguard_om, elmt:IrregularLayout__Ops___404_succession_om ; - sysml:ownedMembership expr:IrregularLayout__Ops___404_pguard_om, elmt:IrregularLayout__Ops___404_succession_om ; sysml:source elmt:IrregularLayout__Ops__off ; sysml:target elmt:IrregularLayout__Ops__on ; - json:ownedRelationship "[{\"@id\":\"IrregularLayout__Ops___404_pguard_om\"},{\"@id\":\"IrregularLayout__Ops___404_succession_om\"}]" ; - json:ownedMembership "[{\"@id\":\"IrregularLayout__Ops___404_pguard_om\"},{\"@id\":\"IrregularLayout__Ops___404_succession_om\"}]" . + json:ownedRelationship "[{\"@id\":\"IrregularLayout__Ops___404_psourcemember\"},{\"@id\":\"IrregularLayout__Ops___404_linkparam_om\"},{\"@id\":\"IrregularLayout__Ops___404_pguard_om\"},{\"@id\":\"IrregularLayout__Ops___404_succession_om\"}]" ; + json:ownedMembership "[{\"@id\":\"IrregularLayout__Ops___404_psourcemember\"},{\"@id\":\"IrregularLayout__Ops___404_linkparam_om\"},{\"@id\":\"IrregularLayout__Ops___404_pguard_om\"},{\"@id\":\"IrregularLayout__Ops___404_succession_om\"}]" . elmt:IrregularLayout__Ops___404_om a sysml:FeatureMembership ; @@ -3064,6 +3066,34 @@ elmt:IrregularLayout__Ops___404_om sysml:ownedMemberFeature elmt:IrregularLayout__Ops___404 ; sysml:owningType elmt:IrregularLayout__Ops . +expr:IrregularLayout__Ops___404_psourcemember + a sysml:Membership ; + sysml:elementId "IrregularLayout__Ops___404_psourcemember" ; + sysml:owner elmt:IrregularLayout__Ops___404 ; + sysml:memberElement elmt:IrregularLayout__Ops__off ; + sysml:owningRelatedElement elmt:IrregularLayout__Ops___404 ; + sysml:membershipOwningNamespace elmt:IrregularLayout__Ops___404 . + +elmt:IrregularLayout__Ops___404_linkparam + a sysml:ReferenceUsage ; + sysml:elementId "IrregularLayout__Ops___404_linkparam" ; + sysml:direction "in" ; + sysml:owner elmt:IrregularLayout__Ops___404 ; + sysml:owningRelationship elmt:IrregularLayout__Ops___404_linkparam_om ; + sysml:owningMembership elmt:IrregularLayout__Ops___404_linkparam_om . + +elmt:IrregularLayout__Ops___404_linkparam_om + a sysml:ParameterMembership ; + sysml:elementId "IrregularLayout__Ops___404_linkparam_om" ; + sysml:owner elmt:IrregularLayout__Ops___404 ; + sysml:memberElement elmt:IrregularLayout__Ops___404_linkparam ; + sysml:ownedMemberElement elmt:IrregularLayout__Ops___404_linkparam ; + sysml:ownedRelatedElement elmt:IrregularLayout__Ops___404_linkparam ; + sysml:owningRelatedElement elmt:IrregularLayout__Ops___404 ; + sysml:membershipOwningNamespace elmt:IrregularLayout__Ops___404 ; + sysml:ownedMemberFeature elmt:IrregularLayout__Ops___404_linkparam ; + sysml:ownedMemberParameter elmt:IrregularLayout__Ops___404_linkparam . + elmt:IrregularLayout__Ops___404_succession a sysml:SuccessionAsUsage ; sysml:elementId "IrregularLayout__Ops___404_succession" ; @@ -3500,3 +3530,17 @@ elmt:IrregularLayout__Drive___404___400_rs sysml:owner elmt:IrregularLayout__Drive___404___400 ; sysml:relatedElement elmt:IrregularLayout__Drive___404___400, elmt:IrregularLayout__Drive__tick ; json:relatedElement "[{\"@id\":\"IrregularLayout__Drive___404___400\"},{\"@id\":\"IrregularLayout__Drive__tick\"}]" . + + + a sysml:DataType ; + sysml:elementId "14c0aa22-5489-59b5-b438-ded26e83ba31" ; + sysml:qualifiedName "ScalarValues::Real" ; + sysml:declaredName "Real" ; + sysml:isLibraryElement "true"^^xsd:boolean . + + + a sysml:LibraryPackage ; + sysml:elementId "40bb440c-5036-58e1-8675-5afccb8b8f1d" ; + sysml:qualifiedName "ScalarValues" ; + sysml:declaredName "ScalarValues" ; + sysml:isLibraryElement "true"^^xsd:boolean . diff --git a/tests/export/testdata/convert/loop_scopes.golden.ttl b/tests/export/testdata/convert/loop_scopes.golden.ttl index f18b437e47..df482380a9 100644 --- a/tests/export/testdata/convert/loop_scopes.golden.ttl +++ b/tests/export/testdata/convert/loop_scopes.golden.ttl @@ -631,3 +631,10 @@ expr:Loops__Charge___402_puntilCondition_pa0_preferent sysml:memberElement elmt:Loops__Charge___402__pace ; sysml:owner expr:Loops__Charge___402_puntilCondition_pa0 ; sysml:owningRelatedElement expr:Loops__Charge___402_puntilCondition_pa0 . + + + a sysml:ActionUsage ; + sysml:elementId "0cdc3cd3-b06c-5c32-beda-0cf4ba164a64" ; + sysml:qualifiedName "Actions::Action::done" ; + sysml:declaredName "done" ; + sysml:isLibraryElement "true"^^xsd:boolean . diff --git a/tests/export/testdata/convert/parts.golden.ttl b/tests/export/testdata/convert/parts.golden.ttl index f41058e51c..fe47b9de4f 100644 --- a/tests/export/testdata/convert/parts.golden.ttl +++ b/tests/export/testdata/convert/parts.golden.ttl @@ -230,3 +230,10 @@ elmt:Vehicles__Vehicle__engine_ft0 sysml:owner elmt:Vehicles__Vehicle__engine ; sysml:relatedElement elmt:Vehicles__Vehicle__engine, elmt:Vehicles__Engine ; json:relatedElement "[{\"@id\":\"Vehicles__Vehicle__engine\"},{\"@id\":\"Vehicles__Engine\"}]" . + + + a sysml:AttributeDefinition ; + sysml:elementId "9cd0e404-efee-50e5-a59b-681065bd188c" ; + sysml:qualifiedName "ISQBase::MassValue" ; + sysml:declaredName "MassValue" ; + sysml:isLibraryElement "true"^^xsd:boolean . diff --git a/tests/export/testdata/convert/payload_declaration_bodies.golden.ttl b/tests/export/testdata/convert/payload_declaration_bodies.golden.ttl index e77e5299d5..4aeef35dd9 100644 --- a/tests/export/testdata/convert/payload_declaration_bodies.golden.ttl +++ b/tests/export/testdata/convert/payload_declaration_bodies.golden.ttl @@ -229,14 +229,14 @@ elmt:Payloads__Ctx sysml:ownedMember elmt:Payloads__Ctx__x, elmt:Payloads__Ctx__y, elmt:Payloads__Ctx___402, elmt:Payloads__Ctx__m, elmt:Payloads__Ctx___404 ; sysml:ownedMembership elmt:Payloads__Ctx__x_om, elmt:Payloads__Ctx__y_om, elmt:Payloads__Ctx___402_om, elmt:Payloads__Ctx__m_om, elmt:Payloads__Ctx___404_om ; sysml:ownedRelationship elmt:Payloads__Ctx__x_om, elmt:Payloads__Ctx__y_om, elmt:Payloads__Ctx___402_om, elmt:Payloads__Ctx__m_om, elmt:Payloads__Ctx___404_om ; - sysml:ownedFeature elmt:Payloads__Ctx__x, elmt:Payloads__Ctx__y ; - sysml:ownedFeatureMembership elmt:Payloads__Ctx__x_om, elmt:Payloads__Ctx__y_om ; + sysml:ownedFeature elmt:Payloads__Ctx__x, elmt:Payloads__Ctx__y, elmt:Payloads__Ctx___402, elmt:Payloads__Ctx__m, elmt:Payloads__Ctx___404 ; + sysml:ownedFeatureMembership elmt:Payloads__Ctx__x_om, elmt:Payloads__Ctx__y_om, elmt:Payloads__Ctx___402_om, elmt:Payloads__Ctx__m_om, elmt:Payloads__Ctx___404_om ; sysx:sourceText " part def Ctx {\n part x : A; part y : B;\n flow of fuel : Fuel from x.i to y.j { attribute w : Prio; }\n message m of cmd : Prio from x.i to y.j;\n message of cmd : Prio = m.cmd from x.i to y.j { attribute w : Prio; }\n }\n" ; json:ownedMember "[{\"@id\":\"Payloads__Ctx__x\"},{\"@id\":\"Payloads__Ctx__y\"},{\"@id\":\"Payloads__Ctx___402\"},{\"@id\":\"Payloads__Ctx__m\"},{\"@id\":\"Payloads__Ctx___404\"}]" ; json:ownedMembership "[{\"@id\":\"Payloads__Ctx__x_om\"},{\"@id\":\"Payloads__Ctx__y_om\"},{\"@id\":\"Payloads__Ctx___402_om\"},{\"@id\":\"Payloads__Ctx__m_om\"},{\"@id\":\"Payloads__Ctx___404_om\"}]" ; json:ownedRelationship "[{\"@id\":\"Payloads__Ctx__x_om\"},{\"@id\":\"Payloads__Ctx__y_om\"},{\"@id\":\"Payloads__Ctx___402_om\"},{\"@id\":\"Payloads__Ctx__m_om\"},{\"@id\":\"Payloads__Ctx___404_om\"}]" ; - json:ownedFeature "[{\"@id\":\"Payloads__Ctx__x\"},{\"@id\":\"Payloads__Ctx__y\"}]" ; - json:ownedFeatureMembership "[{\"@id\":\"Payloads__Ctx__x_om\"},{\"@id\":\"Payloads__Ctx__y_om\"}]" . + json:ownedFeature "[{\"@id\":\"Payloads__Ctx__x\"},{\"@id\":\"Payloads__Ctx__y\"},{\"@id\":\"Payloads__Ctx___402\"},{\"@id\":\"Payloads__Ctx__m\"},{\"@id\":\"Payloads__Ctx___404\"}]" ; + json:ownedFeatureMembership "[{\"@id\":\"Payloads__Ctx__x_om\"},{\"@id\":\"Payloads__Ctx__y_om\"},{\"@id\":\"Payloads__Ctx___402_om\"},{\"@id\":\"Payloads__Ctx__m_om\"},{\"@id\":\"Payloads__Ctx___404_om\"}]" . elmt:Payloads__Ctx_om a sysml:OwningMembership ; @@ -328,28 +328,30 @@ elmt:Payloads__Ctx___402 sysml:connectorEnd expr:Payloads__Ctx___402_pend0, expr:Payloads__Ctx___402_pend1 ; sysml:ownedRelationship expr:Payloads__Ctx___402_pend0_om, expr:Payloads__Ctx___402_pend1_om, elmt:Payloads__Ctx___402__fuel_om, elmt:Payloads__Ctx___402__w_om ; sysml:ownedMembership expr:Payloads__Ctx___402_pend0_om, expr:Payloads__Ctx___402_pend1_om, elmt:Payloads__Ctx___402__fuel_om, elmt:Payloads__Ctx___402__w_om ; - sysml:ownedFeatureMembership expr:Payloads__Ctx___402_pend0_om, expr:Payloads__Ctx___402_pend1_om, elmt:Payloads__Ctx___402__fuel_om ; - sysml:ownedFeature expr:Payloads__Ctx___402_pend0, expr:Payloads__Ctx___402_pend1, elmt:Payloads__Ctx___402__fuel ; + sysml:ownedFeatureMembership expr:Payloads__Ctx___402_pend0_om, expr:Payloads__Ctx___402_pend1_om, elmt:Payloads__Ctx___402__fuel_om, elmt:Payloads__Ctx___402__w_om ; + sysml:ownedFeature expr:Payloads__Ctx___402_pend0, expr:Payloads__Ctx___402_pend1, elmt:Payloads__Ctx___402__fuel, elmt:Payloads__Ctx___402__w ; sysml:ownedEndFeature expr:Payloads__Ctx___402_pend0, expr:Payloads__Ctx___402_pend1 ; sysml:ownedMember elmt:Payloads__Ctx___402__fuel, elmt:Payloads__Ctx___402__w ; sysx:hasBody "true"^^xsd:boolean ; json:connectorEnd "[{\"@id\":\"Payloads__Ctx___402_pend0\"},{\"@id\":\"Payloads__Ctx___402_pend1\"}]" ; json:ownedRelationship "[{\"@id\":\"Payloads__Ctx___402_pend0_om\"},{\"@id\":\"Payloads__Ctx___402_pend1_om\"},{\"@id\":\"Payloads__Ctx___402__fuel_om\"},{\"@id\":\"Payloads__Ctx___402__w_om\"}]" ; json:ownedMembership "[{\"@id\":\"Payloads__Ctx___402_pend0_om\"},{\"@id\":\"Payloads__Ctx___402_pend1_om\"},{\"@id\":\"Payloads__Ctx___402__fuel_om\"},{\"@id\":\"Payloads__Ctx___402__w_om\"}]" ; - json:ownedFeatureMembership "[{\"@id\":\"Payloads__Ctx___402_pend0_om\"},{\"@id\":\"Payloads__Ctx___402_pend1_om\"},{\"@id\":\"Payloads__Ctx___402__fuel_om\"}]" ; - json:ownedFeature "[{\"@id\":\"Payloads__Ctx___402_pend0\"},{\"@id\":\"Payloads__Ctx___402_pend1\"},{\"@id\":\"Payloads__Ctx___402__fuel\"}]" ; + json:ownedFeatureMembership "[{\"@id\":\"Payloads__Ctx___402_pend0_om\"},{\"@id\":\"Payloads__Ctx___402_pend1_om\"},{\"@id\":\"Payloads__Ctx___402__fuel_om\"},{\"@id\":\"Payloads__Ctx___402__w_om\"}]" ; + json:ownedFeature "[{\"@id\":\"Payloads__Ctx___402_pend0\"},{\"@id\":\"Payloads__Ctx___402_pend1\"},{\"@id\":\"Payloads__Ctx___402__fuel\"},{\"@id\":\"Payloads__Ctx___402__w\"}]" ; json:ownedEndFeature "[{\"@id\":\"Payloads__Ctx___402_pend0\"},{\"@id\":\"Payloads__Ctx___402_pend1\"}]" ; json:ownedMember "[{\"@id\":\"Payloads__Ctx___402__fuel\"},{\"@id\":\"Payloads__Ctx___402__w\"}]" . elmt:Payloads__Ctx___402_om - a sysml:OwningMembership ; + a sysml:FeatureMembership ; sysml:elementId "Payloads__Ctx___402_om" ; sysml:owner elmt:Payloads__Ctx ; sysml:memberElement elmt:Payloads__Ctx___402 ; sysml:ownedMemberElement elmt:Payloads__Ctx___402 ; sysml:ownedRelatedElement elmt:Payloads__Ctx___402 ; sysml:owningRelatedElement elmt:Payloads__Ctx ; - sysml:membershipOwningNamespace elmt:Payloads__Ctx . + sysml:membershipOwningNamespace elmt:Payloads__Ctx ; + sysml:ownedMemberFeature elmt:Payloads__Ctx___402 ; + sysml:owningType elmt:Payloads__Ctx . expr:Payloads__Ctx___402_pend0 a sysml:FlowEnd ; @@ -538,14 +540,16 @@ elmt:Payloads__Ctx___402__w sysml:ownedRelationship elmt:Payloads__Ctx___402__w_ft0 . elmt:Payloads__Ctx___402__w_om - a sysml:OwningMembership ; + a sysml:FeatureMembership ; sysml:elementId "Payloads__Ctx___402__w_om" ; sysml:owner elmt:Payloads__Ctx___402 ; sysml:memberElement elmt:Payloads__Ctx___402__w ; sysml:ownedMemberElement elmt:Payloads__Ctx___402__w ; sysml:ownedRelatedElement elmt:Payloads__Ctx___402__w ; sysml:owningRelatedElement elmt:Payloads__Ctx___402 ; - sysml:membershipOwningNamespace elmt:Payloads__Ctx___402 . + sysml:membershipOwningNamespace elmt:Payloads__Ctx___402 ; + sysml:ownedMemberFeature elmt:Payloads__Ctx___402__w ; + sysml:owningType elmt:Payloads__Ctx___402 . elmt:Payloads__Ctx__m a sysml:FlowUsage ; @@ -575,14 +579,16 @@ elmt:Payloads__Ctx__m json:parameter "[{\"@id\":\"Payloads__Ctx__m_pend0\"},{\"@id\":\"Payloads__Ctx__m_pend1\"}]" . elmt:Payloads__Ctx__m_om - a sysml:OwningMembership ; + a sysml:FeatureMembership ; sysml:elementId "Payloads__Ctx__m_om" ; sysml:owner elmt:Payloads__Ctx ; sysml:memberElement elmt:Payloads__Ctx__m ; sysml:ownedMemberElement elmt:Payloads__Ctx__m ; sysml:ownedRelatedElement elmt:Payloads__Ctx__m ; sysml:owningRelatedElement elmt:Payloads__Ctx ; - sysml:membershipOwningNamespace elmt:Payloads__Ctx . + sysml:membershipOwningNamespace elmt:Payloads__Ctx ; + sysml:ownedMemberFeature elmt:Payloads__Ctx__m ; + sysml:owningType elmt:Payloads__Ctx . expr:Payloads__Ctx__m_pend0 a sysml:EventOccurrenceUsage ; @@ -789,27 +795,29 @@ elmt:Payloads__Ctx___404 sysml:owningMembership elmt:Payloads__Ctx___404_om ; sysml:ownedRelationship expr:Payloads__Ctx___404_pend0_om, expr:Payloads__Ctx___404_pend1_om, elmt:Payloads__Ctx___404__cmd_om, elmt:Payloads__Ctx___404__w_om ; sysml:ownedMembership expr:Payloads__Ctx___404_pend0_om, expr:Payloads__Ctx___404_pend1_om, elmt:Payloads__Ctx___404__cmd_om, elmt:Payloads__Ctx___404__w_om ; - sysml:ownedFeatureMembership expr:Payloads__Ctx___404_pend0_om, expr:Payloads__Ctx___404_pend1_om, elmt:Payloads__Ctx___404__cmd_om ; - sysml:ownedFeature expr:Payloads__Ctx___404_pend0, expr:Payloads__Ctx___404_pend1, elmt:Payloads__Ctx___404__cmd ; + sysml:ownedFeatureMembership expr:Payloads__Ctx___404_pend0_om, expr:Payloads__Ctx___404_pend1_om, elmt:Payloads__Ctx___404__cmd_om, elmt:Payloads__Ctx___404__w_om ; + sysml:ownedFeature expr:Payloads__Ctx___404_pend0, expr:Payloads__Ctx___404_pend1, elmt:Payloads__Ctx___404__cmd, elmt:Payloads__Ctx___404__w ; sysml:parameter expr:Payloads__Ctx___404_pend0, expr:Payloads__Ctx___404_pend1 ; sysml:ownedMember elmt:Payloads__Ctx___404__cmd, elmt:Payloads__Ctx___404__w ; sysx:hasBody "true"^^xsd:boolean ; json:ownedRelationship "[{\"@id\":\"Payloads__Ctx___404_pend0_om\"},{\"@id\":\"Payloads__Ctx___404_pend1_om\"},{\"@id\":\"Payloads__Ctx___404__cmd_om\"},{\"@id\":\"Payloads__Ctx___404__w_om\"}]" ; json:ownedMembership "[{\"@id\":\"Payloads__Ctx___404_pend0_om\"},{\"@id\":\"Payloads__Ctx___404_pend1_om\"},{\"@id\":\"Payloads__Ctx___404__cmd_om\"},{\"@id\":\"Payloads__Ctx___404__w_om\"}]" ; - json:ownedFeatureMembership "[{\"@id\":\"Payloads__Ctx___404_pend0_om\"},{\"@id\":\"Payloads__Ctx___404_pend1_om\"},{\"@id\":\"Payloads__Ctx___404__cmd_om\"}]" ; - json:ownedFeature "[{\"@id\":\"Payloads__Ctx___404_pend0\"},{\"@id\":\"Payloads__Ctx___404_pend1\"},{\"@id\":\"Payloads__Ctx___404__cmd\"}]" ; + json:ownedFeatureMembership "[{\"@id\":\"Payloads__Ctx___404_pend0_om\"},{\"@id\":\"Payloads__Ctx___404_pend1_om\"},{\"@id\":\"Payloads__Ctx___404__cmd_om\"},{\"@id\":\"Payloads__Ctx___404__w_om\"}]" ; + json:ownedFeature "[{\"@id\":\"Payloads__Ctx___404_pend0\"},{\"@id\":\"Payloads__Ctx___404_pend1\"},{\"@id\":\"Payloads__Ctx___404__cmd\"},{\"@id\":\"Payloads__Ctx___404__w\"}]" ; json:parameter "[{\"@id\":\"Payloads__Ctx___404_pend0\"},{\"@id\":\"Payloads__Ctx___404_pend1\"}]" ; json:ownedMember "[{\"@id\":\"Payloads__Ctx___404__cmd\"},{\"@id\":\"Payloads__Ctx___404__w\"}]" . elmt:Payloads__Ctx___404_om - a sysml:OwningMembership ; + a sysml:FeatureMembership ; sysml:elementId "Payloads__Ctx___404_om" ; sysml:owner elmt:Payloads__Ctx ; sysml:memberElement elmt:Payloads__Ctx___404 ; sysml:ownedMemberElement elmt:Payloads__Ctx___404 ; sysml:ownedRelatedElement elmt:Payloads__Ctx___404 ; sysml:owningRelatedElement elmt:Payloads__Ctx ; - sysml:membershipOwningNamespace elmt:Payloads__Ctx . + sysml:membershipOwningNamespace elmt:Payloads__Ctx ; + sysml:ownedMemberFeature elmt:Payloads__Ctx___404 ; + sysml:owningType elmt:Payloads__Ctx . expr:Payloads__Ctx___404_pend0 a sysml:EventOccurrenceUsage ; @@ -1149,14 +1157,16 @@ elmt:Payloads__Ctx___404__w sysml:ownedRelationship elmt:Payloads__Ctx___404__w_ft0 . elmt:Payloads__Ctx___404__w_om - a sysml:OwningMembership ; + a sysml:FeatureMembership ; sysml:elementId "Payloads__Ctx___404__w_om" ; sysml:owner elmt:Payloads__Ctx___404 ; sysml:memberElement elmt:Payloads__Ctx___404__w ; sysml:ownedMemberElement elmt:Payloads__Ctx___404__w ; sysml:ownedRelatedElement elmt:Payloads__Ctx___404__w ; sysml:owningRelatedElement elmt:Payloads__Ctx___404 ; - sysml:membershipOwningNamespace elmt:Payloads__Ctx___404 . + sysml:membershipOwningNamespace elmt:Payloads__Ctx___404 ; + sysml:ownedMemberFeature elmt:Payloads__Ctx___404__w ; + sysml:owningType elmt:Payloads__Ctx___404 . elmt:Payloads__A__i_ft0 a sysml:FeatureTyping ; diff --git a/tests/export/testdata/convert/quoted_succession_ends.golden.ttl b/tests/export/testdata/convert/quoted_succession_ends.golden.ttl index 0e56cb3007..b528597677 100644 --- a/tests/export/testdata/convert/quoted_succession_ends.golden.ttl +++ b/tests/export/testdata/convert/quoted_succession_ends.golden.ttl @@ -168,7 +168,19 @@ elmt:QuotedSuccessionEnds__provide_20power___403 sysx:declaredKeyword "first" ; sysml:sourceFeature ; sysml:targetFeature elmt:QuotedSuccessionEnds__provide_20power__engineStarted ; - sysx:sourceText " first start then engineStarted;\n" . + sysml:connectorEnd expr:QuotedSuccessionEnds__provide_20power___403_pend0, expr:QuotedSuccessionEnds__provide_20power___403_pend1 ; + sysml:ownedRelationship expr:QuotedSuccessionEnds__provide_20power___403_pend0_om, expr:QuotedSuccessionEnds__provide_20power___403_pend1_om ; + sysml:ownedMembership expr:QuotedSuccessionEnds__provide_20power___403_pend0_om, expr:QuotedSuccessionEnds__provide_20power___403_pend1_om ; + sysml:ownedFeatureMembership expr:QuotedSuccessionEnds__provide_20power___403_pend0_om, expr:QuotedSuccessionEnds__provide_20power___403_pend1_om ; + sysml:ownedFeature expr:QuotedSuccessionEnds__provide_20power___403_pend0, expr:QuotedSuccessionEnds__provide_20power___403_pend1 ; + sysml:ownedEndFeature expr:QuotedSuccessionEnds__provide_20power___403_pend0, expr:QuotedSuccessionEnds__provide_20power___403_pend1 ; + sysx:sourceText " first start then engineStarted;\n" ; + json:connectorEnd "[{\"@id\":\"QuotedSuccessionEnds__provide_20power___403_pend0\"},{\"@id\":\"QuotedSuccessionEnds__provide_20power___403_pend1\"}]" ; + json:ownedRelationship "[{\"@id\":\"QuotedSuccessionEnds__provide_20power___403_pend0_om\"},{\"@id\":\"QuotedSuccessionEnds__provide_20power___403_pend1_om\"}]" ; + json:ownedMembership "[{\"@id\":\"QuotedSuccessionEnds__provide_20power___403_pend0_om\"},{\"@id\":\"QuotedSuccessionEnds__provide_20power___403_pend1_om\"}]" ; + json:ownedFeatureMembership "[{\"@id\":\"QuotedSuccessionEnds__provide_20power___403_pend0_om\"},{\"@id\":\"QuotedSuccessionEnds__provide_20power___403_pend1_om\"}]" ; + json:ownedFeature "[{\"@id\":\"QuotedSuccessionEnds__provide_20power___403_pend0\"},{\"@id\":\"QuotedSuccessionEnds__provide_20power___403_pend1\"}]" ; + json:ownedEndFeature "[{\"@id\":\"QuotedSuccessionEnds__provide_20power___403_pend0\"},{\"@id\":\"QuotedSuccessionEnds__provide_20power___403_pend1\"}]" . elmt:QuotedSuccessionEnds__provide_20power___403_om a sysml:FeatureMembership ; @@ -182,6 +194,87 @@ elmt:QuotedSuccessionEnds__provide_20power___403_om sysml:ownedMemberFeature elmt:QuotedSuccessionEnds__provide_20power___403 ; sysml:owningType elmt:QuotedSuccessionEnds__provide_20power . +expr:QuotedSuccessionEnds__provide_20power___403_pend0 + a sysml:ReferenceUsage ; + sysml:elementId "QuotedSuccessionEnds__provide_20power___403_pend0" ; + sysml:isEnd "true"^^xsd:boolean ; + sysml:owner elmt:QuotedSuccessionEnds__provide_20power___403 ; + sysml:owningRelationship expr:QuotedSuccessionEnds__provide_20power___403_pend0_om ; + sysml:owningMembership expr:QuotedSuccessionEnds__provide_20power___403_pend0_om ; + sysml:ownedReferenceSubsetting expr:QuotedSuccessionEnds__provide_20power___403_pend0_prs ; + sysml:ownedSubsetting expr:QuotedSuccessionEnds__provide_20power___403_pend0_prs ; + sysml:ownedSpecialization expr:QuotedSuccessionEnds__provide_20power___403_pend0_prs ; + sysml:ownedRelationship expr:QuotedSuccessionEnds__provide_20power___403_pend0_prs . + +expr:QuotedSuccessionEnds__provide_20power___403_pend0_om + a sysml:EndFeatureMembership ; + sysml:elementId "QuotedSuccessionEnds__provide_20power___403_pend0_om" ; + sysml:owner elmt:QuotedSuccessionEnds__provide_20power___403 ; + sysml:memberElement expr:QuotedSuccessionEnds__provide_20power___403_pend0 ; + sysml:ownedMemberElement expr:QuotedSuccessionEnds__provide_20power___403_pend0 ; + sysml:ownedRelatedElement expr:QuotedSuccessionEnds__provide_20power___403_pend0 ; + sysml:owningRelatedElement elmt:QuotedSuccessionEnds__provide_20power___403 ; + sysml:membershipOwningNamespace elmt:QuotedSuccessionEnds__provide_20power___403 . + +expr:QuotedSuccessionEnds__provide_20power___403_pend0_prs + a sysml:ReferenceSubsetting ; + sysml:elementId "QuotedSuccessionEnds__provide_20power___403_pend0_prs" ; + sysml:referencingFeature expr:QuotedSuccessionEnds__provide_20power___403_pend0 ; + sysml:subsettingFeature expr:QuotedSuccessionEnds__provide_20power___403_pend0 ; + sysml:specific expr:QuotedSuccessionEnds__provide_20power___403_pend0 ; + sysml:source expr:QuotedSuccessionEnds__provide_20power___403_pend0 ; + sysml:owningFeature expr:QuotedSuccessionEnds__provide_20power___403_pend0 ; + sysml:owningType expr:QuotedSuccessionEnds__provide_20power___403_pend0 ; + sysml:referencedFeature ; + sysml:subsettedFeature ; + sysml:general ; + sysml:target ; + sysml:relatedElement expr:QuotedSuccessionEnds__provide_20power___403_pend0, ; + sysml:owner expr:QuotedSuccessionEnds__provide_20power___403_pend0 ; + sysml:owningRelatedElement expr:QuotedSuccessionEnds__provide_20power___403_pend0 ; + json:relatedElement "[{\"@id\":\"QuotedSuccessionEnds__provide_20power___403_pend0\"},{\"@id\":\"9a0d2905-0f9c-5bb4-af74-9780d6db1817\"}]" . + +expr:QuotedSuccessionEnds__provide_20power___403_pend1 + a sysml:ReferenceUsage ; + sysml:elementId "QuotedSuccessionEnds__provide_20power___403_pend1" ; + sysml:isEnd "true"^^xsd:boolean ; + sysml:owner elmt:QuotedSuccessionEnds__provide_20power___403 ; + sysml:owningRelationship expr:QuotedSuccessionEnds__provide_20power___403_pend1_om ; + sysml:owningMembership expr:QuotedSuccessionEnds__provide_20power___403_pend1_om ; + sysx:sourceText "engineStarted" ; + sysml:ownedReferenceSubsetting expr:QuotedSuccessionEnds__provide_20power___403_pend1_prs ; + sysml:ownedSubsetting expr:QuotedSuccessionEnds__provide_20power___403_pend1_prs ; + sysml:ownedSpecialization expr:QuotedSuccessionEnds__provide_20power___403_pend1_prs ; + sysml:ownedRelationship expr:QuotedSuccessionEnds__provide_20power___403_pend1_prs . + +expr:QuotedSuccessionEnds__provide_20power___403_pend1_om + a sysml:EndFeatureMembership ; + sysml:elementId "QuotedSuccessionEnds__provide_20power___403_pend1_om" ; + sysml:owner elmt:QuotedSuccessionEnds__provide_20power___403 ; + sysml:memberElement expr:QuotedSuccessionEnds__provide_20power___403_pend1 ; + sysml:ownedMemberElement expr:QuotedSuccessionEnds__provide_20power___403_pend1 ; + sysml:ownedRelatedElement expr:QuotedSuccessionEnds__provide_20power___403_pend1 ; + sysml:owningRelatedElement elmt:QuotedSuccessionEnds__provide_20power___403 ; + sysml:membershipOwningNamespace elmt:QuotedSuccessionEnds__provide_20power___403 . + +expr:QuotedSuccessionEnds__provide_20power___403_pend1_prs + a sysml:ReferenceSubsetting ; + sysml:elementId "QuotedSuccessionEnds__provide_20power___403_pend1_prs" ; + sysml:referencingFeature expr:QuotedSuccessionEnds__provide_20power___403_pend1 ; + sysml:subsettingFeature expr:QuotedSuccessionEnds__provide_20power___403_pend1 ; + sysml:specific expr:QuotedSuccessionEnds__provide_20power___403_pend1 ; + sysml:source expr:QuotedSuccessionEnds__provide_20power___403_pend1 ; + sysml:owningFeature expr:QuotedSuccessionEnds__provide_20power___403_pend1 ; + sysml:owningType expr:QuotedSuccessionEnds__provide_20power___403_pend1 ; + sysml:referencedFeature elmt:QuotedSuccessionEnds__provide_20power__engineStarted ; + sysml:subsettedFeature elmt:QuotedSuccessionEnds__provide_20power__engineStarted ; + sysml:general elmt:QuotedSuccessionEnds__provide_20power__engineStarted ; + sysml:target elmt:QuotedSuccessionEnds__provide_20power__engineStarted ; + sysml:relatedElement expr:QuotedSuccessionEnds__provide_20power___403_pend1, elmt:QuotedSuccessionEnds__provide_20power__engineStarted ; + sysml:owner expr:QuotedSuccessionEnds__provide_20power___403_pend1 ; + sysml:owningRelatedElement expr:QuotedSuccessionEnds__provide_20power___403_pend1 ; + json:relatedElement "[{\"@id\":\"QuotedSuccessionEnds__provide_20power___403_pend1\"},{\"@id\":\"QuotedSuccessionEnds__provide_20power__engineStarted\"}]" . + elmt:QuotedSuccessionEnds__provide_20power___404 a sysml:SuccessionAsUsage ; sysml:qualifiedName "QuotedSuccessionEnds::provide power::@4" ; @@ -198,7 +291,19 @@ elmt:QuotedSuccessionEnds__provide_20power___404 sysx:declaredKeyword "first" ; sysml:sourceFeature elmt:QuotedSuccessionEnds__provide_20power__engineStarted ; sysml:targetFeature elmt:QuotedSuccessionEnds__provide_20power__generate_20torque ; - sysx:sourceText " first engineStarted then 'generate torque';\n" . + sysml:connectorEnd expr:QuotedSuccessionEnds__provide_20power___404_pend0, expr:QuotedSuccessionEnds__provide_20power___404_pend1 ; + sysml:ownedRelationship expr:QuotedSuccessionEnds__provide_20power___404_pend0_om, expr:QuotedSuccessionEnds__provide_20power___404_pend1_om ; + sysml:ownedMembership expr:QuotedSuccessionEnds__provide_20power___404_pend0_om, expr:QuotedSuccessionEnds__provide_20power___404_pend1_om ; + sysml:ownedFeatureMembership expr:QuotedSuccessionEnds__provide_20power___404_pend0_om, expr:QuotedSuccessionEnds__provide_20power___404_pend1_om ; + sysml:ownedFeature expr:QuotedSuccessionEnds__provide_20power___404_pend0, expr:QuotedSuccessionEnds__provide_20power___404_pend1 ; + sysml:ownedEndFeature expr:QuotedSuccessionEnds__provide_20power___404_pend0, expr:QuotedSuccessionEnds__provide_20power___404_pend1 ; + sysx:sourceText " first engineStarted then 'generate torque';\n" ; + json:connectorEnd "[{\"@id\":\"QuotedSuccessionEnds__provide_20power___404_pend0\"},{\"@id\":\"QuotedSuccessionEnds__provide_20power___404_pend1\"}]" ; + json:ownedRelationship "[{\"@id\":\"QuotedSuccessionEnds__provide_20power___404_pend0_om\"},{\"@id\":\"QuotedSuccessionEnds__provide_20power___404_pend1_om\"}]" ; + json:ownedMembership "[{\"@id\":\"QuotedSuccessionEnds__provide_20power___404_pend0_om\"},{\"@id\":\"QuotedSuccessionEnds__provide_20power___404_pend1_om\"}]" ; + json:ownedFeatureMembership "[{\"@id\":\"QuotedSuccessionEnds__provide_20power___404_pend0_om\"},{\"@id\":\"QuotedSuccessionEnds__provide_20power___404_pend1_om\"}]" ; + json:ownedFeature "[{\"@id\":\"QuotedSuccessionEnds__provide_20power___404_pend0\"},{\"@id\":\"QuotedSuccessionEnds__provide_20power___404_pend1\"}]" ; + json:ownedEndFeature "[{\"@id\":\"QuotedSuccessionEnds__provide_20power___404_pend0\"},{\"@id\":\"QuotedSuccessionEnds__provide_20power___404_pend1\"}]" . elmt:QuotedSuccessionEnds__provide_20power___404_om a sysml:FeatureMembership ; @@ -212,6 +317,87 @@ elmt:QuotedSuccessionEnds__provide_20power___404_om sysml:ownedMemberFeature elmt:QuotedSuccessionEnds__provide_20power___404 ; sysml:owningType elmt:QuotedSuccessionEnds__provide_20power . +expr:QuotedSuccessionEnds__provide_20power___404_pend0 + a sysml:ReferenceUsage ; + sysml:elementId "QuotedSuccessionEnds__provide_20power___404_pend0" ; + sysml:isEnd "true"^^xsd:boolean ; + sysml:owner elmt:QuotedSuccessionEnds__provide_20power___404 ; + sysml:owningRelationship expr:QuotedSuccessionEnds__provide_20power___404_pend0_om ; + sysml:owningMembership expr:QuotedSuccessionEnds__provide_20power___404_pend0_om ; + sysml:ownedReferenceSubsetting expr:QuotedSuccessionEnds__provide_20power___404_pend0_prs ; + sysml:ownedSubsetting expr:QuotedSuccessionEnds__provide_20power___404_pend0_prs ; + sysml:ownedSpecialization expr:QuotedSuccessionEnds__provide_20power___404_pend0_prs ; + sysml:ownedRelationship expr:QuotedSuccessionEnds__provide_20power___404_pend0_prs . + +expr:QuotedSuccessionEnds__provide_20power___404_pend0_om + a sysml:EndFeatureMembership ; + sysml:elementId "QuotedSuccessionEnds__provide_20power___404_pend0_om" ; + sysml:owner elmt:QuotedSuccessionEnds__provide_20power___404 ; + sysml:memberElement expr:QuotedSuccessionEnds__provide_20power___404_pend0 ; + sysml:ownedMemberElement expr:QuotedSuccessionEnds__provide_20power___404_pend0 ; + sysml:ownedRelatedElement expr:QuotedSuccessionEnds__provide_20power___404_pend0 ; + sysml:owningRelatedElement elmt:QuotedSuccessionEnds__provide_20power___404 ; + sysml:membershipOwningNamespace elmt:QuotedSuccessionEnds__provide_20power___404 . + +expr:QuotedSuccessionEnds__provide_20power___404_pend0_prs + a sysml:ReferenceSubsetting ; + sysml:elementId "QuotedSuccessionEnds__provide_20power___404_pend0_prs" ; + sysml:referencingFeature expr:QuotedSuccessionEnds__provide_20power___404_pend0 ; + sysml:subsettingFeature expr:QuotedSuccessionEnds__provide_20power___404_pend0 ; + sysml:specific expr:QuotedSuccessionEnds__provide_20power___404_pend0 ; + sysml:source expr:QuotedSuccessionEnds__provide_20power___404_pend0 ; + sysml:owningFeature expr:QuotedSuccessionEnds__provide_20power___404_pend0 ; + sysml:owningType expr:QuotedSuccessionEnds__provide_20power___404_pend0 ; + sysml:referencedFeature elmt:QuotedSuccessionEnds__provide_20power__engineStarted ; + sysml:subsettedFeature elmt:QuotedSuccessionEnds__provide_20power__engineStarted ; + sysml:general elmt:QuotedSuccessionEnds__provide_20power__engineStarted ; + sysml:target elmt:QuotedSuccessionEnds__provide_20power__engineStarted ; + sysml:relatedElement expr:QuotedSuccessionEnds__provide_20power___404_pend0, elmt:QuotedSuccessionEnds__provide_20power__engineStarted ; + sysml:owner expr:QuotedSuccessionEnds__provide_20power___404_pend0 ; + sysml:owningRelatedElement expr:QuotedSuccessionEnds__provide_20power___404_pend0 ; + json:relatedElement "[{\"@id\":\"QuotedSuccessionEnds__provide_20power___404_pend0\"},{\"@id\":\"QuotedSuccessionEnds__provide_20power__engineStarted\"}]" . + +expr:QuotedSuccessionEnds__provide_20power___404_pend1 + a sysml:ReferenceUsage ; + sysml:elementId "QuotedSuccessionEnds__provide_20power___404_pend1" ; + sysml:isEnd "true"^^xsd:boolean ; + sysml:owner elmt:QuotedSuccessionEnds__provide_20power___404 ; + sysml:owningRelationship expr:QuotedSuccessionEnds__provide_20power___404_pend1_om ; + sysml:owningMembership expr:QuotedSuccessionEnds__provide_20power___404_pend1_om ; + sysx:sourceText "'generate torque'" ; + sysml:ownedReferenceSubsetting expr:QuotedSuccessionEnds__provide_20power___404_pend1_prs ; + sysml:ownedSubsetting expr:QuotedSuccessionEnds__provide_20power___404_pend1_prs ; + sysml:ownedSpecialization expr:QuotedSuccessionEnds__provide_20power___404_pend1_prs ; + sysml:ownedRelationship expr:QuotedSuccessionEnds__provide_20power___404_pend1_prs . + +expr:QuotedSuccessionEnds__provide_20power___404_pend1_om + a sysml:EndFeatureMembership ; + sysml:elementId "QuotedSuccessionEnds__provide_20power___404_pend1_om" ; + sysml:owner elmt:QuotedSuccessionEnds__provide_20power___404 ; + sysml:memberElement expr:QuotedSuccessionEnds__provide_20power___404_pend1 ; + sysml:ownedMemberElement expr:QuotedSuccessionEnds__provide_20power___404_pend1 ; + sysml:ownedRelatedElement expr:QuotedSuccessionEnds__provide_20power___404_pend1 ; + sysml:owningRelatedElement elmt:QuotedSuccessionEnds__provide_20power___404 ; + sysml:membershipOwningNamespace elmt:QuotedSuccessionEnds__provide_20power___404 . + +expr:QuotedSuccessionEnds__provide_20power___404_pend1_prs + a sysml:ReferenceSubsetting ; + sysml:elementId "QuotedSuccessionEnds__provide_20power___404_pend1_prs" ; + sysml:referencingFeature expr:QuotedSuccessionEnds__provide_20power___404_pend1 ; + sysml:subsettingFeature expr:QuotedSuccessionEnds__provide_20power___404_pend1 ; + sysml:specific expr:QuotedSuccessionEnds__provide_20power___404_pend1 ; + sysml:source expr:QuotedSuccessionEnds__provide_20power___404_pend1 ; + sysml:owningFeature expr:QuotedSuccessionEnds__provide_20power___404_pend1 ; + sysml:owningType expr:QuotedSuccessionEnds__provide_20power___404_pend1 ; + sysml:referencedFeature elmt:QuotedSuccessionEnds__provide_20power__generate_20torque ; + sysml:subsettedFeature elmt:QuotedSuccessionEnds__provide_20power__generate_20torque ; + sysml:general elmt:QuotedSuccessionEnds__provide_20power__generate_20torque ; + sysml:target elmt:QuotedSuccessionEnds__provide_20power__generate_20torque ; + sysml:relatedElement expr:QuotedSuccessionEnds__provide_20power___404_pend1, elmt:QuotedSuccessionEnds__provide_20power__generate_20torque ; + sysml:owner expr:QuotedSuccessionEnds__provide_20power___404_pend1 ; + sysml:owningRelatedElement expr:QuotedSuccessionEnds__provide_20power___404_pend1 ; + json:relatedElement "[{\"@id\":\"QuotedSuccessionEnds__provide_20power___404_pend1\"},{\"@id\":\"QuotedSuccessionEnds__provide_20power__generate_20torque\"}]" . + elmt:QuotedSuccessionEnds__provide_20power___405 a sysml:SuccessionAsUsage ; sysml:qualifiedName "QuotedSuccessionEnds::provide power::@5" ; @@ -228,7 +414,19 @@ elmt:QuotedSuccessionEnds__provide_20power___405 sysx:declaredKeyword "first" ; sysml:sourceFeature elmt:QuotedSuccessionEnds__provide_20power__generate_20torque ; sysml:targetFeature elmt:QuotedSuccessionEnds__provide_20power__amplify_20torque ; - sysx:sourceText " first 'generate torque' then 'amplify torque';\n" . + sysml:connectorEnd expr:QuotedSuccessionEnds__provide_20power___405_pend0, expr:QuotedSuccessionEnds__provide_20power___405_pend1 ; + sysml:ownedRelationship expr:QuotedSuccessionEnds__provide_20power___405_pend0_om, expr:QuotedSuccessionEnds__provide_20power___405_pend1_om ; + sysml:ownedMembership expr:QuotedSuccessionEnds__provide_20power___405_pend0_om, expr:QuotedSuccessionEnds__provide_20power___405_pend1_om ; + sysml:ownedFeatureMembership expr:QuotedSuccessionEnds__provide_20power___405_pend0_om, expr:QuotedSuccessionEnds__provide_20power___405_pend1_om ; + sysml:ownedFeature expr:QuotedSuccessionEnds__provide_20power___405_pend0, expr:QuotedSuccessionEnds__provide_20power___405_pend1 ; + sysml:ownedEndFeature expr:QuotedSuccessionEnds__provide_20power___405_pend0, expr:QuotedSuccessionEnds__provide_20power___405_pend1 ; + sysx:sourceText " first 'generate torque' then 'amplify torque';\n" ; + json:connectorEnd "[{\"@id\":\"QuotedSuccessionEnds__provide_20power___405_pend0\"},{\"@id\":\"QuotedSuccessionEnds__provide_20power___405_pend1\"}]" ; + json:ownedRelationship "[{\"@id\":\"QuotedSuccessionEnds__provide_20power___405_pend0_om\"},{\"@id\":\"QuotedSuccessionEnds__provide_20power___405_pend1_om\"}]" ; + json:ownedMembership "[{\"@id\":\"QuotedSuccessionEnds__provide_20power___405_pend0_om\"},{\"@id\":\"QuotedSuccessionEnds__provide_20power___405_pend1_om\"}]" ; + json:ownedFeatureMembership "[{\"@id\":\"QuotedSuccessionEnds__provide_20power___405_pend0_om\"},{\"@id\":\"QuotedSuccessionEnds__provide_20power___405_pend1_om\"}]" ; + json:ownedFeature "[{\"@id\":\"QuotedSuccessionEnds__provide_20power___405_pend0\"},{\"@id\":\"QuotedSuccessionEnds__provide_20power___405_pend1\"}]" ; + json:ownedEndFeature "[{\"@id\":\"QuotedSuccessionEnds__provide_20power___405_pend0\"},{\"@id\":\"QuotedSuccessionEnds__provide_20power___405_pend1\"}]" . elmt:QuotedSuccessionEnds__provide_20power___405_om a sysml:FeatureMembership ; @@ -242,6 +440,87 @@ elmt:QuotedSuccessionEnds__provide_20power___405_om sysml:ownedMemberFeature elmt:QuotedSuccessionEnds__provide_20power___405 ; sysml:owningType elmt:QuotedSuccessionEnds__provide_20power . +expr:QuotedSuccessionEnds__provide_20power___405_pend0 + a sysml:ReferenceUsage ; + sysml:elementId "QuotedSuccessionEnds__provide_20power___405_pend0" ; + sysml:isEnd "true"^^xsd:boolean ; + sysml:owner elmt:QuotedSuccessionEnds__provide_20power___405 ; + sysml:owningRelationship expr:QuotedSuccessionEnds__provide_20power___405_pend0_om ; + sysml:owningMembership expr:QuotedSuccessionEnds__provide_20power___405_pend0_om ; + sysml:ownedReferenceSubsetting expr:QuotedSuccessionEnds__provide_20power___405_pend0_prs ; + sysml:ownedSubsetting expr:QuotedSuccessionEnds__provide_20power___405_pend0_prs ; + sysml:ownedSpecialization expr:QuotedSuccessionEnds__provide_20power___405_pend0_prs ; + sysml:ownedRelationship expr:QuotedSuccessionEnds__provide_20power___405_pend0_prs . + +expr:QuotedSuccessionEnds__provide_20power___405_pend0_om + a sysml:EndFeatureMembership ; + sysml:elementId "QuotedSuccessionEnds__provide_20power___405_pend0_om" ; + sysml:owner elmt:QuotedSuccessionEnds__provide_20power___405 ; + sysml:memberElement expr:QuotedSuccessionEnds__provide_20power___405_pend0 ; + sysml:ownedMemberElement expr:QuotedSuccessionEnds__provide_20power___405_pend0 ; + sysml:ownedRelatedElement expr:QuotedSuccessionEnds__provide_20power___405_pend0 ; + sysml:owningRelatedElement elmt:QuotedSuccessionEnds__provide_20power___405 ; + sysml:membershipOwningNamespace elmt:QuotedSuccessionEnds__provide_20power___405 . + +expr:QuotedSuccessionEnds__provide_20power___405_pend0_prs + a sysml:ReferenceSubsetting ; + sysml:elementId "QuotedSuccessionEnds__provide_20power___405_pend0_prs" ; + sysml:referencingFeature expr:QuotedSuccessionEnds__provide_20power___405_pend0 ; + sysml:subsettingFeature expr:QuotedSuccessionEnds__provide_20power___405_pend0 ; + sysml:specific expr:QuotedSuccessionEnds__provide_20power___405_pend0 ; + sysml:source expr:QuotedSuccessionEnds__provide_20power___405_pend0 ; + sysml:owningFeature expr:QuotedSuccessionEnds__provide_20power___405_pend0 ; + sysml:owningType expr:QuotedSuccessionEnds__provide_20power___405_pend0 ; + sysml:referencedFeature elmt:QuotedSuccessionEnds__provide_20power__generate_20torque ; + sysml:subsettedFeature elmt:QuotedSuccessionEnds__provide_20power__generate_20torque ; + sysml:general elmt:QuotedSuccessionEnds__provide_20power__generate_20torque ; + sysml:target elmt:QuotedSuccessionEnds__provide_20power__generate_20torque ; + sysml:relatedElement expr:QuotedSuccessionEnds__provide_20power___405_pend0, elmt:QuotedSuccessionEnds__provide_20power__generate_20torque ; + sysml:owner expr:QuotedSuccessionEnds__provide_20power___405_pend0 ; + sysml:owningRelatedElement expr:QuotedSuccessionEnds__provide_20power___405_pend0 ; + json:relatedElement "[{\"@id\":\"QuotedSuccessionEnds__provide_20power___405_pend0\"},{\"@id\":\"QuotedSuccessionEnds__provide_20power__generate_20torque\"}]" . + +expr:QuotedSuccessionEnds__provide_20power___405_pend1 + a sysml:ReferenceUsage ; + sysml:elementId "QuotedSuccessionEnds__provide_20power___405_pend1" ; + sysml:isEnd "true"^^xsd:boolean ; + sysml:owner elmt:QuotedSuccessionEnds__provide_20power___405 ; + sysml:owningRelationship expr:QuotedSuccessionEnds__provide_20power___405_pend1_om ; + sysml:owningMembership expr:QuotedSuccessionEnds__provide_20power___405_pend1_om ; + sysx:sourceText "'amplify torque'" ; + sysml:ownedReferenceSubsetting expr:QuotedSuccessionEnds__provide_20power___405_pend1_prs ; + sysml:ownedSubsetting expr:QuotedSuccessionEnds__provide_20power___405_pend1_prs ; + sysml:ownedSpecialization expr:QuotedSuccessionEnds__provide_20power___405_pend1_prs ; + sysml:ownedRelationship expr:QuotedSuccessionEnds__provide_20power___405_pend1_prs . + +expr:QuotedSuccessionEnds__provide_20power___405_pend1_om + a sysml:EndFeatureMembership ; + sysml:elementId "QuotedSuccessionEnds__provide_20power___405_pend1_om" ; + sysml:owner elmt:QuotedSuccessionEnds__provide_20power___405 ; + sysml:memberElement expr:QuotedSuccessionEnds__provide_20power___405_pend1 ; + sysml:ownedMemberElement expr:QuotedSuccessionEnds__provide_20power___405_pend1 ; + sysml:ownedRelatedElement expr:QuotedSuccessionEnds__provide_20power___405_pend1 ; + sysml:owningRelatedElement elmt:QuotedSuccessionEnds__provide_20power___405 ; + sysml:membershipOwningNamespace elmt:QuotedSuccessionEnds__provide_20power___405 . + +expr:QuotedSuccessionEnds__provide_20power___405_pend1_prs + a sysml:ReferenceSubsetting ; + sysml:elementId "QuotedSuccessionEnds__provide_20power___405_pend1_prs" ; + sysml:referencingFeature expr:QuotedSuccessionEnds__provide_20power___405_pend1 ; + sysml:subsettingFeature expr:QuotedSuccessionEnds__provide_20power___405_pend1 ; + sysml:specific expr:QuotedSuccessionEnds__provide_20power___405_pend1 ; + sysml:source expr:QuotedSuccessionEnds__provide_20power___405_pend1 ; + sysml:owningFeature expr:QuotedSuccessionEnds__provide_20power___405_pend1 ; + sysml:owningType expr:QuotedSuccessionEnds__provide_20power___405_pend1 ; + sysml:referencedFeature elmt:QuotedSuccessionEnds__provide_20power__amplify_20torque ; + sysml:subsettedFeature elmt:QuotedSuccessionEnds__provide_20power__amplify_20torque ; + sysml:general elmt:QuotedSuccessionEnds__provide_20power__amplify_20torque ; + sysml:target elmt:QuotedSuccessionEnds__provide_20power__amplify_20torque ; + sysml:relatedElement expr:QuotedSuccessionEnds__provide_20power___405_pend1, elmt:QuotedSuccessionEnds__provide_20power__amplify_20torque ; + sysml:owner expr:QuotedSuccessionEnds__provide_20power___405_pend1 ; + sysml:owningRelatedElement expr:QuotedSuccessionEnds__provide_20power___405_pend1 ; + json:relatedElement "[{\"@id\":\"QuotedSuccessionEnds__provide_20power___405_pend1\"},{\"@id\":\"QuotedSuccessionEnds__provide_20power__amplify_20torque\"}]" . + elmt:QuotedSuccessionEnds__provide_20power__s a sysml:SuccessionAsUsage ; sysml:qualifiedName "QuotedSuccessionEnds::provide power::s" ; @@ -724,3 +1003,17 @@ elmt:QuotedSuccessionEnds__drive__drive_20vehicle_om sysml:membershipOwningNamespace elmt:QuotedSuccessionEnds__drive ; sysml:ownedMemberFeature elmt:QuotedSuccessionEnds__drive__drive_20vehicle ; sysml:owningType elmt:QuotedSuccessionEnds__drive . + + + a sysml:ActionUsage ; + sysml:elementId "0cdc3cd3-b06c-5c32-beda-0cf4ba164a64" ; + sysml:qualifiedName "Actions::Action::done" ; + sysml:declaredName "done" ; + sysml:isLibraryElement "true"^^xsd:boolean . + + + a sysml:ActionUsage ; + sysml:elementId "9a0d2905-0f9c-5bb4-af74-9780d6db1817" ; + sysml:qualifiedName "Actions::Action::start" ; + sysml:declaredName "start" ; + sysml:isLibraryElement "true"^^xsd:boolean . diff --git a/tests/export/testdata/convert/relationship_clause_order.golden.ttl b/tests/export/testdata/convert/relationship_clause_order.golden.ttl index 235064518e..38db445a7d 100644 --- a/tests/export/testdata/convert/relationship_clause_order.golden.ttl +++ b/tests/export/testdata/convert/relationship_clause_order.golden.ttl @@ -425,3 +425,17 @@ elmt:ClauseOrder__Mission__groundSystemAtIngress_ss0 sysml:owner elmt:ClauseOrder__Mission__groundSystemAtIngress ; sysml:relatedElement elmt:ClauseOrder__Mission__groundSystemAtIngress, elmt:ClauseOrder__Mission__context ; json:relatedElement "[{\"@id\":\"ClauseOrder__Mission__groundSystemAtIngress\"},{\"@id\":\"ClauseOrder__Mission__context\"}]" . + + + a sysml:DataType ; + sysml:elementId "14c0aa22-5489-59b5-b438-ded26e83ba31" ; + sysml:qualifiedName "ScalarValues::Real" ; + sysml:declaredName "Real" ; + sysml:isLibraryElement "true"^^xsd:boolean . + + + a sysml:LibraryPackage ; + sysml:elementId "40bb440c-5036-58e1-8675-5afccb8b8f1d" ; + sysml:qualifiedName "ScalarValues" ; + sysml:declaredName "ScalarValues" ; + sysml:isLibraryElement "true"^^xsd:boolean . diff --git a/tests/export/testdata/convert/shadowing_body.golden.ttl b/tests/export/testdata/convert/shadowing_body.golden.ttl index 9426020dbc..f148b331a6 100644 --- a/tests/export/testdata/convert/shadowing_body.golden.ttl +++ b/tests/export/testdata/convert/shadowing_body.golden.ttl @@ -717,3 +717,17 @@ expr:ShadowBody__Sensor__highs_pvalue_pa0_presult_pa0_preferent sysml:memberElement "value" ; sysml:owner expr:ShadowBody__Sensor__highs_pvalue_pa0_presult_pa0 ; sysml:owningRelatedElement expr:ShadowBody__Sensor__highs_pvalue_pa0_presult_pa0 . + + + a sysml:LibraryPackage ; + sysml:elementId "1ed3f10f-1391-5a27-a5bd-233a70b01328" ; + sysml:qualifiedName "ControlFunctions" ; + sysml:declaredName "ControlFunctions" ; + sysml:isLibraryElement "true"^^xsd:boolean . + +elmt:d2b84130-4d51-5e96-9ce6-150b5bd9ff56 + a sysml:Function ; + sysml:elementId "d2b84130-4d51-5e96-9ce6-150b5bd9ff56" ; + sysml:qualifiedName "ControlFunctions::select" ; + sysml:declaredName "select" ; + sysml:isLibraryElement "true"^^xsd:boolean . diff --git a/tests/export/testdata/convert/shadowing_parameters.golden.ttl b/tests/export/testdata/convert/shadowing_parameters.golden.ttl index 577db5c4c3..eb0dc5ffc1 100644 --- a/tests/export/testdata/convert/shadowing_parameters.golden.ttl +++ b/tests/export/testdata/convert/shadowing_parameters.golden.ttl @@ -542,17 +542,19 @@ elmt:Shadows__Governor___404 sysml:owningRelationship elmt:Shadows__Governor___404_om ; sysml:owningMembership elmt:Shadows__Governor___404_om ; sysx:transitionSyntax "source" ; + sysml:ownedRelationship expr:Shadows__Governor___404_psourcemember, elmt:Shadows__Governor___404_linkparam_om, expr:Shadows__Governor___404_pguard_om, elmt:Shadows__Governor___404_succession_om ; + sysml:ownedMembership expr:Shadows__Governor___404_psourcemember, elmt:Shadows__Governor___404_linkparam_om, expr:Shadows__Governor___404_pguard_om, elmt:Shadows__Governor___404_succession_om ; + sysml:ownedFeatureMembership elmt:Shadows__Governor___404_linkparam_om ; + sysml:ownedFeature elmt:Shadows__Governor___404_linkparam ; sysml:succession elmt:Shadows__Governor___404_succession ; sysx:trigger "setSpeed(value)" ; sysx:triggerKeyword "accept" ; sysx:guard expr:Shadows__Governor___404_pguard ; - sysml:ownedRelationship expr:Shadows__Governor___404_pguard_om, elmt:Shadows__Governor___404_succession_om ; - sysml:ownedMembership expr:Shadows__Governor___404_pguard_om, elmt:Shadows__Governor___404_succession_om ; sysml:source elmt:Shadows__Governor__idle ; sysml:target elmt:Shadows__Governor__fast ; sysx:sourceText " transition idle then fast accept setSpeed(value) if value > 0;\n" ; - json:ownedRelationship "[{\"@id\":\"Shadows__Governor___404_pguard_om\"},{\"@id\":\"Shadows__Governor___404_succession_om\"}]" ; - json:ownedMembership "[{\"@id\":\"Shadows__Governor___404_pguard_om\"},{\"@id\":\"Shadows__Governor___404_succession_om\"}]" . + json:ownedRelationship "[{\"@id\":\"Shadows__Governor___404_psourcemember\"},{\"@id\":\"Shadows__Governor___404_linkparam_om\"},{\"@id\":\"Shadows__Governor___404_pguard_om\"},{\"@id\":\"Shadows__Governor___404_succession_om\"}]" ; + json:ownedMembership "[{\"@id\":\"Shadows__Governor___404_psourcemember\"},{\"@id\":\"Shadows__Governor___404_linkparam_om\"},{\"@id\":\"Shadows__Governor___404_pguard_om\"},{\"@id\":\"Shadows__Governor___404_succession_om\"}]" . elmt:Shadows__Governor___404_om a sysml:FeatureMembership ; @@ -566,6 +568,34 @@ elmt:Shadows__Governor___404_om sysml:ownedMemberFeature elmt:Shadows__Governor___404 ; sysml:owningType elmt:Shadows__Governor . +expr:Shadows__Governor___404_psourcemember + a sysml:Membership ; + sysml:elementId "Shadows__Governor___404_psourcemember" ; + sysml:owner elmt:Shadows__Governor___404 ; + sysml:memberElement elmt:Shadows__Governor__idle ; + sysml:owningRelatedElement elmt:Shadows__Governor___404 ; + sysml:membershipOwningNamespace elmt:Shadows__Governor___404 . + +elmt:Shadows__Governor___404_linkparam + a sysml:ReferenceUsage ; + sysml:elementId "Shadows__Governor___404_linkparam" ; + sysml:direction "in" ; + sysml:owner elmt:Shadows__Governor___404 ; + sysml:owningRelationship elmt:Shadows__Governor___404_linkparam_om ; + sysml:owningMembership elmt:Shadows__Governor___404_linkparam_om . + +elmt:Shadows__Governor___404_linkparam_om + a sysml:ParameterMembership ; + sysml:elementId "Shadows__Governor___404_linkparam_om" ; + sysml:owner elmt:Shadows__Governor___404 ; + sysml:memberElement elmt:Shadows__Governor___404_linkparam ; + sysml:ownedMemberElement elmt:Shadows__Governor___404_linkparam ; + sysml:ownedRelatedElement elmt:Shadows__Governor___404_linkparam ; + sysml:owningRelatedElement elmt:Shadows__Governor___404 ; + sysml:membershipOwningNamespace elmt:Shadows__Governor___404 ; + sysml:ownedMemberFeature elmt:Shadows__Governor___404_linkparam ; + sysml:ownedMemberParameter elmt:Shadows__Governor___404_linkparam . + elmt:Shadows__Governor___404_succession a sysml:SuccessionAsUsage ; sysml:elementId "Shadows__Governor___404_succession" ; @@ -834,19 +864,21 @@ elmt:Shadows__Governor___405 sysml:owningRelationship elmt:Shadows__Governor___405_om ; sysml:owningMembership elmt:Shadows__Governor___405_om ; sysx:transitionSyntax "source" ; + sysml:ownedRelationship expr:Shadows__Governor___405_psourcemember, elmt:Shadows__Governor___405_linkparam_om, elmt:Shadows__Governor___405_triggerparam_om, elmt:Shadows__Governor___405___40trigger_om, expr:Shadows__Governor___405_pguard_om, elmt:Shadows__Governor___405_succession_om ; + sysml:ownedMembership expr:Shadows__Governor___405_psourcemember, elmt:Shadows__Governor___405_linkparam_om, elmt:Shadows__Governor___405_triggerparam_om, elmt:Shadows__Governor___405___40trigger_om, expr:Shadows__Governor___405_pguard_om, elmt:Shadows__Governor___405_succession_om ; + sysml:ownedFeatureMembership elmt:Shadows__Governor___405_linkparam_om, elmt:Shadows__Governor___405_triggerparam_om, elmt:Shadows__Governor___405___40trigger_om ; + sysml:ownedFeature elmt:Shadows__Governor___405_linkparam, elmt:Shadows__Governor___405_triggerparam, elmt:Shadows__Governor___405___40trigger ; sysml:succession elmt:Shadows__Governor___405_succession ; sysml:triggerAction elmt:Shadows__Governor___405___40trigger ; sysml:ownedMember elmt:Shadows__Governor___405___40trigger ; - sysml:ownedMembership elmt:Shadows__Governor___405___40trigger_om, expr:Shadows__Governor___405_pguard_om, elmt:Shadows__Governor___405_succession_om ; - sysml:ownedRelationship elmt:Shadows__Governor___405___40trigger_om, expr:Shadows__Governor___405_pguard_om, elmt:Shadows__Governor___405_succession_om ; - sysml:ownedFeature elmt:Shadows__Governor___405___40trigger ; - sysml:ownedFeatureMembership elmt:Shadows__Governor___405___40trigger_om ; sysx:guard expr:Shadows__Governor___405_pguard ; sysml:source elmt:Shadows__Governor__fast ; sysml:target elmt:Shadows__Governor__idle ; sysx:sourceText " transition fast then idle accept w : Speed if w > 0;\n" ; - json:ownedMembership "[{\"@id\":\"Shadows__Governor___405___40trigger_om\"},{\"@id\":\"Shadows__Governor___405_pguard_om\"},{\"@id\":\"Shadows__Governor___405_succession_om\"}]" ; - json:ownedRelationship "[{\"@id\":\"Shadows__Governor___405___40trigger_om\"},{\"@id\":\"Shadows__Governor___405_pguard_om\"},{\"@id\":\"Shadows__Governor___405_succession_om\"}]" . + json:ownedRelationship "[{\"@id\":\"Shadows__Governor___405_psourcemember\"},{\"@id\":\"Shadows__Governor___405_linkparam_om\"},{\"@id\":\"Shadows__Governor___405_triggerparam_om\"},{\"@id\":\"Shadows__Governor___405___40trigger_om\"},{\"@id\":\"Shadows__Governor___405_pguard_om\"},{\"@id\":\"Shadows__Governor___405_succession_om\"}]" ; + json:ownedMembership "[{\"@id\":\"Shadows__Governor___405_psourcemember\"},{\"@id\":\"Shadows__Governor___405_linkparam_om\"},{\"@id\":\"Shadows__Governor___405_triggerparam_om\"},{\"@id\":\"Shadows__Governor___405___40trigger_om\"},{\"@id\":\"Shadows__Governor___405_pguard_om\"},{\"@id\":\"Shadows__Governor___405_succession_om\"}]" ; + json:ownedFeatureMembership "[{\"@id\":\"Shadows__Governor___405_linkparam_om\"},{\"@id\":\"Shadows__Governor___405_triggerparam_om\"},{\"@id\":\"Shadows__Governor___405___40trigger_om\"}]" ; + json:ownedFeature "[{\"@id\":\"Shadows__Governor___405_linkparam\"},{\"@id\":\"Shadows__Governor___405_triggerparam\"},{\"@id\":\"Shadows__Governor___405___40trigger\"}]" . elmt:Shadows__Governor___405_om a sysml:FeatureMembership ; @@ -860,6 +892,54 @@ elmt:Shadows__Governor___405_om sysml:ownedMemberFeature elmt:Shadows__Governor___405 ; sysml:owningType elmt:Shadows__Governor . +expr:Shadows__Governor___405_psourcemember + a sysml:Membership ; + sysml:elementId "Shadows__Governor___405_psourcemember" ; + sysml:owner elmt:Shadows__Governor___405 ; + sysml:memberElement elmt:Shadows__Governor__fast ; + sysml:owningRelatedElement elmt:Shadows__Governor___405 ; + sysml:membershipOwningNamespace elmt:Shadows__Governor___405 . + +elmt:Shadows__Governor___405_linkparam + a sysml:ReferenceUsage ; + sysml:elementId "Shadows__Governor___405_linkparam" ; + sysml:direction "in" ; + sysml:owner elmt:Shadows__Governor___405 ; + sysml:owningRelationship elmt:Shadows__Governor___405_linkparam_om ; + sysml:owningMembership elmt:Shadows__Governor___405_linkparam_om . + +elmt:Shadows__Governor___405_linkparam_om + a sysml:ParameterMembership ; + sysml:elementId "Shadows__Governor___405_linkparam_om" ; + sysml:owner elmt:Shadows__Governor___405 ; + sysml:memberElement elmt:Shadows__Governor___405_linkparam ; + sysml:ownedMemberElement elmt:Shadows__Governor___405_linkparam ; + sysml:ownedRelatedElement elmt:Shadows__Governor___405_linkparam ; + sysml:owningRelatedElement elmt:Shadows__Governor___405 ; + sysml:membershipOwningNamespace elmt:Shadows__Governor___405 ; + sysml:ownedMemberFeature elmt:Shadows__Governor___405_linkparam ; + sysml:ownedMemberParameter elmt:Shadows__Governor___405_linkparam . + +elmt:Shadows__Governor___405_triggerparam + a sysml:ReferenceUsage ; + sysml:elementId "Shadows__Governor___405_triggerparam" ; + sysml:direction "in" ; + sysml:owner elmt:Shadows__Governor___405 ; + sysml:owningRelationship elmt:Shadows__Governor___405_triggerparam_om ; + sysml:owningMembership elmt:Shadows__Governor___405_triggerparam_om . + +elmt:Shadows__Governor___405_triggerparam_om + a sysml:ParameterMembership ; + sysml:elementId "Shadows__Governor___405_triggerparam_om" ; + sysml:owner elmt:Shadows__Governor___405 ; + sysml:memberElement elmt:Shadows__Governor___405_triggerparam ; + sysml:ownedMemberElement elmt:Shadows__Governor___405_triggerparam ; + sysml:ownedRelatedElement elmt:Shadows__Governor___405_triggerparam ; + sysml:owningRelatedElement elmt:Shadows__Governor___405 ; + sysml:membershipOwningNamespace elmt:Shadows__Governor___405 ; + sysml:ownedMemberFeature elmt:Shadows__Governor___405_triggerparam ; + sysml:ownedMemberParameter elmt:Shadows__Governor___405_triggerparam . + elmt:Shadows__Governor___405_succession a sysml:SuccessionAsUsage ; sysml:elementId "Shadows__Governor___405_succession" ; diff --git a/tests/export/testdata/convert/state_machine.golden.ttl b/tests/export/testdata/convert/state_machine.golden.ttl index 7ede725aab..b20a123d19 100644 --- a/tests/export/testdata/convert/state_machine.golden.ttl +++ b/tests/export/testdata/convert/state_machine.golden.ttl @@ -520,17 +520,19 @@ elmt:StateMachine__VehicleStates__active___401 sysml:owningRelationship elmt:StateMachine__VehicleStates__active___401_om ; sysml:owningMembership elmt:StateMachine__VehicleStates__active___401_om ; sysx:transitionSyntax "accept" ; + sysml:ownedRelationship elmt:StateMachine__VehicleStates__active___401_linkparam_om, elmt:StateMachine__VehicleStates__active___401_triggerparam_om, elmt:StateMachine__VehicleStates__active___401___40trigger_om, elmt:StateMachine__VehicleStates__active___401_succession_om ; + sysml:ownedMembership elmt:StateMachine__VehicleStates__active___401_linkparam_om, elmt:StateMachine__VehicleStates__active___401_triggerparam_om, elmt:StateMachine__VehicleStates__active___401___40trigger_om, elmt:StateMachine__VehicleStates__active___401_succession_om ; + sysml:ownedFeatureMembership elmt:StateMachine__VehicleStates__active___401_linkparam_om, elmt:StateMachine__VehicleStates__active___401_triggerparam_om, elmt:StateMachine__VehicleStates__active___401___40trigger_om ; + sysml:ownedFeature elmt:StateMachine__VehicleStates__active___401_linkparam, elmt:StateMachine__VehicleStates__active___401_triggerparam, elmt:StateMachine__VehicleStates__active___401___40trigger ; sysml:succession elmt:StateMachine__VehicleStates__active___401_succession ; sysml:triggerAction elmt:StateMachine__VehicleStates__active___401___40trigger ; sysml:ownedMember elmt:StateMachine__VehicleStates__active___401___40trigger ; - sysml:ownedMembership elmt:StateMachine__VehicleStates__active___401___40trigger_om, elmt:StateMachine__VehicleStates__active___401_succession_om ; - sysml:ownedRelationship elmt:StateMachine__VehicleStates__active___401___40trigger_om, elmt:StateMachine__VehicleStates__active___401_succession_om ; - sysml:ownedFeature elmt:StateMachine__VehicleStates__active___401___40trigger ; - sysml:ownedFeatureMembership elmt:StateMachine__VehicleStates__active___401___40trigger_om ; sysml:target elmt:StateMachine__VehicleStates__off ; sysx:sourceText " accept sig : Signal then off;\n" ; - json:ownedMembership "[{\"@id\":\"StateMachine__VehicleStates__active___401___40trigger_om\"},{\"@id\":\"StateMachine__VehicleStates__active___401_succession_om\"}]" ; - json:ownedRelationship "[{\"@id\":\"StateMachine__VehicleStates__active___401___40trigger_om\"},{\"@id\":\"StateMachine__VehicleStates__active___401_succession_om\"}]" . + json:ownedRelationship "[{\"@id\":\"StateMachine__VehicleStates__active___401_linkparam_om\"},{\"@id\":\"StateMachine__VehicleStates__active___401_triggerparam_om\"},{\"@id\":\"StateMachine__VehicleStates__active___401___40trigger_om\"},{\"@id\":\"StateMachine__VehicleStates__active___401_succession_om\"}]" ; + json:ownedMembership "[{\"@id\":\"StateMachine__VehicleStates__active___401_linkparam_om\"},{\"@id\":\"StateMachine__VehicleStates__active___401_triggerparam_om\"},{\"@id\":\"StateMachine__VehicleStates__active___401___40trigger_om\"},{\"@id\":\"StateMachine__VehicleStates__active___401_succession_om\"}]" ; + json:ownedFeatureMembership "[{\"@id\":\"StateMachine__VehicleStates__active___401_linkparam_om\"},{\"@id\":\"StateMachine__VehicleStates__active___401_triggerparam_om\"},{\"@id\":\"StateMachine__VehicleStates__active___401___40trigger_om\"}]" ; + json:ownedFeature "[{\"@id\":\"StateMachine__VehicleStates__active___401_linkparam\"},{\"@id\":\"StateMachine__VehicleStates__active___401_triggerparam\"},{\"@id\":\"StateMachine__VehicleStates__active___401___40trigger\"}]" . elmt:StateMachine__VehicleStates__active___401_om a sysml:FeatureMembership ; @@ -544,6 +546,46 @@ elmt:StateMachine__VehicleStates__active___401_om sysml:ownedMemberFeature elmt:StateMachine__VehicleStates__active___401 ; sysml:owningType elmt:StateMachine__VehicleStates__active . +elmt:StateMachine__VehicleStates__active___401_linkparam + a sysml:ReferenceUsage ; + sysml:elementId "StateMachine__VehicleStates__active___401_linkparam" ; + sysml:direction "in" ; + sysml:owner elmt:StateMachine__VehicleStates__active___401 ; + sysml:owningRelationship elmt:StateMachine__VehicleStates__active___401_linkparam_om ; + sysml:owningMembership elmt:StateMachine__VehicleStates__active___401_linkparam_om . + +elmt:StateMachine__VehicleStates__active___401_linkparam_om + a sysml:ParameterMembership ; + sysml:elementId "StateMachine__VehicleStates__active___401_linkparam_om" ; + sysml:owner elmt:StateMachine__VehicleStates__active___401 ; + sysml:memberElement elmt:StateMachine__VehicleStates__active___401_linkparam ; + sysml:ownedMemberElement elmt:StateMachine__VehicleStates__active___401_linkparam ; + sysml:ownedRelatedElement elmt:StateMachine__VehicleStates__active___401_linkparam ; + sysml:owningRelatedElement elmt:StateMachine__VehicleStates__active___401 ; + sysml:membershipOwningNamespace elmt:StateMachine__VehicleStates__active___401 ; + sysml:ownedMemberFeature elmt:StateMachine__VehicleStates__active___401_linkparam ; + sysml:ownedMemberParameter elmt:StateMachine__VehicleStates__active___401_linkparam . + +elmt:StateMachine__VehicleStates__active___401_triggerparam + a sysml:ReferenceUsage ; + sysml:elementId "StateMachine__VehicleStates__active___401_triggerparam" ; + sysml:direction "in" ; + sysml:owner elmt:StateMachine__VehicleStates__active___401 ; + sysml:owningRelationship elmt:StateMachine__VehicleStates__active___401_triggerparam_om ; + sysml:owningMembership elmt:StateMachine__VehicleStates__active___401_triggerparam_om . + +elmt:StateMachine__VehicleStates__active___401_triggerparam_om + a sysml:ParameterMembership ; + sysml:elementId "StateMachine__VehicleStates__active___401_triggerparam_om" ; + sysml:owner elmt:StateMachine__VehicleStates__active___401 ; + sysml:memberElement elmt:StateMachine__VehicleStates__active___401_triggerparam ; + sysml:ownedMemberElement elmt:StateMachine__VehicleStates__active___401_triggerparam ; + sysml:ownedRelatedElement elmt:StateMachine__VehicleStates__active___401_triggerparam ; + sysml:owningRelatedElement elmt:StateMachine__VehicleStates__active___401 ; + sysml:membershipOwningNamespace elmt:StateMachine__VehicleStates__active___401 ; + sysml:ownedMemberFeature elmt:StateMachine__VehicleStates__active___401_triggerparam ; + sysml:ownedMemberParameter elmt:StateMachine__VehicleStates__active___401_triggerparam . + elmt:StateMachine__VehicleStates__active___401_succession a sysml:SuccessionAsUsage ; sysml:elementId "StateMachine__VehicleStates__active___401_succession" ; @@ -718,18 +760,20 @@ elmt:StateMachine__VehicleStates__off_5fto_5fstart sysml:owningMembership elmt:StateMachine__VehicleStates__off_5fto_5fstart_om ; sysml:declaredName "off_to_start" ; sysx:transitionSyntax "first" ; + sysml:ownedRelationship expr:StateMachine__VehicleStates__off_5fto_5fstart_psourcemember, elmt:StateMachine__VehicleStates__off_5fto_5fstart_linkparam_om, elmt:StateMachine__VehicleStates__off_5fto_5fstart_triggerparam_om, elmt:StateMachine__VehicleStates__off_5fto_5fstart___40trigger_om, elmt:StateMachine__VehicleStates__off_5fto_5fstart_succession_om ; + sysml:ownedMembership expr:StateMachine__VehicleStates__off_5fto_5fstart_psourcemember, elmt:StateMachine__VehicleStates__off_5fto_5fstart_linkparam_om, elmt:StateMachine__VehicleStates__off_5fto_5fstart_triggerparam_om, elmt:StateMachine__VehicleStates__off_5fto_5fstart___40trigger_om, elmt:StateMachine__VehicleStates__off_5fto_5fstart_succession_om ; + sysml:ownedFeatureMembership elmt:StateMachine__VehicleStates__off_5fto_5fstart_linkparam_om, elmt:StateMachine__VehicleStates__off_5fto_5fstart_triggerparam_om, elmt:StateMachine__VehicleStates__off_5fto_5fstart___40trigger_om ; + sysml:ownedFeature elmt:StateMachine__VehicleStates__off_5fto_5fstart_linkparam, elmt:StateMachine__VehicleStates__off_5fto_5fstart_triggerparam, elmt:StateMachine__VehicleStates__off_5fto_5fstart___40trigger ; sysml:succession elmt:StateMachine__VehicleStates__off_5fto_5fstart_succession ; sysml:triggerAction elmt:StateMachine__VehicleStates__off_5fto_5fstart___40trigger ; sysml:ownedMember elmt:StateMachine__VehicleStates__off_5fto_5fstart___40trigger ; - sysml:ownedMembership elmt:StateMachine__VehicleStates__off_5fto_5fstart___40trigger_om, elmt:StateMachine__VehicleStates__off_5fto_5fstart_succession_om ; - sysml:ownedRelationship elmt:StateMachine__VehicleStates__off_5fto_5fstart___40trigger_om, elmt:StateMachine__VehicleStates__off_5fto_5fstart_succession_om ; - sysml:ownedFeature elmt:StateMachine__VehicleStates__off_5fto_5fstart___40trigger ; - sysml:ownedFeatureMembership elmt:StateMachine__VehicleStates__off_5fto_5fstart___40trigger_om ; sysml:source elmt:StateMachine__VehicleStates__off ; sysml:target elmt:StateMachine__VehicleStates__starting ; sysx:sourceText " transition off_to_start first off accept sig : Signal then starting;\n" ; - json:ownedMembership "[{\"@id\":\"StateMachine__VehicleStates__off_5fto_5fstart___40trigger_om\"},{\"@id\":\"StateMachine__VehicleStates__off_5fto_5fstart_succession_om\"}]" ; - json:ownedRelationship "[{\"@id\":\"StateMachine__VehicleStates__off_5fto_5fstart___40trigger_om\"},{\"@id\":\"StateMachine__VehicleStates__off_5fto_5fstart_succession_om\"}]" . + json:ownedRelationship "[{\"@id\":\"StateMachine__VehicleStates__off_5fto_5fstart_psourcemember\"},{\"@id\":\"StateMachine__VehicleStates__off_5fto_5fstart_linkparam_om\"},{\"@id\":\"StateMachine__VehicleStates__off_5fto_5fstart_triggerparam_om\"},{\"@id\":\"StateMachine__VehicleStates__off_5fto_5fstart___40trigger_om\"},{\"@id\":\"StateMachine__VehicleStates__off_5fto_5fstart_succession_om\"}]" ; + json:ownedMembership "[{\"@id\":\"StateMachine__VehicleStates__off_5fto_5fstart_psourcemember\"},{\"@id\":\"StateMachine__VehicleStates__off_5fto_5fstart_linkparam_om\"},{\"@id\":\"StateMachine__VehicleStates__off_5fto_5fstart_triggerparam_om\"},{\"@id\":\"StateMachine__VehicleStates__off_5fto_5fstart___40trigger_om\"},{\"@id\":\"StateMachine__VehicleStates__off_5fto_5fstart_succession_om\"}]" ; + json:ownedFeatureMembership "[{\"@id\":\"StateMachine__VehicleStates__off_5fto_5fstart_linkparam_om\"},{\"@id\":\"StateMachine__VehicleStates__off_5fto_5fstart_triggerparam_om\"},{\"@id\":\"StateMachine__VehicleStates__off_5fto_5fstart___40trigger_om\"}]" ; + json:ownedFeature "[{\"@id\":\"StateMachine__VehicleStates__off_5fto_5fstart_linkparam\"},{\"@id\":\"StateMachine__VehicleStates__off_5fto_5fstart_triggerparam\"},{\"@id\":\"StateMachine__VehicleStates__off_5fto_5fstart___40trigger\"}]" . elmt:StateMachine__VehicleStates__off_5fto_5fstart_om a sysml:FeatureMembership ; @@ -743,6 +787,54 @@ elmt:StateMachine__VehicleStates__off_5fto_5fstart_om sysml:ownedMemberFeature elmt:StateMachine__VehicleStates__off_5fto_5fstart ; sysml:owningType elmt:StateMachine__VehicleStates . +expr:StateMachine__VehicleStates__off_5fto_5fstart_psourcemember + a sysml:Membership ; + sysml:elementId "StateMachine__VehicleStates__off_5fto_5fstart_psourcemember" ; + sysml:owner elmt:StateMachine__VehicleStates__off_5fto_5fstart ; + sysml:memberElement elmt:StateMachine__VehicleStates__off ; + sysml:owningRelatedElement elmt:StateMachine__VehicleStates__off_5fto_5fstart ; + sysml:membershipOwningNamespace elmt:StateMachine__VehicleStates__off_5fto_5fstart . + +elmt:StateMachine__VehicleStates__off_5fto_5fstart_linkparam + a sysml:ReferenceUsage ; + sysml:elementId "StateMachine__VehicleStates__off_5fto_5fstart_linkparam" ; + sysml:direction "in" ; + sysml:owner elmt:StateMachine__VehicleStates__off_5fto_5fstart ; + sysml:owningRelationship elmt:StateMachine__VehicleStates__off_5fto_5fstart_linkparam_om ; + sysml:owningMembership elmt:StateMachine__VehicleStates__off_5fto_5fstart_linkparam_om . + +elmt:StateMachine__VehicleStates__off_5fto_5fstart_linkparam_om + a sysml:ParameterMembership ; + sysml:elementId "StateMachine__VehicleStates__off_5fto_5fstart_linkparam_om" ; + sysml:owner elmt:StateMachine__VehicleStates__off_5fto_5fstart ; + sysml:memberElement elmt:StateMachine__VehicleStates__off_5fto_5fstart_linkparam ; + sysml:ownedMemberElement elmt:StateMachine__VehicleStates__off_5fto_5fstart_linkparam ; + sysml:ownedRelatedElement elmt:StateMachine__VehicleStates__off_5fto_5fstart_linkparam ; + sysml:owningRelatedElement elmt:StateMachine__VehicleStates__off_5fto_5fstart ; + sysml:membershipOwningNamespace elmt:StateMachine__VehicleStates__off_5fto_5fstart ; + sysml:ownedMemberFeature elmt:StateMachine__VehicleStates__off_5fto_5fstart_linkparam ; + sysml:ownedMemberParameter elmt:StateMachine__VehicleStates__off_5fto_5fstart_linkparam . + +elmt:StateMachine__VehicleStates__off_5fto_5fstart_triggerparam + a sysml:ReferenceUsage ; + sysml:elementId "StateMachine__VehicleStates__off_5fto_5fstart_triggerparam" ; + sysml:direction "in" ; + sysml:owner elmt:StateMachine__VehicleStates__off_5fto_5fstart ; + sysml:owningRelationship elmt:StateMachine__VehicleStates__off_5fto_5fstart_triggerparam_om ; + sysml:owningMembership elmt:StateMachine__VehicleStates__off_5fto_5fstart_triggerparam_om . + +elmt:StateMachine__VehicleStates__off_5fto_5fstart_triggerparam_om + a sysml:ParameterMembership ; + sysml:elementId "StateMachine__VehicleStates__off_5fto_5fstart_triggerparam_om" ; + sysml:owner elmt:StateMachine__VehicleStates__off_5fto_5fstart ; + sysml:memberElement elmt:StateMachine__VehicleStates__off_5fto_5fstart_triggerparam ; + sysml:ownedMemberElement elmt:StateMachine__VehicleStates__off_5fto_5fstart_triggerparam ; + sysml:ownedRelatedElement elmt:StateMachine__VehicleStates__off_5fto_5fstart_triggerparam ; + sysml:owningRelatedElement elmt:StateMachine__VehicleStates__off_5fto_5fstart ; + sysml:membershipOwningNamespace elmt:StateMachine__VehicleStates__off_5fto_5fstart ; + sysml:ownedMemberFeature elmt:StateMachine__VehicleStates__off_5fto_5fstart_triggerparam ; + sysml:ownedMemberParameter elmt:StateMachine__VehicleStates__off_5fto_5fstart_triggerparam . + elmt:StateMachine__VehicleStates__off_5fto_5fstart_succession a sysml:SuccessionAsUsage ; sysml:elementId "StateMachine__VehicleStates__off_5fto_5fstart_succession" ; @@ -916,15 +1008,17 @@ elmt:StateMachine__VehicleStates___405 sysml:owningRelationship elmt:StateMachine__VehicleStates___405_om ; sysml:owningMembership elmt:StateMachine__VehicleStates___405_om ; sysx:transitionSyntax "first" ; + sysml:ownedRelationship expr:StateMachine__VehicleStates___405_psourcemember, elmt:StateMachine__VehicleStates___405_linkparam_om, expr:StateMachine__VehicleStates___405_pguard_om, elmt:StateMachine__VehicleStates___405_succession_om ; + sysml:ownedMembership expr:StateMachine__VehicleStates___405_psourcemember, elmt:StateMachine__VehicleStates___405_linkparam_om, expr:StateMachine__VehicleStates___405_pguard_om, elmt:StateMachine__VehicleStates___405_succession_om ; + sysml:ownedFeatureMembership elmt:StateMachine__VehicleStates___405_linkparam_om ; + sysml:ownedFeature elmt:StateMachine__VehicleStates___405_linkparam ; sysml:succession elmt:StateMachine__VehicleStates___405_succession ; sysx:guard expr:StateMachine__VehicleStates___405_pguard ; - sysml:ownedRelationship expr:StateMachine__VehicleStates___405_pguard_om, elmt:StateMachine__VehicleStates___405_succession_om ; - sysml:ownedMembership expr:StateMachine__VehicleStates___405_pguard_om, elmt:StateMachine__VehicleStates___405_succession_om ; sysml:source elmt:StateMachine__VehicleStates__starting ; sysml:target elmt:StateMachine__VehicleStates__active ; sysx:sourceText " transition first starting if ready then active;\n" ; - json:ownedRelationship "[{\"@id\":\"StateMachine__VehicleStates___405_pguard_om\"},{\"@id\":\"StateMachine__VehicleStates___405_succession_om\"}]" ; - json:ownedMembership "[{\"@id\":\"StateMachine__VehicleStates___405_pguard_om\"},{\"@id\":\"StateMachine__VehicleStates___405_succession_om\"}]" . + json:ownedRelationship "[{\"@id\":\"StateMachine__VehicleStates___405_psourcemember\"},{\"@id\":\"StateMachine__VehicleStates___405_linkparam_om\"},{\"@id\":\"StateMachine__VehicleStates___405_pguard_om\"},{\"@id\":\"StateMachine__VehicleStates___405_succession_om\"}]" ; + json:ownedMembership "[{\"@id\":\"StateMachine__VehicleStates___405_psourcemember\"},{\"@id\":\"StateMachine__VehicleStates___405_linkparam_om\"},{\"@id\":\"StateMachine__VehicleStates___405_pguard_om\"},{\"@id\":\"StateMachine__VehicleStates___405_succession_om\"}]" . elmt:StateMachine__VehicleStates___405_om a sysml:FeatureMembership ; @@ -938,6 +1032,34 @@ elmt:StateMachine__VehicleStates___405_om sysml:ownedMemberFeature elmt:StateMachine__VehicleStates___405 ; sysml:owningType elmt:StateMachine__VehicleStates . +expr:StateMachine__VehicleStates___405_psourcemember + a sysml:Membership ; + sysml:elementId "StateMachine__VehicleStates___405_psourcemember" ; + sysml:owner elmt:StateMachine__VehicleStates___405 ; + sysml:memberElement elmt:StateMachine__VehicleStates__starting ; + sysml:owningRelatedElement elmt:StateMachine__VehicleStates___405 ; + sysml:membershipOwningNamespace elmt:StateMachine__VehicleStates___405 . + +elmt:StateMachine__VehicleStates___405_linkparam + a sysml:ReferenceUsage ; + sysml:elementId "StateMachine__VehicleStates___405_linkparam" ; + sysml:direction "in" ; + sysml:owner elmt:StateMachine__VehicleStates___405 ; + sysml:owningRelationship elmt:StateMachine__VehicleStates___405_linkparam_om ; + sysml:owningMembership elmt:StateMachine__VehicleStates___405_linkparam_om . + +elmt:StateMachine__VehicleStates___405_linkparam_om + a sysml:ParameterMembership ; + sysml:elementId "StateMachine__VehicleStates___405_linkparam_om" ; + sysml:owner elmt:StateMachine__VehicleStates___405 ; + sysml:memberElement elmt:StateMachine__VehicleStates___405_linkparam ; + sysml:ownedMemberElement elmt:StateMachine__VehicleStates___405_linkparam ; + sysml:ownedRelatedElement elmt:StateMachine__VehicleStates___405_linkparam ; + sysml:owningRelatedElement elmt:StateMachine__VehicleStates___405 ; + sysml:membershipOwningNamespace elmt:StateMachine__VehicleStates___405 ; + sysml:ownedMemberFeature elmt:StateMachine__VehicleStates___405_linkparam ; + sysml:ownedMemberParameter elmt:StateMachine__VehicleStates___405_linkparam . + elmt:StateMachine__VehicleStates___405_succession a sysml:SuccessionAsUsage ; sysml:elementId "StateMachine__VehicleStates___405_succession" ; @@ -1086,13 +1208,13 @@ elmt:StateMachine__VehicleStates__active_5fto_5foff sysml:owningMembership elmt:StateMachine__VehicleStates__active_5fto_5foff_om ; sysml:declaredName "active_to_off" ; sysx:transitionSyntax "first" ; + sysml:ownedRelationship expr:StateMachine__VehicleStates__active_5fto_5foff_psourcemember, elmt:StateMachine__VehicleStates__active_5fto_5foff_linkparam_om, elmt:StateMachine__VehicleStates__active_5fto_5foff_triggerparam_om, elmt:StateMachine__VehicleStates__active_5fto_5foff___40trigger_om, expr:StateMachine__VehicleStates__active_5fto_5foff_pguard_om, elmt:StateMachine__VehicleStates__active_5fto_5foff__stop_om, elmt:StateMachine__VehicleStates__active_5fto_5foff_succession_om ; + sysml:ownedMembership expr:StateMachine__VehicleStates__active_5fto_5foff_psourcemember, elmt:StateMachine__VehicleStates__active_5fto_5foff_linkparam_om, elmt:StateMachine__VehicleStates__active_5fto_5foff_triggerparam_om, elmt:StateMachine__VehicleStates__active_5fto_5foff___40trigger_om, expr:StateMachine__VehicleStates__active_5fto_5foff_pguard_om, elmt:StateMachine__VehicleStates__active_5fto_5foff__stop_om, elmt:StateMachine__VehicleStates__active_5fto_5foff_succession_om ; + sysml:ownedFeatureMembership elmt:StateMachine__VehicleStates__active_5fto_5foff_linkparam_om, elmt:StateMachine__VehicleStates__active_5fto_5foff_triggerparam_om, elmt:StateMachine__VehicleStates__active_5fto_5foff___40trigger_om, elmt:StateMachine__VehicleStates__active_5fto_5foff__stop_om ; + sysml:ownedFeature elmt:StateMachine__VehicleStates__active_5fto_5foff_linkparam, elmt:StateMachine__VehicleStates__active_5fto_5foff_triggerparam, elmt:StateMachine__VehicleStates__active_5fto_5foff___40trigger, elmt:StateMachine__VehicleStates__active_5fto_5foff__stop ; sysml:succession elmt:StateMachine__VehicleStates__active_5fto_5foff_succession ; sysml:triggerAction elmt:StateMachine__VehicleStates__active_5fto_5foff___40trigger ; sysml:ownedMember elmt:StateMachine__VehicleStates__active_5fto_5foff___40trigger, elmt:StateMachine__VehicleStates__active_5fto_5foff__stop ; - sysml:ownedMembership elmt:StateMachine__VehicleStates__active_5fto_5foff___40trigger_om, expr:StateMachine__VehicleStates__active_5fto_5foff_pguard_om, elmt:StateMachine__VehicleStates__active_5fto_5foff__stop_om, elmt:StateMachine__VehicleStates__active_5fto_5foff_succession_om ; - sysml:ownedRelationship elmt:StateMachine__VehicleStates__active_5fto_5foff___40trigger_om, expr:StateMachine__VehicleStates__active_5fto_5foff_pguard_om, elmt:StateMachine__VehicleStates__active_5fto_5foff__stop_om, elmt:StateMachine__VehicleStates__active_5fto_5foff_succession_om ; - sysml:ownedFeature elmt:StateMachine__VehicleStates__active_5fto_5foff___40trigger, elmt:StateMachine__VehicleStates__active_5fto_5foff__stop ; - sysml:ownedFeatureMembership elmt:StateMachine__VehicleStates__active_5fto_5foff___40trigger_om, elmt:StateMachine__VehicleStates__active_5fto_5foff__stop_om ; sysx:guard expr:StateMachine__VehicleStates__active_5fto_5foff_pguard ; sysx:hasEffect "true"^^xsd:boolean ; sysx:effectMember elmt:StateMachine__VehicleStates__active_5fto_5foff__stop ; @@ -1100,11 +1222,11 @@ elmt:StateMachine__VehicleStates__active_5fto_5foff sysml:source elmt:StateMachine__VehicleStates__active ; sysml:target elmt:StateMachine__VehicleStates__off ; sysx:sourceText " transition active_to_off first active accept sig : Signal via lane if monitor do action stop : Warm then off;\n" ; - json:ownedMember "[{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff___40trigger\"},{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff__stop\"}]" ; - json:ownedMembership "[{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff___40trigger_om\"},{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff_pguard_om\"},{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff__stop_om\"},{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff_succession_om\"}]" ; - json:ownedRelationship "[{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff___40trigger_om\"},{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff_pguard_om\"},{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff__stop_om\"},{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff_succession_om\"}]" ; - json:ownedFeature "[{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff___40trigger\"},{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff__stop\"}]" ; - json:ownedFeatureMembership "[{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff___40trigger_om\"},{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff__stop_om\"}]" . + json:ownedRelationship "[{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff_psourcemember\"},{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff_linkparam_om\"},{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff_triggerparam_om\"},{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff___40trigger_om\"},{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff_pguard_om\"},{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff__stop_om\"},{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff_succession_om\"}]" ; + json:ownedMembership "[{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff_psourcemember\"},{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff_linkparam_om\"},{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff_triggerparam_om\"},{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff___40trigger_om\"},{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff_pguard_om\"},{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff__stop_om\"},{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff_succession_om\"}]" ; + json:ownedFeatureMembership "[{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff_linkparam_om\"},{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff_triggerparam_om\"},{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff___40trigger_om\"},{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff__stop_om\"}]" ; + json:ownedFeature "[{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff_linkparam\"},{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff_triggerparam\"},{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff___40trigger\"},{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff__stop\"}]" ; + json:ownedMember "[{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff___40trigger\"},{\"@id\":\"StateMachine__VehicleStates__active_5fto_5foff__stop\"}]" . elmt:StateMachine__VehicleStates__active_5fto_5foff_om a sysml:FeatureMembership ; @@ -1118,6 +1240,54 @@ elmt:StateMachine__VehicleStates__active_5fto_5foff_om sysml:ownedMemberFeature elmt:StateMachine__VehicleStates__active_5fto_5foff ; sysml:owningType elmt:StateMachine__VehicleStates . +expr:StateMachine__VehicleStates__active_5fto_5foff_psourcemember + a sysml:Membership ; + sysml:elementId "StateMachine__VehicleStates__active_5fto_5foff_psourcemember" ; + sysml:owner elmt:StateMachine__VehicleStates__active_5fto_5foff ; + sysml:memberElement elmt:StateMachine__VehicleStates__active ; + sysml:owningRelatedElement elmt:StateMachine__VehicleStates__active_5fto_5foff ; + sysml:membershipOwningNamespace elmt:StateMachine__VehicleStates__active_5fto_5foff . + +elmt:StateMachine__VehicleStates__active_5fto_5foff_linkparam + a sysml:ReferenceUsage ; + sysml:elementId "StateMachine__VehicleStates__active_5fto_5foff_linkparam" ; + sysml:direction "in" ; + sysml:owner elmt:StateMachine__VehicleStates__active_5fto_5foff ; + sysml:owningRelationship elmt:StateMachine__VehicleStates__active_5fto_5foff_linkparam_om ; + sysml:owningMembership elmt:StateMachine__VehicleStates__active_5fto_5foff_linkparam_om . + +elmt:StateMachine__VehicleStates__active_5fto_5foff_linkparam_om + a sysml:ParameterMembership ; + sysml:elementId "StateMachine__VehicleStates__active_5fto_5foff_linkparam_om" ; + sysml:owner elmt:StateMachine__VehicleStates__active_5fto_5foff ; + sysml:memberElement elmt:StateMachine__VehicleStates__active_5fto_5foff_linkparam ; + sysml:ownedMemberElement elmt:StateMachine__VehicleStates__active_5fto_5foff_linkparam ; + sysml:ownedRelatedElement elmt:StateMachine__VehicleStates__active_5fto_5foff_linkparam ; + sysml:owningRelatedElement elmt:StateMachine__VehicleStates__active_5fto_5foff ; + sysml:membershipOwningNamespace elmt:StateMachine__VehicleStates__active_5fto_5foff ; + sysml:ownedMemberFeature elmt:StateMachine__VehicleStates__active_5fto_5foff_linkparam ; + sysml:ownedMemberParameter elmt:StateMachine__VehicleStates__active_5fto_5foff_linkparam . + +elmt:StateMachine__VehicleStates__active_5fto_5foff_triggerparam + a sysml:ReferenceUsage ; + sysml:elementId "StateMachine__VehicleStates__active_5fto_5foff_triggerparam" ; + sysml:direction "in" ; + sysml:owner elmt:StateMachine__VehicleStates__active_5fto_5foff ; + sysml:owningRelationship elmt:StateMachine__VehicleStates__active_5fto_5foff_triggerparam_om ; + sysml:owningMembership elmt:StateMachine__VehicleStates__active_5fto_5foff_triggerparam_om . + +elmt:StateMachine__VehicleStates__active_5fto_5foff_triggerparam_om + a sysml:ParameterMembership ; + sysml:elementId "StateMachine__VehicleStates__active_5fto_5foff_triggerparam_om" ; + sysml:owner elmt:StateMachine__VehicleStates__active_5fto_5foff ; + sysml:memberElement elmt:StateMachine__VehicleStates__active_5fto_5foff_triggerparam ; + sysml:ownedMemberElement elmt:StateMachine__VehicleStates__active_5fto_5foff_triggerparam ; + sysml:ownedRelatedElement elmt:StateMachine__VehicleStates__active_5fto_5foff_triggerparam ; + sysml:owningRelatedElement elmt:StateMachine__VehicleStates__active_5fto_5foff ; + sysml:membershipOwningNamespace elmt:StateMachine__VehicleStates__active_5fto_5foff ; + sysml:ownedMemberFeature elmt:StateMachine__VehicleStates__active_5fto_5foff_triggerparam ; + sysml:ownedMemberParameter elmt:StateMachine__VehicleStates__active_5fto_5foff_triggerparam . + elmt:StateMachine__VehicleStates__active_5fto_5foff_succession a sysml:SuccessionAsUsage ; sysml:elementId "StateMachine__VehicleStates__active_5fto_5foff_succession" ; diff --git a/tests/export/testdata/convert/then_after_members.golden.ttl b/tests/export/testdata/convert/then_after_members.golden.ttl index fc4d6555bb..16615e8dfb 100644 --- a/tests/export/testdata/convert/then_after_members.golden.ttl +++ b/tests/export/testdata/convert/then_after_members.golden.ttl @@ -178,15 +178,15 @@ elmt:ThenAfterMembers__AfterFlow sysml:ownedMember elmt:ThenAfterMembers__AfterFlow__a, elmt:ThenAfterMembers__AfterFlow___401, elmt:ThenAfterMembers__AfterFlow__b, elmt:ThenAfterMembers__AfterFlow___403 ; sysml:ownedMembership elmt:ThenAfterMembers__AfterFlow__a_om, elmt:ThenAfterMembers__AfterFlow___401_om, elmt:ThenAfterMembers__AfterFlow__b_om, elmt:ThenAfterMembers__AfterFlow___403_om ; sysml:ownedRelationship elmt:ThenAfterMembers__AfterFlow__a_om, elmt:ThenAfterMembers__AfterFlow___401_om, elmt:ThenAfterMembers__AfterFlow__b_om, elmt:ThenAfterMembers__AfterFlow___403_om ; - sysml:ownedFeature elmt:ThenAfterMembers__AfterFlow__a, elmt:ThenAfterMembers__AfterFlow__b, elmt:ThenAfterMembers__AfterFlow___403 ; - sysml:ownedFeatureMembership elmt:ThenAfterMembers__AfterFlow__a_om, elmt:ThenAfterMembers__AfterFlow__b_om, elmt:ThenAfterMembers__AfterFlow___403_om ; + sysml:ownedFeature elmt:ThenAfterMembers__AfterFlow__a, elmt:ThenAfterMembers__AfterFlow___401, elmt:ThenAfterMembers__AfterFlow__b, elmt:ThenAfterMembers__AfterFlow___403 ; + sysml:ownedFeatureMembership elmt:ThenAfterMembers__AfterFlow__a_om, elmt:ThenAfterMembers__AfterFlow___401_om, elmt:ThenAfterMembers__AfterFlow__b_om, elmt:ThenAfterMembers__AfterFlow___403_om ; sysx:sourceText " action def AfterFlow {\n" ; sysx:sourceTail " }\n" ; json:ownedMember "[{\"@id\":\"ThenAfterMembers__AfterFlow__a\"},{\"@id\":\"ThenAfterMembers__AfterFlow___401\"},{\"@id\":\"ThenAfterMembers__AfterFlow__b\"},{\"@id\":\"ThenAfterMembers__AfterFlow___403\"}]" ; json:ownedMembership "[{\"@id\":\"ThenAfterMembers__AfterFlow__a_om\"},{\"@id\":\"ThenAfterMembers__AfterFlow___401_om\"},{\"@id\":\"ThenAfterMembers__AfterFlow__b_om\"},{\"@id\":\"ThenAfterMembers__AfterFlow___403_om\"}]" ; json:ownedRelationship "[{\"@id\":\"ThenAfterMembers__AfterFlow__a_om\"},{\"@id\":\"ThenAfterMembers__AfterFlow___401_om\"},{\"@id\":\"ThenAfterMembers__AfterFlow__b_om\"},{\"@id\":\"ThenAfterMembers__AfterFlow___403_om\"}]" ; - json:ownedFeature "[{\"@id\":\"ThenAfterMembers__AfterFlow__a\"},{\"@id\":\"ThenAfterMembers__AfterFlow__b\"},{\"@id\":\"ThenAfterMembers__AfterFlow___403\"}]" ; - json:ownedFeatureMembership "[{\"@id\":\"ThenAfterMembers__AfterFlow__a_om\"},{\"@id\":\"ThenAfterMembers__AfterFlow__b_om\"},{\"@id\":\"ThenAfterMembers__AfterFlow___403_om\"}]" . + json:ownedFeature "[{\"@id\":\"ThenAfterMembers__AfterFlow__a\"},{\"@id\":\"ThenAfterMembers__AfterFlow___401\"},{\"@id\":\"ThenAfterMembers__AfterFlow__b\"},{\"@id\":\"ThenAfterMembers__AfterFlow___403\"}]" ; + json:ownedFeatureMembership "[{\"@id\":\"ThenAfterMembers__AfterFlow__a_om\"},{\"@id\":\"ThenAfterMembers__AfterFlow___401_om\"},{\"@id\":\"ThenAfterMembers__AfterFlow__b_om\"},{\"@id\":\"ThenAfterMembers__AfterFlow___403_om\"}]" . elmt:ThenAfterMembers__AfterFlow_om a sysml:OwningMembership ; @@ -261,14 +261,16 @@ elmt:ThenAfterMembers__AfterFlow___401 json:ownedEndFeature "[{\"@id\":\"ThenAfterMembers__AfterFlow___401_pend0\"},{\"@id\":\"ThenAfterMembers__AfterFlow___401_pend1\"}]" . elmt:ThenAfterMembers__AfterFlow___401_om - a sysml:OwningMembership ; + a sysml:FeatureMembership ; sysml:elementId "ThenAfterMembers__AfterFlow___401_om" ; sysml:owner elmt:ThenAfterMembers__AfterFlow ; sysml:memberElement elmt:ThenAfterMembers__AfterFlow___401 ; sysml:ownedMemberElement elmt:ThenAfterMembers__AfterFlow___401 ; sysml:ownedRelatedElement elmt:ThenAfterMembers__AfterFlow___401 ; sysml:owningRelatedElement elmt:ThenAfterMembers__AfterFlow ; - sysml:membershipOwningNamespace elmt:ThenAfterMembers__AfterFlow . + sysml:membershipOwningNamespace elmt:ThenAfterMembers__AfterFlow ; + sysml:ownedMemberFeature elmt:ThenAfterMembers__AfterFlow___401 ; + sysml:owningType elmt:ThenAfterMembers__AfterFlow . expr:ThenAfterMembers__AfterFlow___401_pend0 a sysml:FlowEnd ; @@ -6498,7 +6500,19 @@ elmt:ThenAfterMembers__AfterFirstThen___401 sysx:declaredKeyword "first" ; sysml:sourceFeature elmt:ThenAfterMembers__AfterFirstThen__a ; sysml:targetFeature elmt:ThenAfterMembers__AfterFirstThen__c ; - sysx:sourceText " first a then c;\n" . + sysml:connectorEnd expr:ThenAfterMembers__AfterFirstThen___401_pend0, expr:ThenAfterMembers__AfterFirstThen___401_pend1 ; + sysml:ownedRelationship expr:ThenAfterMembers__AfterFirstThen___401_pend0_om, expr:ThenAfterMembers__AfterFirstThen___401_pend1_om ; + sysml:ownedMembership expr:ThenAfterMembers__AfterFirstThen___401_pend0_om, expr:ThenAfterMembers__AfterFirstThen___401_pend1_om ; + sysml:ownedFeatureMembership expr:ThenAfterMembers__AfterFirstThen___401_pend0_om, expr:ThenAfterMembers__AfterFirstThen___401_pend1_om ; + sysml:ownedFeature expr:ThenAfterMembers__AfterFirstThen___401_pend0, expr:ThenAfterMembers__AfterFirstThen___401_pend1 ; + sysml:ownedEndFeature expr:ThenAfterMembers__AfterFirstThen___401_pend0, expr:ThenAfterMembers__AfterFirstThen___401_pend1 ; + sysx:sourceText " first a then c;\n" ; + json:connectorEnd "[{\"@id\":\"ThenAfterMembers__AfterFirstThen___401_pend0\"},{\"@id\":\"ThenAfterMembers__AfterFirstThen___401_pend1\"}]" ; + json:ownedRelationship "[{\"@id\":\"ThenAfterMembers__AfterFirstThen___401_pend0_om\"},{\"@id\":\"ThenAfterMembers__AfterFirstThen___401_pend1_om\"}]" ; + json:ownedMembership "[{\"@id\":\"ThenAfterMembers__AfterFirstThen___401_pend0_om\"},{\"@id\":\"ThenAfterMembers__AfterFirstThen___401_pend1_om\"}]" ; + json:ownedFeatureMembership "[{\"@id\":\"ThenAfterMembers__AfterFirstThen___401_pend0_om\"},{\"@id\":\"ThenAfterMembers__AfterFirstThen___401_pend1_om\"}]" ; + json:ownedFeature "[{\"@id\":\"ThenAfterMembers__AfterFirstThen___401_pend0\"},{\"@id\":\"ThenAfterMembers__AfterFirstThen___401_pend1\"}]" ; + json:ownedEndFeature "[{\"@id\":\"ThenAfterMembers__AfterFirstThen___401_pend0\"},{\"@id\":\"ThenAfterMembers__AfterFirstThen___401_pend1\"}]" . elmt:ThenAfterMembers__AfterFirstThen___401_om a sysml:FeatureMembership ; @@ -6512,6 +6526,87 @@ elmt:ThenAfterMembers__AfterFirstThen___401_om sysml:ownedMemberFeature elmt:ThenAfterMembers__AfterFirstThen___401 ; sysml:owningType elmt:ThenAfterMembers__AfterFirstThen . +expr:ThenAfterMembers__AfterFirstThen___401_pend0 + a sysml:ReferenceUsage ; + sysml:elementId "ThenAfterMembers__AfterFirstThen___401_pend0" ; + sysml:isEnd "true"^^xsd:boolean ; + sysml:owner elmt:ThenAfterMembers__AfterFirstThen___401 ; + sysml:owningRelationship expr:ThenAfterMembers__AfterFirstThen___401_pend0_om ; + sysml:owningMembership expr:ThenAfterMembers__AfterFirstThen___401_pend0_om ; + sysml:ownedReferenceSubsetting expr:ThenAfterMembers__AfterFirstThen___401_pend0_prs ; + sysml:ownedSubsetting expr:ThenAfterMembers__AfterFirstThen___401_pend0_prs ; + sysml:ownedSpecialization expr:ThenAfterMembers__AfterFirstThen___401_pend0_prs ; + sysml:ownedRelationship expr:ThenAfterMembers__AfterFirstThen___401_pend0_prs . + +expr:ThenAfterMembers__AfterFirstThen___401_pend0_om + a sysml:EndFeatureMembership ; + sysml:elementId "ThenAfterMembers__AfterFirstThen___401_pend0_om" ; + sysml:owner elmt:ThenAfterMembers__AfterFirstThen___401 ; + sysml:memberElement expr:ThenAfterMembers__AfterFirstThen___401_pend0 ; + sysml:ownedMemberElement expr:ThenAfterMembers__AfterFirstThen___401_pend0 ; + sysml:ownedRelatedElement expr:ThenAfterMembers__AfterFirstThen___401_pend0 ; + sysml:owningRelatedElement elmt:ThenAfterMembers__AfterFirstThen___401 ; + sysml:membershipOwningNamespace elmt:ThenAfterMembers__AfterFirstThen___401 . + +expr:ThenAfterMembers__AfterFirstThen___401_pend0_prs + a sysml:ReferenceSubsetting ; + sysml:elementId "ThenAfterMembers__AfterFirstThen___401_pend0_prs" ; + sysml:referencingFeature expr:ThenAfterMembers__AfterFirstThen___401_pend0 ; + sysml:subsettingFeature expr:ThenAfterMembers__AfterFirstThen___401_pend0 ; + sysml:specific expr:ThenAfterMembers__AfterFirstThen___401_pend0 ; + sysml:source expr:ThenAfterMembers__AfterFirstThen___401_pend0 ; + sysml:owningFeature expr:ThenAfterMembers__AfterFirstThen___401_pend0 ; + sysml:owningType expr:ThenAfterMembers__AfterFirstThen___401_pend0 ; + sysml:referencedFeature elmt:ThenAfterMembers__AfterFirstThen__a ; + sysml:subsettedFeature elmt:ThenAfterMembers__AfterFirstThen__a ; + sysml:general elmt:ThenAfterMembers__AfterFirstThen__a ; + sysml:target elmt:ThenAfterMembers__AfterFirstThen__a ; + sysml:relatedElement expr:ThenAfterMembers__AfterFirstThen___401_pend0, elmt:ThenAfterMembers__AfterFirstThen__a ; + sysml:owner expr:ThenAfterMembers__AfterFirstThen___401_pend0 ; + sysml:owningRelatedElement expr:ThenAfterMembers__AfterFirstThen___401_pend0 ; + json:relatedElement "[{\"@id\":\"ThenAfterMembers__AfterFirstThen___401_pend0\"},{\"@id\":\"ThenAfterMembers__AfterFirstThen__a\"}]" . + +expr:ThenAfterMembers__AfterFirstThen___401_pend1 + a sysml:ReferenceUsage ; + sysml:elementId "ThenAfterMembers__AfterFirstThen___401_pend1" ; + sysml:isEnd "true"^^xsd:boolean ; + sysml:owner elmt:ThenAfterMembers__AfterFirstThen___401 ; + sysml:owningRelationship expr:ThenAfterMembers__AfterFirstThen___401_pend1_om ; + sysml:owningMembership expr:ThenAfterMembers__AfterFirstThen___401_pend1_om ; + sysx:sourceText "c" ; + sysml:ownedReferenceSubsetting expr:ThenAfterMembers__AfterFirstThen___401_pend1_prs ; + sysml:ownedSubsetting expr:ThenAfterMembers__AfterFirstThen___401_pend1_prs ; + sysml:ownedSpecialization expr:ThenAfterMembers__AfterFirstThen___401_pend1_prs ; + sysml:ownedRelationship expr:ThenAfterMembers__AfterFirstThen___401_pend1_prs . + +expr:ThenAfterMembers__AfterFirstThen___401_pend1_om + a sysml:EndFeatureMembership ; + sysml:elementId "ThenAfterMembers__AfterFirstThen___401_pend1_om" ; + sysml:owner elmt:ThenAfterMembers__AfterFirstThen___401 ; + sysml:memberElement expr:ThenAfterMembers__AfterFirstThen___401_pend1 ; + sysml:ownedMemberElement expr:ThenAfterMembers__AfterFirstThen___401_pend1 ; + sysml:ownedRelatedElement expr:ThenAfterMembers__AfterFirstThen___401_pend1 ; + sysml:owningRelatedElement elmt:ThenAfterMembers__AfterFirstThen___401 ; + sysml:membershipOwningNamespace elmt:ThenAfterMembers__AfterFirstThen___401 . + +expr:ThenAfterMembers__AfterFirstThen___401_pend1_prs + a sysml:ReferenceSubsetting ; + sysml:elementId "ThenAfterMembers__AfterFirstThen___401_pend1_prs" ; + sysml:referencingFeature expr:ThenAfterMembers__AfterFirstThen___401_pend1 ; + sysml:subsettingFeature expr:ThenAfterMembers__AfterFirstThen___401_pend1 ; + sysml:specific expr:ThenAfterMembers__AfterFirstThen___401_pend1 ; + sysml:source expr:ThenAfterMembers__AfterFirstThen___401_pend1 ; + sysml:owningFeature expr:ThenAfterMembers__AfterFirstThen___401_pend1 ; + sysml:owningType expr:ThenAfterMembers__AfterFirstThen___401_pend1 ; + sysml:referencedFeature elmt:ThenAfterMembers__AfterFirstThen__c ; + sysml:subsettedFeature elmt:ThenAfterMembers__AfterFirstThen__c ; + sysml:general elmt:ThenAfterMembers__AfterFirstThen__c ; + sysml:target elmt:ThenAfterMembers__AfterFirstThen__c ; + sysml:relatedElement expr:ThenAfterMembers__AfterFirstThen___401_pend1, elmt:ThenAfterMembers__AfterFirstThen__c ; + sysml:owner expr:ThenAfterMembers__AfterFirstThen___401_pend1 ; + sysml:owningRelatedElement expr:ThenAfterMembers__AfterFirstThen___401_pend1 ; + json:relatedElement "[{\"@id\":\"ThenAfterMembers__AfterFirstThen___401_pend1\"},{\"@id\":\"ThenAfterMembers__AfterFirstThen__c\"}]" . + elmt:ThenAfterMembers__AfterFirstThen__b a sysml:ActionUsage ; sysml:qualifiedName "ThenAfterMembers::AfterFirstThen::b" ; @@ -7017,15 +7112,15 @@ elmt:ThenAfterMembers__AfterPerform sysml:ownedMember elmt:ThenAfterMembers__AfterPerform___400, elmt:ThenAfterMembers__AfterPerform___401, elmt:ThenAfterMembers__AfterPerform__b, elmt:ThenAfterMembers__AfterPerform___403 ; sysml:ownedMembership elmt:ThenAfterMembers__AfterPerform___400_om, elmt:ThenAfterMembers__AfterPerform___401_om, elmt:ThenAfterMembers__AfterPerform__b_om, elmt:ThenAfterMembers__AfterPerform___403_om ; sysml:ownedRelationship elmt:ThenAfterMembers__AfterPerform___400_om, elmt:ThenAfterMembers__AfterPerform___401_om, elmt:ThenAfterMembers__AfterPerform__b_om, elmt:ThenAfterMembers__AfterPerform___403_om ; - sysml:ownedFeature elmt:ThenAfterMembers__AfterPerform___400, elmt:ThenAfterMembers__AfterPerform__b, elmt:ThenAfterMembers__AfterPerform___403 ; - sysml:ownedFeatureMembership elmt:ThenAfterMembers__AfterPerform___400_om, elmt:ThenAfterMembers__AfterPerform__b_om, elmt:ThenAfterMembers__AfterPerform___403_om ; + sysml:ownedFeature elmt:ThenAfterMembers__AfterPerform___400, elmt:ThenAfterMembers__AfterPerform___401, elmt:ThenAfterMembers__AfterPerform__b, elmt:ThenAfterMembers__AfterPerform___403 ; + sysml:ownedFeatureMembership elmt:ThenAfterMembers__AfterPerform___400_om, elmt:ThenAfterMembers__AfterPerform___401_om, elmt:ThenAfterMembers__AfterPerform__b_om, elmt:ThenAfterMembers__AfterPerform___403_om ; sysx:sourceText " action def AfterPerform {\n" ; sysx:sourceTail " }\n" ; json:ownedMember "[{\"@id\":\"ThenAfterMembers__AfterPerform___400\"},{\"@id\":\"ThenAfterMembers__AfterPerform___401\"},{\"@id\":\"ThenAfterMembers__AfterPerform__b\"},{\"@id\":\"ThenAfterMembers__AfterPerform___403\"}]" ; json:ownedMembership "[{\"@id\":\"ThenAfterMembers__AfterPerform___400_om\"},{\"@id\":\"ThenAfterMembers__AfterPerform___401_om\"},{\"@id\":\"ThenAfterMembers__AfterPerform__b_om\"},{\"@id\":\"ThenAfterMembers__AfterPerform___403_om\"}]" ; json:ownedRelationship "[{\"@id\":\"ThenAfterMembers__AfterPerform___400_om\"},{\"@id\":\"ThenAfterMembers__AfterPerform___401_om\"},{\"@id\":\"ThenAfterMembers__AfterPerform__b_om\"},{\"@id\":\"ThenAfterMembers__AfterPerform___403_om\"}]" ; - json:ownedFeature "[{\"@id\":\"ThenAfterMembers__AfterPerform___400\"},{\"@id\":\"ThenAfterMembers__AfterPerform__b\"},{\"@id\":\"ThenAfterMembers__AfterPerform___403\"}]" ; - json:ownedFeatureMembership "[{\"@id\":\"ThenAfterMembers__AfterPerform___400_om\"},{\"@id\":\"ThenAfterMembers__AfterPerform__b_om\"},{\"@id\":\"ThenAfterMembers__AfterPerform___403_om\"}]" . + json:ownedFeature "[{\"@id\":\"ThenAfterMembers__AfterPerform___400\"},{\"@id\":\"ThenAfterMembers__AfterPerform___401\"},{\"@id\":\"ThenAfterMembers__AfterPerform__b\"},{\"@id\":\"ThenAfterMembers__AfterPerform___403\"}]" ; + json:ownedFeatureMembership "[{\"@id\":\"ThenAfterMembers__AfterPerform___400_om\"},{\"@id\":\"ThenAfterMembers__AfterPerform___401_om\"},{\"@id\":\"ThenAfterMembers__AfterPerform__b_om\"},{\"@id\":\"ThenAfterMembers__AfterPerform___403_om\"}]" . elmt:ThenAfterMembers__AfterPerform_om a sysml:OwningMembership ; @@ -7101,14 +7196,16 @@ elmt:ThenAfterMembers__AfterPerform___401 json:ownedEndFeature "[{\"@id\":\"ThenAfterMembers__AfterPerform___401_pend0\"},{\"@id\":\"ThenAfterMembers__AfterPerform___401_pend1\"}]" . elmt:ThenAfterMembers__AfterPerform___401_om - a sysml:OwningMembership ; + a sysml:FeatureMembership ; sysml:elementId "ThenAfterMembers__AfterPerform___401_om" ; sysml:owner elmt:ThenAfterMembers__AfterPerform ; sysml:memberElement elmt:ThenAfterMembers__AfterPerform___401 ; sysml:ownedMemberElement elmt:ThenAfterMembers__AfterPerform___401 ; sysml:ownedRelatedElement elmt:ThenAfterMembers__AfterPerform___401 ; sysml:owningRelatedElement elmt:ThenAfterMembers__AfterPerform ; - sysml:membershipOwningNamespace elmt:ThenAfterMembers__AfterPerform . + sysml:membershipOwningNamespace elmt:ThenAfterMembers__AfterPerform ; + sysml:ownedMemberFeature elmt:ThenAfterMembers__AfterPerform___401 ; + sysml:owningType elmt:ThenAfterMembers__AfterPerform . expr:ThenAfterMembers__AfterPerform___401_pend0 a sysml:FlowEnd ; @@ -7396,15 +7493,15 @@ elmt:ThenAfterMembers__ThenAlone sysml:ownedMember elmt:ThenAfterMembers__ThenAlone__a, elmt:ThenAfterMembers__ThenAlone___401, elmt:ThenAfterMembers__ThenAlone___402, elmt:ThenAfterMembers__ThenAlone__b ; sysml:ownedMembership elmt:ThenAfterMembers__ThenAlone__a_om, elmt:ThenAfterMembers__ThenAlone___401_om, elmt:ThenAfterMembers__ThenAlone___402_om, elmt:ThenAfterMembers__ThenAlone__b_om ; sysml:ownedRelationship elmt:ThenAfterMembers__ThenAlone__a_om, elmt:ThenAfterMembers__ThenAlone___401_om, elmt:ThenAfterMembers__ThenAlone___402_om, elmt:ThenAfterMembers__ThenAlone__b_om ; - sysml:ownedFeature elmt:ThenAfterMembers__ThenAlone__a, elmt:ThenAfterMembers__ThenAlone___402, elmt:ThenAfterMembers__ThenAlone__b ; - sysml:ownedFeatureMembership elmt:ThenAfterMembers__ThenAlone__a_om, elmt:ThenAfterMembers__ThenAlone___402_om, elmt:ThenAfterMembers__ThenAlone__b_om ; + sysml:ownedFeature elmt:ThenAfterMembers__ThenAlone__a, elmt:ThenAfterMembers__ThenAlone___401, elmt:ThenAfterMembers__ThenAlone___402, elmt:ThenAfterMembers__ThenAlone__b ; + sysml:ownedFeatureMembership elmt:ThenAfterMembers__ThenAlone__a_om, elmt:ThenAfterMembers__ThenAlone___401_om, elmt:ThenAfterMembers__ThenAlone___402_om, elmt:ThenAfterMembers__ThenAlone__b_om ; sysx:sourceText " action def ThenAlone {\n" ; sysx:sourceTail " }\n" ; json:ownedMember "[{\"@id\":\"ThenAfterMembers__ThenAlone__a\"},{\"@id\":\"ThenAfterMembers__ThenAlone___401\"},{\"@id\":\"ThenAfterMembers__ThenAlone___402\"},{\"@id\":\"ThenAfterMembers__ThenAlone__b\"}]" ; json:ownedMembership "[{\"@id\":\"ThenAfterMembers__ThenAlone__a_om\"},{\"@id\":\"ThenAfterMembers__ThenAlone___401_om\"},{\"@id\":\"ThenAfterMembers__ThenAlone___402_om\"},{\"@id\":\"ThenAfterMembers__ThenAlone__b_om\"}]" ; json:ownedRelationship "[{\"@id\":\"ThenAfterMembers__ThenAlone__a_om\"},{\"@id\":\"ThenAfterMembers__ThenAlone___401_om\"},{\"@id\":\"ThenAfterMembers__ThenAlone___402_om\"},{\"@id\":\"ThenAfterMembers__ThenAlone__b_om\"}]" ; - json:ownedFeature "[{\"@id\":\"ThenAfterMembers__ThenAlone__a\"},{\"@id\":\"ThenAfterMembers__ThenAlone___402\"},{\"@id\":\"ThenAfterMembers__ThenAlone__b\"}]" ; - json:ownedFeatureMembership "[{\"@id\":\"ThenAfterMembers__ThenAlone__a_om\"},{\"@id\":\"ThenAfterMembers__ThenAlone___402_om\"},{\"@id\":\"ThenAfterMembers__ThenAlone__b_om\"}]" . + json:ownedFeature "[{\"@id\":\"ThenAfterMembers__ThenAlone__a\"},{\"@id\":\"ThenAfterMembers__ThenAlone___401\"},{\"@id\":\"ThenAfterMembers__ThenAlone___402\"},{\"@id\":\"ThenAfterMembers__ThenAlone__b\"}]" ; + json:ownedFeatureMembership "[{\"@id\":\"ThenAfterMembers__ThenAlone__a_om\"},{\"@id\":\"ThenAfterMembers__ThenAlone___401_om\"},{\"@id\":\"ThenAfterMembers__ThenAlone___402_om\"},{\"@id\":\"ThenAfterMembers__ThenAlone__b_om\"}]" . elmt:ThenAfterMembers__ThenAlone_om a sysml:OwningMembership ; @@ -7479,14 +7576,16 @@ elmt:ThenAfterMembers__ThenAlone___401 json:ownedEndFeature "[{\"@id\":\"ThenAfterMembers__ThenAlone___401_pend0\"},{\"@id\":\"ThenAfterMembers__ThenAlone___401_pend1\"}]" . elmt:ThenAfterMembers__ThenAlone___401_om - a sysml:OwningMembership ; + a sysml:FeatureMembership ; sysml:elementId "ThenAfterMembers__ThenAlone___401_om" ; sysml:owner elmt:ThenAfterMembers__ThenAlone ; sysml:memberElement elmt:ThenAfterMembers__ThenAlone___401 ; sysml:ownedMemberElement elmt:ThenAfterMembers__ThenAlone___401 ; sysml:ownedRelatedElement elmt:ThenAfterMembers__ThenAlone___401 ; sysml:owningRelatedElement elmt:ThenAfterMembers__ThenAlone ; - sysml:membershipOwningNamespace elmt:ThenAfterMembers__ThenAlone . + sysml:membershipOwningNamespace elmt:ThenAfterMembers__ThenAlone ; + sysml:ownedMemberFeature elmt:ThenAfterMembers__ThenAlone___401 ; + sysml:owningType elmt:ThenAfterMembers__ThenAlone . expr:ThenAfterMembers__ThenAlone___401_pend0 a sysml:FlowEnd ; @@ -7896,12 +7995,16 @@ elmt:ThenAfterMembers__Lamp___403 sysml:owningRelationship elmt:ThenAfterMembers__Lamp___403_om ; sysml:owningMembership elmt:ThenAfterMembers__Lamp___403_om ; sysx:transitionSyntax "first" ; + sysml:ownedRelationship expr:ThenAfterMembers__Lamp___403_psourcemember, elmt:ThenAfterMembers__Lamp___403_linkparam_om, elmt:ThenAfterMembers__Lamp___403_succession_om ; + sysml:ownedMembership expr:ThenAfterMembers__Lamp___403_psourcemember, elmt:ThenAfterMembers__Lamp___403_linkparam_om, elmt:ThenAfterMembers__Lamp___403_succession_om ; + sysml:ownedFeatureMembership elmt:ThenAfterMembers__Lamp___403_linkparam_om ; + sysml:ownedFeature elmt:ThenAfterMembers__Lamp___403_linkparam ; sysml:succession elmt:ThenAfterMembers__Lamp___403_succession ; - sysml:ownedRelationship elmt:ThenAfterMembers__Lamp___403_succession_om ; - sysml:ownedMembership elmt:ThenAfterMembers__Lamp___403_succession_om ; sysml:source elmt:ThenAfterMembers__Lamp__on ; sysml:target elmt:ThenAfterMembers__Lamp__off ; - sysx:sourceText " transition first on then off;\n" . + sysx:sourceText " transition first on then off;\n" ; + json:ownedRelationship "[{\"@id\":\"ThenAfterMembers__Lamp___403_psourcemember\"},{\"@id\":\"ThenAfterMembers__Lamp___403_linkparam_om\"},{\"@id\":\"ThenAfterMembers__Lamp___403_succession_om\"}]" ; + json:ownedMembership "[{\"@id\":\"ThenAfterMembers__Lamp___403_psourcemember\"},{\"@id\":\"ThenAfterMembers__Lamp___403_linkparam_om\"},{\"@id\":\"ThenAfterMembers__Lamp___403_succession_om\"}]" . elmt:ThenAfterMembers__Lamp___403_om a sysml:FeatureMembership ; @@ -7915,6 +8018,34 @@ elmt:ThenAfterMembers__Lamp___403_om sysml:ownedMemberFeature elmt:ThenAfterMembers__Lamp___403 ; sysml:owningType elmt:ThenAfterMembers__Lamp . +expr:ThenAfterMembers__Lamp___403_psourcemember + a sysml:Membership ; + sysml:elementId "ThenAfterMembers__Lamp___403_psourcemember" ; + sysml:owner elmt:ThenAfterMembers__Lamp___403 ; + sysml:memberElement elmt:ThenAfterMembers__Lamp__on ; + sysml:owningRelatedElement elmt:ThenAfterMembers__Lamp___403 ; + sysml:membershipOwningNamespace elmt:ThenAfterMembers__Lamp___403 . + +elmt:ThenAfterMembers__Lamp___403_linkparam + a sysml:ReferenceUsage ; + sysml:elementId "ThenAfterMembers__Lamp___403_linkparam" ; + sysml:direction "in" ; + sysml:owner elmt:ThenAfterMembers__Lamp___403 ; + sysml:owningRelationship elmt:ThenAfterMembers__Lamp___403_linkparam_om ; + sysml:owningMembership elmt:ThenAfterMembers__Lamp___403_linkparam_om . + +elmt:ThenAfterMembers__Lamp___403_linkparam_om + a sysml:ParameterMembership ; + sysml:elementId "ThenAfterMembers__Lamp___403_linkparam_om" ; + sysml:owner elmt:ThenAfterMembers__Lamp___403 ; + sysml:memberElement elmt:ThenAfterMembers__Lamp___403_linkparam ; + sysml:ownedMemberElement elmt:ThenAfterMembers__Lamp___403_linkparam ; + sysml:ownedRelatedElement elmt:ThenAfterMembers__Lamp___403_linkparam ; + sysml:owningRelatedElement elmt:ThenAfterMembers__Lamp___403 ; + sysml:membershipOwningNamespace elmt:ThenAfterMembers__Lamp___403 ; + sysml:ownedMemberFeature elmt:ThenAfterMembers__Lamp___403_linkparam ; + sysml:ownedMemberParameter elmt:ThenAfterMembers__Lamp___403_linkparam . + elmt:ThenAfterMembers__Lamp___403_succession a sysml:SuccessionAsUsage ; sysml:elementId "ThenAfterMembers__Lamp___403_succession" ; @@ -9683,3 +9814,31 @@ elmt:ThenAfterMembers__Switch__pressed_ft0 sysml:owner elmt:ThenAfterMembers__Switch__pressed ; sysml:relatedElement elmt:ThenAfterMembers__Switch__pressed, elmt:d1e9242d-b2e3-5270-bf69-4f4fb0447193 ; json:relatedElement "[{\"@id\":\"ThenAfterMembers__Switch__pressed\"},{\"@id\":\"d1e9242d-b2e3-5270-bf69-4f4fb0447193\"}]" . + + + a sysml:ActionUsage ; + sysml:elementId "0cdc3cd3-b06c-5c32-beda-0cf4ba164a64" ; + sysml:qualifiedName "Actions::Action::done" ; + sysml:declaredName "done" ; + sysml:isLibraryElement "true"^^xsd:boolean . + + + a sysml:ActionUsage ; + sysml:elementId "9a0d2905-0f9c-5bb4-af74-9780d6db1817" ; + sysml:qualifiedName "Actions::Action::start" ; + sysml:declaredName "start" ; + sysml:isLibraryElement "true"^^xsd:boolean . + +elmt:d1e9242d-b2e3-5270-bf69-4f4fb0447193 + a sysml:DataType ; + sysml:elementId "d1e9242d-b2e3-5270-bf69-4f4fb0447193" ; + sysml:qualifiedName "ScalarValues::Boolean" ; + sysml:declaredName "Boolean" ; + sysml:isLibraryElement "true"^^xsd:boolean . + +elmt:f2350199-2ab1-5258-8514-58812ef25dc6 + a sysml:DataType ; + sysml:elementId "f2350199-2ab1-5258-8514-58812ef25dc6" ; + sysml:qualifiedName "ScalarValues::Integer" ; + sysml:declaredName "Integer" ; + sysml:isLibraryElement "true"^^xsd:boolean . diff --git a/tests/export/testdata/convert/views_flows_parameters.golden.ttl b/tests/export/testdata/convert/views_flows_parameters.golden.ttl index 985487639f..175b96783b 100644 --- a/tests/export/testdata/convert/views_flows_parameters.golden.ttl +++ b/tests/export/testdata/convert/views_flows_parameters.golden.ttl @@ -200,15 +200,15 @@ elmt:FlowsAndViews__FuelInterface sysml:ownedMember elmt:FlowsAndViews__FuelInterface__supplierPort, elmt:FlowsAndViews__FuelInterface__consumerPort, elmt:FlowsAndViews__FuelInterface___402 ; sysml:ownedMembership elmt:FlowsAndViews__FuelInterface__supplierPort_om, elmt:FlowsAndViews__FuelInterface__consumerPort_om, elmt:FlowsAndViews__FuelInterface___402_om ; sysml:ownedRelationship elmt:FlowsAndViews__FuelInterface__supplierPort_om, elmt:FlowsAndViews__FuelInterface__consumerPort_om, elmt:FlowsAndViews__FuelInterface___402_om ; - sysml:ownedFeature elmt:FlowsAndViews__FuelInterface__supplierPort, elmt:FlowsAndViews__FuelInterface__consumerPort ; - sysml:ownedFeatureMembership elmt:FlowsAndViews__FuelInterface__supplierPort_om, elmt:FlowsAndViews__FuelInterface__consumerPort_om ; + sysml:ownedFeature elmt:FlowsAndViews__FuelInterface__supplierPort, elmt:FlowsAndViews__FuelInterface__consumerPort, elmt:FlowsAndViews__FuelInterface___402 ; + sysml:ownedFeatureMembership elmt:FlowsAndViews__FuelInterface__supplierPort_om, elmt:FlowsAndViews__FuelInterface__consumerPort_om, elmt:FlowsAndViews__FuelInterface___402_om ; sysx:sourceText " interface def FuelInterface {\n" ; sysx:sourceTail " }\n" ; json:ownedMember "[{\"@id\":\"FlowsAndViews__FuelInterface__supplierPort\"},{\"@id\":\"FlowsAndViews__FuelInterface__consumerPort\"},{\"@id\":\"FlowsAndViews__FuelInterface___402\"}]" ; json:ownedMembership "[{\"@id\":\"FlowsAndViews__FuelInterface__supplierPort_om\"},{\"@id\":\"FlowsAndViews__FuelInterface__consumerPort_om\"},{\"@id\":\"FlowsAndViews__FuelInterface___402_om\"}]" ; json:ownedRelationship "[{\"@id\":\"FlowsAndViews__FuelInterface__supplierPort_om\"},{\"@id\":\"FlowsAndViews__FuelInterface__consumerPort_om\"},{\"@id\":\"FlowsAndViews__FuelInterface___402_om\"}]" ; - json:ownedFeature "[{\"@id\":\"FlowsAndViews__FuelInterface__supplierPort\"},{\"@id\":\"FlowsAndViews__FuelInterface__consumerPort\"}]" ; - json:ownedFeatureMembership "[{\"@id\":\"FlowsAndViews__FuelInterface__supplierPort_om\"},{\"@id\":\"FlowsAndViews__FuelInterface__consumerPort_om\"}]" . + json:ownedFeature "[{\"@id\":\"FlowsAndViews__FuelInterface__supplierPort\"},{\"@id\":\"FlowsAndViews__FuelInterface__consumerPort\"},{\"@id\":\"FlowsAndViews__FuelInterface___402\"}]" ; + json:ownedFeatureMembership "[{\"@id\":\"FlowsAndViews__FuelInterface__supplierPort_om\"},{\"@id\":\"FlowsAndViews__FuelInterface__consumerPort_om\"},{\"@id\":\"FlowsAndViews__FuelInterface___402_om\"}]" . elmt:FlowsAndViews__FuelInterface_om a sysml:OwningMembership ; @@ -318,14 +318,16 @@ elmt:FlowsAndViews__FuelInterface___402 json:ownedEndFeature "[{\"@id\":\"FlowsAndViews__FuelInterface___402_pend0\"},{\"@id\":\"FlowsAndViews__FuelInterface___402_pend1\"}]" . elmt:FlowsAndViews__FuelInterface___402_om - a sysml:OwningMembership ; + a sysml:FeatureMembership ; sysml:elementId "FlowsAndViews__FuelInterface___402_om" ; sysml:owner elmt:FlowsAndViews__FuelInterface ; sysml:memberElement elmt:FlowsAndViews__FuelInterface___402 ; sysml:ownedMemberElement elmt:FlowsAndViews__FuelInterface___402 ; sysml:ownedRelatedElement elmt:FlowsAndViews__FuelInterface___402 ; sysml:owningRelatedElement elmt:FlowsAndViews__FuelInterface ; - sysml:membershipOwningNamespace elmt:FlowsAndViews__FuelInterface . + sysml:membershipOwningNamespace elmt:FlowsAndViews__FuelInterface ; + sysml:ownedMemberFeature elmt:FlowsAndViews__FuelInterface___402 ; + sysml:owningType elmt:FlowsAndViews__FuelInterface . expr:FlowsAndViews__FuelInterface___402_pend0 a sysml:FlowEnd ; @@ -475,7 +477,7 @@ elmt:FlowsAndViews__tanks sysml:owningRelationship elmt:FlowsAndViews__tanks_om ; sysml:owningMembership elmt:FlowsAndViews__tanks_om ; sysml:declaredName "tanks" ; - sysml:isNonunique "true"^^xsd:boolean ; + sysml:isUnique "false"^^xsd:boolean ; sysml:type elmt:FlowsAndViews__Tank ; sysml:multiplicity expr:FlowsAndViews__tanks_pmultiplicity ; sysml:ownedRelationship expr:FlowsAndViews__tanks_pmultiplicity_om, elmt:FlowsAndViews__tanks_ft0 ; @@ -620,7 +622,7 @@ elmt:FlowsAndViews__vehicle__spares sysml:owningRelationship elmt:FlowsAndViews__vehicle__spares_om ; sysml:owningMembership elmt:FlowsAndViews__vehicle__spares_om ; sysml:declaredName "spares" ; - sysml:isNonunique "true"^^xsd:boolean ; + sysml:isUnique "false"^^xsd:boolean ; sysml:type elmt:FlowsAndViews__Tank ; sysml:subsets elmt:FlowsAndViews__tanks ; sysml:multiplicity expr:FlowsAndViews__vehicle__spares_pmultiplicity ; @@ -1389,3 +1391,10 @@ elmt:FlowsAndViews__vehicleView_ft0 sysml:owner elmt:FlowsAndViews__vehicleView ; sysml:relatedElement elmt:FlowsAndViews__vehicleView, elmt:FlowsAndViews__StructureView ; json:relatedElement "[{\"@id\":\"FlowsAndViews__vehicleView\"},{\"@id\":\"FlowsAndViews__StructureView\"}]" . + + + a sysml:MetadataDefinition ; + sysml:elementId "550f9923-23f8-5142-aa06-d7ff476876d7" ; + sysml:qualifiedName "SysML::Systems::PartUsage" ; + sysml:declaredName "PartUsage" ; + sysml:isLibraryElement "true"^^xsd:boolean . diff --git a/tests/export/testdata/interchange/README.md b/tests/export/testdata/interchange/README.md new file mode 100644 index 0000000000..c22562d6d7 --- /dev/null +++ b/tests/export/testdata/interchange/README.md @@ -0,0 +1,3 @@ +The two library identity JSON fixtures are toolkit v0.10.0 full-JSON exports with a hand-edited `ScalarValues::Real` library stub id; the unmatched case also changes its qualified name. + +The `satisfy_by` fixture is a toolkit v0.10.0 full-JSON export of the adjacent source model. diff --git a/tests/export/testdata/interchange/flow_ends.golden.sysml b/tests/export/testdata/interchange/flow_ends.golden.sysml new file mode 100644 index 0000000000..14184c5721 --- /dev/null +++ b/tests/export/testdata/interchange/flow_ends.golden.sysml @@ -0,0 +1,14 @@ +package FlowEnds { + item def Payload; + part def PayloadHolder { + item payload : Payload; + } + part def Endpoint { + part holder : PayloadHolder; + } + part def Assembly { + part source : Endpoint; + part target : Endpoint; + flow of Payload from source.holder.payload to target.holder.payload; + } +} diff --git a/tests/export/testdata/interchange/flow_ends.sysml b/tests/export/testdata/interchange/flow_ends.sysml new file mode 100644 index 0000000000..14184c5721 --- /dev/null +++ b/tests/export/testdata/interchange/flow_ends.sysml @@ -0,0 +1,14 @@ +package FlowEnds { + item def Payload; + part def PayloadHolder { + item payload : Payload; + } + part def Endpoint { + part holder : PayloadHolder; + } + part def Assembly { + part source : Endpoint; + part target : Endpoint; + flow of Payload from source.holder.payload to target.holder.payload; + } +} diff --git a/tests/export/testdata/interchange/flow_ends.toolkit.full.json b/tests/export/testdata/interchange/flow_ends.toolkit.full.json new file mode 100644 index 0000000000..328c182f82 --- /dev/null +++ b/tests/export/testdata/interchange/flow_ends.toolkit.full.json @@ -0,0 +1,5567 @@ +[ + { + "@id": "4ae5f4fa-4753-5940-8bc4-f27e7dd78232", + "@type": "Namespace", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "4ae5f4fa-4753-5940-8bc4-f27e7dd78232", + "importedMembership": [], + "isImpliedIncluded": true, + "isLibraryElement": false, + "member": [ + { + "@id": "2f73b34f-ee68-5e69-9be7-112b48346541" + } + ], + "membership": [ + { + "@id": "5025186b-8d52-5fd7-9866-e0e739184845" + } + ], + "name": null, + "ownedAnnotation": [], + "ownedElement": [ + { + "@id": "2f73b34f-ee68-5e69-9be7-112b48346541" + } + ], + "ownedImport": [], + "ownedMember": [ + { + "@id": "2f73b34f-ee68-5e69-9be7-112b48346541" + } + ], + "ownedMembership": [ + { + "@id": "5025186b-8d52-5fd7-9866-e0e739184845" + } + ], + "ownedRelationship": [ + { + "@id": "5025186b-8d52-5fd7-9866-e0e739184845" + } + ], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelationship": null, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [] + }, + { + "@id": "5025186b-8d52-5fd7-9866-e0e739184845", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "5025186b-8d52-5fd7-9866-e0e739184845", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "2f73b34f-ee68-5e69-9be7-112b48346541" + }, + "memberElementId": "2f73b34f-ee68-5e69-9be7-112b48346541", + "memberName": "FlowEnds", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "4ae5f4fa-4753-5940-8bc4-f27e7dd78232" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "2f73b34f-ee68-5e69-9be7-112b48346541" + }, + "ownedMemberElementId": "2f73b34f-ee68-5e69-9be7-112b48346541", + "ownedMemberName": "FlowEnds", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "2f73b34f-ee68-5e69-9be7-112b48346541" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "4ae5f4fa-4753-5940-8bc4-f27e7dd78232" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "4ae5f4fa-4753-5940-8bc4-f27e7dd78232" + }, + { + "@id": "2f73b34f-ee68-5e69-9be7-112b48346541" + } + ], + "shortName": null, + "source": [ + { + "@id": "4ae5f4fa-4753-5940-8bc4-f27e7dd78232" + } + ], + "target": [ + { + "@id": "2f73b34f-ee68-5e69-9be7-112b48346541" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "2f73b34f-ee68-5e69-9be7-112b48346541", + "@type": "Package", + "aliasIds": [], + "declaredName": "FlowEnds", + "declaredShortName": null, + "documentation": [], + "elementId": "2f73b34f-ee68-5e69-9be7-112b48346541", + "filterCondition": [], + "importedMembership": [], + "isImpliedIncluded": true, + "isLibraryElement": false, + "member": [ + { + "@id": "789f3a8d-d66f-5524-9bed-d370a23d6057" + }, + { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + }, + { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + }, + { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + } + ], + "membership": [ + { + "@id": "f39a586d-6ea7-5289-a541-aca72b00dfee" + }, + { + "@id": "b781643d-a7c1-5947-8d76-b51c4a586d95" + }, + { + "@id": "9ea0d333-73a4-560d-91e4-21b16e66480d" + }, + { + "@id": "437e849c-6cbc-5304-acf1-e0293ee9d3d2" + } + ], + "name": "FlowEnds", + "ownedAnnotation": [], + "ownedElement": [ + { + "@id": "789f3a8d-d66f-5524-9bed-d370a23d6057" + }, + { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + }, + { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + }, + { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + } + ], + "ownedImport": [], + "ownedMember": [ + { + "@id": "789f3a8d-d66f-5524-9bed-d370a23d6057" + }, + { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + }, + { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + }, + { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + } + ], + "ownedMembership": [ + { + "@id": "f39a586d-6ea7-5289-a541-aca72b00dfee" + }, + { + "@id": "b781643d-a7c1-5947-8d76-b51c4a586d95" + }, + { + "@id": "9ea0d333-73a4-560d-91e4-21b16e66480d" + }, + { + "@id": "437e849c-6cbc-5304-acf1-e0293ee9d3d2" + } + ], + "ownedRelationship": [ + { + "@id": "f39a586d-6ea7-5289-a541-aca72b00dfee" + }, + { + "@id": "b781643d-a7c1-5947-8d76-b51c4a586d95" + }, + { + "@id": "9ea0d333-73a4-560d-91e4-21b16e66480d" + }, + { + "@id": "437e849c-6cbc-5304-acf1-e0293ee9d3d2" + } + ], + "owner": { + "@id": "4ae5f4fa-4753-5940-8bc4-f27e7dd78232" + }, + "owningMembership": { + "@id": "5025186b-8d52-5fd7-9866-e0e739184845" + }, + "owningNamespace": { + "@id": "4ae5f4fa-4753-5940-8bc4-f27e7dd78232" + }, + "owningRelationship": { + "@id": "5025186b-8d52-5fd7-9866-e0e739184845" + }, + "qualifiedName": "FlowEnds", + "shortName": null, + "textualRepresentation": [] + }, + { + "@id": "f39a586d-6ea7-5289-a541-aca72b00dfee", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "f39a586d-6ea7-5289-a541-aca72b00dfee", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "789f3a8d-d66f-5524-9bed-d370a23d6057" + }, + "memberElementId": "789f3a8d-d66f-5524-9bed-d370a23d6057", + "memberName": "Payload", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "2f73b34f-ee68-5e69-9be7-112b48346541" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "789f3a8d-d66f-5524-9bed-d370a23d6057" + }, + "ownedMemberElementId": "789f3a8d-d66f-5524-9bed-d370a23d6057", + "ownedMemberName": "Payload", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "789f3a8d-d66f-5524-9bed-d370a23d6057" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "2f73b34f-ee68-5e69-9be7-112b48346541" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "2f73b34f-ee68-5e69-9be7-112b48346541" + }, + { + "@id": "789f3a8d-d66f-5524-9bed-d370a23d6057" + } + ], + "shortName": null, + "source": [ + { + "@id": "2f73b34f-ee68-5e69-9be7-112b48346541" + } + ], + "target": [ + { + "@id": "789f3a8d-d66f-5524-9bed-d370a23d6057" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "789f3a8d-d66f-5524-9bed-d370a23d6057", + "@type": "ItemDefinition", + "aliasIds": [], + "declaredName": "Payload", + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "documentation": [], + "elementId": "789f3a8d-d66f-5524-9bed-d370a23d6057", + "endFeature": [], + "feature": [], + "featureMembership": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isConjugated": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isSufficient": false, + "isVariation": false, + "member": [], + "membership": [], + "multiplicity": null, + "name": "Payload", + "output": [], + "ownedAction": [], + "ownedAllocation": [], + "ownedAnalysisCase": [], + "ownedAnnotation": [], + "ownedAttribute": [], + "ownedCalculation": [], + "ownedCase": [], + "ownedConcern": [], + "ownedConjugator": null, + "ownedConnection": [], + "ownedConstraint": [], + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedEnumeration": [], + "ownedFeature": [], + "ownedFeatureMembership": [], + "ownedFlow": [], + "ownedImport": [], + "ownedInterface": [], + "ownedIntersecting": [], + "ownedItem": [], + "ownedMember": [], + "ownedMembership": [], + "ownedMetadata": [], + "ownedOccurrence": [], + "ownedPart": [], + "ownedPort": [], + "ownedReference": [], + "ownedRelationship": [ + { + "@id": "bcacfa78-13f4-5362-9700-604e6cdf5880" + } + ], + "ownedRendering": [], + "ownedRequirement": [], + "ownedSpecialization": [ + { + "@id": "bcacfa78-13f4-5362-9700-604e6cdf5880" + } + ], + "ownedState": [], + "ownedSubclassification": [ + { + "@id": "bcacfa78-13f4-5362-9700-604e6cdf5880" + } + ], + "ownedTransition": [], + "ownedUnioning": [], + "ownedUsage": [], + "ownedUseCase": [], + "ownedVerificationCase": [], + "ownedView": [], + "ownedViewpoint": [], + "owner": { + "@id": "2f73b34f-ee68-5e69-9be7-112b48346541" + }, + "owningMembership": { + "@id": "f39a586d-6ea7-5289-a541-aca72b00dfee" + }, + "owningNamespace": { + "@id": "2f73b34f-ee68-5e69-9be7-112b48346541" + }, + "owningRelationship": { + "@id": "f39a586d-6ea7-5289-a541-aca72b00dfee" + }, + "qualifiedName": "FlowEnds::Payload", + "shortName": null, + "textualRepresentation": [], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "b781643d-a7c1-5947-8d76-b51c4a586d95", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "b781643d-a7c1-5947-8d76-b51c4a586d95", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + }, + "memberElementId": "88e2d4ca-e276-5187-b44e-4e91cbe01393", + "memberName": "PayloadHolder", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "2f73b34f-ee68-5e69-9be7-112b48346541" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + }, + "ownedMemberElementId": "88e2d4ca-e276-5187-b44e-4e91cbe01393", + "ownedMemberName": "PayloadHolder", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "2f73b34f-ee68-5e69-9be7-112b48346541" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "2f73b34f-ee68-5e69-9be7-112b48346541" + }, + { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + } + ], + "shortName": null, + "source": [ + { + "@id": "2f73b34f-ee68-5e69-9be7-112b48346541" + } + ], + "target": [ + { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393", + "@type": "PartDefinition", + "aliasIds": [], + "declaredName": "PayloadHolder", + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "documentation": [], + "elementId": "88e2d4ca-e276-5187-b44e-4e91cbe01393", + "endFeature": [], + "feature": [ + { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + } + ], + "featureMembership": [ + { + "@id": "1f62df8a-fd16-55bc-b9d2-363e52ee92ed" + } + ], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isConjugated": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isSufficient": false, + "isVariation": false, + "member": [ + { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + } + ], + "membership": [ + { + "@id": "1f62df8a-fd16-55bc-b9d2-363e52ee92ed" + } + ], + "multiplicity": null, + "name": "PayloadHolder", + "output": [], + "ownedAction": [], + "ownedAllocation": [], + "ownedAnalysisCase": [], + "ownedAnnotation": [], + "ownedAttribute": [], + "ownedCalculation": [], + "ownedCase": [], + "ownedConcern": [], + "ownedConjugator": null, + "ownedConnection": [], + "ownedConstraint": [], + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + } + ], + "ownedEndFeature": [], + "ownedEnumeration": [], + "ownedFeature": [ + { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + } + ], + "ownedFeatureMembership": [ + { + "@id": "1f62df8a-fd16-55bc-b9d2-363e52ee92ed" + } + ], + "ownedFlow": [], + "ownedImport": [], + "ownedInterface": [], + "ownedIntersecting": [], + "ownedItem": [ + { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + } + ], + "ownedMember": [ + { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + } + ], + "ownedMembership": [ + { + "@id": "1f62df8a-fd16-55bc-b9d2-363e52ee92ed" + } + ], + "ownedMetadata": [], + "ownedOccurrence": [ + { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + } + ], + "ownedPart": [], + "ownedPort": [], + "ownedReference": [], + "ownedRelationship": [ + { + "@id": "1f62df8a-fd16-55bc-b9d2-363e52ee92ed" + }, + { + "@id": "4485e629-b8b4-5222-947b-12ddf8830613" + } + ], + "ownedRendering": [], + "ownedRequirement": [], + "ownedSpecialization": [ + { + "@id": "4485e629-b8b4-5222-947b-12ddf8830613" + } + ], + "ownedState": [], + "ownedSubclassification": [ + { + "@id": "4485e629-b8b4-5222-947b-12ddf8830613" + } + ], + "ownedTransition": [], + "ownedUnioning": [], + "ownedUsage": [ + { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + } + ], + "ownedUseCase": [], + "ownedVerificationCase": [], + "ownedView": [], + "ownedViewpoint": [], + "owner": { + "@id": "2f73b34f-ee68-5e69-9be7-112b48346541" + }, + "owningMembership": { + "@id": "b781643d-a7c1-5947-8d76-b51c4a586d95" + }, + "owningNamespace": { + "@id": "2f73b34f-ee68-5e69-9be7-112b48346541" + }, + "owningRelationship": { + "@id": "b781643d-a7c1-5947-8d76-b51c4a586d95" + }, + "qualifiedName": "FlowEnds::PayloadHolder", + "shortName": null, + "textualRepresentation": [], + "unioningType": [], + "usage": [ + { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + } + ], + "variant": [], + "variantMembership": [] + }, + { + "@id": "1f62df8a-fd16-55bc-b9d2-363e52ee92ed", + "@type": "FeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "1f62df8a-fd16-55bc-b9d2-363e52ee92ed", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + }, + "memberElementId": "dc08c950-4f3e-5019-897e-b0c674972092", + "memberName": "payload", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + }, + "ownedMemberElementId": "dc08c950-4f3e-5019-897e-b0c674972092", + "ownedMemberFeature": { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + }, + "ownedMemberName": "payload", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + }, + "owningRelationship": null, + "owningType": { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + }, + { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + } + ], + "shortName": null, + "source": [ + { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + } + ], + "target": [ + { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092", + "@type": "ItemUsage", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": "payload", + "declaredShortName": null, + "definition": [ + { + "@id": "789f3a8d-d66f-5524-9bed-d370a23d6057" + } + ], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "dc08c950-4f3e-5019-897e-b0c674972092", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + }, + "featuringType": [], + "importedMembership": [], + "individualDefinition": null, + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": true, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": false, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "itemDefinition": [ + { + "@id": "789f3a8d-d66f-5524-9bed-d370a23d6057" + } + ], + "mayTimeVary": null, + "member": [], + "membership": [], + "multiplicity": null, + "name": "payload", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "occurrenceDefinition": [ + { + "@id": "789f3a8d-d66f-5524-9bed-d370a23d6057" + } + ], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "0d3509c5-30dd-53e9-9b25-f6155f5a34c4" + }, + { + "@id": "687d60b0-fae4-58ed-b4b8-98d6d420a72e" + } + ], + "ownedSpecialization": [ + { + "@id": "0d3509c5-30dd-53e9-9b25-f6155f5a34c4" + }, + { + "@id": "687d60b0-fae4-58ed-b4b8-98d6d420a72e" + } + ], + "ownedSubsetting": [ + { + "@id": "687d60b0-fae4-58ed-b4b8-98d6d420a72e" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [ + { + "@id": "0d3509c5-30dd-53e9-9b25-f6155f5a34c4" + } + ], + "ownedUnioning": [], + "owner": { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + }, + "owningDefinition": { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + }, + "owningFeatureMembership": { + "@id": "1f62df8a-fd16-55bc-b9d2-363e52ee92ed" + }, + "owningMembership": { + "@id": "1f62df8a-fd16-55bc-b9d2-363e52ee92ed" + }, + "owningNamespace": { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + }, + "owningRelationship": { + "@id": "1f62df8a-fd16-55bc-b9d2-363e52ee92ed" + }, + "owningType": { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + }, + "owningUsage": null, + "portionKind": null, + "qualifiedName": "FlowEnds::PayloadHolder::payload", + "shortName": null, + "textualRepresentation": [], + "type": [ + { + "@id": "789f3a8d-d66f-5524-9bed-d370a23d6057" + } + ], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "0d3509c5-30dd-53e9-9b25-f6155f5a34c4", + "@type": "FeatureTyping", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "0d3509c5-30dd-53e9-9b25-f6155f5a34c4", + "general": { + "@id": "789f3a8d-d66f-5524-9bed-d370a23d6057" + }, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + }, + "owningRelationship": null, + "owningType": { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + }, + { + "@id": "789f3a8d-d66f-5524-9bed-d370a23d6057" + } + ], + "shortName": null, + "source": [ + { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + } + ], + "specific": { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + }, + "target": [ + { + "@id": "789f3a8d-d66f-5524-9bed-d370a23d6057" + } + ], + "textualRepresentation": [], + "type": { + "@id": "789f3a8d-d66f-5524-9bed-d370a23d6057" + }, + "typedFeature": { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + } + }, + { + "@id": "9ea0d333-73a4-560d-91e4-21b16e66480d", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "9ea0d333-73a4-560d-91e4-21b16e66480d", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + }, + "memberElementId": "8824b96c-920c-57be-bec1-17612dd42265", + "memberName": "Endpoint", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "2f73b34f-ee68-5e69-9be7-112b48346541" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + }, + "ownedMemberElementId": "8824b96c-920c-57be-bec1-17612dd42265", + "ownedMemberName": "Endpoint", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "2f73b34f-ee68-5e69-9be7-112b48346541" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "2f73b34f-ee68-5e69-9be7-112b48346541" + }, + { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + } + ], + "shortName": null, + "source": [ + { + "@id": "2f73b34f-ee68-5e69-9be7-112b48346541" + } + ], + "target": [ + { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "8824b96c-920c-57be-bec1-17612dd42265", + "@type": "PartDefinition", + "aliasIds": [], + "declaredName": "Endpoint", + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "documentation": [], + "elementId": "8824b96c-920c-57be-bec1-17612dd42265", + "endFeature": [], + "feature": [ + { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + } + ], + "featureMembership": [ + { + "@id": "052aa3bc-b203-5870-bd70-ac5b239c1de2" + } + ], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isConjugated": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isSufficient": false, + "isVariation": false, + "member": [ + { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + } + ], + "membership": [ + { + "@id": "052aa3bc-b203-5870-bd70-ac5b239c1de2" + } + ], + "multiplicity": null, + "name": "Endpoint", + "output": [], + "ownedAction": [], + "ownedAllocation": [], + "ownedAnalysisCase": [], + "ownedAnnotation": [], + "ownedAttribute": [], + "ownedCalculation": [], + "ownedCase": [], + "ownedConcern": [], + "ownedConjugator": null, + "ownedConnection": [], + "ownedConstraint": [], + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + } + ], + "ownedEndFeature": [], + "ownedEnumeration": [], + "ownedFeature": [ + { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + } + ], + "ownedFeatureMembership": [ + { + "@id": "052aa3bc-b203-5870-bd70-ac5b239c1de2" + } + ], + "ownedFlow": [], + "ownedImport": [], + "ownedInterface": [], + "ownedIntersecting": [], + "ownedItem": [ + { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + } + ], + "ownedMember": [ + { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + } + ], + "ownedMembership": [ + { + "@id": "052aa3bc-b203-5870-bd70-ac5b239c1de2" + } + ], + "ownedMetadata": [], + "ownedOccurrence": [ + { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + } + ], + "ownedPart": [ + { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + } + ], + "ownedPort": [], + "ownedReference": [], + "ownedRelationship": [ + { + "@id": "052aa3bc-b203-5870-bd70-ac5b239c1de2" + }, + { + "@id": "a8c5a1e5-67c0-5aa5-928a-530efd34dfd5" + } + ], + "ownedRendering": [], + "ownedRequirement": [], + "ownedSpecialization": [ + { + "@id": "a8c5a1e5-67c0-5aa5-928a-530efd34dfd5" + } + ], + "ownedState": [], + "ownedSubclassification": [ + { + "@id": "a8c5a1e5-67c0-5aa5-928a-530efd34dfd5" + } + ], + "ownedTransition": [], + "ownedUnioning": [], + "ownedUsage": [ + { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + } + ], + "ownedUseCase": [], + "ownedVerificationCase": [], + "ownedView": [], + "ownedViewpoint": [], + "owner": { + "@id": "2f73b34f-ee68-5e69-9be7-112b48346541" + }, + "owningMembership": { + "@id": "9ea0d333-73a4-560d-91e4-21b16e66480d" + }, + "owningNamespace": { + "@id": "2f73b34f-ee68-5e69-9be7-112b48346541" + }, + "owningRelationship": { + "@id": "9ea0d333-73a4-560d-91e4-21b16e66480d" + }, + "qualifiedName": "FlowEnds::Endpoint", + "shortName": null, + "textualRepresentation": [], + "unioningType": [], + "usage": [ + { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + } + ], + "variant": [], + "variantMembership": [] + }, + { + "@id": "052aa3bc-b203-5870-bd70-ac5b239c1de2", + "@type": "FeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "052aa3bc-b203-5870-bd70-ac5b239c1de2", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + }, + "memberElementId": "0657e80a-e774-57d1-95ca-291849065195", + "memberName": "holder", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + }, + "ownedMemberElementId": "0657e80a-e774-57d1-95ca-291849065195", + "ownedMemberFeature": { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + }, + "ownedMemberName": "holder", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + }, + "owningRelationship": null, + "owningType": { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + }, + { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + } + ], + "shortName": null, + "source": [ + { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + } + ], + "target": [ + { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "0657e80a-e774-57d1-95ca-291849065195", + "@type": "PartUsage", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": "holder", + "declaredShortName": null, + "definition": [ + { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + } + ], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "0657e80a-e774-57d1-95ca-291849065195", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + }, + "featuringType": [], + "importedMembership": [], + "individualDefinition": null, + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": true, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": false, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "itemDefinition": [ + { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + } + ], + "mayTimeVary": null, + "member": [], + "membership": [], + "multiplicity": null, + "name": "holder", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "occurrenceDefinition": [ + { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + } + ], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "c0d454b8-a034-5314-a210-1161a8208721" + }, + { + "@id": "11567119-c2d1-58c7-80aa-29c7ac98b2a8" + } + ], + "ownedSpecialization": [ + { + "@id": "c0d454b8-a034-5314-a210-1161a8208721" + }, + { + "@id": "11567119-c2d1-58c7-80aa-29c7ac98b2a8" + } + ], + "ownedSubsetting": [ + { + "@id": "11567119-c2d1-58c7-80aa-29c7ac98b2a8" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [ + { + "@id": "c0d454b8-a034-5314-a210-1161a8208721" + } + ], + "ownedUnioning": [], + "owner": { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + }, + "owningDefinition": { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + }, + "owningFeatureMembership": { + "@id": "052aa3bc-b203-5870-bd70-ac5b239c1de2" + }, + "owningMembership": { + "@id": "052aa3bc-b203-5870-bd70-ac5b239c1de2" + }, + "owningNamespace": { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + }, + "owningRelationship": { + "@id": "052aa3bc-b203-5870-bd70-ac5b239c1de2" + }, + "owningType": { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + }, + "owningUsage": null, + "partDefinition": [ + { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + } + ], + "portionKind": null, + "qualifiedName": "FlowEnds::Endpoint::holder", + "shortName": null, + "textualRepresentation": [], + "type": [ + { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + } + ], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "c0d454b8-a034-5314-a210-1161a8208721", + "@type": "FeatureTyping", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "c0d454b8-a034-5314-a210-1161a8208721", + "general": { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + }, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + }, + "owningRelationship": null, + "owningType": { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + }, + { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + } + ], + "shortName": null, + "source": [ + { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + } + ], + "specific": { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + }, + "target": [ + { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + } + ], + "textualRepresentation": [], + "type": { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + }, + "typedFeature": { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + } + }, + { + "@id": "437e849c-6cbc-5304-acf1-e0293ee9d3d2", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "437e849c-6cbc-5304-acf1-e0293ee9d3d2", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + }, + "memberElementId": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e", + "memberName": "Assembly", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "2f73b34f-ee68-5e69-9be7-112b48346541" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + }, + "ownedMemberElementId": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e", + "ownedMemberName": "Assembly", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "2f73b34f-ee68-5e69-9be7-112b48346541" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "2f73b34f-ee68-5e69-9be7-112b48346541" + }, + { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + } + ], + "shortName": null, + "source": [ + { + "@id": "2f73b34f-ee68-5e69-9be7-112b48346541" + } + ], + "target": [ + { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e", + "@type": "PartDefinition", + "aliasIds": [], + "declaredName": "Assembly", + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "documentation": [], + "elementId": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e", + "endFeature": [], + "feature": [ + { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf" + }, + { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673" + }, + { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + } + ], + "featureMembership": [ + { + "@id": "2be49f7c-139b-5cd0-a3c4-435661647180" + }, + { + "@id": "f43e3665-1994-56f3-a107-8b542d1e2c9b" + }, + { + "@id": "401c27fd-bb8e-5230-badb-fa4dc1b787cf" + } + ], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isConjugated": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isSufficient": false, + "isVariation": false, + "member": [ + { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf" + }, + { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673" + }, + { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + } + ], + "membership": [ + { + "@id": "2be49f7c-139b-5cd0-a3c4-435661647180" + }, + { + "@id": "f43e3665-1994-56f3-a107-8b542d1e2c9b" + }, + { + "@id": "401c27fd-bb8e-5230-badb-fa4dc1b787cf" + } + ], + "multiplicity": null, + "name": "Assembly", + "output": [], + "ownedAction": [ + { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + } + ], + "ownedAllocation": [], + "ownedAnalysisCase": [], + "ownedAnnotation": [], + "ownedAttribute": [], + "ownedCalculation": [], + "ownedCase": [], + "ownedConcern": [], + "ownedConjugator": null, + "ownedConnection": [ + { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + } + ], + "ownedConstraint": [], + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf" + }, + { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673" + }, + { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + } + ], + "ownedEndFeature": [], + "ownedEnumeration": [], + "ownedFeature": [ + { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf" + }, + { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673" + }, + { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + } + ], + "ownedFeatureMembership": [ + { + "@id": "2be49f7c-139b-5cd0-a3c4-435661647180" + }, + { + "@id": "f43e3665-1994-56f3-a107-8b542d1e2c9b" + }, + { + "@id": "401c27fd-bb8e-5230-badb-fa4dc1b787cf" + } + ], + "ownedFlow": [ + { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + } + ], + "ownedImport": [], + "ownedInterface": [], + "ownedIntersecting": [], + "ownedItem": [ + { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf" + }, + { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673" + } + ], + "ownedMember": [ + { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf" + }, + { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673" + }, + { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + } + ], + "ownedMembership": [ + { + "@id": "2be49f7c-139b-5cd0-a3c4-435661647180" + }, + { + "@id": "f43e3665-1994-56f3-a107-8b542d1e2c9b" + }, + { + "@id": "401c27fd-bb8e-5230-badb-fa4dc1b787cf" + } + ], + "ownedMetadata": [], + "ownedOccurrence": [ + { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf" + }, + { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673" + }, + { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + } + ], + "ownedPart": [ + { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf" + }, + { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673" + } + ], + "ownedPort": [], + "ownedReference": [], + "ownedRelationship": [ + { + "@id": "2be49f7c-139b-5cd0-a3c4-435661647180" + }, + { + "@id": "f43e3665-1994-56f3-a107-8b542d1e2c9b" + }, + { + "@id": "401c27fd-bb8e-5230-badb-fa4dc1b787cf" + }, + { + "@id": "6397eac8-403f-509d-abe5-3ece777a7675" + } + ], + "ownedRendering": [], + "ownedRequirement": [], + "ownedSpecialization": [ + { + "@id": "6397eac8-403f-509d-abe5-3ece777a7675" + } + ], + "ownedState": [], + "ownedSubclassification": [ + { + "@id": "6397eac8-403f-509d-abe5-3ece777a7675" + } + ], + "ownedTransition": [], + "ownedUnioning": [], + "ownedUsage": [ + { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf" + }, + { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673" + }, + { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + } + ], + "ownedUseCase": [], + "ownedVerificationCase": [], + "ownedView": [], + "ownedViewpoint": [], + "owner": { + "@id": "2f73b34f-ee68-5e69-9be7-112b48346541" + }, + "owningMembership": { + "@id": "437e849c-6cbc-5304-acf1-e0293ee9d3d2" + }, + "owningNamespace": { + "@id": "2f73b34f-ee68-5e69-9be7-112b48346541" + }, + "owningRelationship": { + "@id": "437e849c-6cbc-5304-acf1-e0293ee9d3d2" + }, + "qualifiedName": "FlowEnds::Assembly", + "shortName": null, + "textualRepresentation": [], + "unioningType": [], + "usage": [ + { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf" + }, + { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673" + }, + { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + } + ], + "variant": [], + "variantMembership": [] + }, + { + "@id": "2be49f7c-139b-5cd0-a3c4-435661647180", + "@type": "FeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "2be49f7c-139b-5cd0-a3c4-435661647180", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf" + }, + "memberElementId": "59a5136b-e079-55a0-a995-880adb1ac1bf", + "memberName": "source", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf" + }, + "ownedMemberElementId": "59a5136b-e079-55a0-a995-880adb1ac1bf", + "ownedMemberFeature": { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf" + }, + "ownedMemberName": "source", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + }, + "owningRelationship": null, + "owningType": { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + }, + { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf" + } + ], + "shortName": null, + "source": [ + { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + } + ], + "target": [ + { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf", + "@type": "PartUsage", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": "source", + "declaredShortName": null, + "definition": [ + { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + } + ], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "59a5136b-e079-55a0-a995-880adb1ac1bf", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf" + }, + "featuringType": [], + "importedMembership": [], + "individualDefinition": null, + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": true, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": false, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "itemDefinition": [ + { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + } + ], + "mayTimeVary": null, + "member": [], + "membership": [], + "multiplicity": null, + "name": "source", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "occurrenceDefinition": [ + { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + } + ], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "2837a72c-5b5d-569a-8e66-5cc3248bf0ad" + }, + { + "@id": "c1e438d6-9211-5284-871c-32fc65c8e36a" + } + ], + "ownedSpecialization": [ + { + "@id": "2837a72c-5b5d-569a-8e66-5cc3248bf0ad" + }, + { + "@id": "c1e438d6-9211-5284-871c-32fc65c8e36a" + } + ], + "ownedSubsetting": [ + { + "@id": "c1e438d6-9211-5284-871c-32fc65c8e36a" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [ + { + "@id": "2837a72c-5b5d-569a-8e66-5cc3248bf0ad" + } + ], + "ownedUnioning": [], + "owner": { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + }, + "owningDefinition": { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + }, + "owningFeatureMembership": { + "@id": "2be49f7c-139b-5cd0-a3c4-435661647180" + }, + "owningMembership": { + "@id": "2be49f7c-139b-5cd0-a3c4-435661647180" + }, + "owningNamespace": { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + }, + "owningRelationship": { + "@id": "2be49f7c-139b-5cd0-a3c4-435661647180" + }, + "owningType": { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + }, + "owningUsage": null, + "partDefinition": [ + { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + } + ], + "portionKind": null, + "qualifiedName": "FlowEnds::Assembly::source", + "shortName": null, + "textualRepresentation": [], + "type": [ + { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + } + ], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "2837a72c-5b5d-569a-8e66-5cc3248bf0ad", + "@type": "FeatureTyping", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "2837a72c-5b5d-569a-8e66-5cc3248bf0ad", + "general": { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + }, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf" + }, + "owningRelationship": null, + "owningType": { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf" + }, + { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + } + ], + "shortName": null, + "source": [ + { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf" + } + ], + "specific": { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf" + }, + "target": [ + { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + } + ], + "textualRepresentation": [], + "type": { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + }, + "typedFeature": { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf" + } + }, + { + "@id": "f43e3665-1994-56f3-a107-8b542d1e2c9b", + "@type": "FeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "f43e3665-1994-56f3-a107-8b542d1e2c9b", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673" + }, + "memberElementId": "c23f2a28-1fcc-5c00-b7db-d563f41cc673", + "memberName": "target", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673" + }, + "ownedMemberElementId": "c23f2a28-1fcc-5c00-b7db-d563f41cc673", + "ownedMemberFeature": { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673" + }, + "ownedMemberName": "target", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + }, + "owningRelationship": null, + "owningType": { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + }, + { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673" + } + ], + "shortName": null, + "source": [ + { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + } + ], + "target": [ + { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673", + "@type": "PartUsage", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": "target", + "declaredShortName": null, + "definition": [ + { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + } + ], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "c23f2a28-1fcc-5c00-b7db-d563f41cc673", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673" + }, + "featuringType": [], + "importedMembership": [], + "individualDefinition": null, + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": true, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": false, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "itemDefinition": [ + { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + } + ], + "mayTimeVary": null, + "member": [], + "membership": [], + "multiplicity": null, + "name": "target", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "occurrenceDefinition": [ + { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + } + ], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "53bf54ce-104c-5518-86e1-76272a65d6ae" + }, + { + "@id": "97fbba9f-3a69-511e-92ee-80331d5a6fc4" + } + ], + "ownedSpecialization": [ + { + "@id": "53bf54ce-104c-5518-86e1-76272a65d6ae" + }, + { + "@id": "97fbba9f-3a69-511e-92ee-80331d5a6fc4" + } + ], + "ownedSubsetting": [ + { + "@id": "97fbba9f-3a69-511e-92ee-80331d5a6fc4" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [ + { + "@id": "53bf54ce-104c-5518-86e1-76272a65d6ae" + } + ], + "ownedUnioning": [], + "owner": { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + }, + "owningDefinition": { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + }, + "owningFeatureMembership": { + "@id": "f43e3665-1994-56f3-a107-8b542d1e2c9b" + }, + "owningMembership": { + "@id": "f43e3665-1994-56f3-a107-8b542d1e2c9b" + }, + "owningNamespace": { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + }, + "owningRelationship": { + "@id": "f43e3665-1994-56f3-a107-8b542d1e2c9b" + }, + "owningType": { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + }, + "owningUsage": null, + "partDefinition": [ + { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + } + ], + "portionKind": null, + "qualifiedName": "FlowEnds::Assembly::target", + "shortName": null, + "textualRepresentation": [], + "type": [ + { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + } + ], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "53bf54ce-104c-5518-86e1-76272a65d6ae", + "@type": "FeatureTyping", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "53bf54ce-104c-5518-86e1-76272a65d6ae", + "general": { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + }, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673" + }, + "owningRelationship": null, + "owningType": { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673" + }, + { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + } + ], + "shortName": null, + "source": [ + { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673" + } + ], + "specific": { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673" + }, + "target": [ + { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + } + ], + "textualRepresentation": [], + "type": { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + }, + "typedFeature": { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673" + } + }, + { + "@id": "401c27fd-bb8e-5230-badb-fa4dc1b787cf", + "@type": "FeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "401c27fd-bb8e-5230-badb-fa4dc1b787cf", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + "memberElementId": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f", + "memberName": null, + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + "ownedMemberElementId": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f", + "ownedMemberFeature": { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + "ownedMemberName": null, + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + }, + "owningRelationship": null, + "owningType": { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + }, + { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + } + ], + "shortName": null, + "source": [ + { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + } + ], + "target": [ + { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f", + "@type": "FlowUsage", + "actionDefinition": [], + "aliasIds": [], + "association": [], + "behavior": [], + "chainingFeature": [], + "connectorEnd": [ + { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + }, + { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + } + ], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "defaultFeaturingType": { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + }, + "definition": [], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f", + "endFeature": [ + { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + }, + { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + } + ], + "endOwningType": null, + "feature": [ + { + "@id": "3df85971-f25e-5281-9404-ab6eff3eec08" + }, + { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + }, + { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + } + ], + "featureMembership": [ + { + "@id": "609b131c-9bf5-50ab-9984-c7f1bcb270e0" + }, + { + "@id": "a1ab72dc-e0f2-573b-a352-2018ccf79ab0" + }, + { + "@id": "e58709a1-9688-5ecf-ad70-c919c6ccb47a" + } + ], + "featureTarget": { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + "featuringType": [], + "flowDefinition": [], + "flowEnd": [ + { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + }, + { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + } + ], + "importedMembership": [], + "individualDefinition": null, + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "interaction": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": true, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImplied": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": false, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [ + { + "@id": "3df85971-f25e-5281-9404-ab6eff3eec08" + }, + { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + }, + { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + } + ], + "membership": [ + { + "@id": "609b131c-9bf5-50ab-9984-c7f1bcb270e0" + }, + { + "@id": "a1ab72dc-e0f2-573b-a352-2018ccf79ab0" + }, + { + "@id": "e58709a1-9688-5ecf-ad70-c919c6ccb47a" + } + ], + "multiplicity": null, + "name": null, + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "occurrenceDefinition": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "3df85971-f25e-5281-9404-ab6eff3eec08" + }, + { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + }, + { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + } + ], + "ownedEndFeature": [ + { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + }, + { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + } + ], + "ownedFeature": [ + { + "@id": "3df85971-f25e-5281-9404-ab6eff3eec08" + }, + { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + }, + { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + } + ], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [ + { + "@id": "609b131c-9bf5-50ab-9984-c7f1bcb270e0" + }, + { + "@id": "a1ab72dc-e0f2-573b-a352-2018ccf79ab0" + }, + { + "@id": "e58709a1-9688-5ecf-ad70-c919c6ccb47a" + } + ], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [ + { + "@id": "3df85971-f25e-5281-9404-ab6eff3eec08" + }, + { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + }, + { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + } + ], + "ownedMembership": [ + { + "@id": "609b131c-9bf5-50ab-9984-c7f1bcb270e0" + }, + { + "@id": "a1ab72dc-e0f2-573b-a352-2018ccf79ab0" + }, + { + "@id": "e58709a1-9688-5ecf-ad70-c919c6ccb47a" + } + ], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelatedElement": [], + "ownedRelationship": [ + { + "@id": "609b131c-9bf5-50ab-9984-c7f1bcb270e0" + }, + { + "@id": "a1ab72dc-e0f2-573b-a352-2018ccf79ab0" + }, + { + "@id": "e58709a1-9688-5ecf-ad70-c919c6ccb47a" + }, + { + "@id": "10484cac-d0bf-5138-bcc1-721013a119b8" + }, + { + "@id": "e8ca5eaa-7a68-57ee-b32d-7e04fe3654b7" + } + ], + "ownedSpecialization": [ + { + "@id": "10484cac-d0bf-5138-bcc1-721013a119b8" + }, + { + "@id": "e8ca5eaa-7a68-57ee-b32d-7e04fe3654b7" + } + ], + "ownedSubsetting": [ + { + "@id": "10484cac-d0bf-5138-bcc1-721013a119b8" + }, + { + "@id": "e8ca5eaa-7a68-57ee-b32d-7e04fe3654b7" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + }, + "owningDefinition": { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + }, + "owningFeatureMembership": { + "@id": "401c27fd-bb8e-5230-badb-fa4dc1b787cf" + }, + "owningMembership": { + "@id": "401c27fd-bb8e-5230-badb-fa4dc1b787cf" + }, + "owningNamespace": { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + }, + "owningRelatedElement": null, + "owningRelationship": { + "@id": "401c27fd-bb8e-5230-badb-fa4dc1b787cf" + }, + "owningType": { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + }, + "owningUsage": null, + "parameter": [], + "payloadFeature": { + "@id": "3df85971-f25e-5281-9404-ab6eff3eec08" + }, + "payloadType": [ + { + "@id": "789f3a8d-d66f-5524-9bed-d370a23d6057" + } + ], + "portionKind": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "7b585939-0c2e-5e7a-9182-0cf8a5c860df" + }, + { + "@id": "f181017e-4d81-5e27-b4f1-9a058bd66a00" + } + ], + "relatedFeature": [ + { + "@id": "7b585939-0c2e-5e7a-9182-0cf8a5c860df" + }, + { + "@id": "f181017e-4d81-5e27-b4f1-9a058bd66a00" + } + ], + "shortName": null, + "source": [ + { + "@id": "7b585939-0c2e-5e7a-9182-0cf8a5c860df" + } + ], + "sourceFeature": { + "@id": "7b585939-0c2e-5e7a-9182-0cf8a5c860df" + }, + "sourceOutputFeature": { + "@id": "3fd75470-a311-5891-8691-0f5f275da37e" + }, + "target": [ + { + "@id": "f181017e-4d81-5e27-b4f1-9a058bd66a00" + } + ], + "targetFeature": [ + { + "@id": "f181017e-4d81-5e27-b4f1-9a058bd66a00" + } + ], + "targetInputFeature": { + "@id": "c2fc26d0-7472-54cb-976d-303f761f4e2e" + }, + "textualRepresentation": [], + "type": [], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "609b131c-9bf5-50ab-9984-c7f1bcb270e0", + "@type": "FeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "609b131c-9bf5-50ab-9984-c7f1bcb270e0", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "3df85971-f25e-5281-9404-ab6eff3eec08" + }, + "memberElementId": "3df85971-f25e-5281-9404-ab6eff3eec08", + "memberName": "payload", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "3df85971-f25e-5281-9404-ab6eff3eec08" + }, + "ownedMemberElementId": "3df85971-f25e-5281-9404-ab6eff3eec08", + "ownedMemberFeature": { + "@id": "3df85971-f25e-5281-9404-ab6eff3eec08" + }, + "ownedMemberName": "payload", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "3df85971-f25e-5281-9404-ab6eff3eec08" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + "owningRelationship": null, + "owningType": { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + { + "@id": "3df85971-f25e-5281-9404-ab6eff3eec08" + } + ], + "shortName": null, + "source": [ + { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + } + ], + "target": [ + { + "@id": "3df85971-f25e-5281-9404-ab6eff3eec08" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "3df85971-f25e-5281-9404-ab6eff3eec08", + "@type": "PayloadFeature", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "direction": null, + "documentation": [], + "elementId": "3df85971-f25e-5281-9404-ab6eff3eec08", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "3df85971-f25e-5281-9404-ab6eff3eec08" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isSufficient": false, + "isUnique": true, + "isVariable": false, + "member": [], + "membership": [], + "multiplicity": null, + "name": "payload", + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "ad7b8d3c-5ac8-5802-844c-77beb774ac4f" + }, + { + "@id": "3008d8e5-f6f0-5798-a265-c8fd6da977a3" + } + ], + "ownedSpecialization": [ + { + "@id": "ad7b8d3c-5ac8-5802-844c-77beb774ac4f" + }, + { + "@id": "3008d8e5-f6f0-5798-a265-c8fd6da977a3" + } + ], + "ownedSubsetting": [ + { + "@id": "3008d8e5-f6f0-5798-a265-c8fd6da977a3" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [ + { + "@id": "ad7b8d3c-5ac8-5802-844c-77beb774ac4f" + } + ], + "ownedUnioning": [], + "owner": { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + "owningFeatureMembership": { + "@id": "609b131c-9bf5-50ab-9984-c7f1bcb270e0" + }, + "owningMembership": { + "@id": "609b131c-9bf5-50ab-9984-c7f1bcb270e0" + }, + "owningNamespace": { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + "owningRelationship": { + "@id": "609b131c-9bf5-50ab-9984-c7f1bcb270e0" + }, + "owningType": { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [], + "type": [ + { + "@id": "789f3a8d-d66f-5524-9bed-d370a23d6057" + } + ], + "unioningType": [] + }, + { + "@id": "ad7b8d3c-5ac8-5802-844c-77beb774ac4f", + "@type": "FeatureTyping", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "ad7b8d3c-5ac8-5802-844c-77beb774ac4f", + "general": { + "@id": "789f3a8d-d66f-5524-9bed-d370a23d6057" + }, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "3df85971-f25e-5281-9404-ab6eff3eec08" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "3df85971-f25e-5281-9404-ab6eff3eec08" + }, + "owningRelationship": null, + "owningType": { + "@id": "3df85971-f25e-5281-9404-ab6eff3eec08" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "3df85971-f25e-5281-9404-ab6eff3eec08" + }, + { + "@id": "789f3a8d-d66f-5524-9bed-d370a23d6057" + } + ], + "shortName": null, + "source": [ + { + "@id": "3df85971-f25e-5281-9404-ab6eff3eec08" + } + ], + "specific": { + "@id": "3df85971-f25e-5281-9404-ab6eff3eec08" + }, + "target": [ + { + "@id": "789f3a8d-d66f-5524-9bed-d370a23d6057" + } + ], + "textualRepresentation": [], + "type": { + "@id": "789f3a8d-d66f-5524-9bed-d370a23d6057" + }, + "typedFeature": { + "@id": "3df85971-f25e-5281-9404-ab6eff3eec08" + } + }, + { + "@id": "a1ab72dc-e0f2-573b-a352-2018ccf79ab0", + "@type": "EndFeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "a1ab72dc-e0f2-573b-a352-2018ccf79ab0", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + }, + "memberElementId": "bd5a6280-71b6-5c4a-9399-6ef57459975e", + "memberName": "source", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + }, + "ownedMemberElementId": "bd5a6280-71b6-5c4a-9399-6ef57459975e", + "ownedMemberFeature": { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + }, + "ownedMemberName": "source", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + "owningRelationship": null, + "owningType": { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + } + ], + "shortName": null, + "source": [ + { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + } + ], + "target": [ + { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e", + "@type": "FlowEnd", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "differencingType": [], + "directedFeature": [ + { + "@id": "3fd75470-a311-5891-8691-0f5f275da37e" + } + ], + "direction": null, + "documentation": [], + "elementId": "bd5a6280-71b6-5c4a-9399-6ef57459975e", + "endFeature": [], + "endOwningType": { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + "feature": [ + { + "@id": "3fd75470-a311-5891-8691-0f5f275da37e" + } + ], + "featureMembership": [ + { + "@id": "e5622e61-66ba-5c28-a44d-74ccd9c95b9c" + } + ], + "featureTarget": { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isSufficient": false, + "isUnique": true, + "isVariable": false, + "member": [ + { + "@id": "3fd75470-a311-5891-8691-0f5f275da37e" + } + ], + "membership": [ + { + "@id": "e5622e61-66ba-5c28-a44d-74ccd9c95b9c" + } + ], + "multiplicity": null, + "name": "source", + "output": [ + { + "@id": "3fd75470-a311-5891-8691-0f5f275da37e" + } + ], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "7b585939-0c2e-5e7a-9182-0cf8a5c860df" + }, + { + "@id": "3fd75470-a311-5891-8691-0f5f275da37e" + } + ], + "ownedEndFeature": [], + "ownedFeature": [ + { + "@id": "3fd75470-a311-5891-8691-0f5f275da37e" + } + ], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [ + { + "@id": "e5622e61-66ba-5c28-a44d-74ccd9c95b9c" + } + ], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [ + { + "@id": "3fd75470-a311-5891-8691-0f5f275da37e" + } + ], + "ownedMembership": [ + { + "@id": "e5622e61-66ba-5c28-a44d-74ccd9c95b9c" + } + ], + "ownedRedefinition": [ + { + "@id": "6f47b5b3-4c4f-5858-b5f1-ce7e8c438b41" + } + ], + "ownedReferenceSubsetting": { + "@id": "7d11a880-e60b-5e66-a51b-3810d0e0cff9" + }, + "ownedRelationship": [ + { + "@id": "7d11a880-e60b-5e66-a51b-3810d0e0cff9" + }, + { + "@id": "e5622e61-66ba-5c28-a44d-74ccd9c95b9c" + }, + { + "@id": "6f47b5b3-4c4f-5858-b5f1-ce7e8c438b41" + } + ], + "ownedSpecialization": [ + { + "@id": "7d11a880-e60b-5e66-a51b-3810d0e0cff9" + }, + { + "@id": "6f47b5b3-4c4f-5858-b5f1-ce7e8c438b41" + } + ], + "ownedSubsetting": [ + { + "@id": "7d11a880-e60b-5e66-a51b-3810d0e0cff9" + }, + { + "@id": "6f47b5b3-4c4f-5858-b5f1-ce7e8c438b41" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + "owningFeatureMembership": { + "@id": "a1ab72dc-e0f2-573b-a352-2018ccf79ab0" + }, + "owningMembership": { + "@id": "a1ab72dc-e0f2-573b-a352-2018ccf79ab0" + }, + "owningNamespace": { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + "owningRelationship": { + "@id": "a1ab72dc-e0f2-573b-a352-2018ccf79ab0" + }, + "owningType": { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [], + "type": [ + { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + } + ], + "unioningType": [] + }, + { + "@id": "7d11a880-e60b-5e66-a51b-3810d0e0cff9", + "@type": "ReferenceSubsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "7d11a880-e60b-5e66-a51b-3810d0e0cff9", + "general": { + "@id": "7b585939-0c2e-5e7a-9182-0cf8a5c860df" + }, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [ + { + "@id": "7b585939-0c2e-5e7a-9182-0cf8a5c860df" + } + ], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + }, + "owningRelationship": null, + "owningType": { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + }, + "qualifiedName": null, + "referencedFeature": { + "@id": "7b585939-0c2e-5e7a-9182-0cf8a5c860df" + }, + "referencingFeature": { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + }, + "relatedElement": [ + { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + }, + { + "@id": "7b585939-0c2e-5e7a-9182-0cf8a5c860df" + } + ], + "shortName": null, + "source": [ + { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + } + ], + "specific": { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + }, + "subsettedFeature": { + "@id": "7b585939-0c2e-5e7a-9182-0cf8a5c860df" + }, + "subsettingFeature": { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + }, + "target": [ + { + "@id": "7b585939-0c2e-5e7a-9182-0cf8a5c860df" + } + ], + "textualRepresentation": [] + }, + { + "@id": "7b585939-0c2e-5e7a-9182-0cf8a5c860df", + "@type": "Feature", + "aliasIds": [], + "chainingFeature": [ + { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf" + }, + { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + } + ], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "direction": null, + "documentation": [], + "elementId": "7b585939-0c2e-5e7a-9182-0cf8a5c860df", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isSufficient": false, + "isUnique": true, + "isVariable": false, + "member": [], + "membership": [], + "multiplicity": null, + "name": null, + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [ + { + "@id": "47317a03-0e95-5600-91fc-b524f2b78f13" + }, + { + "@id": "25d5a2ca-1758-5e51-b2de-0b8e5d44b748" + } + ], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "47317a03-0e95-5600-91fc-b524f2b78f13" + }, + { + "@id": "25d5a2ca-1758-5e51-b2de-0b8e5d44b748" + } + ], + "ownedSpecialization": [], + "ownedSubsetting": [], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + }, + "owningFeatureMembership": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelationship": { + "@id": "7d11a880-e60b-5e66-a51b-3810d0e0cff9" + }, + "owningType": null, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [], + "type": [ + { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + } + ], + "unioningType": [] + }, + { + "@id": "47317a03-0e95-5600-91fc-b524f2b78f13", + "@type": "FeatureChaining", + "aliasIds": [], + "chainingFeature": { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf" + }, + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "47317a03-0e95-5600-91fc-b524f2b78f13", + "featureChained": { + "@id": "7b585939-0c2e-5e7a-9182-0cf8a5c860df" + }, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "7b585939-0c2e-5e7a-9182-0cf8a5c860df" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "7b585939-0c2e-5e7a-9182-0cf8a5c860df" + }, + { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf" + } + ], + "shortName": null, + "source": [ + { + "@id": "7b585939-0c2e-5e7a-9182-0cf8a5c860df" + } + ], + "target": [ + { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf" + } + ], + "textualRepresentation": [] + }, + { + "@id": "25d5a2ca-1758-5e51-b2de-0b8e5d44b748", + "@type": "FeatureChaining", + "aliasIds": [], + "chainingFeature": { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + }, + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "25d5a2ca-1758-5e51-b2de-0b8e5d44b748", + "featureChained": { + "@id": "7b585939-0c2e-5e7a-9182-0cf8a5c860df" + }, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "7b585939-0c2e-5e7a-9182-0cf8a5c860df" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "7b585939-0c2e-5e7a-9182-0cf8a5c860df" + }, + { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + } + ], + "shortName": null, + "source": [ + { + "@id": "7b585939-0c2e-5e7a-9182-0cf8a5c860df" + } + ], + "target": [ + { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + } + ], + "textualRepresentation": [] + }, + { + "@id": "e5622e61-66ba-5c28-a44d-74ccd9c95b9c", + "@type": "FeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "e5622e61-66ba-5c28-a44d-74ccd9c95b9c", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "3fd75470-a311-5891-8691-0f5f275da37e" + }, + "memberElementId": "3fd75470-a311-5891-8691-0f5f275da37e", + "memberName": "payload", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "3fd75470-a311-5891-8691-0f5f275da37e" + }, + "ownedMemberElementId": "3fd75470-a311-5891-8691-0f5f275da37e", + "ownedMemberFeature": { + "@id": "3fd75470-a311-5891-8691-0f5f275da37e" + }, + "ownedMemberName": "payload", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "3fd75470-a311-5891-8691-0f5f275da37e" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + }, + "owningRelationship": null, + "owningType": { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + }, + { + "@id": "3fd75470-a311-5891-8691-0f5f275da37e" + } + ], + "shortName": null, + "source": [ + { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + } + ], + "target": [ + { + "@id": "3fd75470-a311-5891-8691-0f5f275da37e" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "3fd75470-a311-5891-8691-0f5f275da37e", + "@type": "ReferenceUsage", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "definition": [ + { + "@id": "789f3a8d-d66f-5524-9bed-d370a23d6057" + } + ], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": "out", + "documentation": [], + "elementId": "3fd75470-a311-5891-8691-0f5f275da37e", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "3fd75470-a311-5891-8691-0f5f275da37e" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": true, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [], + "membership": [], + "multiplicity": null, + "name": "payload", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [ + { + "@id": "8f9988fb-330d-553d-8e70-32e5d2d445f3" + } + ], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "8f9988fb-330d-553d-8e70-32e5d2d445f3" + } + ], + "ownedSpecialization": [ + { + "@id": "8f9988fb-330d-553d-8e70-32e5d2d445f3" + } + ], + "ownedSubsetting": [ + { + "@id": "8f9988fb-330d-553d-8e70-32e5d2d445f3" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + }, + "owningDefinition": null, + "owningFeatureMembership": { + "@id": "e5622e61-66ba-5c28-a44d-74ccd9c95b9c" + }, + "owningMembership": { + "@id": "e5622e61-66ba-5c28-a44d-74ccd9c95b9c" + }, + "owningNamespace": { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + }, + "owningRelationship": { + "@id": "e5622e61-66ba-5c28-a44d-74ccd9c95b9c" + }, + "owningType": { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + }, + "owningUsage": null, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [], + "type": [ + { + "@id": "789f3a8d-d66f-5524-9bed-d370a23d6057" + } + ], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "8f9988fb-330d-553d-8e70-32e5d2d445f3", + "@type": "Redefinition", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "8f9988fb-330d-553d-8e70-32e5d2d445f3", + "general": { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + }, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "3fd75470-a311-5891-8691-0f5f275da37e" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "3fd75470-a311-5891-8691-0f5f275da37e" + }, + "owningRelationship": null, + "owningType": { + "@id": "3fd75470-a311-5891-8691-0f5f275da37e" + }, + "qualifiedName": null, + "redefinedFeature": { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + }, + "redefiningFeature": { + "@id": "3fd75470-a311-5891-8691-0f5f275da37e" + }, + "relatedElement": [ + { + "@id": "3fd75470-a311-5891-8691-0f5f275da37e" + }, + { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + } + ], + "shortName": null, + "source": [ + { + "@id": "3fd75470-a311-5891-8691-0f5f275da37e" + } + ], + "specific": { + "@id": "3fd75470-a311-5891-8691-0f5f275da37e" + }, + "subsettedFeature": { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + }, + "subsettingFeature": { + "@id": "3fd75470-a311-5891-8691-0f5f275da37e" + }, + "target": [ + { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + } + ], + "textualRepresentation": [] + }, + { + "@id": "e58709a1-9688-5ecf-ad70-c919c6ccb47a", + "@type": "EndFeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "e58709a1-9688-5ecf-ad70-c919c6ccb47a", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + }, + "memberElementId": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc", + "memberName": "target", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + }, + "ownedMemberElementId": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc", + "ownedMemberFeature": { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + }, + "ownedMemberName": "target", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + "owningRelationship": null, + "owningType": { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + } + ], + "shortName": null, + "source": [ + { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + } + ], + "target": [ + { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc", + "@type": "FlowEnd", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "differencingType": [], + "directedFeature": [ + { + "@id": "c2fc26d0-7472-54cb-976d-303f761f4e2e" + } + ], + "direction": null, + "documentation": [], + "elementId": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc", + "endFeature": [], + "endOwningType": { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + "feature": [ + { + "@id": "c2fc26d0-7472-54cb-976d-303f761f4e2e" + } + ], + "featureMembership": [ + { + "@id": "743dd476-a0ba-5bc5-a645-00725b403b04" + } + ], + "featureTarget": { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [ + { + "@id": "c2fc26d0-7472-54cb-976d-303f761f4e2e" + } + ], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isSufficient": false, + "isUnique": true, + "isVariable": false, + "member": [ + { + "@id": "c2fc26d0-7472-54cb-976d-303f761f4e2e" + } + ], + "membership": [ + { + "@id": "743dd476-a0ba-5bc5-a645-00725b403b04" + } + ], + "multiplicity": null, + "name": "target", + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "f181017e-4d81-5e27-b4f1-9a058bd66a00" + }, + { + "@id": "c2fc26d0-7472-54cb-976d-303f761f4e2e" + } + ], + "ownedEndFeature": [], + "ownedFeature": [ + { + "@id": "c2fc26d0-7472-54cb-976d-303f761f4e2e" + } + ], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [ + { + "@id": "743dd476-a0ba-5bc5-a645-00725b403b04" + } + ], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [ + { + "@id": "c2fc26d0-7472-54cb-976d-303f761f4e2e" + } + ], + "ownedMembership": [ + { + "@id": "743dd476-a0ba-5bc5-a645-00725b403b04" + } + ], + "ownedRedefinition": [ + { + "@id": "ddfe62fe-b152-5113-a52d-44d0f589a27a" + } + ], + "ownedReferenceSubsetting": { + "@id": "72196c68-f374-5e9a-bb70-5f5d960632a4" + }, + "ownedRelationship": [ + { + "@id": "72196c68-f374-5e9a-bb70-5f5d960632a4" + }, + { + "@id": "743dd476-a0ba-5bc5-a645-00725b403b04" + }, + { + "@id": "ddfe62fe-b152-5113-a52d-44d0f589a27a" + } + ], + "ownedSpecialization": [ + { + "@id": "72196c68-f374-5e9a-bb70-5f5d960632a4" + }, + { + "@id": "ddfe62fe-b152-5113-a52d-44d0f589a27a" + } + ], + "ownedSubsetting": [ + { + "@id": "72196c68-f374-5e9a-bb70-5f5d960632a4" + }, + { + "@id": "ddfe62fe-b152-5113-a52d-44d0f589a27a" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + "owningFeatureMembership": { + "@id": "e58709a1-9688-5ecf-ad70-c919c6ccb47a" + }, + "owningMembership": { + "@id": "e58709a1-9688-5ecf-ad70-c919c6ccb47a" + }, + "owningNamespace": { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + "owningRelationship": { + "@id": "e58709a1-9688-5ecf-ad70-c919c6ccb47a" + }, + "owningType": { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [], + "type": [ + { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + } + ], + "unioningType": [] + }, + { + "@id": "72196c68-f374-5e9a-bb70-5f5d960632a4", + "@type": "ReferenceSubsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "72196c68-f374-5e9a-bb70-5f5d960632a4", + "general": { + "@id": "f181017e-4d81-5e27-b4f1-9a058bd66a00" + }, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [ + { + "@id": "f181017e-4d81-5e27-b4f1-9a058bd66a00" + } + ], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + }, + "owningRelationship": null, + "owningType": { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + }, + "qualifiedName": null, + "referencedFeature": { + "@id": "f181017e-4d81-5e27-b4f1-9a058bd66a00" + }, + "referencingFeature": { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + }, + "relatedElement": [ + { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + }, + { + "@id": "f181017e-4d81-5e27-b4f1-9a058bd66a00" + } + ], + "shortName": null, + "source": [ + { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + } + ], + "specific": { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + }, + "subsettedFeature": { + "@id": "f181017e-4d81-5e27-b4f1-9a058bd66a00" + }, + "subsettingFeature": { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + }, + "target": [ + { + "@id": "f181017e-4d81-5e27-b4f1-9a058bd66a00" + } + ], + "textualRepresentation": [] + }, + { + "@id": "f181017e-4d81-5e27-b4f1-9a058bd66a00", + "@type": "Feature", + "aliasIds": [], + "chainingFeature": [ + { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673" + }, + { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + } + ], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "direction": null, + "documentation": [], + "elementId": "f181017e-4d81-5e27-b4f1-9a058bd66a00", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isSufficient": false, + "isUnique": true, + "isVariable": false, + "member": [], + "membership": [], + "multiplicity": null, + "name": null, + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [ + { + "@id": "7832f10f-4e3b-51f2-a566-362e747d89a2" + }, + { + "@id": "96e682ef-5f99-5e44-8f5c-c00c30fb7bbc" + } + ], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "7832f10f-4e3b-51f2-a566-362e747d89a2" + }, + { + "@id": "96e682ef-5f99-5e44-8f5c-c00c30fb7bbc" + } + ], + "ownedSpecialization": [], + "ownedSubsetting": [], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + }, + "owningFeatureMembership": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelationship": { + "@id": "72196c68-f374-5e9a-bb70-5f5d960632a4" + }, + "owningType": null, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [], + "type": [ + { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + } + ], + "unioningType": [] + }, + { + "@id": "7832f10f-4e3b-51f2-a566-362e747d89a2", + "@type": "FeatureChaining", + "aliasIds": [], + "chainingFeature": { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673" + }, + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "7832f10f-4e3b-51f2-a566-362e747d89a2", + "featureChained": { + "@id": "f181017e-4d81-5e27-b4f1-9a058bd66a00" + }, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "f181017e-4d81-5e27-b4f1-9a058bd66a00" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "f181017e-4d81-5e27-b4f1-9a058bd66a00" + }, + { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673" + } + ], + "shortName": null, + "source": [ + { + "@id": "f181017e-4d81-5e27-b4f1-9a058bd66a00" + } + ], + "target": [ + { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673" + } + ], + "textualRepresentation": [] + }, + { + "@id": "96e682ef-5f99-5e44-8f5c-c00c30fb7bbc", + "@type": "FeatureChaining", + "aliasIds": [], + "chainingFeature": { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + }, + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "96e682ef-5f99-5e44-8f5c-c00c30fb7bbc", + "featureChained": { + "@id": "f181017e-4d81-5e27-b4f1-9a058bd66a00" + }, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "f181017e-4d81-5e27-b4f1-9a058bd66a00" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "f181017e-4d81-5e27-b4f1-9a058bd66a00" + }, + { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + } + ], + "shortName": null, + "source": [ + { + "@id": "f181017e-4d81-5e27-b4f1-9a058bd66a00" + } + ], + "target": [ + { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + } + ], + "textualRepresentation": [] + }, + { + "@id": "743dd476-a0ba-5bc5-a645-00725b403b04", + "@type": "FeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "743dd476-a0ba-5bc5-a645-00725b403b04", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "c2fc26d0-7472-54cb-976d-303f761f4e2e" + }, + "memberElementId": "c2fc26d0-7472-54cb-976d-303f761f4e2e", + "memberName": "payload", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "c2fc26d0-7472-54cb-976d-303f761f4e2e" + }, + "ownedMemberElementId": "c2fc26d0-7472-54cb-976d-303f761f4e2e", + "ownedMemberFeature": { + "@id": "c2fc26d0-7472-54cb-976d-303f761f4e2e" + }, + "ownedMemberName": "payload", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "c2fc26d0-7472-54cb-976d-303f761f4e2e" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + }, + "owningRelationship": null, + "owningType": { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + }, + { + "@id": "c2fc26d0-7472-54cb-976d-303f761f4e2e" + } + ], + "shortName": null, + "source": [ + { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + } + ], + "target": [ + { + "@id": "c2fc26d0-7472-54cb-976d-303f761f4e2e" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "c2fc26d0-7472-54cb-976d-303f761f4e2e", + "@type": "ReferenceUsage", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "definition": [ + { + "@id": "789f3a8d-d66f-5524-9bed-d370a23d6057" + } + ], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": "in", + "documentation": [], + "elementId": "c2fc26d0-7472-54cb-976d-303f761f4e2e", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "c2fc26d0-7472-54cb-976d-303f761f4e2e" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": true, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [], + "membership": [], + "multiplicity": null, + "name": "payload", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [ + { + "@id": "c04198ef-1839-5cfc-9b84-6292f65f8ff2" + } + ], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "c04198ef-1839-5cfc-9b84-6292f65f8ff2" + } + ], + "ownedSpecialization": [ + { + "@id": "c04198ef-1839-5cfc-9b84-6292f65f8ff2" + } + ], + "ownedSubsetting": [ + { + "@id": "c04198ef-1839-5cfc-9b84-6292f65f8ff2" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + }, + "owningDefinition": null, + "owningFeatureMembership": { + "@id": "743dd476-a0ba-5bc5-a645-00725b403b04" + }, + "owningMembership": { + "@id": "743dd476-a0ba-5bc5-a645-00725b403b04" + }, + "owningNamespace": { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + }, + "owningRelationship": { + "@id": "743dd476-a0ba-5bc5-a645-00725b403b04" + }, + "owningType": { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + }, + "owningUsage": null, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [], + "type": [ + { + "@id": "789f3a8d-d66f-5524-9bed-d370a23d6057" + } + ], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "c04198ef-1839-5cfc-9b84-6292f65f8ff2", + "@type": "Redefinition", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "c04198ef-1839-5cfc-9b84-6292f65f8ff2", + "general": { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + }, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "c2fc26d0-7472-54cb-976d-303f761f4e2e" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "c2fc26d0-7472-54cb-976d-303f761f4e2e" + }, + "owningRelationship": null, + "owningType": { + "@id": "c2fc26d0-7472-54cb-976d-303f761f4e2e" + }, + "qualifiedName": null, + "redefinedFeature": { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + }, + "redefiningFeature": { + "@id": "c2fc26d0-7472-54cb-976d-303f761f4e2e" + }, + "relatedElement": [ + { + "@id": "c2fc26d0-7472-54cb-976d-303f761f4e2e" + }, + { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + } + ], + "shortName": null, + "source": [ + { + "@id": "c2fc26d0-7472-54cb-976d-303f761f4e2e" + } + ], + "specific": { + "@id": "c2fc26d0-7472-54cb-976d-303f761f4e2e" + }, + "subsettedFeature": { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + }, + "subsettingFeature": { + "@id": "c2fc26d0-7472-54cb-976d-303f761f4e2e" + }, + "target": [ + { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + } + ], + "textualRepresentation": [] + }, + { + "@id": "bcacfa78-13f4-5362-9700-604e6cdf5880", + "@type": "Subclassification", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "bcacfa78-13f4-5362-9700-604e6cdf5880", + "general": { + "@id": "8e9bd20f-ea8f-5a87-9759-f196d58bdd1a" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningClassifier": { + "@id": "789f3a8d-d66f-5524-9bed-d370a23d6057" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "789f3a8d-d66f-5524-9bed-d370a23d6057" + }, + "owningRelationship": null, + "owningType": { + "@id": "789f3a8d-d66f-5524-9bed-d370a23d6057" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "789f3a8d-d66f-5524-9bed-d370a23d6057" + }, + { + "@id": "8e9bd20f-ea8f-5a87-9759-f196d58bdd1a" + } + ], + "shortName": null, + "source": [ + { + "@id": "789f3a8d-d66f-5524-9bed-d370a23d6057" + } + ], + "specific": { + "@id": "789f3a8d-d66f-5524-9bed-d370a23d6057" + }, + "subclassifier": { + "@id": "789f3a8d-d66f-5524-9bed-d370a23d6057" + }, + "superclassifier": { + "@id": "8e9bd20f-ea8f-5a87-9759-f196d58bdd1a" + }, + "target": [ + { + "@id": "8e9bd20f-ea8f-5a87-9759-f196d58bdd1a" + } + ], + "textualRepresentation": [] + }, + { + "@id": "4485e629-b8b4-5222-947b-12ddf8830613", + "@type": "Subclassification", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "4485e629-b8b4-5222-947b-12ddf8830613", + "general": { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningClassifier": { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + }, + "owningRelationship": null, + "owningType": { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + }, + { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + } + ], + "shortName": null, + "source": [ + { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + } + ], + "specific": { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + }, + "subclassifier": { + "@id": "88e2d4ca-e276-5187-b44e-4e91cbe01393" + }, + "superclassifier": { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + }, + "target": [ + { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + } + ], + "textualRepresentation": [] + }, + { + "@id": "687d60b0-fae4-58ed-b4b8-98d6d420a72e", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "687d60b0-fae4-58ed-b4b8-98d6d420a72e", + "general": { + "@id": "f6f04e9e-c8f9-5a8e-8e4b-a4504ca2bf85" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + }, + "owningRelationship": null, + "owningType": { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + }, + { + "@id": "f6f04e9e-c8f9-5a8e-8e4b-a4504ca2bf85" + } + ], + "shortName": null, + "source": [ + { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + } + ], + "specific": { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + }, + "subsettedFeature": { + "@id": "f6f04e9e-c8f9-5a8e-8e4b-a4504ca2bf85" + }, + "subsettingFeature": { + "@id": "dc08c950-4f3e-5019-897e-b0c674972092" + }, + "target": [ + { + "@id": "f6f04e9e-c8f9-5a8e-8e4b-a4504ca2bf85" + } + ], + "textualRepresentation": [] + }, + { + "@id": "a8c5a1e5-67c0-5aa5-928a-530efd34dfd5", + "@type": "Subclassification", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "a8c5a1e5-67c0-5aa5-928a-530efd34dfd5", + "general": { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningClassifier": { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + }, + "owningRelationship": null, + "owningType": { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + }, + { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + } + ], + "shortName": null, + "source": [ + { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + } + ], + "specific": { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + }, + "subclassifier": { + "@id": "8824b96c-920c-57be-bec1-17612dd42265" + }, + "superclassifier": { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + }, + "target": [ + { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + } + ], + "textualRepresentation": [] + }, + { + "@id": "11567119-c2d1-58c7-80aa-29c7ac98b2a8", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "11567119-c2d1-58c7-80aa-29c7ac98b2a8", + "general": { + "@id": "a44baa93-a4d0-535d-b879-44a30575f348" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + }, + "owningRelationship": null, + "owningType": { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + }, + { + "@id": "a44baa93-a4d0-535d-b879-44a30575f348" + } + ], + "shortName": null, + "source": [ + { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + } + ], + "specific": { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + }, + "subsettedFeature": { + "@id": "a44baa93-a4d0-535d-b879-44a30575f348" + }, + "subsettingFeature": { + "@id": "0657e80a-e774-57d1-95ca-291849065195" + }, + "target": [ + { + "@id": "a44baa93-a4d0-535d-b879-44a30575f348" + } + ], + "textualRepresentation": [] + }, + { + "@id": "6397eac8-403f-509d-abe5-3ece777a7675", + "@type": "Subclassification", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "6397eac8-403f-509d-abe5-3ece777a7675", + "general": { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningClassifier": { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + }, + "owningRelationship": null, + "owningType": { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + }, + { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + } + ], + "shortName": null, + "source": [ + { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + } + ], + "specific": { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + }, + "subclassifier": { + "@id": "448a7ce0-12d8-5486-9aba-133bc5b3ca5e" + }, + "superclassifier": { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + }, + "target": [ + { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + } + ], + "textualRepresentation": [] + }, + { + "@id": "c1e438d6-9211-5284-871c-32fc65c8e36a", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "c1e438d6-9211-5284-871c-32fc65c8e36a", + "general": { + "@id": "a44baa93-a4d0-535d-b879-44a30575f348" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf" + }, + "owningRelationship": null, + "owningType": { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf" + }, + { + "@id": "a44baa93-a4d0-535d-b879-44a30575f348" + } + ], + "shortName": null, + "source": [ + { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf" + } + ], + "specific": { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf" + }, + "subsettedFeature": { + "@id": "a44baa93-a4d0-535d-b879-44a30575f348" + }, + "subsettingFeature": { + "@id": "59a5136b-e079-55a0-a995-880adb1ac1bf" + }, + "target": [ + { + "@id": "a44baa93-a4d0-535d-b879-44a30575f348" + } + ], + "textualRepresentation": [] + }, + { + "@id": "97fbba9f-3a69-511e-92ee-80331d5a6fc4", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "97fbba9f-3a69-511e-92ee-80331d5a6fc4", + "general": { + "@id": "a44baa93-a4d0-535d-b879-44a30575f348" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673" + }, + "owningRelationship": null, + "owningType": { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673" + }, + { + "@id": "a44baa93-a4d0-535d-b879-44a30575f348" + } + ], + "shortName": null, + "source": [ + { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673" + } + ], + "specific": { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673" + }, + "subsettedFeature": { + "@id": "a44baa93-a4d0-535d-b879-44a30575f348" + }, + "subsettingFeature": { + "@id": "c23f2a28-1fcc-5c00-b7db-d563f41cc673" + }, + "target": [ + { + "@id": "a44baa93-a4d0-535d-b879-44a30575f348" + } + ], + "textualRepresentation": [] + }, + { + "@id": "10484cac-d0bf-5138-bcc1-721013a119b8", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "10484cac-d0bf-5138-bcc1-721013a119b8", + "general": { + "@id": "58f4b8ef-ef56-5e97-8def-549155818a37" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + "owningRelationship": null, + "owningType": { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + { + "@id": "58f4b8ef-ef56-5e97-8def-549155818a37" + } + ], + "shortName": null, + "source": [ + { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + } + ], + "specific": { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + "subsettedFeature": { + "@id": "58f4b8ef-ef56-5e97-8def-549155818a37" + }, + "subsettingFeature": { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + "target": [ + { + "@id": "58f4b8ef-ef56-5e97-8def-549155818a37" + } + ], + "textualRepresentation": [] + }, + { + "@id": "e8ca5eaa-7a68-57ee-b32d-7e04fe3654b7", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "e8ca5eaa-7a68-57ee-b32d-7e04fe3654b7", + "general": { + "@id": "42cca478-6f8d-5c19-b990-bc4510c8bea7" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + "owningRelationship": null, + "owningType": { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + { + "@id": "42cca478-6f8d-5c19-b990-bc4510c8bea7" + } + ], + "shortName": null, + "source": [ + { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + } + ], + "specific": { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + "subsettedFeature": { + "@id": "42cca478-6f8d-5c19-b990-bc4510c8bea7" + }, + "subsettingFeature": { + "@id": "3d1a2f67-df80-57d9-bedc-8a3ef7eda40f" + }, + "target": [ + { + "@id": "42cca478-6f8d-5c19-b990-bc4510c8bea7" + } + ], + "textualRepresentation": [] + }, + { + "@id": "3008d8e5-f6f0-5798-a265-c8fd6da977a3", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "3008d8e5-f6f0-5798-a265-c8fd6da977a3", + "general": { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "3df85971-f25e-5281-9404-ab6eff3eec08" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "3df85971-f25e-5281-9404-ab6eff3eec08" + }, + "owningRelationship": null, + "owningType": { + "@id": "3df85971-f25e-5281-9404-ab6eff3eec08" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "3df85971-f25e-5281-9404-ab6eff3eec08" + }, + { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + } + ], + "shortName": null, + "source": [ + { + "@id": "3df85971-f25e-5281-9404-ab6eff3eec08" + } + ], + "specific": { + "@id": "3df85971-f25e-5281-9404-ab6eff3eec08" + }, + "subsettedFeature": { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + }, + "subsettingFeature": { + "@id": "3df85971-f25e-5281-9404-ab6eff3eec08" + }, + "target": [ + { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + } + ], + "textualRepresentation": [] + }, + { + "@id": "6f47b5b3-4c4f-5858-b5f1-ce7e8c438b41", + "@type": "Redefinition", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "6f47b5b3-4c4f-5858-b5f1-ce7e8c438b41", + "general": { + "@id": "9d174cd9-1d36-52f0-9c44-62001ffb9568" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + }, + "owningRelationship": null, + "owningType": { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + }, + "qualifiedName": null, + "redefinedFeature": { + "@id": "9d174cd9-1d36-52f0-9c44-62001ffb9568" + }, + "redefiningFeature": { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + }, + "relatedElement": [ + { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + }, + { + "@id": "9d174cd9-1d36-52f0-9c44-62001ffb9568" + } + ], + "shortName": null, + "source": [ + { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + } + ], + "specific": { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + }, + "subsettedFeature": { + "@id": "9d174cd9-1d36-52f0-9c44-62001ffb9568" + }, + "subsettingFeature": { + "@id": "bd5a6280-71b6-5c4a-9399-6ef57459975e" + }, + "target": [ + { + "@id": "9d174cd9-1d36-52f0-9c44-62001ffb9568" + } + ], + "textualRepresentation": [] + }, + { + "@id": "ddfe62fe-b152-5113-a52d-44d0f589a27a", + "@type": "Redefinition", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "ddfe62fe-b152-5113-a52d-44d0f589a27a", + "general": { + "@id": "bf43c516-b2fd-59b0-ae53-a534f1289406" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + }, + "owningRelationship": null, + "owningType": { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + }, + "qualifiedName": null, + "redefinedFeature": { + "@id": "bf43c516-b2fd-59b0-ae53-a534f1289406" + }, + "redefiningFeature": { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + }, + "relatedElement": [ + { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + }, + { + "@id": "bf43c516-b2fd-59b0-ae53-a534f1289406" + } + ], + "shortName": null, + "source": [ + { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + } + ], + "specific": { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + }, + "subsettedFeature": { + "@id": "bf43c516-b2fd-59b0-ae53-a534f1289406" + }, + "subsettingFeature": { + "@id": "ed0cde77-fb6d-5042-bb84-b266fd8ec6fc" + }, + "target": [ + { + "@id": "bf43c516-b2fd-59b0-ae53-a534f1289406" + } + ], + "textualRepresentation": [] + } +] diff --git a/tests/export/testdata/interchange/library_identity.golden.sysml b/tests/export/testdata/interchange/library_identity.golden.sysml new file mode 100644 index 0000000000..935cd1ab58 --- /dev/null +++ b/tests/export/testdata/interchange/library_identity.golden.sysml @@ -0,0 +1,8 @@ +library package DocumentLibrary { + part def Component; +} +package LibraryIdentity { + part def Sensor { + attribute value : ScalarValues::Real; + } +} diff --git a/tests/export/testdata/interchange/library_identity.sysml b/tests/export/testdata/interchange/library_identity.sysml new file mode 100644 index 0000000000..aae5dd7d6c --- /dev/null +++ b/tests/export/testdata/interchange/library_identity.sysml @@ -0,0 +1,9 @@ +library package DocumentLibrary { + part def Component; +} + +package LibraryIdentity { + part def Sensor { + attribute value : ScalarValues::Real; + } +} diff --git a/tests/export/testdata/interchange/library_identity.toolkit.full.json b/tests/export/testdata/interchange/library_identity.toolkit.full.json new file mode 100644 index 0000000000..56a7bcd4eb --- /dev/null +++ b/tests/export/testdata/interchange/library_identity.toolkit.full.json @@ -0,0 +1,1213 @@ +[ + { + "@id": "0b283aaf-8741-5773-8fc2-37322b93f33e", + "@type": "Namespace", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "0b283aaf-8741-5773-8fc2-37322b93f33e", + "importedMembership": [], + "isImpliedIncluded": true, + "isLibraryElement": false, + "member": [ + { + "@id": "dc00aeae-f561-5574-a6d0-3bd7382f31cc" + }, + { + "@id": "95eecbfe-3f3f-5d47-9626-8bd842da05bb" + } + ], + "membership": [ + { + "@id": "c9228882-b4f1-54eb-8d02-5a672771bef8" + }, + { + "@id": "b5efa11b-9679-580d-8edf-4c50e08db617" + } + ], + "name": null, + "ownedAnnotation": [], + "ownedElement": [ + { + "@id": "dc00aeae-f561-5574-a6d0-3bd7382f31cc" + }, + { + "@id": "95eecbfe-3f3f-5d47-9626-8bd842da05bb" + } + ], + "ownedImport": [], + "ownedMember": [ + { + "@id": "dc00aeae-f561-5574-a6d0-3bd7382f31cc" + }, + { + "@id": "95eecbfe-3f3f-5d47-9626-8bd842da05bb" + } + ], + "ownedMembership": [ + { + "@id": "c9228882-b4f1-54eb-8d02-5a672771bef8" + }, + { + "@id": "b5efa11b-9679-580d-8edf-4c50e08db617" + } + ], + "ownedRelationship": [ + { + "@id": "c9228882-b4f1-54eb-8d02-5a672771bef8" + }, + { + "@id": "b5efa11b-9679-580d-8edf-4c50e08db617" + } + ], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelationship": null, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [] + }, + { + "@id": "c9228882-b4f1-54eb-8d02-5a672771bef8", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "c9228882-b4f1-54eb-8d02-5a672771bef8", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "dc00aeae-f561-5574-a6d0-3bd7382f31cc" + }, + "memberElementId": "dc00aeae-f561-5574-a6d0-3bd7382f31cc", + "memberName": "DocumentLibrary", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "0b283aaf-8741-5773-8fc2-37322b93f33e" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "dc00aeae-f561-5574-a6d0-3bd7382f31cc" + }, + "ownedMemberElementId": "dc00aeae-f561-5574-a6d0-3bd7382f31cc", + "ownedMemberName": "DocumentLibrary", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "dc00aeae-f561-5574-a6d0-3bd7382f31cc" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "0b283aaf-8741-5773-8fc2-37322b93f33e" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "0b283aaf-8741-5773-8fc2-37322b93f33e" + }, + { + "@id": "dc00aeae-f561-5574-a6d0-3bd7382f31cc" + } + ], + "shortName": null, + "source": [ + { + "@id": "0b283aaf-8741-5773-8fc2-37322b93f33e" + } + ], + "target": [ + { + "@id": "dc00aeae-f561-5574-a6d0-3bd7382f31cc" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "dc00aeae-f561-5574-a6d0-3bd7382f31cc", + "@type": "LibraryPackage", + "aliasIds": [], + "declaredName": "DocumentLibrary", + "declaredShortName": null, + "documentation": [], + "elementId": "dc00aeae-f561-5574-a6d0-3bd7382f31cc", + "filterCondition": [], + "importedMembership": [], + "isImpliedIncluded": true, + "isLibraryElement": true, + "isStandard": false, + "member": [ + { + "@id": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2" + } + ], + "membership": [ + { + "@id": "5b090e63-520e-579e-a68f-f1b12e754e56" + } + ], + "name": "DocumentLibrary", + "ownedAnnotation": [], + "ownedElement": [ + { + "@id": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2" + } + ], + "ownedImport": [], + "ownedMember": [ + { + "@id": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2" + } + ], + "ownedMembership": [ + { + "@id": "5b090e63-520e-579e-a68f-f1b12e754e56" + } + ], + "ownedRelationship": [ + { + "@id": "5b090e63-520e-579e-a68f-f1b12e754e56" + } + ], + "owner": { + "@id": "0b283aaf-8741-5773-8fc2-37322b93f33e" + }, + "owningMembership": { + "@id": "c9228882-b4f1-54eb-8d02-5a672771bef8" + }, + "owningNamespace": { + "@id": "0b283aaf-8741-5773-8fc2-37322b93f33e" + }, + "owningRelationship": { + "@id": "c9228882-b4f1-54eb-8d02-5a672771bef8" + }, + "qualifiedName": "DocumentLibrary", + "shortName": null, + "textualRepresentation": [] + }, + { + "@id": "5b090e63-520e-579e-a68f-f1b12e754e56", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "5b090e63-520e-579e-a68f-f1b12e754e56", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": true, + "memberElement": { + "@id": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2" + }, + "memberElementId": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2", + "memberName": "Component", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "dc00aeae-f561-5574-a6d0-3bd7382f31cc" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2" + }, + "ownedMemberElementId": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2", + "ownedMemberName": "Component", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "dc00aeae-f561-5574-a6d0-3bd7382f31cc" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "dc00aeae-f561-5574-a6d0-3bd7382f31cc" + }, + { + "@id": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2" + } + ], + "shortName": null, + "source": [ + { + "@id": "dc00aeae-f561-5574-a6d0-3bd7382f31cc" + } + ], + "target": [ + { + "@id": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2", + "@type": "PartDefinition", + "aliasIds": [], + "declaredName": "Component", + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "documentation": [], + "elementId": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2", + "endFeature": [], + "feature": [], + "featureMembership": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isConjugated": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": true, + "isSufficient": false, + "isVariation": false, + "member": [], + "membership": [], + "multiplicity": null, + "name": "Component", + "output": [], + "ownedAction": [], + "ownedAllocation": [], + "ownedAnalysisCase": [], + "ownedAnnotation": [], + "ownedAttribute": [], + "ownedCalculation": [], + "ownedCase": [], + "ownedConcern": [], + "ownedConjugator": null, + "ownedConnection": [], + "ownedConstraint": [], + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedEnumeration": [], + "ownedFeature": [], + "ownedFeatureMembership": [], + "ownedFlow": [], + "ownedImport": [], + "ownedInterface": [], + "ownedIntersecting": [], + "ownedItem": [], + "ownedMember": [], + "ownedMembership": [], + "ownedMetadata": [], + "ownedOccurrence": [], + "ownedPart": [], + "ownedPort": [], + "ownedReference": [], + "ownedRelationship": [ + { + "@id": "790265e4-6780-50a7-944d-11edc7255883" + } + ], + "ownedRendering": [], + "ownedRequirement": [], + "ownedSpecialization": [ + { + "@id": "790265e4-6780-50a7-944d-11edc7255883" + } + ], + "ownedState": [], + "ownedSubclassification": [ + { + "@id": "790265e4-6780-50a7-944d-11edc7255883" + } + ], + "ownedTransition": [], + "ownedUnioning": [], + "ownedUsage": [], + "ownedUseCase": [], + "ownedVerificationCase": [], + "ownedView": [], + "ownedViewpoint": [], + "owner": { + "@id": "dc00aeae-f561-5574-a6d0-3bd7382f31cc" + }, + "owningMembership": { + "@id": "5b090e63-520e-579e-a68f-f1b12e754e56" + }, + "owningNamespace": { + "@id": "dc00aeae-f561-5574-a6d0-3bd7382f31cc" + }, + "owningRelationship": { + "@id": "5b090e63-520e-579e-a68f-f1b12e754e56" + }, + "qualifiedName": "DocumentLibrary::Component", + "shortName": null, + "textualRepresentation": [], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "b5efa11b-9679-580d-8edf-4c50e08db617", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "b5efa11b-9679-580d-8edf-4c50e08db617", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "95eecbfe-3f3f-5d47-9626-8bd842da05bb" + }, + "memberElementId": "95eecbfe-3f3f-5d47-9626-8bd842da05bb", + "memberName": "LibraryIdentity", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "0b283aaf-8741-5773-8fc2-37322b93f33e" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "95eecbfe-3f3f-5d47-9626-8bd842da05bb" + }, + "ownedMemberElementId": "95eecbfe-3f3f-5d47-9626-8bd842da05bb", + "ownedMemberName": "LibraryIdentity", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "95eecbfe-3f3f-5d47-9626-8bd842da05bb" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "0b283aaf-8741-5773-8fc2-37322b93f33e" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "0b283aaf-8741-5773-8fc2-37322b93f33e" + }, + { + "@id": "95eecbfe-3f3f-5d47-9626-8bd842da05bb" + } + ], + "shortName": null, + "source": [ + { + "@id": "0b283aaf-8741-5773-8fc2-37322b93f33e" + } + ], + "target": [ + { + "@id": "95eecbfe-3f3f-5d47-9626-8bd842da05bb" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "95eecbfe-3f3f-5d47-9626-8bd842da05bb", + "@type": "Package", + "aliasIds": [], + "declaredName": "LibraryIdentity", + "declaredShortName": null, + "documentation": [], + "elementId": "95eecbfe-3f3f-5d47-9626-8bd842da05bb", + "filterCondition": [], + "importedMembership": [], + "isImpliedIncluded": true, + "isLibraryElement": false, + "member": [ + { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + } + ], + "membership": [ + { + "@id": "cbed16c1-4e78-5fb0-b866-a266cd8e1cd8" + } + ], + "name": "LibraryIdentity", + "ownedAnnotation": [], + "ownedElement": [ + { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + } + ], + "ownedImport": [], + "ownedMember": [ + { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + } + ], + "ownedMembership": [ + { + "@id": "cbed16c1-4e78-5fb0-b866-a266cd8e1cd8" + } + ], + "ownedRelationship": [ + { + "@id": "cbed16c1-4e78-5fb0-b866-a266cd8e1cd8" + } + ], + "owner": { + "@id": "0b283aaf-8741-5773-8fc2-37322b93f33e" + }, + "owningMembership": { + "@id": "b5efa11b-9679-580d-8edf-4c50e08db617" + }, + "owningNamespace": { + "@id": "0b283aaf-8741-5773-8fc2-37322b93f33e" + }, + "owningRelationship": { + "@id": "b5efa11b-9679-580d-8edf-4c50e08db617" + }, + "qualifiedName": "LibraryIdentity", + "shortName": null, + "textualRepresentation": [] + }, + { + "@id": "cbed16c1-4e78-5fb0-b866-a266cd8e1cd8", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "cbed16c1-4e78-5fb0-b866-a266cd8e1cd8", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + }, + "memberElementId": "92370943-ff56-5024-adcd-a52ef649993d", + "memberName": "Sensor", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "95eecbfe-3f3f-5d47-9626-8bd842da05bb" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + }, + "ownedMemberElementId": "92370943-ff56-5024-adcd-a52ef649993d", + "ownedMemberName": "Sensor", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "95eecbfe-3f3f-5d47-9626-8bd842da05bb" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "95eecbfe-3f3f-5d47-9626-8bd842da05bb" + }, + { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + } + ], + "shortName": null, + "source": [ + { + "@id": "95eecbfe-3f3f-5d47-9626-8bd842da05bb" + } + ], + "target": [ + { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "92370943-ff56-5024-adcd-a52ef649993d", + "@type": "PartDefinition", + "aliasIds": [], + "declaredName": "Sensor", + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "documentation": [], + "elementId": "92370943-ff56-5024-adcd-a52ef649993d", + "endFeature": [], + "feature": [ + { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + } + ], + "featureMembership": [ + { + "@id": "f8091f01-bfaa-586f-a0c4-b7e64dd5889d" + } + ], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isConjugated": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isSufficient": false, + "isVariation": false, + "member": [ + { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + } + ], + "membership": [ + { + "@id": "f8091f01-bfaa-586f-a0c4-b7e64dd5889d" + } + ], + "multiplicity": null, + "name": "Sensor", + "output": [], + "ownedAction": [], + "ownedAllocation": [], + "ownedAnalysisCase": [], + "ownedAnnotation": [], + "ownedAttribute": [ + { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + } + ], + "ownedCalculation": [], + "ownedCase": [], + "ownedConcern": [], + "ownedConjugator": null, + "ownedConnection": [], + "ownedConstraint": [], + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + } + ], + "ownedEndFeature": [], + "ownedEnumeration": [], + "ownedFeature": [ + { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + } + ], + "ownedFeatureMembership": [ + { + "@id": "f8091f01-bfaa-586f-a0c4-b7e64dd5889d" + } + ], + "ownedFlow": [], + "ownedImport": [], + "ownedInterface": [], + "ownedIntersecting": [], + "ownedItem": [], + "ownedMember": [ + { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + } + ], + "ownedMembership": [ + { + "@id": "f8091f01-bfaa-586f-a0c4-b7e64dd5889d" + } + ], + "ownedMetadata": [], + "ownedOccurrence": [], + "ownedPart": [], + "ownedPort": [], + "ownedReference": [], + "ownedRelationship": [ + { + "@id": "f8091f01-bfaa-586f-a0c4-b7e64dd5889d" + }, + { + "@id": "022b0a6b-b8b8-541b-a425-0f1a6962802c" + } + ], + "ownedRendering": [], + "ownedRequirement": [], + "ownedSpecialization": [ + { + "@id": "022b0a6b-b8b8-541b-a425-0f1a6962802c" + } + ], + "ownedState": [], + "ownedSubclassification": [ + { + "@id": "022b0a6b-b8b8-541b-a425-0f1a6962802c" + } + ], + "ownedTransition": [], + "ownedUnioning": [], + "ownedUsage": [ + { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + } + ], + "ownedUseCase": [], + "ownedVerificationCase": [], + "ownedView": [], + "ownedViewpoint": [], + "owner": { + "@id": "95eecbfe-3f3f-5d47-9626-8bd842da05bb" + }, + "owningMembership": { + "@id": "cbed16c1-4e78-5fb0-b866-a266cd8e1cd8" + }, + "owningNamespace": { + "@id": "95eecbfe-3f3f-5d47-9626-8bd842da05bb" + }, + "owningRelationship": { + "@id": "cbed16c1-4e78-5fb0-b866-a266cd8e1cd8" + }, + "qualifiedName": "LibraryIdentity::Sensor", + "shortName": null, + "textualRepresentation": [], + "unioningType": [], + "usage": [ + { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + } + ], + "variant": [], + "variantMembership": [] + }, + { + "@id": "f8091f01-bfaa-586f-a0c4-b7e64dd5889d", + "@type": "FeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "f8091f01-bfaa-586f-a0c4-b7e64dd5889d", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + }, + "memberElementId": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738", + "memberName": "value", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + }, + "ownedMemberElementId": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738", + "ownedMemberFeature": { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + }, + "ownedMemberName": "value", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + }, + "owningRelationship": null, + "owningType": { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + }, + { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + } + ], + "shortName": null, + "source": [ + { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + } + ], + "target": [ + { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738", + "@type": "AttributeUsage", + "aliasIds": [], + "attributeDefinition": [ + { + "@id": "11111111-2222-4333-8444-555555555555" + } + ], + "chainingFeature": [], + "crossFeature": null, + "declaredName": "value", + "declaredShortName": null, + "definition": [ + { + "@id": "11111111-2222-4333-8444-555555555555" + } + ], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": true, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [], + "membership": [], + "multiplicity": null, + "name": "value", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "e87db069-6ca2-5cd9-a4b7-cabfb8d349fe" + }, + { + "@id": "1f31ddba-9aa8-51bb-824a-8c96aeb2c775" + } + ], + "ownedSpecialization": [ + { + "@id": "e87db069-6ca2-5cd9-a4b7-cabfb8d349fe" + }, + { + "@id": "1f31ddba-9aa8-51bb-824a-8c96aeb2c775" + } + ], + "ownedSubsetting": [ + { + "@id": "1f31ddba-9aa8-51bb-824a-8c96aeb2c775" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [ + { + "@id": "e87db069-6ca2-5cd9-a4b7-cabfb8d349fe" + } + ], + "ownedUnioning": [], + "owner": { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + }, + "owningDefinition": { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + }, + "owningFeatureMembership": { + "@id": "f8091f01-bfaa-586f-a0c4-b7e64dd5889d" + }, + "owningMembership": { + "@id": "f8091f01-bfaa-586f-a0c4-b7e64dd5889d" + }, + "owningNamespace": { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + }, + "owningRelationship": { + "@id": "f8091f01-bfaa-586f-a0c4-b7e64dd5889d" + }, + "owningType": { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + }, + "owningUsage": null, + "qualifiedName": "LibraryIdentity::Sensor::value", + "shortName": null, + "textualRepresentation": [], + "type": [ + { + "@id": "11111111-2222-4333-8444-555555555555" + } + ], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "e87db069-6ca2-5cd9-a4b7-cabfb8d349fe", + "@type": "FeatureTyping", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "e87db069-6ca2-5cd9-a4b7-cabfb8d349fe", + "general": { + "@id": "11111111-2222-4333-8444-555555555555" + }, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + }, + "owningRelationship": null, + "owningType": { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + }, + { + "@id": "11111111-2222-4333-8444-555555555555" + } + ], + "shortName": null, + "source": [ + { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + } + ], + "specific": { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + }, + "target": [ + { + "@id": "11111111-2222-4333-8444-555555555555" + } + ], + "textualRepresentation": [], + "type": { + "@id": "11111111-2222-4333-8444-555555555555" + }, + "typedFeature": { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + } + }, + { + "@id": "790265e4-6780-50a7-944d-11edc7255883", + "@type": "Subclassification", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "790265e4-6780-50a7-944d-11edc7255883", + "general": { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": true, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningClassifier": { + "@id": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2" + }, + "owningRelationship": null, + "owningType": { + "@id": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2" + }, + { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + } + ], + "shortName": null, + "source": [ + { + "@id": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2" + } + ], + "specific": { + "@id": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2" + }, + "subclassifier": { + "@id": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2" + }, + "superclassifier": { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + }, + "target": [ + { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + } + ], + "textualRepresentation": [] + }, + { + "@id": "022b0a6b-b8b8-541b-a425-0f1a6962802c", + "@type": "Subclassification", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "022b0a6b-b8b8-541b-a425-0f1a6962802c", + "general": { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningClassifier": { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + }, + "owningRelationship": null, + "owningType": { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + }, + { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + } + ], + "shortName": null, + "source": [ + { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + } + ], + "specific": { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + }, + "subclassifier": { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + }, + "superclassifier": { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + }, + "target": [ + { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + } + ], + "textualRepresentation": [] + }, + { + "@id": "1f31ddba-9aa8-51bb-824a-8c96aeb2c775", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "1f31ddba-9aa8-51bb-824a-8c96aeb2c775", + "general": { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + }, + "owningRelationship": null, + "owningType": { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + }, + { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + } + ], + "shortName": null, + "source": [ + { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + } + ], + "specific": { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + }, + "subsettedFeature": { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + }, + "subsettingFeature": { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + }, + "target": [ + { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + } + ], + "textualRepresentation": [] + }, + { + "@type": "DataType", + "@id": "11111111-2222-4333-8444-555555555555", + "elementId": "11111111-2222-4333-8444-555555555555", + "qualifiedName": "ScalarValues::Real", + "isLibraryElement": true + } +] diff --git a/tests/export/testdata/interchange/library_unmatched.toolkit.full.json b/tests/export/testdata/interchange/library_unmatched.toolkit.full.json new file mode 100644 index 0000000000..7fad4c383f --- /dev/null +++ b/tests/export/testdata/interchange/library_unmatched.toolkit.full.json @@ -0,0 +1,1213 @@ +[ + { + "@id": "0b283aaf-8741-5773-8fc2-37322b93f33e", + "@type": "Namespace", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "0b283aaf-8741-5773-8fc2-37322b93f33e", + "importedMembership": [], + "isImpliedIncluded": true, + "isLibraryElement": false, + "member": [ + { + "@id": "dc00aeae-f561-5574-a6d0-3bd7382f31cc" + }, + { + "@id": "95eecbfe-3f3f-5d47-9626-8bd842da05bb" + } + ], + "membership": [ + { + "@id": "c9228882-b4f1-54eb-8d02-5a672771bef8" + }, + { + "@id": "b5efa11b-9679-580d-8edf-4c50e08db617" + } + ], + "name": null, + "ownedAnnotation": [], + "ownedElement": [ + { + "@id": "dc00aeae-f561-5574-a6d0-3bd7382f31cc" + }, + { + "@id": "95eecbfe-3f3f-5d47-9626-8bd842da05bb" + } + ], + "ownedImport": [], + "ownedMember": [ + { + "@id": "dc00aeae-f561-5574-a6d0-3bd7382f31cc" + }, + { + "@id": "95eecbfe-3f3f-5d47-9626-8bd842da05bb" + } + ], + "ownedMembership": [ + { + "@id": "c9228882-b4f1-54eb-8d02-5a672771bef8" + }, + { + "@id": "b5efa11b-9679-580d-8edf-4c50e08db617" + } + ], + "ownedRelationship": [ + { + "@id": "c9228882-b4f1-54eb-8d02-5a672771bef8" + }, + { + "@id": "b5efa11b-9679-580d-8edf-4c50e08db617" + } + ], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelationship": null, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [] + }, + { + "@id": "c9228882-b4f1-54eb-8d02-5a672771bef8", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "c9228882-b4f1-54eb-8d02-5a672771bef8", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "dc00aeae-f561-5574-a6d0-3bd7382f31cc" + }, + "memberElementId": "dc00aeae-f561-5574-a6d0-3bd7382f31cc", + "memberName": "DocumentLibrary", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "0b283aaf-8741-5773-8fc2-37322b93f33e" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "dc00aeae-f561-5574-a6d0-3bd7382f31cc" + }, + "ownedMemberElementId": "dc00aeae-f561-5574-a6d0-3bd7382f31cc", + "ownedMemberName": "DocumentLibrary", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "dc00aeae-f561-5574-a6d0-3bd7382f31cc" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "0b283aaf-8741-5773-8fc2-37322b93f33e" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "0b283aaf-8741-5773-8fc2-37322b93f33e" + }, + { + "@id": "dc00aeae-f561-5574-a6d0-3bd7382f31cc" + } + ], + "shortName": null, + "source": [ + { + "@id": "0b283aaf-8741-5773-8fc2-37322b93f33e" + } + ], + "target": [ + { + "@id": "dc00aeae-f561-5574-a6d0-3bd7382f31cc" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "dc00aeae-f561-5574-a6d0-3bd7382f31cc", + "@type": "LibraryPackage", + "aliasIds": [], + "declaredName": "DocumentLibrary", + "declaredShortName": null, + "documentation": [], + "elementId": "dc00aeae-f561-5574-a6d0-3bd7382f31cc", + "filterCondition": [], + "importedMembership": [], + "isImpliedIncluded": true, + "isLibraryElement": true, + "isStandard": false, + "member": [ + { + "@id": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2" + } + ], + "membership": [ + { + "@id": "5b090e63-520e-579e-a68f-f1b12e754e56" + } + ], + "name": "DocumentLibrary", + "ownedAnnotation": [], + "ownedElement": [ + { + "@id": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2" + } + ], + "ownedImport": [], + "ownedMember": [ + { + "@id": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2" + } + ], + "ownedMembership": [ + { + "@id": "5b090e63-520e-579e-a68f-f1b12e754e56" + } + ], + "ownedRelationship": [ + { + "@id": "5b090e63-520e-579e-a68f-f1b12e754e56" + } + ], + "owner": { + "@id": "0b283aaf-8741-5773-8fc2-37322b93f33e" + }, + "owningMembership": { + "@id": "c9228882-b4f1-54eb-8d02-5a672771bef8" + }, + "owningNamespace": { + "@id": "0b283aaf-8741-5773-8fc2-37322b93f33e" + }, + "owningRelationship": { + "@id": "c9228882-b4f1-54eb-8d02-5a672771bef8" + }, + "qualifiedName": "DocumentLibrary", + "shortName": null, + "textualRepresentation": [] + }, + { + "@id": "5b090e63-520e-579e-a68f-f1b12e754e56", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "5b090e63-520e-579e-a68f-f1b12e754e56", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": true, + "memberElement": { + "@id": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2" + }, + "memberElementId": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2", + "memberName": "Component", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "dc00aeae-f561-5574-a6d0-3bd7382f31cc" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2" + }, + "ownedMemberElementId": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2", + "ownedMemberName": "Component", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "dc00aeae-f561-5574-a6d0-3bd7382f31cc" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "dc00aeae-f561-5574-a6d0-3bd7382f31cc" + }, + { + "@id": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2" + } + ], + "shortName": null, + "source": [ + { + "@id": "dc00aeae-f561-5574-a6d0-3bd7382f31cc" + } + ], + "target": [ + { + "@id": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2", + "@type": "PartDefinition", + "aliasIds": [], + "declaredName": "Component", + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "documentation": [], + "elementId": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2", + "endFeature": [], + "feature": [], + "featureMembership": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isConjugated": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": true, + "isSufficient": false, + "isVariation": false, + "member": [], + "membership": [], + "multiplicity": null, + "name": "Component", + "output": [], + "ownedAction": [], + "ownedAllocation": [], + "ownedAnalysisCase": [], + "ownedAnnotation": [], + "ownedAttribute": [], + "ownedCalculation": [], + "ownedCase": [], + "ownedConcern": [], + "ownedConjugator": null, + "ownedConnection": [], + "ownedConstraint": [], + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedEnumeration": [], + "ownedFeature": [], + "ownedFeatureMembership": [], + "ownedFlow": [], + "ownedImport": [], + "ownedInterface": [], + "ownedIntersecting": [], + "ownedItem": [], + "ownedMember": [], + "ownedMembership": [], + "ownedMetadata": [], + "ownedOccurrence": [], + "ownedPart": [], + "ownedPort": [], + "ownedReference": [], + "ownedRelationship": [ + { + "@id": "790265e4-6780-50a7-944d-11edc7255883" + } + ], + "ownedRendering": [], + "ownedRequirement": [], + "ownedSpecialization": [ + { + "@id": "790265e4-6780-50a7-944d-11edc7255883" + } + ], + "ownedState": [], + "ownedSubclassification": [ + { + "@id": "790265e4-6780-50a7-944d-11edc7255883" + } + ], + "ownedTransition": [], + "ownedUnioning": [], + "ownedUsage": [], + "ownedUseCase": [], + "ownedVerificationCase": [], + "ownedView": [], + "ownedViewpoint": [], + "owner": { + "@id": "dc00aeae-f561-5574-a6d0-3bd7382f31cc" + }, + "owningMembership": { + "@id": "5b090e63-520e-579e-a68f-f1b12e754e56" + }, + "owningNamespace": { + "@id": "dc00aeae-f561-5574-a6d0-3bd7382f31cc" + }, + "owningRelationship": { + "@id": "5b090e63-520e-579e-a68f-f1b12e754e56" + }, + "qualifiedName": "DocumentLibrary::Component", + "shortName": null, + "textualRepresentation": [], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "b5efa11b-9679-580d-8edf-4c50e08db617", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "b5efa11b-9679-580d-8edf-4c50e08db617", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "95eecbfe-3f3f-5d47-9626-8bd842da05bb" + }, + "memberElementId": "95eecbfe-3f3f-5d47-9626-8bd842da05bb", + "memberName": "LibraryIdentity", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "0b283aaf-8741-5773-8fc2-37322b93f33e" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "95eecbfe-3f3f-5d47-9626-8bd842da05bb" + }, + "ownedMemberElementId": "95eecbfe-3f3f-5d47-9626-8bd842da05bb", + "ownedMemberName": "LibraryIdentity", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "95eecbfe-3f3f-5d47-9626-8bd842da05bb" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "0b283aaf-8741-5773-8fc2-37322b93f33e" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "0b283aaf-8741-5773-8fc2-37322b93f33e" + }, + { + "@id": "95eecbfe-3f3f-5d47-9626-8bd842da05bb" + } + ], + "shortName": null, + "source": [ + { + "@id": "0b283aaf-8741-5773-8fc2-37322b93f33e" + } + ], + "target": [ + { + "@id": "95eecbfe-3f3f-5d47-9626-8bd842da05bb" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "95eecbfe-3f3f-5d47-9626-8bd842da05bb", + "@type": "Package", + "aliasIds": [], + "declaredName": "LibraryIdentity", + "declaredShortName": null, + "documentation": [], + "elementId": "95eecbfe-3f3f-5d47-9626-8bd842da05bb", + "filterCondition": [], + "importedMembership": [], + "isImpliedIncluded": true, + "isLibraryElement": false, + "member": [ + { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + } + ], + "membership": [ + { + "@id": "cbed16c1-4e78-5fb0-b866-a266cd8e1cd8" + } + ], + "name": "LibraryIdentity", + "ownedAnnotation": [], + "ownedElement": [ + { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + } + ], + "ownedImport": [], + "ownedMember": [ + { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + } + ], + "ownedMembership": [ + { + "@id": "cbed16c1-4e78-5fb0-b866-a266cd8e1cd8" + } + ], + "ownedRelationship": [ + { + "@id": "cbed16c1-4e78-5fb0-b866-a266cd8e1cd8" + } + ], + "owner": { + "@id": "0b283aaf-8741-5773-8fc2-37322b93f33e" + }, + "owningMembership": { + "@id": "b5efa11b-9679-580d-8edf-4c50e08db617" + }, + "owningNamespace": { + "@id": "0b283aaf-8741-5773-8fc2-37322b93f33e" + }, + "owningRelationship": { + "@id": "b5efa11b-9679-580d-8edf-4c50e08db617" + }, + "qualifiedName": "LibraryIdentity", + "shortName": null, + "textualRepresentation": [] + }, + { + "@id": "cbed16c1-4e78-5fb0-b866-a266cd8e1cd8", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "cbed16c1-4e78-5fb0-b866-a266cd8e1cd8", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + }, + "memberElementId": "92370943-ff56-5024-adcd-a52ef649993d", + "memberName": "Sensor", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "95eecbfe-3f3f-5d47-9626-8bd842da05bb" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + }, + "ownedMemberElementId": "92370943-ff56-5024-adcd-a52ef649993d", + "ownedMemberName": "Sensor", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "95eecbfe-3f3f-5d47-9626-8bd842da05bb" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "95eecbfe-3f3f-5d47-9626-8bd842da05bb" + }, + { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + } + ], + "shortName": null, + "source": [ + { + "@id": "95eecbfe-3f3f-5d47-9626-8bd842da05bb" + } + ], + "target": [ + { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "92370943-ff56-5024-adcd-a52ef649993d", + "@type": "PartDefinition", + "aliasIds": [], + "declaredName": "Sensor", + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "documentation": [], + "elementId": "92370943-ff56-5024-adcd-a52ef649993d", + "endFeature": [], + "feature": [ + { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + } + ], + "featureMembership": [ + { + "@id": "f8091f01-bfaa-586f-a0c4-b7e64dd5889d" + } + ], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isConjugated": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isSufficient": false, + "isVariation": false, + "member": [ + { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + } + ], + "membership": [ + { + "@id": "f8091f01-bfaa-586f-a0c4-b7e64dd5889d" + } + ], + "multiplicity": null, + "name": "Sensor", + "output": [], + "ownedAction": [], + "ownedAllocation": [], + "ownedAnalysisCase": [], + "ownedAnnotation": [], + "ownedAttribute": [ + { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + } + ], + "ownedCalculation": [], + "ownedCase": [], + "ownedConcern": [], + "ownedConjugator": null, + "ownedConnection": [], + "ownedConstraint": [], + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + } + ], + "ownedEndFeature": [], + "ownedEnumeration": [], + "ownedFeature": [ + { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + } + ], + "ownedFeatureMembership": [ + { + "@id": "f8091f01-bfaa-586f-a0c4-b7e64dd5889d" + } + ], + "ownedFlow": [], + "ownedImport": [], + "ownedInterface": [], + "ownedIntersecting": [], + "ownedItem": [], + "ownedMember": [ + { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + } + ], + "ownedMembership": [ + { + "@id": "f8091f01-bfaa-586f-a0c4-b7e64dd5889d" + } + ], + "ownedMetadata": [], + "ownedOccurrence": [], + "ownedPart": [], + "ownedPort": [], + "ownedReference": [], + "ownedRelationship": [ + { + "@id": "f8091f01-bfaa-586f-a0c4-b7e64dd5889d" + }, + { + "@id": "022b0a6b-b8b8-541b-a425-0f1a6962802c" + } + ], + "ownedRendering": [], + "ownedRequirement": [], + "ownedSpecialization": [ + { + "@id": "022b0a6b-b8b8-541b-a425-0f1a6962802c" + } + ], + "ownedState": [], + "ownedSubclassification": [ + { + "@id": "022b0a6b-b8b8-541b-a425-0f1a6962802c" + } + ], + "ownedTransition": [], + "ownedUnioning": [], + "ownedUsage": [ + { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + } + ], + "ownedUseCase": [], + "ownedVerificationCase": [], + "ownedView": [], + "ownedViewpoint": [], + "owner": { + "@id": "95eecbfe-3f3f-5d47-9626-8bd842da05bb" + }, + "owningMembership": { + "@id": "cbed16c1-4e78-5fb0-b866-a266cd8e1cd8" + }, + "owningNamespace": { + "@id": "95eecbfe-3f3f-5d47-9626-8bd842da05bb" + }, + "owningRelationship": { + "@id": "cbed16c1-4e78-5fb0-b866-a266cd8e1cd8" + }, + "qualifiedName": "LibraryIdentity::Sensor", + "shortName": null, + "textualRepresentation": [], + "unioningType": [], + "usage": [ + { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + } + ], + "variant": [], + "variantMembership": [] + }, + { + "@id": "f8091f01-bfaa-586f-a0c4-b7e64dd5889d", + "@type": "FeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "f8091f01-bfaa-586f-a0c4-b7e64dd5889d", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + }, + "memberElementId": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738", + "memberName": "value", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + }, + "ownedMemberElementId": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738", + "ownedMemberFeature": { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + }, + "ownedMemberName": "value", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + }, + "owningRelationship": null, + "owningType": { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + }, + { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + } + ], + "shortName": null, + "source": [ + { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + } + ], + "target": [ + { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738", + "@type": "AttributeUsage", + "aliasIds": [], + "attributeDefinition": [ + { + "@id": "11111111-2222-4333-8444-555555555555" + } + ], + "chainingFeature": [], + "crossFeature": null, + "declaredName": "value", + "declaredShortName": null, + "definition": [ + { + "@id": "11111111-2222-4333-8444-555555555555" + } + ], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": true, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [], + "membership": [], + "multiplicity": null, + "name": "value", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "e87db069-6ca2-5cd9-a4b7-cabfb8d349fe" + }, + { + "@id": "1f31ddba-9aa8-51bb-824a-8c96aeb2c775" + } + ], + "ownedSpecialization": [ + { + "@id": "e87db069-6ca2-5cd9-a4b7-cabfb8d349fe" + }, + { + "@id": "1f31ddba-9aa8-51bb-824a-8c96aeb2c775" + } + ], + "ownedSubsetting": [ + { + "@id": "1f31ddba-9aa8-51bb-824a-8c96aeb2c775" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [ + { + "@id": "e87db069-6ca2-5cd9-a4b7-cabfb8d349fe" + } + ], + "ownedUnioning": [], + "owner": { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + }, + "owningDefinition": { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + }, + "owningFeatureMembership": { + "@id": "f8091f01-bfaa-586f-a0c4-b7e64dd5889d" + }, + "owningMembership": { + "@id": "f8091f01-bfaa-586f-a0c4-b7e64dd5889d" + }, + "owningNamespace": { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + }, + "owningRelationship": { + "@id": "f8091f01-bfaa-586f-a0c4-b7e64dd5889d" + }, + "owningType": { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + }, + "owningUsage": null, + "qualifiedName": "LibraryIdentity::Sensor::value", + "shortName": null, + "textualRepresentation": [], + "type": [ + { + "@id": "11111111-2222-4333-8444-555555555555" + } + ], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "e87db069-6ca2-5cd9-a4b7-cabfb8d349fe", + "@type": "FeatureTyping", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "e87db069-6ca2-5cd9-a4b7-cabfb8d349fe", + "general": { + "@id": "11111111-2222-4333-8444-555555555555" + }, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + }, + "owningRelationship": null, + "owningType": { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + }, + { + "@id": "11111111-2222-4333-8444-555555555555" + } + ], + "shortName": null, + "source": [ + { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + } + ], + "specific": { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + }, + "target": [ + { + "@id": "11111111-2222-4333-8444-555555555555" + } + ], + "textualRepresentation": [], + "type": { + "@id": "11111111-2222-4333-8444-555555555555" + }, + "typedFeature": { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + } + }, + { + "@id": "790265e4-6780-50a7-944d-11edc7255883", + "@type": "Subclassification", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "790265e4-6780-50a7-944d-11edc7255883", + "general": { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": true, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningClassifier": { + "@id": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2" + }, + "owningRelationship": null, + "owningType": { + "@id": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2" + }, + { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + } + ], + "shortName": null, + "source": [ + { + "@id": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2" + } + ], + "specific": { + "@id": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2" + }, + "subclassifier": { + "@id": "d1a43b05-3f65-5b8d-afd0-00a3a04e2ca2" + }, + "superclassifier": { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + }, + "target": [ + { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + } + ], + "textualRepresentation": [] + }, + { + "@id": "022b0a6b-b8b8-541b-a425-0f1a6962802c", + "@type": "Subclassification", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "022b0a6b-b8b8-541b-a425-0f1a6962802c", + "general": { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningClassifier": { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + }, + "owningRelationship": null, + "owningType": { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + }, + { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + } + ], + "shortName": null, + "source": [ + { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + } + ], + "specific": { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + }, + "subclassifier": { + "@id": "92370943-ff56-5024-adcd-a52ef649993d" + }, + "superclassifier": { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + }, + "target": [ + { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + } + ], + "textualRepresentation": [] + }, + { + "@id": "1f31ddba-9aa8-51bb-824a-8c96aeb2c775", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "1f31ddba-9aa8-51bb-824a-8c96aeb2c775", + "general": { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + }, + "owningRelationship": null, + "owningType": { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + }, + { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + } + ], + "shortName": null, + "source": [ + { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + } + ], + "specific": { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + }, + "subsettedFeature": { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + }, + "subsettingFeature": { + "@id": "ab4d5ca0-f17f-545b-93e5-4b5b211b9738" + }, + "target": [ + { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + } + ], + "textualRepresentation": [] + }, + { + "@type": "DataType", + "@id": "11111111-2222-4333-8444-555555555555", + "elementId": "11111111-2222-4333-8444-555555555555", + "qualifiedName": "Missing::MissingType", + "isLibraryElement": true + } +] diff --git a/tests/export/testdata/interchange/satisfy_by.sysml b/tests/export/testdata/interchange/satisfy_by.sysml new file mode 100644 index 0000000000..db33c4bdfb --- /dev/null +++ b/tests/export/testdata/interchange/satisfy_by.sysml @@ -0,0 +1,11 @@ +package SatisfyCases { + part def Vehicle { + part engine : Engine; + } + part def Engine; + part vehicle : Vehicle; + requirement def MissionRequirement; + requirement mission : MissionRequirement { + satisfy mission by vehicle.engine; + } +} diff --git a/tests/export/testdata/interchange/satisfy_by.toolkit.full.json b/tests/export/testdata/interchange/satisfy_by.toolkit.full.json new file mode 100644 index 0000000000..d4625d84db --- /dev/null +++ b/tests/export/testdata/interchange/satisfy_by.toolkit.full.json @@ -0,0 +1,3627 @@ +[ + { + "@id": "01681e9f-cb49-5954-b950-df259366756e", + "@type": "Namespace", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "01681e9f-cb49-5954-b950-df259366756e", + "importedMembership": [], + "isImpliedIncluded": true, + "isLibraryElement": false, + "member": [ + { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + } + ], + "membership": [ + { + "@id": "2f3b358f-db56-5b93-87e7-718462eb4bc4" + } + ], + "name": null, + "ownedAnnotation": [], + "ownedElement": [ + { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + } + ], + "ownedImport": [], + "ownedMember": [ + { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + } + ], + "ownedMembership": [ + { + "@id": "2f3b358f-db56-5b93-87e7-718462eb4bc4" + } + ], + "ownedRelationship": [ + { + "@id": "2f3b358f-db56-5b93-87e7-718462eb4bc4" + } + ], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelationship": null, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [] + }, + { + "@id": "2f3b358f-db56-5b93-87e7-718462eb4bc4", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "2f3b358f-db56-5b93-87e7-718462eb4bc4", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + }, + "memberElementId": "d34f71f6-516c-5046-897d-4ee0a36ad111", + "memberName": "SatisfyCases", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "01681e9f-cb49-5954-b950-df259366756e" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + }, + "ownedMemberElementId": "d34f71f6-516c-5046-897d-4ee0a36ad111", + "ownedMemberName": "SatisfyCases", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "01681e9f-cb49-5954-b950-df259366756e" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "01681e9f-cb49-5954-b950-df259366756e" + }, + { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + } + ], + "shortName": null, + "source": [ + { + "@id": "01681e9f-cb49-5954-b950-df259366756e" + } + ], + "target": [ + { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111", + "@type": "Package", + "aliasIds": [], + "declaredName": "SatisfyCases", + "declaredShortName": null, + "documentation": [], + "elementId": "d34f71f6-516c-5046-897d-4ee0a36ad111", + "filterCondition": [], + "importedMembership": [], + "isImpliedIncluded": true, + "isLibraryElement": false, + "member": [ + { + "@id": "f7e7d98d-2960-5f44-88a5-f76924c19597" + }, + { + "@id": "2d014161-d2a0-590a-9330-3f63dacbab49" + }, + { + "@id": "19b04e5e-f144-5c01-8bc4-43338c0c9c65" + }, + { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + }, + { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + } + ], + "membership": [ + { + "@id": "fe67ec45-eb13-58fa-8dee-14ba6d6e7e9e" + }, + { + "@id": "0679b410-ec86-5594-9ccf-7144023b9d98" + }, + { + "@id": "3550f483-261d-5438-bca4-4ef2213f77b5" + }, + { + "@id": "54171709-55b0-5ac0-a0a5-159572e00834" + }, + { + "@id": "3675ed7f-88a5-5418-8afb-14956897c094" + } + ], + "name": "SatisfyCases", + "ownedAnnotation": [], + "ownedElement": [ + { + "@id": "f7e7d98d-2960-5f44-88a5-f76924c19597" + }, + { + "@id": "2d014161-d2a0-590a-9330-3f63dacbab49" + }, + { + "@id": "19b04e5e-f144-5c01-8bc4-43338c0c9c65" + }, + { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + }, + { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + } + ], + "ownedImport": [], + "ownedMember": [ + { + "@id": "f7e7d98d-2960-5f44-88a5-f76924c19597" + }, + { + "@id": "2d014161-d2a0-590a-9330-3f63dacbab49" + }, + { + "@id": "19b04e5e-f144-5c01-8bc4-43338c0c9c65" + }, + { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + }, + { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + } + ], + "ownedMembership": [ + { + "@id": "fe67ec45-eb13-58fa-8dee-14ba6d6e7e9e" + }, + { + "@id": "0679b410-ec86-5594-9ccf-7144023b9d98" + }, + { + "@id": "3550f483-261d-5438-bca4-4ef2213f77b5" + }, + { + "@id": "54171709-55b0-5ac0-a0a5-159572e00834" + }, + { + "@id": "3675ed7f-88a5-5418-8afb-14956897c094" + } + ], + "ownedRelationship": [ + { + "@id": "fe67ec45-eb13-58fa-8dee-14ba6d6e7e9e" + }, + { + "@id": "0679b410-ec86-5594-9ccf-7144023b9d98" + }, + { + "@id": "3550f483-261d-5438-bca4-4ef2213f77b5" + }, + { + "@id": "54171709-55b0-5ac0-a0a5-159572e00834" + }, + { + "@id": "3675ed7f-88a5-5418-8afb-14956897c094" + } + ], + "owner": { + "@id": "01681e9f-cb49-5954-b950-df259366756e" + }, + "owningMembership": { + "@id": "2f3b358f-db56-5b93-87e7-718462eb4bc4" + }, + "owningNamespace": { + "@id": "01681e9f-cb49-5954-b950-df259366756e" + }, + "owningRelationship": { + "@id": "2f3b358f-db56-5b93-87e7-718462eb4bc4" + }, + "qualifiedName": "SatisfyCases", + "shortName": null, + "textualRepresentation": [] + }, + { + "@id": "fe67ec45-eb13-58fa-8dee-14ba6d6e7e9e", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "fe67ec45-eb13-58fa-8dee-14ba6d6e7e9e", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "f7e7d98d-2960-5f44-88a5-f76924c19597" + }, + "memberElementId": "f7e7d98d-2960-5f44-88a5-f76924c19597", + "memberName": "Vehicle", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "f7e7d98d-2960-5f44-88a5-f76924c19597" + }, + "ownedMemberElementId": "f7e7d98d-2960-5f44-88a5-f76924c19597", + "ownedMemberName": "Vehicle", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "f7e7d98d-2960-5f44-88a5-f76924c19597" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + }, + { + "@id": "f7e7d98d-2960-5f44-88a5-f76924c19597" + } + ], + "shortName": null, + "source": [ + { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + } + ], + "target": [ + { + "@id": "f7e7d98d-2960-5f44-88a5-f76924c19597" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "f7e7d98d-2960-5f44-88a5-f76924c19597", + "@type": "PartDefinition", + "aliasIds": [], + "declaredName": "Vehicle", + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "documentation": [], + "elementId": "f7e7d98d-2960-5f44-88a5-f76924c19597", + "endFeature": [], + "feature": [ + { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + } + ], + "featureMembership": [ + { + "@id": "07133f0e-55e4-53af-829f-5a6a51287492" + } + ], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isConjugated": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isSufficient": false, + "isVariation": false, + "member": [ + { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + } + ], + "membership": [ + { + "@id": "07133f0e-55e4-53af-829f-5a6a51287492" + } + ], + "multiplicity": null, + "name": "Vehicle", + "output": [], + "ownedAction": [], + "ownedAllocation": [], + "ownedAnalysisCase": [], + "ownedAnnotation": [], + "ownedAttribute": [], + "ownedCalculation": [], + "ownedCase": [], + "ownedConcern": [], + "ownedConjugator": null, + "ownedConnection": [], + "ownedConstraint": [], + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + } + ], + "ownedEndFeature": [], + "ownedEnumeration": [], + "ownedFeature": [ + { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + } + ], + "ownedFeatureMembership": [ + { + "@id": "07133f0e-55e4-53af-829f-5a6a51287492" + } + ], + "ownedFlow": [], + "ownedImport": [], + "ownedInterface": [], + "ownedIntersecting": [], + "ownedItem": [ + { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + } + ], + "ownedMember": [ + { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + } + ], + "ownedMembership": [ + { + "@id": "07133f0e-55e4-53af-829f-5a6a51287492" + } + ], + "ownedMetadata": [], + "ownedOccurrence": [ + { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + } + ], + "ownedPart": [ + { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + } + ], + "ownedPort": [], + "ownedReference": [], + "ownedRelationship": [ + { + "@id": "07133f0e-55e4-53af-829f-5a6a51287492" + }, + { + "@id": "4ca9c4a5-5981-5ede-9c5d-fcdc1c787d7a" + } + ], + "ownedRendering": [], + "ownedRequirement": [], + "ownedSpecialization": [ + { + "@id": "4ca9c4a5-5981-5ede-9c5d-fcdc1c787d7a" + } + ], + "ownedState": [], + "ownedSubclassification": [ + { + "@id": "4ca9c4a5-5981-5ede-9c5d-fcdc1c787d7a" + } + ], + "ownedTransition": [], + "ownedUnioning": [], + "ownedUsage": [ + { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + } + ], + "ownedUseCase": [], + "ownedVerificationCase": [], + "ownedView": [], + "ownedViewpoint": [], + "owner": { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + }, + "owningMembership": { + "@id": "fe67ec45-eb13-58fa-8dee-14ba6d6e7e9e" + }, + "owningNamespace": { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + }, + "owningRelationship": { + "@id": "fe67ec45-eb13-58fa-8dee-14ba6d6e7e9e" + }, + "qualifiedName": "SatisfyCases::Vehicle", + "shortName": null, + "textualRepresentation": [], + "unioningType": [], + "usage": [ + { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + } + ], + "variant": [], + "variantMembership": [] + }, + { + "@id": "07133f0e-55e4-53af-829f-5a6a51287492", + "@type": "FeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "07133f0e-55e4-53af-829f-5a6a51287492", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + }, + "memberElementId": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde", + "memberName": "engine", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "f7e7d98d-2960-5f44-88a5-f76924c19597" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + }, + "ownedMemberElementId": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde", + "ownedMemberFeature": { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + }, + "ownedMemberName": "engine", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "f7e7d98d-2960-5f44-88a5-f76924c19597" + }, + "owningRelationship": null, + "owningType": { + "@id": "f7e7d98d-2960-5f44-88a5-f76924c19597" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "f7e7d98d-2960-5f44-88a5-f76924c19597" + }, + { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + } + ], + "shortName": null, + "source": [ + { + "@id": "f7e7d98d-2960-5f44-88a5-f76924c19597" + } + ], + "target": [ + { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde", + "@type": "PartUsage", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": "engine", + "declaredShortName": null, + "definition": [ + { + "@id": "2d014161-d2a0-590a-9330-3f63dacbab49" + } + ], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + }, + "featuringType": [], + "importedMembership": [], + "individualDefinition": null, + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": true, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": false, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "itemDefinition": [ + { + "@id": "2d014161-d2a0-590a-9330-3f63dacbab49" + } + ], + "mayTimeVary": null, + "member": [], + "membership": [], + "multiplicity": null, + "name": "engine", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "occurrenceDefinition": [ + { + "@id": "2d014161-d2a0-590a-9330-3f63dacbab49" + } + ], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "790a0c64-ccd4-5227-b6ca-54ea64a4d0d4" + }, + { + "@id": "8b09ec52-e5fe-5160-913f-334be332898c" + } + ], + "ownedSpecialization": [ + { + "@id": "790a0c64-ccd4-5227-b6ca-54ea64a4d0d4" + }, + { + "@id": "8b09ec52-e5fe-5160-913f-334be332898c" + } + ], + "ownedSubsetting": [ + { + "@id": "8b09ec52-e5fe-5160-913f-334be332898c" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [ + { + "@id": "790a0c64-ccd4-5227-b6ca-54ea64a4d0d4" + } + ], + "ownedUnioning": [], + "owner": { + "@id": "f7e7d98d-2960-5f44-88a5-f76924c19597" + }, + "owningDefinition": { + "@id": "f7e7d98d-2960-5f44-88a5-f76924c19597" + }, + "owningFeatureMembership": { + "@id": "07133f0e-55e4-53af-829f-5a6a51287492" + }, + "owningMembership": { + "@id": "07133f0e-55e4-53af-829f-5a6a51287492" + }, + "owningNamespace": { + "@id": "f7e7d98d-2960-5f44-88a5-f76924c19597" + }, + "owningRelationship": { + "@id": "07133f0e-55e4-53af-829f-5a6a51287492" + }, + "owningType": { + "@id": "f7e7d98d-2960-5f44-88a5-f76924c19597" + }, + "owningUsage": null, + "partDefinition": [ + { + "@id": "2d014161-d2a0-590a-9330-3f63dacbab49" + } + ], + "portionKind": null, + "qualifiedName": "SatisfyCases::Vehicle::engine", + "shortName": null, + "textualRepresentation": [], + "type": [ + { + "@id": "2d014161-d2a0-590a-9330-3f63dacbab49" + } + ], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "790a0c64-ccd4-5227-b6ca-54ea64a4d0d4", + "@type": "FeatureTyping", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "790a0c64-ccd4-5227-b6ca-54ea64a4d0d4", + "general": { + "@id": "2d014161-d2a0-590a-9330-3f63dacbab49" + }, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + }, + "owningRelationship": null, + "owningType": { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + }, + { + "@id": "2d014161-d2a0-590a-9330-3f63dacbab49" + } + ], + "shortName": null, + "source": [ + { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + } + ], + "specific": { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + }, + "target": [ + { + "@id": "2d014161-d2a0-590a-9330-3f63dacbab49" + } + ], + "textualRepresentation": [], + "type": { + "@id": "2d014161-d2a0-590a-9330-3f63dacbab49" + }, + "typedFeature": { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + } + }, + { + "@id": "0679b410-ec86-5594-9ccf-7144023b9d98", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "0679b410-ec86-5594-9ccf-7144023b9d98", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "2d014161-d2a0-590a-9330-3f63dacbab49" + }, + "memberElementId": "2d014161-d2a0-590a-9330-3f63dacbab49", + "memberName": "Engine", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "2d014161-d2a0-590a-9330-3f63dacbab49" + }, + "ownedMemberElementId": "2d014161-d2a0-590a-9330-3f63dacbab49", + "ownedMemberName": "Engine", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "2d014161-d2a0-590a-9330-3f63dacbab49" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + }, + { + "@id": "2d014161-d2a0-590a-9330-3f63dacbab49" + } + ], + "shortName": null, + "source": [ + { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + } + ], + "target": [ + { + "@id": "2d014161-d2a0-590a-9330-3f63dacbab49" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "2d014161-d2a0-590a-9330-3f63dacbab49", + "@type": "PartDefinition", + "aliasIds": [], + "declaredName": "Engine", + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "documentation": [], + "elementId": "2d014161-d2a0-590a-9330-3f63dacbab49", + "endFeature": [], + "feature": [], + "featureMembership": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isConjugated": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isSufficient": false, + "isVariation": false, + "member": [], + "membership": [], + "multiplicity": null, + "name": "Engine", + "output": [], + "ownedAction": [], + "ownedAllocation": [], + "ownedAnalysisCase": [], + "ownedAnnotation": [], + "ownedAttribute": [], + "ownedCalculation": [], + "ownedCase": [], + "ownedConcern": [], + "ownedConjugator": null, + "ownedConnection": [], + "ownedConstraint": [], + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedEnumeration": [], + "ownedFeature": [], + "ownedFeatureMembership": [], + "ownedFlow": [], + "ownedImport": [], + "ownedInterface": [], + "ownedIntersecting": [], + "ownedItem": [], + "ownedMember": [], + "ownedMembership": [], + "ownedMetadata": [], + "ownedOccurrence": [], + "ownedPart": [], + "ownedPort": [], + "ownedReference": [], + "ownedRelationship": [ + { + "@id": "6d09e68c-8e5d-5618-b54c-a90f054d6e23" + } + ], + "ownedRendering": [], + "ownedRequirement": [], + "ownedSpecialization": [ + { + "@id": "6d09e68c-8e5d-5618-b54c-a90f054d6e23" + } + ], + "ownedState": [], + "ownedSubclassification": [ + { + "@id": "6d09e68c-8e5d-5618-b54c-a90f054d6e23" + } + ], + "ownedTransition": [], + "ownedUnioning": [], + "ownedUsage": [], + "ownedUseCase": [], + "ownedVerificationCase": [], + "ownedView": [], + "ownedViewpoint": [], + "owner": { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + }, + "owningMembership": { + "@id": "0679b410-ec86-5594-9ccf-7144023b9d98" + }, + "owningNamespace": { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + }, + "owningRelationship": { + "@id": "0679b410-ec86-5594-9ccf-7144023b9d98" + }, + "qualifiedName": "SatisfyCases::Engine", + "shortName": null, + "textualRepresentation": [], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "3550f483-261d-5438-bca4-4ef2213f77b5", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "3550f483-261d-5438-bca4-4ef2213f77b5", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "19b04e5e-f144-5c01-8bc4-43338c0c9c65" + }, + "memberElementId": "19b04e5e-f144-5c01-8bc4-43338c0c9c65", + "memberName": "vehicle", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "19b04e5e-f144-5c01-8bc4-43338c0c9c65" + }, + "ownedMemberElementId": "19b04e5e-f144-5c01-8bc4-43338c0c9c65", + "ownedMemberName": "vehicle", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "19b04e5e-f144-5c01-8bc4-43338c0c9c65" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + }, + { + "@id": "19b04e5e-f144-5c01-8bc4-43338c0c9c65" + } + ], + "shortName": null, + "source": [ + { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + } + ], + "target": [ + { + "@id": "19b04e5e-f144-5c01-8bc4-43338c0c9c65" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "19b04e5e-f144-5c01-8bc4-43338c0c9c65", + "@type": "PartUsage", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": "vehicle", + "declaredShortName": null, + "definition": [ + { + "@id": "f7e7d98d-2960-5f44-88a5-f76924c19597" + } + ], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "19b04e5e-f144-5c01-8bc4-43338c0c9c65", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "19b04e5e-f144-5c01-8bc4-43338c0c9c65" + }, + "featuringType": [], + "importedMembership": [], + "individualDefinition": null, + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": true, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "itemDefinition": [ + { + "@id": "f7e7d98d-2960-5f44-88a5-f76924c19597" + } + ], + "mayTimeVary": null, + "member": [], + "membership": [], + "multiplicity": null, + "name": "vehicle", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "occurrenceDefinition": [ + { + "@id": "f7e7d98d-2960-5f44-88a5-f76924c19597" + } + ], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "e0942b10-c053-585f-890c-9044f752dfc9" + }, + { + "@id": "ef4923e3-ec13-5a8b-adfb-d719cc3c9af8" + } + ], + "ownedSpecialization": [ + { + "@id": "e0942b10-c053-585f-890c-9044f752dfc9" + }, + { + "@id": "ef4923e3-ec13-5a8b-adfb-d719cc3c9af8" + } + ], + "ownedSubsetting": [ + { + "@id": "ef4923e3-ec13-5a8b-adfb-d719cc3c9af8" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [ + { + "@id": "e0942b10-c053-585f-890c-9044f752dfc9" + } + ], + "ownedUnioning": [], + "owner": { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + }, + "owningDefinition": null, + "owningFeatureMembership": null, + "owningMembership": { + "@id": "3550f483-261d-5438-bca4-4ef2213f77b5" + }, + "owningNamespace": { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + }, + "owningRelationship": { + "@id": "3550f483-261d-5438-bca4-4ef2213f77b5" + }, + "owningType": null, + "owningUsage": null, + "partDefinition": [ + { + "@id": "f7e7d98d-2960-5f44-88a5-f76924c19597" + } + ], + "portionKind": null, + "qualifiedName": "SatisfyCases::vehicle", + "shortName": null, + "textualRepresentation": [], + "type": [ + { + "@id": "f7e7d98d-2960-5f44-88a5-f76924c19597" + } + ], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "e0942b10-c053-585f-890c-9044f752dfc9", + "@type": "FeatureTyping", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "e0942b10-c053-585f-890c-9044f752dfc9", + "general": { + "@id": "f7e7d98d-2960-5f44-88a5-f76924c19597" + }, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "19b04e5e-f144-5c01-8bc4-43338c0c9c65" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "19b04e5e-f144-5c01-8bc4-43338c0c9c65" + }, + "owningRelationship": null, + "owningType": { + "@id": "19b04e5e-f144-5c01-8bc4-43338c0c9c65" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "19b04e5e-f144-5c01-8bc4-43338c0c9c65" + }, + { + "@id": "f7e7d98d-2960-5f44-88a5-f76924c19597" + } + ], + "shortName": null, + "source": [ + { + "@id": "19b04e5e-f144-5c01-8bc4-43338c0c9c65" + } + ], + "specific": { + "@id": "19b04e5e-f144-5c01-8bc4-43338c0c9c65" + }, + "target": [ + { + "@id": "f7e7d98d-2960-5f44-88a5-f76924c19597" + } + ], + "textualRepresentation": [], + "type": { + "@id": "f7e7d98d-2960-5f44-88a5-f76924c19597" + }, + "typedFeature": { + "@id": "19b04e5e-f144-5c01-8bc4-43338c0c9c65" + } + }, + { + "@id": "54171709-55b0-5ac0-a0a5-159572e00834", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "54171709-55b0-5ac0-a0a5-159572e00834", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + }, + "memberElementId": "9591768d-756a-55a2-a746-66a99cebffad", + "memberName": "MissionRequirement", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + }, + "ownedMemberElementId": "9591768d-756a-55a2-a746-66a99cebffad", + "ownedMemberName": "MissionRequirement", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + }, + { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + } + ], + "shortName": null, + "source": [ + { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + } + ], + "target": [ + { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "9591768d-756a-55a2-a746-66a99cebffad", + "@type": "RequirementDefinition", + "actorParameter": [], + "aliasIds": [], + "assumedConstraint": [], + "declaredName": "MissionRequirement", + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "documentation": [], + "elementId": "9591768d-756a-55a2-a746-66a99cebffad", + "endFeature": [], + "expression": [], + "feature": [], + "featureMembership": [], + "framedConcern": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isConjugated": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isModelLevelEvaluable": false, + "isSufficient": false, + "isVariation": false, + "member": [], + "membership": [], + "multiplicity": null, + "name": "MissionRequirement", + "output": [], + "ownedAction": [], + "ownedAllocation": [], + "ownedAnalysisCase": [], + "ownedAnnotation": [], + "ownedAttribute": [], + "ownedCalculation": [], + "ownedCase": [], + "ownedConcern": [], + "ownedConjugator": null, + "ownedConnection": [], + "ownedConstraint": [], + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedEnumeration": [], + "ownedFeature": [], + "ownedFeatureMembership": [], + "ownedFlow": [], + "ownedImport": [], + "ownedInterface": [], + "ownedIntersecting": [], + "ownedItem": [], + "ownedMember": [], + "ownedMembership": [], + "ownedMetadata": [], + "ownedOccurrence": [], + "ownedPart": [], + "ownedPort": [], + "ownedReference": [], + "ownedRelationship": [ + { + "@id": "43bca579-d715-521b-a6bf-b55b626f0e69" + } + ], + "ownedRendering": [], + "ownedRequirement": [], + "ownedSpecialization": [ + { + "@id": "43bca579-d715-521b-a6bf-b55b626f0e69" + } + ], + "ownedState": [], + "ownedSubclassification": [ + { + "@id": "43bca579-d715-521b-a6bf-b55b626f0e69" + } + ], + "ownedTransition": [], + "ownedUnioning": [], + "ownedUsage": [], + "ownedUseCase": [], + "ownedVerificationCase": [], + "ownedView": [], + "ownedViewpoint": [], + "owner": { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + }, + "owningMembership": { + "@id": "54171709-55b0-5ac0-a0a5-159572e00834" + }, + "owningNamespace": { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + }, + "owningRelationship": { + "@id": "54171709-55b0-5ac0-a0a5-159572e00834" + }, + "parameter": [], + "qualifiedName": "SatisfyCases::MissionRequirement", + "reqId": null, + "requiredConstraint": [], + "result": { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + }, + "shortName": null, + "stakeholderParameter": [], + "step": [], + "subjectParameter": { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + }, + "text": [], + "textualRepresentation": [], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "3675ed7f-88a5-5418-8afb-14956897c094", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "3675ed7f-88a5-5418-8afb-14956897c094", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + }, + "memberElementId": "ddf58eb2-e917-525b-80bf-be2b5da6dec8", + "memberName": "mission", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + }, + "ownedMemberElementId": "ddf58eb2-e917-525b-80bf-be2b5da6dec8", + "ownedMemberName": "mission", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + }, + { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + } + ], + "shortName": null, + "source": [ + { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + } + ], + "target": [ + { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8", + "@type": "RequirementUsage", + "actorParameter": [], + "aliasIds": [], + "assumedConstraint": [], + "behavior": [ + { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + } + ], + "chainingFeature": [], + "constraintDefinition": { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + }, + "crossFeature": null, + "declaredName": "mission", + "declaredShortName": null, + "definition": [ + { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + } + ], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "ddf58eb2-e917-525b-80bf-be2b5da6dec8", + "endFeature": [], + "endOwningType": null, + "feature": [ + { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + } + ], + "featureMembership": [ + { + "@id": "15039928-a578-5415-8fa9-34111b0058a5" + } + ], + "featureTarget": { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + }, + "featuringType": [], + "framedConcern": [], + "function": { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + }, + "importedMembership": [], + "individualDefinition": null, + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isModelLevelEvaluable": false, + "isOrdered": false, + "isPortion": false, + "isReference": true, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [ + { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + } + ], + "membership": [ + { + "@id": "15039928-a578-5415-8fa9-34111b0058a5" + } + ], + "multiplicity": null, + "name": "mission", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [ + { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + } + ], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [ + { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + } + ], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [ + { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + } + ], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [ + { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + } + ], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "occurrenceDefinition": [ + { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + } + ], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + } + ], + "ownedEndFeature": [], + "ownedFeature": [ + { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + } + ], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [ + { + "@id": "15039928-a578-5415-8fa9-34111b0058a5" + } + ], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [ + { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + } + ], + "ownedMembership": [ + { + "@id": "15039928-a578-5415-8fa9-34111b0058a5" + } + ], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "86bfb0af-1b47-550c-9439-458329c0a722" + }, + { + "@id": "15039928-a578-5415-8fa9-34111b0058a5" + }, + { + "@id": "a505bff6-1b93-5a91-a49a-a881cd8d74f8" + } + ], + "ownedSpecialization": [ + { + "@id": "86bfb0af-1b47-550c-9439-458329c0a722" + }, + { + "@id": "a505bff6-1b93-5a91-a49a-a881cd8d74f8" + } + ], + "ownedSubsetting": [ + { + "@id": "a505bff6-1b93-5a91-a49a-a881cd8d74f8" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [ + { + "@id": "86bfb0af-1b47-550c-9439-458329c0a722" + } + ], + "ownedUnioning": [], + "owner": { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + }, + "owningDefinition": null, + "owningFeatureMembership": null, + "owningMembership": { + "@id": "3675ed7f-88a5-5418-8afb-14956897c094" + }, + "owningNamespace": { + "@id": "d34f71f6-516c-5046-897d-4ee0a36ad111" + }, + "owningRelationship": { + "@id": "3675ed7f-88a5-5418-8afb-14956897c094" + }, + "owningType": null, + "owningUsage": null, + "parameter": [], + "portionKind": null, + "predicate": { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + }, + "qualifiedName": "SatisfyCases::mission", + "reqId": null, + "requiredConstraint": [], + "requirementDefinition": { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + }, + "result": { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + }, + "shortName": null, + "stakeholderParameter": [], + "subjectParameter": { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + }, + "text": [], + "textualRepresentation": [], + "type": [ + { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + } + ], + "unioningType": [], + "usage": [ + { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + } + ], + "variant": [], + "variantMembership": [] + }, + { + "@id": "86bfb0af-1b47-550c-9439-458329c0a722", + "@type": "FeatureTyping", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "86bfb0af-1b47-550c-9439-458329c0a722", + "general": { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + }, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + }, + "owningRelationship": null, + "owningType": { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + }, + { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + } + ], + "shortName": null, + "source": [ + { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + } + ], + "specific": { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + }, + "target": [ + { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + } + ], + "textualRepresentation": [], + "type": { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + }, + "typedFeature": { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + } + }, + { + "@id": "15039928-a578-5415-8fa9-34111b0058a5", + "@type": "FeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "15039928-a578-5415-8fa9-34111b0058a5", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + }, + "memberElementId": "6e14b85e-4d0f-54e2-b311-0735f5038532", + "memberName": null, + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + }, + "ownedMemberElementId": "6e14b85e-4d0f-54e2-b311-0735f5038532", + "ownedMemberFeature": { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + }, + "ownedMemberName": null, + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + }, + "owningRelationship": null, + "owningType": { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + }, + { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + } + ], + "shortName": null, + "source": [ + { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + } + ], + "target": [ + { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532", + "@type": "SatisfyRequirementUsage", + "actorParameter": [], + "aliasIds": [], + "assertedConstraint": { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + }, + "assumedConstraint": [], + "behavior": [ + { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + } + ], + "chainingFeature": [], + "constraintDefinition": { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + }, + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "definition": [ + { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + } + ], + "differencingType": [], + "directedFeature": [ + { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + } + ], + "directedUsage": [ + { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + } + ], + "direction": null, + "documentation": [], + "elementId": "6e14b85e-4d0f-54e2-b311-0735f5038532", + "endFeature": [], + "endOwningType": null, + "feature": [ + { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + } + ], + "featureMembership": [ + { + "@id": "64bfa91c-ef78-5f1a-a881-9bc957184627" + } + ], + "featureTarget": { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + }, + "featuringType": [], + "framedConcern": [], + "function": { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + }, + "importedMembership": [], + "individualDefinition": null, + "inheritedFeature": [], + "inheritedMembership": [], + "input": [ + { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + } + ], + "intersectingType": [], + "isAbstract": false, + "isComposite": true, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isModelLevelEvaluable": false, + "isNegated": false, + "isOrdered": false, + "isPortion": false, + "isReference": false, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [ + { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + } + ], + "membership": [ + { + "@id": "64bfa91c-ef78-5f1a-a881-9bc957184627" + } + ], + "multiplicity": null, + "name": null, + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [ + { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + } + ], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [ + { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + } + ], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "occurrenceDefinition": [ + { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + } + ], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + } + ], + "ownedEndFeature": [], + "ownedFeature": [ + { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + } + ], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [ + { + "@id": "64bfa91c-ef78-5f1a-a881-9bc957184627" + } + ], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [ + { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + } + ], + "ownedMembership": [ + { + "@id": "64bfa91c-ef78-5f1a-a881-9bc957184627" + } + ], + "ownedRedefinition": [], + "ownedReferenceSubsetting": { + "@id": "9f43e401-7f3a-5c26-8293-fb72b44140cd" + }, + "ownedRelationship": [ + { + "@id": "9f43e401-7f3a-5c26-8293-fb72b44140cd" + }, + { + "@id": "64bfa91c-ef78-5f1a-a881-9bc957184627" + }, + { + "@id": "2494131d-752c-5608-8e5b-55148d57597c" + } + ], + "ownedSpecialization": [ + { + "@id": "9f43e401-7f3a-5c26-8293-fb72b44140cd" + }, + { + "@id": "2494131d-752c-5608-8e5b-55148d57597c" + } + ], + "ownedSubsetting": [ + { + "@id": "9f43e401-7f3a-5c26-8293-fb72b44140cd" + }, + { + "@id": "2494131d-752c-5608-8e5b-55148d57597c" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + }, + "owningDefinition": null, + "owningFeatureMembership": { + "@id": "15039928-a578-5415-8fa9-34111b0058a5" + }, + "owningMembership": { + "@id": "15039928-a578-5415-8fa9-34111b0058a5" + }, + "owningNamespace": { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + }, + "owningRelationship": { + "@id": "15039928-a578-5415-8fa9-34111b0058a5" + }, + "owningType": { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + }, + "owningUsage": { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + }, + "parameter": [ + { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + } + ], + "portionKind": null, + "predicate": { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + }, + "qualifiedName": null, + "reqId": null, + "requiredConstraint": [], + "requirementDefinition": { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + }, + "result": { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + }, + "satisfiedRequirement": { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + }, + "satisfyingFeature": { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + }, + "shortName": null, + "stakeholderParameter": [], + "subjectParameter": { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + }, + "text": [], + "textualRepresentation": [], + "type": [ + { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + } + ], + "unioningType": [], + "usage": [ + { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + } + ], + "variant": [], + "variantMembership": [] + }, + { + "@id": "9f43e401-7f3a-5c26-8293-fb72b44140cd", + "@type": "ReferenceSubsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "9f43e401-7f3a-5c26-8293-fb72b44140cd", + "general": { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + }, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + }, + "owningRelationship": null, + "owningType": { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + }, + "qualifiedName": null, + "referencedFeature": { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + }, + "referencingFeature": { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + }, + "relatedElement": [ + { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + }, + { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + } + ], + "shortName": null, + "source": [ + { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + } + ], + "specific": { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + }, + "subsettedFeature": { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + }, + "subsettingFeature": { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + }, + "target": [ + { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + } + ], + "textualRepresentation": [] + }, + { + "@id": "64bfa91c-ef78-5f1a-a881-9bc957184627", + "@type": "SubjectMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "64bfa91c-ef78-5f1a-a881-9bc957184627", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + }, + "memberElementId": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6", + "memberName": "subj", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + }, + "ownedMemberElementId": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6", + "ownedMemberFeature": { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + }, + "ownedMemberName": "subj", + "ownedMemberParameter": { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + }, + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + } + ], + "ownedRelationship": [], + "ownedSubjectParameter": { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + }, + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + }, + "owningRelationship": null, + "owningType": { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + }, + { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + } + ], + "shortName": null, + "source": [ + { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + } + ], + "target": [ + { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6", + "@type": "ReferenceUsage", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "definition": [], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": null, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [ + { + "@id": "19536408-4501-523c-86b6-c2875600c87b" + } + ], + "membership": [ + { + "@id": "ae893f09-88aa-528e-acfb-afc49d807591" + } + ], + "multiplicity": null, + "name": "subj", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "19536408-4501-523c-86b6-c2875600c87b" + } + ], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [ + { + "@id": "19536408-4501-523c-86b6-c2875600c87b" + } + ], + "ownedMembership": [ + { + "@id": "ae893f09-88aa-528e-acfb-afc49d807591" + } + ], + "ownedRedefinition": [ + { + "@id": "857a11a4-b149-5d64-9b55-08f678b4ff76" + } + ], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "ae893f09-88aa-528e-acfb-afc49d807591" + }, + { + "@id": "f5d4879c-2882-5d07-921f-e6ad667a0844" + }, + { + "@id": "857a11a4-b149-5d64-9b55-08f678b4ff76" + } + ], + "ownedSpecialization": [ + { + "@id": "f5d4879c-2882-5d07-921f-e6ad667a0844" + }, + { + "@id": "857a11a4-b149-5d64-9b55-08f678b4ff76" + } + ], + "ownedSubsetting": [ + { + "@id": "f5d4879c-2882-5d07-921f-e6ad667a0844" + }, + { + "@id": "857a11a4-b149-5d64-9b55-08f678b4ff76" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + }, + "owningDefinition": null, + "owningFeatureMembership": { + "@id": "64bfa91c-ef78-5f1a-a881-9bc957184627" + }, + "owningMembership": { + "@id": "64bfa91c-ef78-5f1a-a881-9bc957184627" + }, + "owningNamespace": { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + }, + "owningRelationship": { + "@id": "64bfa91c-ef78-5f1a-a881-9bc957184627" + }, + "owningType": { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + }, + "owningUsage": { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + }, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "ae893f09-88aa-528e-acfb-afc49d807591", + "@type": "FeatureValue", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "ae893f09-88aa-528e-acfb-afc49d807591", + "featureWithValue": { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + }, + "isDefault": false, + "isImplied": false, + "isImpliedIncluded": true, + "isInitial": false, + "isLibraryElement": false, + "memberElement": { + "@id": "19536408-4501-523c-86b6-c2875600c87b" + }, + "memberElementId": "19536408-4501-523c-86b6-c2875600c87b", + "memberName": null, + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "19536408-4501-523c-86b6-c2875600c87b" + }, + "ownedMemberElementId": "19536408-4501-523c-86b6-c2875600c87b", + "ownedMemberName": null, + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "19536408-4501-523c-86b6-c2875600c87b" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + }, + { + "@id": "19536408-4501-523c-86b6-c2875600c87b" + } + ], + "shortName": null, + "source": [ + { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + } + ], + "target": [ + { + "@id": "19536408-4501-523c-86b6-c2875600c87b" + } + ], + "textualRepresentation": [], + "value": { + "@id": "19536408-4501-523c-86b6-c2875600c87b" + }, + "visibility": "public" + }, + { + "@id": "19536408-4501-523c-86b6-c2875600c87b", + "@type": "FeatureReferenceExpression", + "aliasIds": [], + "behavior": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "direction": null, + "documentation": [], + "elementId": "19536408-4501-523c-86b6-c2875600c87b", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "19536408-4501-523c-86b6-c2875600c87b" + }, + "featuringType": [], + "function": null, + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isModelLevelEvaluable": true, + "isOrdered": false, + "isPortion": false, + "isSufficient": false, + "isUnique": true, + "isVariable": false, + "member": [ + { + "@id": "2a9feb78-8ec1-52d7-a5bf-3b2adeb3d669" + } + ], + "membership": [ + { + "@id": "8dec8a0b-91dd-5cbe-a500-63ce23b855f0" + } + ], + "multiplicity": null, + "name": null, + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "2a9feb78-8ec1-52d7-a5bf-3b2adeb3d669" + } + ], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [ + { + "@id": "2a9feb78-8ec1-52d7-a5bf-3b2adeb3d669" + } + ], + "ownedMembership": [ + { + "@id": "8dec8a0b-91dd-5cbe-a500-63ce23b855f0" + } + ], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "8dec8a0b-91dd-5cbe-a500-63ce23b855f0" + }, + { + "@id": "269690c0-6bd8-59e6-be7d-194fdccbdb1e" + } + ], + "ownedSpecialization": [ + { + "@id": "269690c0-6bd8-59e6-be7d-194fdccbdb1e" + } + ], + "ownedSubsetting": [ + { + "@id": "269690c0-6bd8-59e6-be7d-194fdccbdb1e" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + }, + "owningFeatureMembership": null, + "owningMembership": { + "@id": "ae893f09-88aa-528e-acfb-afc49d807591" + }, + "owningNamespace": { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + }, + "owningRelationship": { + "@id": "ae893f09-88aa-528e-acfb-afc49d807591" + }, + "owningType": null, + "parameter": [], + "qualifiedName": null, + "referent": { + "@id": "2a9feb78-8ec1-52d7-a5bf-3b2adeb3d669" + }, + "result": { + "@id": "19536408-4501-523c-86b6-c2875600c87b" + }, + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [] + }, + { + "@id": "8dec8a0b-91dd-5cbe-a500-63ce23b855f0", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "8dec8a0b-91dd-5cbe-a500-63ce23b855f0", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "2a9feb78-8ec1-52d7-a5bf-3b2adeb3d669" + }, + "memberElementId": "2a9feb78-8ec1-52d7-a5bf-3b2adeb3d669", + "memberName": null, + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "19536408-4501-523c-86b6-c2875600c87b" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "2a9feb78-8ec1-52d7-a5bf-3b2adeb3d669" + }, + "ownedMemberElementId": "2a9feb78-8ec1-52d7-a5bf-3b2adeb3d669", + "ownedMemberName": null, + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "2a9feb78-8ec1-52d7-a5bf-3b2adeb3d669" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "19536408-4501-523c-86b6-c2875600c87b" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "19536408-4501-523c-86b6-c2875600c87b" + }, + { + "@id": "2a9feb78-8ec1-52d7-a5bf-3b2adeb3d669" + } + ], + "shortName": null, + "source": [ + { + "@id": "19536408-4501-523c-86b6-c2875600c87b" + } + ], + "target": [ + { + "@id": "2a9feb78-8ec1-52d7-a5bf-3b2adeb3d669" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "2a9feb78-8ec1-52d7-a5bf-3b2adeb3d669", + "@type": "Feature", + "aliasIds": [], + "chainingFeature": [ + { + "@id": "19b04e5e-f144-5c01-8bc4-43338c0c9c65" + }, + { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + } + ], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "direction": null, + "documentation": [], + "elementId": "2a9feb78-8ec1-52d7-a5bf-3b2adeb3d669", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isSufficient": false, + "isUnique": true, + "isVariable": false, + "member": [], + "membership": [], + "multiplicity": null, + "name": null, + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [ + { + "@id": "da56ac4d-c8c1-5cd8-b791-613141eb6915" + }, + { + "@id": "b356fc7d-d48a-5e84-916a-4bd42b47b0e7" + } + ], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "da56ac4d-c8c1-5cd8-b791-613141eb6915" + }, + { + "@id": "b356fc7d-d48a-5e84-916a-4bd42b47b0e7" + } + ], + "ownedSpecialization": [], + "ownedSubsetting": [], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "19536408-4501-523c-86b6-c2875600c87b" + }, + "owningFeatureMembership": null, + "owningMembership": { + "@id": "8dec8a0b-91dd-5cbe-a500-63ce23b855f0" + }, + "owningNamespace": { + "@id": "19536408-4501-523c-86b6-c2875600c87b" + }, + "owningRelationship": { + "@id": "8dec8a0b-91dd-5cbe-a500-63ce23b855f0" + }, + "owningType": null, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [], + "type": [ + { + "@id": "2d014161-d2a0-590a-9330-3f63dacbab49" + } + ], + "unioningType": [] + }, + { + "@id": "da56ac4d-c8c1-5cd8-b791-613141eb6915", + "@type": "FeatureChaining", + "aliasIds": [], + "chainingFeature": { + "@id": "19b04e5e-f144-5c01-8bc4-43338c0c9c65" + }, + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "da56ac4d-c8c1-5cd8-b791-613141eb6915", + "featureChained": { + "@id": "2a9feb78-8ec1-52d7-a5bf-3b2adeb3d669" + }, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "2a9feb78-8ec1-52d7-a5bf-3b2adeb3d669" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "2a9feb78-8ec1-52d7-a5bf-3b2adeb3d669" + }, + { + "@id": "19b04e5e-f144-5c01-8bc4-43338c0c9c65" + } + ], + "shortName": null, + "source": [ + { + "@id": "2a9feb78-8ec1-52d7-a5bf-3b2adeb3d669" + } + ], + "target": [ + { + "@id": "19b04e5e-f144-5c01-8bc4-43338c0c9c65" + } + ], + "textualRepresentation": [] + }, + { + "@id": "b356fc7d-d48a-5e84-916a-4bd42b47b0e7", + "@type": "FeatureChaining", + "aliasIds": [], + "chainingFeature": { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + }, + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "b356fc7d-d48a-5e84-916a-4bd42b47b0e7", + "featureChained": { + "@id": "2a9feb78-8ec1-52d7-a5bf-3b2adeb3d669" + }, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "2a9feb78-8ec1-52d7-a5bf-3b2adeb3d669" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "2a9feb78-8ec1-52d7-a5bf-3b2adeb3d669" + }, + { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + } + ], + "shortName": null, + "source": [ + { + "@id": "2a9feb78-8ec1-52d7-a5bf-3b2adeb3d669" + } + ], + "target": [ + { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + } + ], + "textualRepresentation": [] + }, + { + "@id": "4ca9c4a5-5981-5ede-9c5d-fcdc1c787d7a", + "@type": "Subclassification", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "4ca9c4a5-5981-5ede-9c5d-fcdc1c787d7a", + "general": { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningClassifier": { + "@id": "f7e7d98d-2960-5f44-88a5-f76924c19597" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "f7e7d98d-2960-5f44-88a5-f76924c19597" + }, + "owningRelationship": null, + "owningType": { + "@id": "f7e7d98d-2960-5f44-88a5-f76924c19597" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "f7e7d98d-2960-5f44-88a5-f76924c19597" + }, + { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + } + ], + "shortName": null, + "source": [ + { + "@id": "f7e7d98d-2960-5f44-88a5-f76924c19597" + } + ], + "specific": { + "@id": "f7e7d98d-2960-5f44-88a5-f76924c19597" + }, + "subclassifier": { + "@id": "f7e7d98d-2960-5f44-88a5-f76924c19597" + }, + "superclassifier": { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + }, + "target": [ + { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + } + ], + "textualRepresentation": [] + }, + { + "@id": "8b09ec52-e5fe-5160-913f-334be332898c", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "8b09ec52-e5fe-5160-913f-334be332898c", + "general": { + "@id": "a44baa93-a4d0-535d-b879-44a30575f348" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + }, + "owningRelationship": null, + "owningType": { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + }, + { + "@id": "a44baa93-a4d0-535d-b879-44a30575f348" + } + ], + "shortName": null, + "source": [ + { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + } + ], + "specific": { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + }, + "subsettedFeature": { + "@id": "a44baa93-a4d0-535d-b879-44a30575f348" + }, + "subsettingFeature": { + "@id": "ee07e7cd-9d04-587e-a211-c7fb4dabbbde" + }, + "target": [ + { + "@id": "a44baa93-a4d0-535d-b879-44a30575f348" + } + ], + "textualRepresentation": [] + }, + { + "@id": "6d09e68c-8e5d-5618-b54c-a90f054d6e23", + "@type": "Subclassification", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "6d09e68c-8e5d-5618-b54c-a90f054d6e23", + "general": { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningClassifier": { + "@id": "2d014161-d2a0-590a-9330-3f63dacbab49" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "2d014161-d2a0-590a-9330-3f63dacbab49" + }, + "owningRelationship": null, + "owningType": { + "@id": "2d014161-d2a0-590a-9330-3f63dacbab49" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "2d014161-d2a0-590a-9330-3f63dacbab49" + }, + { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + } + ], + "shortName": null, + "source": [ + { + "@id": "2d014161-d2a0-590a-9330-3f63dacbab49" + } + ], + "specific": { + "@id": "2d014161-d2a0-590a-9330-3f63dacbab49" + }, + "subclassifier": { + "@id": "2d014161-d2a0-590a-9330-3f63dacbab49" + }, + "superclassifier": { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + }, + "target": [ + { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + } + ], + "textualRepresentation": [] + }, + { + "@id": "ef4923e3-ec13-5a8b-adfb-d719cc3c9af8", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "ef4923e3-ec13-5a8b-adfb-d719cc3c9af8", + "general": { + "@id": "0c6a9942-4bb9-58da-8344-57ecd220d4de" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "19b04e5e-f144-5c01-8bc4-43338c0c9c65" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "19b04e5e-f144-5c01-8bc4-43338c0c9c65" + }, + "owningRelationship": null, + "owningType": { + "@id": "19b04e5e-f144-5c01-8bc4-43338c0c9c65" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "19b04e5e-f144-5c01-8bc4-43338c0c9c65" + }, + { + "@id": "0c6a9942-4bb9-58da-8344-57ecd220d4de" + } + ], + "shortName": null, + "source": [ + { + "@id": "19b04e5e-f144-5c01-8bc4-43338c0c9c65" + } + ], + "specific": { + "@id": "19b04e5e-f144-5c01-8bc4-43338c0c9c65" + }, + "subsettedFeature": { + "@id": "0c6a9942-4bb9-58da-8344-57ecd220d4de" + }, + "subsettingFeature": { + "@id": "19b04e5e-f144-5c01-8bc4-43338c0c9c65" + }, + "target": [ + { + "@id": "0c6a9942-4bb9-58da-8344-57ecd220d4de" + } + ], + "textualRepresentation": [] + }, + { + "@id": "43bca579-d715-521b-a6bf-b55b626f0e69", + "@type": "Subclassification", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "43bca579-d715-521b-a6bf-b55b626f0e69", + "general": { + "@id": "e6c0a087-dffc-5a7a-872b-367adf7dcf4c" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningClassifier": { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + }, + "owningRelationship": null, + "owningType": { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + }, + { + "@id": "e6c0a087-dffc-5a7a-872b-367adf7dcf4c" + } + ], + "shortName": null, + "source": [ + { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + } + ], + "specific": { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + }, + "subclassifier": { + "@id": "9591768d-756a-55a2-a746-66a99cebffad" + }, + "superclassifier": { + "@id": "e6c0a087-dffc-5a7a-872b-367adf7dcf4c" + }, + "target": [ + { + "@id": "e6c0a087-dffc-5a7a-872b-367adf7dcf4c" + } + ], + "textualRepresentation": [] + }, + { + "@id": "a505bff6-1b93-5a91-a49a-a881cd8d74f8", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "a505bff6-1b93-5a91-a49a-a881cd8d74f8", + "general": { + "@id": "8bad436f-8f9a-5197-b184-58a7e0145d9d" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + }, + "owningRelationship": null, + "owningType": { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + }, + { + "@id": "8bad436f-8f9a-5197-b184-58a7e0145d9d" + } + ], + "shortName": null, + "source": [ + { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + } + ], + "specific": { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + }, + "subsettedFeature": { + "@id": "8bad436f-8f9a-5197-b184-58a7e0145d9d" + }, + "subsettingFeature": { + "@id": "ddf58eb2-e917-525b-80bf-be2b5da6dec8" + }, + "target": [ + { + "@id": "8bad436f-8f9a-5197-b184-58a7e0145d9d" + } + ], + "textualRepresentation": [] + }, + { + "@id": "2494131d-752c-5608-8e5b-55148d57597c", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "2494131d-752c-5608-8e5b-55148d57597c", + "general": { + "@id": "2d1053c8-d4eb-5f2c-92d4-917c1228de5c" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + }, + "owningRelationship": null, + "owningType": { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + }, + { + "@id": "2d1053c8-d4eb-5f2c-92d4-917c1228de5c" + } + ], + "shortName": null, + "source": [ + { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + } + ], + "specific": { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + }, + "subsettedFeature": { + "@id": "2d1053c8-d4eb-5f2c-92d4-917c1228de5c" + }, + "subsettingFeature": { + "@id": "6e14b85e-4d0f-54e2-b311-0735f5038532" + }, + "target": [ + { + "@id": "2d1053c8-d4eb-5f2c-92d4-917c1228de5c" + } + ], + "textualRepresentation": [] + }, + { + "@id": "f5d4879c-2882-5d07-921f-e6ad667a0844", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "f5d4879c-2882-5d07-921f-e6ad667a0844", + "general": { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + }, + "owningRelationship": null, + "owningType": { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + }, + { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + } + ], + "shortName": null, + "source": [ + { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + } + ], + "specific": { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + }, + "subsettedFeature": { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + }, + "subsettingFeature": { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + }, + "target": [ + { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + } + ], + "textualRepresentation": [] + }, + { + "@id": "857a11a4-b149-5d64-9b55-08f678b4ff76", + "@type": "Redefinition", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "857a11a4-b149-5d64-9b55-08f678b4ff76", + "general": { + "@id": "dcfd8195-70ca-5d3b-9d5c-2293fe0cdc65" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + }, + "owningRelationship": null, + "owningType": { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + }, + "qualifiedName": null, + "redefinedFeature": { + "@id": "dcfd8195-70ca-5d3b-9d5c-2293fe0cdc65" + }, + "redefiningFeature": { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + }, + "relatedElement": [ + { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + }, + { + "@id": "dcfd8195-70ca-5d3b-9d5c-2293fe0cdc65" + } + ], + "shortName": null, + "source": [ + { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + } + ], + "specific": { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + }, + "subsettedFeature": { + "@id": "dcfd8195-70ca-5d3b-9d5c-2293fe0cdc65" + }, + "subsettingFeature": { + "@id": "6d49395b-17f9-5a3e-9611-e02ba7ab60e6" + }, + "target": [ + { + "@id": "dcfd8195-70ca-5d3b-9d5c-2293fe0cdc65" + } + ], + "textualRepresentation": [] + }, + { + "@id": "269690c0-6bd8-59e6-be7d-194fdccbdb1e", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "269690c0-6bd8-59e6-be7d-194fdccbdb1e", + "general": { + "@id": "c590aa58-6c78-5aeb-b1c9-a784abcb2e29" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "19536408-4501-523c-86b6-c2875600c87b" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "19536408-4501-523c-86b6-c2875600c87b" + }, + "owningRelationship": null, + "owningType": { + "@id": "19536408-4501-523c-86b6-c2875600c87b" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "19536408-4501-523c-86b6-c2875600c87b" + }, + { + "@id": "c590aa58-6c78-5aeb-b1c9-a784abcb2e29" + } + ], + "shortName": null, + "source": [ + { + "@id": "19536408-4501-523c-86b6-c2875600c87b" + } + ], + "specific": { + "@id": "19536408-4501-523c-86b6-c2875600c87b" + }, + "subsettedFeature": { + "@id": "c590aa58-6c78-5aeb-b1c9-a784abcb2e29" + }, + "subsettingFeature": { + "@id": "19536408-4501-523c-86b6-c2875600c87b" + }, + "target": [ + { + "@id": "c590aa58-6c78-5aeb-b1c9-a784abcb2e29" + } + ], + "textualRepresentation": [] + } +] diff --git a/tests/export/testdata/interchange/successions.golden.sysml b/tests/export/testdata/interchange/successions.golden.sysml new file mode 100644 index 0000000000..8dafbf6bd9 --- /dev/null +++ b/tests/export/testdata/interchange/successions.golden.sysml @@ -0,0 +1,8 @@ +package Successions { + individual part def Timeline; + individual part timeline : Timeline { + timeslice occurrence firstEvent; + succession first firstEvent then secondEvent; + timeslice occurrence secondEvent; + } +} diff --git a/tests/export/testdata/interchange/successions.sysml b/tests/export/testdata/interchange/successions.sysml new file mode 100644 index 0000000000..e59c4873f2 --- /dev/null +++ b/tests/export/testdata/interchange/successions.sysml @@ -0,0 +1,7 @@ +package Successions { + individual part def Timeline; + individual part timeline : Timeline { + timeslice firstEvent; + then timeslice secondEvent; + } +} diff --git a/tests/export/testdata/interchange/successions.toolkit.full.json b/tests/export/testdata/interchange/successions.toolkit.full.json new file mode 100644 index 0000000000..c4bd2655ec --- /dev/null +++ b/tests/export/testdata/interchange/successions.toolkit.full.json @@ -0,0 +1,2652 @@ +[ + { + "@id": "172711ad-3d0c-5e10-8ee0-36b402f72d22", + "@type": "Namespace", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "172711ad-3d0c-5e10-8ee0-36b402f72d22", + "importedMembership": [], + "isImpliedIncluded": true, + "isLibraryElement": false, + "member": [ + { + "@id": "55b692bc-4fe1-54fe-841f-f6cef2135ba6" + } + ], + "membership": [ + { + "@id": "2dd36a80-0a37-5c83-b770-2ec83ede5412" + } + ], + "name": null, + "ownedAnnotation": [], + "ownedElement": [ + { + "@id": "55b692bc-4fe1-54fe-841f-f6cef2135ba6" + } + ], + "ownedImport": [], + "ownedMember": [ + { + "@id": "55b692bc-4fe1-54fe-841f-f6cef2135ba6" + } + ], + "ownedMembership": [ + { + "@id": "2dd36a80-0a37-5c83-b770-2ec83ede5412" + } + ], + "ownedRelationship": [ + { + "@id": "2dd36a80-0a37-5c83-b770-2ec83ede5412" + } + ], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelationship": null, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [] + }, + { + "@id": "2dd36a80-0a37-5c83-b770-2ec83ede5412", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "2dd36a80-0a37-5c83-b770-2ec83ede5412", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "55b692bc-4fe1-54fe-841f-f6cef2135ba6" + }, + "memberElementId": "55b692bc-4fe1-54fe-841f-f6cef2135ba6", + "memberName": "Successions", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "172711ad-3d0c-5e10-8ee0-36b402f72d22" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "55b692bc-4fe1-54fe-841f-f6cef2135ba6" + }, + "ownedMemberElementId": "55b692bc-4fe1-54fe-841f-f6cef2135ba6", + "ownedMemberName": "Successions", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "55b692bc-4fe1-54fe-841f-f6cef2135ba6" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "172711ad-3d0c-5e10-8ee0-36b402f72d22" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "172711ad-3d0c-5e10-8ee0-36b402f72d22" + }, + { + "@id": "55b692bc-4fe1-54fe-841f-f6cef2135ba6" + } + ], + "shortName": null, + "source": [ + { + "@id": "172711ad-3d0c-5e10-8ee0-36b402f72d22" + } + ], + "target": [ + { + "@id": "55b692bc-4fe1-54fe-841f-f6cef2135ba6" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "55b692bc-4fe1-54fe-841f-f6cef2135ba6", + "@type": "Package", + "aliasIds": [], + "declaredName": "Successions", + "declaredShortName": null, + "documentation": [], + "elementId": "55b692bc-4fe1-54fe-841f-f6cef2135ba6", + "filterCondition": [], + "importedMembership": [], + "isImpliedIncluded": true, + "isLibraryElement": false, + "member": [ + { + "@id": "d4a924a4-1088-5712-8e5a-a922fe36d7d7" + }, + { + "@id": "09d64173-1864-5055-9318-3817001779d6" + } + ], + "membership": [ + { + "@id": "a77674a1-c0a2-5679-8f65-5b25c2a226c5" + }, + { + "@id": "a63c1782-dfdd-591a-a25b-94852414d696" + } + ], + "name": "Successions", + "ownedAnnotation": [], + "ownedElement": [ + { + "@id": "d4a924a4-1088-5712-8e5a-a922fe36d7d7" + }, + { + "@id": "09d64173-1864-5055-9318-3817001779d6" + } + ], + "ownedImport": [], + "ownedMember": [ + { + "@id": "d4a924a4-1088-5712-8e5a-a922fe36d7d7" + }, + { + "@id": "09d64173-1864-5055-9318-3817001779d6" + } + ], + "ownedMembership": [ + { + "@id": "a77674a1-c0a2-5679-8f65-5b25c2a226c5" + }, + { + "@id": "a63c1782-dfdd-591a-a25b-94852414d696" + } + ], + "ownedRelationship": [ + { + "@id": "a77674a1-c0a2-5679-8f65-5b25c2a226c5" + }, + { + "@id": "a63c1782-dfdd-591a-a25b-94852414d696" + } + ], + "owner": { + "@id": "172711ad-3d0c-5e10-8ee0-36b402f72d22" + }, + "owningMembership": { + "@id": "2dd36a80-0a37-5c83-b770-2ec83ede5412" + }, + "owningNamespace": { + "@id": "172711ad-3d0c-5e10-8ee0-36b402f72d22" + }, + "owningRelationship": { + "@id": "2dd36a80-0a37-5c83-b770-2ec83ede5412" + }, + "qualifiedName": "Successions", + "shortName": null, + "textualRepresentation": [] + }, + { + "@id": "a77674a1-c0a2-5679-8f65-5b25c2a226c5", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "a77674a1-c0a2-5679-8f65-5b25c2a226c5", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "d4a924a4-1088-5712-8e5a-a922fe36d7d7" + }, + "memberElementId": "d4a924a4-1088-5712-8e5a-a922fe36d7d7", + "memberName": "Timeline", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "55b692bc-4fe1-54fe-841f-f6cef2135ba6" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "d4a924a4-1088-5712-8e5a-a922fe36d7d7" + }, + "ownedMemberElementId": "d4a924a4-1088-5712-8e5a-a922fe36d7d7", + "ownedMemberName": "Timeline", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "d4a924a4-1088-5712-8e5a-a922fe36d7d7" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "55b692bc-4fe1-54fe-841f-f6cef2135ba6" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "55b692bc-4fe1-54fe-841f-f6cef2135ba6" + }, + { + "@id": "d4a924a4-1088-5712-8e5a-a922fe36d7d7" + } + ], + "shortName": null, + "source": [ + { + "@id": "55b692bc-4fe1-54fe-841f-f6cef2135ba6" + } + ], + "target": [ + { + "@id": "d4a924a4-1088-5712-8e5a-a922fe36d7d7" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "d4a924a4-1088-5712-8e5a-a922fe36d7d7", + "@type": "PartDefinition", + "aliasIds": [], + "declaredName": "Timeline", + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "documentation": [], + "elementId": "d4a924a4-1088-5712-8e5a-a922fe36d7d7", + "endFeature": [], + "feature": [], + "featureMembership": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isConjugated": false, + "isImpliedIncluded": true, + "isIndividual": true, + "isLibraryElement": false, + "isSufficient": false, + "isVariation": false, + "member": [], + "membership": [], + "multiplicity": null, + "name": "Timeline", + "output": [], + "ownedAction": [], + "ownedAllocation": [], + "ownedAnalysisCase": [], + "ownedAnnotation": [], + "ownedAttribute": [], + "ownedCalculation": [], + "ownedCase": [], + "ownedConcern": [], + "ownedConjugator": null, + "ownedConnection": [], + "ownedConstraint": [], + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedEnumeration": [], + "ownedFeature": [], + "ownedFeatureMembership": [], + "ownedFlow": [], + "ownedImport": [], + "ownedInterface": [], + "ownedIntersecting": [], + "ownedItem": [], + "ownedMember": [], + "ownedMembership": [], + "ownedMetadata": [], + "ownedOccurrence": [], + "ownedPart": [], + "ownedPort": [], + "ownedReference": [], + "ownedRelationship": [ + { + "@id": "d081c052-541c-5576-ac81-952755752e8a" + } + ], + "ownedRendering": [], + "ownedRequirement": [], + "ownedSpecialization": [ + { + "@id": "d081c052-541c-5576-ac81-952755752e8a" + } + ], + "ownedState": [], + "ownedSubclassification": [ + { + "@id": "d081c052-541c-5576-ac81-952755752e8a" + } + ], + "ownedTransition": [], + "ownedUnioning": [], + "ownedUsage": [], + "ownedUseCase": [], + "ownedVerificationCase": [], + "ownedView": [], + "ownedViewpoint": [], + "owner": { + "@id": "55b692bc-4fe1-54fe-841f-f6cef2135ba6" + }, + "owningMembership": { + "@id": "a77674a1-c0a2-5679-8f65-5b25c2a226c5" + }, + "owningNamespace": { + "@id": "55b692bc-4fe1-54fe-841f-f6cef2135ba6" + }, + "owningRelationship": { + "@id": "a77674a1-c0a2-5679-8f65-5b25c2a226c5" + }, + "qualifiedName": "Successions::Timeline", + "shortName": null, + "textualRepresentation": [], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "a63c1782-dfdd-591a-a25b-94852414d696", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "a63c1782-dfdd-591a-a25b-94852414d696", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + "memberElementId": "09d64173-1864-5055-9318-3817001779d6", + "memberName": "timeline", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "55b692bc-4fe1-54fe-841f-f6cef2135ba6" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + "ownedMemberElementId": "09d64173-1864-5055-9318-3817001779d6", + "ownedMemberName": "timeline", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "09d64173-1864-5055-9318-3817001779d6" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "55b692bc-4fe1-54fe-841f-f6cef2135ba6" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "55b692bc-4fe1-54fe-841f-f6cef2135ba6" + }, + { + "@id": "09d64173-1864-5055-9318-3817001779d6" + } + ], + "shortName": null, + "source": [ + { + "@id": "55b692bc-4fe1-54fe-841f-f6cef2135ba6" + } + ], + "target": [ + { + "@id": "09d64173-1864-5055-9318-3817001779d6" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "09d64173-1864-5055-9318-3817001779d6", + "@type": "PartUsage", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": "timeline", + "declaredShortName": null, + "definition": [ + { + "@id": "d4a924a4-1088-5712-8e5a-a922fe36d7d7" + } + ], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "09d64173-1864-5055-9318-3817001779d6", + "endFeature": [], + "endOwningType": null, + "feature": [ + { + "@id": "5a3c317d-800d-5c91-8b78-7bf351c9a148" + }, + { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + }, + { + "@id": "d069988a-057d-5930-9836-c5c101d16a52" + } + ], + "featureMembership": [ + { + "@id": "cd6511f1-68a2-57f5-bf83-a16f1f59fe8b" + }, + { + "@id": "0899baa2-fdb7-58a8-81bd-5fc40827c33c" + }, + { + "@id": "550a8492-f4dc-52b4-9271-94a9b1fc1378" + } + ], + "featureTarget": { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + "featuringType": [], + "importedMembership": [], + "individualDefinition": { + "@id": "d4a924a4-1088-5712-8e5a-a922fe36d7d7" + }, + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isIndividual": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": true, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "itemDefinition": [ + { + "@id": "d4a924a4-1088-5712-8e5a-a922fe36d7d7" + } + ], + "mayTimeVary": null, + "member": [ + { + "@id": "5a3c317d-800d-5c91-8b78-7bf351c9a148" + }, + { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + }, + { + "@id": "d069988a-057d-5930-9836-c5c101d16a52" + } + ], + "membership": [ + { + "@id": "cd6511f1-68a2-57f5-bf83-a16f1f59fe8b" + }, + { + "@id": "0899baa2-fdb7-58a8-81bd-5fc40827c33c" + }, + { + "@id": "550a8492-f4dc-52b4-9271-94a9b1fc1378" + } + ], + "multiplicity": null, + "name": "timeline", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [ + { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + } + ], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [ + { + "@id": "5a3c317d-800d-5c91-8b78-7bf351c9a148" + }, + { + "@id": "d069988a-057d-5930-9836-c5c101d16a52" + } + ], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [ + { + "@id": "5a3c317d-800d-5c91-8b78-7bf351c9a148" + }, + { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + }, + { + "@id": "d069988a-057d-5930-9836-c5c101d16a52" + } + ], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "occurrenceDefinition": [ + { + "@id": "d4a924a4-1088-5712-8e5a-a922fe36d7d7" + } + ], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "5a3c317d-800d-5c91-8b78-7bf351c9a148" + }, + { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + }, + { + "@id": "d069988a-057d-5930-9836-c5c101d16a52" + } + ], + "ownedEndFeature": [], + "ownedFeature": [ + { + "@id": "5a3c317d-800d-5c91-8b78-7bf351c9a148" + }, + { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + }, + { + "@id": "d069988a-057d-5930-9836-c5c101d16a52" + } + ], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [ + { + "@id": "cd6511f1-68a2-57f5-bf83-a16f1f59fe8b" + }, + { + "@id": "0899baa2-fdb7-58a8-81bd-5fc40827c33c" + }, + { + "@id": "550a8492-f4dc-52b4-9271-94a9b1fc1378" + } + ], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [ + { + "@id": "5a3c317d-800d-5c91-8b78-7bf351c9a148" + }, + { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + }, + { + "@id": "d069988a-057d-5930-9836-c5c101d16a52" + } + ], + "ownedMembership": [ + { + "@id": "cd6511f1-68a2-57f5-bf83-a16f1f59fe8b" + }, + { + "@id": "0899baa2-fdb7-58a8-81bd-5fc40827c33c" + }, + { + "@id": "550a8492-f4dc-52b4-9271-94a9b1fc1378" + } + ], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "0ae8b9f9-9038-5ba5-b145-f191ab44fc10" + }, + { + "@id": "cd6511f1-68a2-57f5-bf83-a16f1f59fe8b" + }, + { + "@id": "0899baa2-fdb7-58a8-81bd-5fc40827c33c" + }, + { + "@id": "550a8492-f4dc-52b4-9271-94a9b1fc1378" + }, + { + "@id": "2cf941a4-beef-5706-9d18-2553c35c9618" + } + ], + "ownedSpecialization": [ + { + "@id": "0ae8b9f9-9038-5ba5-b145-f191ab44fc10" + }, + { + "@id": "2cf941a4-beef-5706-9d18-2553c35c9618" + } + ], + "ownedSubsetting": [ + { + "@id": "2cf941a4-beef-5706-9d18-2553c35c9618" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [ + { + "@id": "0ae8b9f9-9038-5ba5-b145-f191ab44fc10" + } + ], + "ownedUnioning": [], + "owner": { + "@id": "55b692bc-4fe1-54fe-841f-f6cef2135ba6" + }, + "owningDefinition": null, + "owningFeatureMembership": null, + "owningMembership": { + "@id": "a63c1782-dfdd-591a-a25b-94852414d696" + }, + "owningNamespace": { + "@id": "55b692bc-4fe1-54fe-841f-f6cef2135ba6" + }, + "owningRelationship": { + "@id": "a63c1782-dfdd-591a-a25b-94852414d696" + }, + "owningType": null, + "owningUsage": null, + "partDefinition": [ + { + "@id": "d4a924a4-1088-5712-8e5a-a922fe36d7d7" + } + ], + "portionKind": null, + "qualifiedName": "Successions::timeline", + "shortName": null, + "textualRepresentation": [], + "type": [ + { + "@id": "d4a924a4-1088-5712-8e5a-a922fe36d7d7" + } + ], + "unioningType": [], + "usage": [ + { + "@id": "5a3c317d-800d-5c91-8b78-7bf351c9a148" + }, + { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + }, + { + "@id": "d069988a-057d-5930-9836-c5c101d16a52" + } + ], + "variant": [], + "variantMembership": [] + }, + { + "@id": "0ae8b9f9-9038-5ba5-b145-f191ab44fc10", + "@type": "FeatureTyping", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "0ae8b9f9-9038-5ba5-b145-f191ab44fc10", + "general": { + "@id": "d4a924a4-1088-5712-8e5a-a922fe36d7d7" + }, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + "owningRelationship": null, + "owningType": { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + { + "@id": "d4a924a4-1088-5712-8e5a-a922fe36d7d7" + } + ], + "shortName": null, + "source": [ + { + "@id": "09d64173-1864-5055-9318-3817001779d6" + } + ], + "specific": { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + "target": [ + { + "@id": "d4a924a4-1088-5712-8e5a-a922fe36d7d7" + } + ], + "textualRepresentation": [], + "type": { + "@id": "d4a924a4-1088-5712-8e5a-a922fe36d7d7" + }, + "typedFeature": { + "@id": "09d64173-1864-5055-9318-3817001779d6" + } + }, + { + "@id": "cd6511f1-68a2-57f5-bf83-a16f1f59fe8b", + "@type": "FeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "cd6511f1-68a2-57f5-bf83-a16f1f59fe8b", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "5a3c317d-800d-5c91-8b78-7bf351c9a148" + }, + "memberElementId": "5a3c317d-800d-5c91-8b78-7bf351c9a148", + "memberName": "firstEvent", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "5a3c317d-800d-5c91-8b78-7bf351c9a148" + }, + "ownedMemberElementId": "5a3c317d-800d-5c91-8b78-7bf351c9a148", + "ownedMemberFeature": { + "@id": "5a3c317d-800d-5c91-8b78-7bf351c9a148" + }, + "ownedMemberName": "firstEvent", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "5a3c317d-800d-5c91-8b78-7bf351c9a148" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + "owningRelationship": null, + "owningType": { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + { + "@id": "5a3c317d-800d-5c91-8b78-7bf351c9a148" + } + ], + "shortName": null, + "source": [ + { + "@id": "09d64173-1864-5055-9318-3817001779d6" + } + ], + "target": [ + { + "@id": "5a3c317d-800d-5c91-8b78-7bf351c9a148" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "5a3c317d-800d-5c91-8b78-7bf351c9a148", + "@type": "OccurrenceUsage", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": "firstEvent", + "declaredShortName": null, + "definition": [], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "5a3c317d-800d-5c91-8b78-7bf351c9a148", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "5a3c317d-800d-5c91-8b78-7bf351c9a148" + }, + "featuringType": [], + "importedMembership": [], + "individualDefinition": null, + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": true, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": false, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [], + "membership": [], + "multiplicity": null, + "name": "firstEvent", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "occurrenceDefinition": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "29c87237-c8fb-5b5e-bed1-00d556d05cf4" + } + ], + "ownedSpecialization": [ + { + "@id": "29c87237-c8fb-5b5e-bed1-00d556d05cf4" + } + ], + "ownedSubsetting": [ + { + "@id": "29c87237-c8fb-5b5e-bed1-00d556d05cf4" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + "owningDefinition": null, + "owningFeatureMembership": { + "@id": "cd6511f1-68a2-57f5-bf83-a16f1f59fe8b" + }, + "owningMembership": { + "@id": "cd6511f1-68a2-57f5-bf83-a16f1f59fe8b" + }, + "owningNamespace": { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + "owningRelationship": { + "@id": "cd6511f1-68a2-57f5-bf83-a16f1f59fe8b" + }, + "owningType": { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + "owningUsage": { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + "portionKind": "timeslice", + "qualifiedName": "Successions::timeline::firstEvent", + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "0899baa2-fdb7-58a8-81bd-5fc40827c33c", + "@type": "FeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "0899baa2-fdb7-58a8-81bd-5fc40827c33c", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + }, + "memberElementId": "851999d9-91dd-5425-a5cb-826dcd67810e", + "memberName": null, + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + }, + "ownedMemberElementId": "851999d9-91dd-5425-a5cb-826dcd67810e", + "ownedMemberFeature": { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + }, + "ownedMemberName": null, + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + "owningRelationship": null, + "owningType": { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + } + ], + "shortName": null, + "source": [ + { + "@id": "09d64173-1864-5055-9318-3817001779d6" + } + ], + "target": [ + { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e", + "@type": "SuccessionAsUsage", + "aliasIds": [], + "association": [], + "chainingFeature": [], + "connectorEnd": [ + { + "@id": "49dbef5c-1f16-5f03-a4df-1e96baaf034e" + }, + { + "@id": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650" + } + ], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "defaultFeaturingType": { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + "definition": [], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "851999d9-91dd-5425-a5cb-826dcd67810e", + "endFeature": [ + { + "@id": "49dbef5c-1f16-5f03-a4df-1e96baaf034e" + }, + { + "@id": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650" + } + ], + "endOwningType": null, + "feature": [ + { + "@id": "49dbef5c-1f16-5f03-a4df-1e96baaf034e" + }, + { + "@id": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650" + } + ], + "featureMembership": [ + { + "@id": "054d8105-a7cc-54ef-bb57-761aa47c036d" + }, + { + "@id": "8c8443a2-9938-5340-84b6-d8586b52e01f" + } + ], + "featureTarget": { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": true, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [ + { + "@id": "49dbef5c-1f16-5f03-a4df-1e96baaf034e" + }, + { + "@id": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650" + } + ], + "membership": [ + { + "@id": "054d8105-a7cc-54ef-bb57-761aa47c036d" + }, + { + "@id": "8c8443a2-9938-5340-84b6-d8586b52e01f" + } + ], + "multiplicity": null, + "name": null, + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [ + { + "@id": "49dbef5c-1f16-5f03-a4df-1e96baaf034e" + }, + { + "@id": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650" + } + ], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [ + { + "@id": "49dbef5c-1f16-5f03-a4df-1e96baaf034e" + }, + { + "@id": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650" + } + ], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "49dbef5c-1f16-5f03-a4df-1e96baaf034e" + }, + { + "@id": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650" + } + ], + "ownedEndFeature": [ + { + "@id": "49dbef5c-1f16-5f03-a4df-1e96baaf034e" + }, + { + "@id": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650" + } + ], + "ownedFeature": [ + { + "@id": "49dbef5c-1f16-5f03-a4df-1e96baaf034e" + }, + { + "@id": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650" + } + ], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [ + { + "@id": "054d8105-a7cc-54ef-bb57-761aa47c036d" + }, + { + "@id": "8c8443a2-9938-5340-84b6-d8586b52e01f" + } + ], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [ + { + "@id": "49dbef5c-1f16-5f03-a4df-1e96baaf034e" + }, + { + "@id": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650" + } + ], + "ownedMembership": [ + { + "@id": "054d8105-a7cc-54ef-bb57-761aa47c036d" + }, + { + "@id": "8c8443a2-9938-5340-84b6-d8586b52e01f" + } + ], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelatedElement": [], + "ownedRelationship": [ + { + "@id": "054d8105-a7cc-54ef-bb57-761aa47c036d" + }, + { + "@id": "8c8443a2-9938-5340-84b6-d8586b52e01f" + }, + { + "@id": "5afb95f7-7e60-5a25-9b29-ccd787783217" + } + ], + "ownedSpecialization": [ + { + "@id": "5afb95f7-7e60-5a25-9b29-ccd787783217" + } + ], + "ownedSubsetting": [ + { + "@id": "5afb95f7-7e60-5a25-9b29-ccd787783217" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + "owningDefinition": null, + "owningFeatureMembership": { + "@id": "0899baa2-fdb7-58a8-81bd-5fc40827c33c" + }, + "owningMembership": { + "@id": "0899baa2-fdb7-58a8-81bd-5fc40827c33c" + }, + "owningNamespace": { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + "owningRelatedElement": null, + "owningRelationship": { + "@id": "0899baa2-fdb7-58a8-81bd-5fc40827c33c" + }, + "owningType": { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + "owningUsage": { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "5a3c317d-800d-5c91-8b78-7bf351c9a148" + }, + { + "@id": "d069988a-057d-5930-9836-c5c101d16a52" + } + ], + "relatedFeature": [ + { + "@id": "5a3c317d-800d-5c91-8b78-7bf351c9a148" + }, + { + "@id": "d069988a-057d-5930-9836-c5c101d16a52" + } + ], + "shortName": null, + "source": [ + { + "@id": "5a3c317d-800d-5c91-8b78-7bf351c9a148" + } + ], + "sourceFeature": { + "@id": "5a3c317d-800d-5c91-8b78-7bf351c9a148" + }, + "target": [ + { + "@id": "d069988a-057d-5930-9836-c5c101d16a52" + } + ], + "targetFeature": [ + { + "@id": "d069988a-057d-5930-9836-c5c101d16a52" + } + ], + "textualRepresentation": [], + "type": [], + "unioningType": [], + "usage": [ + { + "@id": "49dbef5c-1f16-5f03-a4df-1e96baaf034e" + }, + { + "@id": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650" + } + ], + "variant": [], + "variantMembership": [] + }, + { + "@id": "054d8105-a7cc-54ef-bb57-761aa47c036d", + "@type": "EndFeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "054d8105-a7cc-54ef-bb57-761aa47c036d", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "49dbef5c-1f16-5f03-a4df-1e96baaf034e" + }, + "memberElementId": "49dbef5c-1f16-5f03-a4df-1e96baaf034e", + "memberName": "earlierOccurrence", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "49dbef5c-1f16-5f03-a4df-1e96baaf034e" + }, + "ownedMemberElementId": "49dbef5c-1f16-5f03-a4df-1e96baaf034e", + "ownedMemberFeature": { + "@id": "49dbef5c-1f16-5f03-a4df-1e96baaf034e" + }, + "ownedMemberName": "earlierOccurrence", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "49dbef5c-1f16-5f03-a4df-1e96baaf034e" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + }, + "owningRelationship": null, + "owningType": { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + }, + { + "@id": "49dbef5c-1f16-5f03-a4df-1e96baaf034e" + } + ], + "shortName": null, + "source": [ + { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + } + ], + "target": [ + { + "@id": "49dbef5c-1f16-5f03-a4df-1e96baaf034e" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "49dbef5c-1f16-5f03-a4df-1e96baaf034e", + "@type": "ReferenceUsage", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "definition": [], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "49dbef5c-1f16-5f03-a4df-1e96baaf034e", + "endFeature": [], + "endOwningType": { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + }, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "49dbef5c-1f16-5f03-a4df-1e96baaf034e" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": true, + "isDerived": false, + "isEnd": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": true, + "isSufficient": false, + "isUnique": true, + "isVariable": true, + "isVariation": false, + "mayTimeVary": true, + "member": [], + "membership": [], + "multiplicity": null, + "name": "earlierOccurrence", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [ + { + "@id": "df7efa8b-d0c3-5d66-be86-eb35deb2f0fa" + } + ], + "ownedReferenceSubsetting": { + "@id": "3a54ac9f-23c3-5cd5-a750-0049638b60c2" + }, + "ownedRelationship": [ + { + "@id": "3a54ac9f-23c3-5cd5-a750-0049638b60c2" + }, + { + "@id": "df7efa8b-d0c3-5d66-be86-eb35deb2f0fa" + } + ], + "ownedSpecialization": [ + { + "@id": "3a54ac9f-23c3-5cd5-a750-0049638b60c2" + }, + { + "@id": "df7efa8b-d0c3-5d66-be86-eb35deb2f0fa" + } + ], + "ownedSubsetting": [ + { + "@id": "3a54ac9f-23c3-5cd5-a750-0049638b60c2" + }, + { + "@id": "df7efa8b-d0c3-5d66-be86-eb35deb2f0fa" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + }, + "owningDefinition": null, + "owningFeatureMembership": { + "@id": "054d8105-a7cc-54ef-bb57-761aa47c036d" + }, + "owningMembership": { + "@id": "054d8105-a7cc-54ef-bb57-761aa47c036d" + }, + "owningNamespace": { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + }, + "owningRelationship": { + "@id": "054d8105-a7cc-54ef-bb57-761aa47c036d" + }, + "owningType": { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + }, + "owningUsage": { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + }, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "8c8443a2-9938-5340-84b6-d8586b52e01f", + "@type": "EndFeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "8c8443a2-9938-5340-84b6-d8586b52e01f", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650" + }, + "memberElementId": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650", + "memberName": "laterOccurrence", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650" + }, + "ownedMemberElementId": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650", + "ownedMemberFeature": { + "@id": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650" + }, + "ownedMemberName": "laterOccurrence", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + }, + "owningRelationship": null, + "owningType": { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + }, + { + "@id": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650" + } + ], + "shortName": null, + "source": [ + { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + } + ], + "target": [ + { + "@id": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650", + "@type": "ReferenceUsage", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "definition": [], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650", + "endFeature": [], + "endOwningType": { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + }, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": true, + "isDerived": false, + "isEnd": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": true, + "isSufficient": false, + "isUnique": true, + "isVariable": true, + "isVariation": false, + "mayTimeVary": true, + "member": [], + "membership": [], + "multiplicity": null, + "name": "laterOccurrence", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [ + { + "@id": "d068c0d0-08e6-55a8-88e5-cc9b5dd46611" + } + ], + "ownedReferenceSubsetting": { + "@id": "d5bef476-90c1-5c21-a93a-155ece4c7b26" + }, + "ownedRelationship": [ + { + "@id": "d5bef476-90c1-5c21-a93a-155ece4c7b26" + }, + { + "@id": "d068c0d0-08e6-55a8-88e5-cc9b5dd46611" + } + ], + "ownedSpecialization": [ + { + "@id": "d5bef476-90c1-5c21-a93a-155ece4c7b26" + }, + { + "@id": "d068c0d0-08e6-55a8-88e5-cc9b5dd46611" + } + ], + "ownedSubsetting": [ + { + "@id": "d5bef476-90c1-5c21-a93a-155ece4c7b26" + }, + { + "@id": "d068c0d0-08e6-55a8-88e5-cc9b5dd46611" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + }, + "owningDefinition": null, + "owningFeatureMembership": { + "@id": "8c8443a2-9938-5340-84b6-d8586b52e01f" + }, + "owningMembership": { + "@id": "8c8443a2-9938-5340-84b6-d8586b52e01f" + }, + "owningNamespace": { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + }, + "owningRelationship": { + "@id": "8c8443a2-9938-5340-84b6-d8586b52e01f" + }, + "owningType": { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + }, + "owningUsage": { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + }, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "550a8492-f4dc-52b4-9271-94a9b1fc1378", + "@type": "FeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "550a8492-f4dc-52b4-9271-94a9b1fc1378", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "d069988a-057d-5930-9836-c5c101d16a52" + }, + "memberElementId": "d069988a-057d-5930-9836-c5c101d16a52", + "memberName": "secondEvent", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "d069988a-057d-5930-9836-c5c101d16a52" + }, + "ownedMemberElementId": "d069988a-057d-5930-9836-c5c101d16a52", + "ownedMemberFeature": { + "@id": "d069988a-057d-5930-9836-c5c101d16a52" + }, + "ownedMemberName": "secondEvent", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "d069988a-057d-5930-9836-c5c101d16a52" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + "owningRelationship": null, + "owningType": { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + { + "@id": "d069988a-057d-5930-9836-c5c101d16a52" + } + ], + "shortName": null, + "source": [ + { + "@id": "09d64173-1864-5055-9318-3817001779d6" + } + ], + "target": [ + { + "@id": "d069988a-057d-5930-9836-c5c101d16a52" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "d069988a-057d-5930-9836-c5c101d16a52", + "@type": "OccurrenceUsage", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": "secondEvent", + "declaredShortName": null, + "definition": [], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "d069988a-057d-5930-9836-c5c101d16a52", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "d069988a-057d-5930-9836-c5c101d16a52" + }, + "featuringType": [], + "importedMembership": [], + "individualDefinition": null, + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": true, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": false, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [], + "membership": [], + "multiplicity": null, + "name": "secondEvent", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "occurrenceDefinition": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "73c23ab4-1824-52c7-b415-a02aebcc5af3" + } + ], + "ownedSpecialization": [ + { + "@id": "73c23ab4-1824-52c7-b415-a02aebcc5af3" + } + ], + "ownedSubsetting": [ + { + "@id": "73c23ab4-1824-52c7-b415-a02aebcc5af3" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + "owningDefinition": null, + "owningFeatureMembership": { + "@id": "550a8492-f4dc-52b4-9271-94a9b1fc1378" + }, + "owningMembership": { + "@id": "550a8492-f4dc-52b4-9271-94a9b1fc1378" + }, + "owningNamespace": { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + "owningRelationship": { + "@id": "550a8492-f4dc-52b4-9271-94a9b1fc1378" + }, + "owningType": { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + "owningUsage": { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + "portionKind": "timeslice", + "qualifiedName": "Successions::timeline::secondEvent", + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "d081c052-541c-5576-ac81-952755752e8a", + "@type": "Subclassification", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "d081c052-541c-5576-ac81-952755752e8a", + "general": { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningClassifier": { + "@id": "d4a924a4-1088-5712-8e5a-a922fe36d7d7" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "d4a924a4-1088-5712-8e5a-a922fe36d7d7" + }, + "owningRelationship": null, + "owningType": { + "@id": "d4a924a4-1088-5712-8e5a-a922fe36d7d7" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "d4a924a4-1088-5712-8e5a-a922fe36d7d7" + }, + { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + } + ], + "shortName": null, + "source": [ + { + "@id": "d4a924a4-1088-5712-8e5a-a922fe36d7d7" + } + ], + "specific": { + "@id": "d4a924a4-1088-5712-8e5a-a922fe36d7d7" + }, + "subclassifier": { + "@id": "d4a924a4-1088-5712-8e5a-a922fe36d7d7" + }, + "superclassifier": { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + }, + "target": [ + { + "@id": "0774a545-39e3-5bc1-9607-63beabc6bf65" + } + ], + "textualRepresentation": [] + }, + { + "@id": "2cf941a4-beef-5706-9d18-2553c35c9618", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "2cf941a4-beef-5706-9d18-2553c35c9618", + "general": { + "@id": "0c6a9942-4bb9-58da-8344-57ecd220d4de" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + "owningRelationship": null, + "owningType": { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + { + "@id": "0c6a9942-4bb9-58da-8344-57ecd220d4de" + } + ], + "shortName": null, + "source": [ + { + "@id": "09d64173-1864-5055-9318-3817001779d6" + } + ], + "specific": { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + "subsettedFeature": { + "@id": "0c6a9942-4bb9-58da-8344-57ecd220d4de" + }, + "subsettingFeature": { + "@id": "09d64173-1864-5055-9318-3817001779d6" + }, + "target": [ + { + "@id": "0c6a9942-4bb9-58da-8344-57ecd220d4de" + } + ], + "textualRepresentation": [] + }, + { + "@id": "29c87237-c8fb-5b5e-bed1-00d556d05cf4", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "29c87237-c8fb-5b5e-bed1-00d556d05cf4", + "general": { + "@id": "42cca478-6f8d-5c19-b990-bc4510c8bea7" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "5a3c317d-800d-5c91-8b78-7bf351c9a148" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "5a3c317d-800d-5c91-8b78-7bf351c9a148" + }, + "owningRelationship": null, + "owningType": { + "@id": "5a3c317d-800d-5c91-8b78-7bf351c9a148" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "5a3c317d-800d-5c91-8b78-7bf351c9a148" + }, + { + "@id": "42cca478-6f8d-5c19-b990-bc4510c8bea7" + } + ], + "shortName": null, + "source": [ + { + "@id": "5a3c317d-800d-5c91-8b78-7bf351c9a148" + } + ], + "specific": { + "@id": "5a3c317d-800d-5c91-8b78-7bf351c9a148" + }, + "subsettedFeature": { + "@id": "42cca478-6f8d-5c19-b990-bc4510c8bea7" + }, + "subsettingFeature": { + "@id": "5a3c317d-800d-5c91-8b78-7bf351c9a148" + }, + "target": [ + { + "@id": "42cca478-6f8d-5c19-b990-bc4510c8bea7" + } + ], + "textualRepresentation": [] + }, + { + "@id": "5afb95f7-7e60-5a25-9b29-ccd787783217", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "5afb95f7-7e60-5a25-9b29-ccd787783217", + "general": { + "@id": "0e1bba0a-81f0-518c-8415-d1976bd38f8d" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + }, + "owningRelationship": null, + "owningType": { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + }, + { + "@id": "0e1bba0a-81f0-518c-8415-d1976bd38f8d" + } + ], + "shortName": null, + "source": [ + { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + } + ], + "specific": { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + }, + "subsettedFeature": { + "@id": "0e1bba0a-81f0-518c-8415-d1976bd38f8d" + }, + "subsettingFeature": { + "@id": "851999d9-91dd-5425-a5cb-826dcd67810e" + }, + "target": [ + { + "@id": "0e1bba0a-81f0-518c-8415-d1976bd38f8d" + } + ], + "textualRepresentation": [] + }, + { + "@id": "3a54ac9f-23c3-5cd5-a750-0049638b60c2", + "@type": "ReferenceSubsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "3a54ac9f-23c3-5cd5-a750-0049638b60c2", + "general": { + "@id": "5a3c317d-800d-5c91-8b78-7bf351c9a148" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "49dbef5c-1f16-5f03-a4df-1e96baaf034e" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "49dbef5c-1f16-5f03-a4df-1e96baaf034e" + }, + "owningRelationship": null, + "owningType": { + "@id": "49dbef5c-1f16-5f03-a4df-1e96baaf034e" + }, + "qualifiedName": null, + "referencedFeature": { + "@id": "5a3c317d-800d-5c91-8b78-7bf351c9a148" + }, + "referencingFeature": { + "@id": "49dbef5c-1f16-5f03-a4df-1e96baaf034e" + }, + "relatedElement": [ + { + "@id": "49dbef5c-1f16-5f03-a4df-1e96baaf034e" + }, + { + "@id": "5a3c317d-800d-5c91-8b78-7bf351c9a148" + } + ], + "shortName": null, + "source": [ + { + "@id": "49dbef5c-1f16-5f03-a4df-1e96baaf034e" + } + ], + "specific": { + "@id": "49dbef5c-1f16-5f03-a4df-1e96baaf034e" + }, + "subsettedFeature": { + "@id": "5a3c317d-800d-5c91-8b78-7bf351c9a148" + }, + "subsettingFeature": { + "@id": "49dbef5c-1f16-5f03-a4df-1e96baaf034e" + }, + "target": [ + { + "@id": "5a3c317d-800d-5c91-8b78-7bf351c9a148" + } + ], + "textualRepresentation": [] + }, + { + "@id": "df7efa8b-d0c3-5d66-be86-eb35deb2f0fa", + "@type": "Redefinition", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "df7efa8b-d0c3-5d66-be86-eb35deb2f0fa", + "general": { + "@id": "7d7065b6-1bb8-5bb5-b421-cc92f2e84584" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "49dbef5c-1f16-5f03-a4df-1e96baaf034e" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "49dbef5c-1f16-5f03-a4df-1e96baaf034e" + }, + "owningRelationship": null, + "owningType": { + "@id": "49dbef5c-1f16-5f03-a4df-1e96baaf034e" + }, + "qualifiedName": null, + "redefinedFeature": { + "@id": "7d7065b6-1bb8-5bb5-b421-cc92f2e84584" + }, + "redefiningFeature": { + "@id": "49dbef5c-1f16-5f03-a4df-1e96baaf034e" + }, + "relatedElement": [ + { + "@id": "49dbef5c-1f16-5f03-a4df-1e96baaf034e" + }, + { + "@id": "7d7065b6-1bb8-5bb5-b421-cc92f2e84584" + } + ], + "shortName": null, + "source": [ + { + "@id": "49dbef5c-1f16-5f03-a4df-1e96baaf034e" + } + ], + "specific": { + "@id": "49dbef5c-1f16-5f03-a4df-1e96baaf034e" + }, + "subsettedFeature": { + "@id": "7d7065b6-1bb8-5bb5-b421-cc92f2e84584" + }, + "subsettingFeature": { + "@id": "49dbef5c-1f16-5f03-a4df-1e96baaf034e" + }, + "target": [ + { + "@id": "7d7065b6-1bb8-5bb5-b421-cc92f2e84584" + } + ], + "textualRepresentation": [] + }, + { + "@id": "d5bef476-90c1-5c21-a93a-155ece4c7b26", + "@type": "ReferenceSubsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "d5bef476-90c1-5c21-a93a-155ece4c7b26", + "general": { + "@id": "d069988a-057d-5930-9836-c5c101d16a52" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650" + }, + "owningRelationship": null, + "owningType": { + "@id": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650" + }, + "qualifiedName": null, + "referencedFeature": { + "@id": "d069988a-057d-5930-9836-c5c101d16a52" + }, + "referencingFeature": { + "@id": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650" + }, + "relatedElement": [ + { + "@id": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650" + }, + { + "@id": "d069988a-057d-5930-9836-c5c101d16a52" + } + ], + "shortName": null, + "source": [ + { + "@id": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650" + } + ], + "specific": { + "@id": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650" + }, + "subsettedFeature": { + "@id": "d069988a-057d-5930-9836-c5c101d16a52" + }, + "subsettingFeature": { + "@id": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650" + }, + "target": [ + { + "@id": "d069988a-057d-5930-9836-c5c101d16a52" + } + ], + "textualRepresentation": [] + }, + { + "@id": "d068c0d0-08e6-55a8-88e5-cc9b5dd46611", + "@type": "Redefinition", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "d068c0d0-08e6-55a8-88e5-cc9b5dd46611", + "general": { + "@id": "99bd4b60-e5a9-55fb-8cea-1dcf517e50ec" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650" + }, + "owningRelationship": null, + "owningType": { + "@id": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650" + }, + "qualifiedName": null, + "redefinedFeature": { + "@id": "99bd4b60-e5a9-55fb-8cea-1dcf517e50ec" + }, + "redefiningFeature": { + "@id": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650" + }, + "relatedElement": [ + { + "@id": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650" + }, + { + "@id": "99bd4b60-e5a9-55fb-8cea-1dcf517e50ec" + } + ], + "shortName": null, + "source": [ + { + "@id": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650" + } + ], + "specific": { + "@id": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650" + }, + "subsettedFeature": { + "@id": "99bd4b60-e5a9-55fb-8cea-1dcf517e50ec" + }, + "subsettingFeature": { + "@id": "c4f12d7e-72e5-5ac1-be3d-a51f9be4b650" + }, + "target": [ + { + "@id": "99bd4b60-e5a9-55fb-8cea-1dcf517e50ec" + } + ], + "textualRepresentation": [] + }, + { + "@id": "73c23ab4-1824-52c7-b415-a02aebcc5af3", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "73c23ab4-1824-52c7-b415-a02aebcc5af3", + "general": { + "@id": "42cca478-6f8d-5c19-b990-bc4510c8bea7" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "d069988a-057d-5930-9836-c5c101d16a52" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "d069988a-057d-5930-9836-c5c101d16a52" + }, + "owningRelationship": null, + "owningType": { + "@id": "d069988a-057d-5930-9836-c5c101d16a52" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "d069988a-057d-5930-9836-c5c101d16a52" + }, + { + "@id": "42cca478-6f8d-5c19-b990-bc4510c8bea7" + } + ], + "shortName": null, + "source": [ + { + "@id": "d069988a-057d-5930-9836-c5c101d16a52" + } + ], + "specific": { + "@id": "d069988a-057d-5930-9836-c5c101d16a52" + }, + "subsettedFeature": { + "@id": "42cca478-6f8d-5c19-b990-bc4510c8bea7" + }, + "subsettingFeature": { + "@id": "d069988a-057d-5930-9836-c5c101d16a52" + }, + "target": [ + { + "@id": "42cca478-6f8d-5c19-b990-bc4510c8bea7" + } + ], + "textualRepresentation": [] + } +] diff --git a/tests/export/testdata/interchange/transitions.golden.sysml b/tests/export/testdata/interchange/transitions.golden.sysml new file mode 100644 index 0000000000..e2f72f96fb --- /dev/null +++ b/tests/export/testdata/interchange/transitions.golden.sysml @@ -0,0 +1,13 @@ +package TransitionCases { + item def Go; + action def Reset; + attribute ready : ScalarValues::Boolean; + state def Modes { + state x; + state y; + first start then x; + transition triggered first x accept Go then y; + transition guarded first y accept Go if ready then x; + transition effectful first x do action reset : Reset then y; + } +} diff --git a/tests/export/testdata/interchange/transitions.sysml b/tests/export/testdata/interchange/transitions.sysml new file mode 100644 index 0000000000..f660f93fee --- /dev/null +++ b/tests/export/testdata/interchange/transitions.sysml @@ -0,0 +1,15 @@ +package TransitionCases { + item def Go; + action def Reset; + attribute ready : ScalarValues::Boolean; + + state def Modes { + state x; + state y; + + first start then x; + transition triggered first x accept Go then y; + transition guarded first y accept Go if ready then x; + transition effectful first x do action reset : Reset then y; + } +} diff --git a/tests/export/testdata/interchange/transitions.toolkit.full.json b/tests/export/testdata/interchange/transitions.toolkit.full.json new file mode 100644 index 0000000000..91efc7377a --- /dev/null +++ b/tests/export/testdata/interchange/transitions.toolkit.full.json @@ -0,0 +1,12712 @@ +[ + { + "@id": "dc519949-f1d0-53f5-a39c-6a245afcc5b1", + "@type": "Namespace", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "dc519949-f1d0-53f5-a39c-6a245afcc5b1", + "importedMembership": [], + "isImpliedIncluded": true, + "isLibraryElement": false, + "member": [ + { + "@id": "2804aaa9-4449-549e-b85e-f731b1f46288" + } + ], + "membership": [ + { + "@id": "40c2274b-72fa-54ff-8e2f-96b809076f46" + } + ], + "name": null, + "ownedAnnotation": [], + "ownedElement": [ + { + "@id": "2804aaa9-4449-549e-b85e-f731b1f46288" + } + ], + "ownedImport": [], + "ownedMember": [ + { + "@id": "2804aaa9-4449-549e-b85e-f731b1f46288" + } + ], + "ownedMembership": [ + { + "@id": "40c2274b-72fa-54ff-8e2f-96b809076f46" + } + ], + "ownedRelationship": [ + { + "@id": "40c2274b-72fa-54ff-8e2f-96b809076f46" + } + ], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelationship": null, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [] + }, + { + "@id": "40c2274b-72fa-54ff-8e2f-96b809076f46", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "40c2274b-72fa-54ff-8e2f-96b809076f46", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "2804aaa9-4449-549e-b85e-f731b1f46288" + }, + "memberElementId": "2804aaa9-4449-549e-b85e-f731b1f46288", + "memberName": "TransitionCases", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "dc519949-f1d0-53f5-a39c-6a245afcc5b1" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "2804aaa9-4449-549e-b85e-f731b1f46288" + }, + "ownedMemberElementId": "2804aaa9-4449-549e-b85e-f731b1f46288", + "ownedMemberName": "TransitionCases", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "2804aaa9-4449-549e-b85e-f731b1f46288" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "dc519949-f1d0-53f5-a39c-6a245afcc5b1" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "dc519949-f1d0-53f5-a39c-6a245afcc5b1" + }, + { + "@id": "2804aaa9-4449-549e-b85e-f731b1f46288" + } + ], + "shortName": null, + "source": [ + { + "@id": "dc519949-f1d0-53f5-a39c-6a245afcc5b1" + } + ], + "target": [ + { + "@id": "2804aaa9-4449-549e-b85e-f731b1f46288" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "2804aaa9-4449-549e-b85e-f731b1f46288", + "@type": "Package", + "aliasIds": [], + "declaredName": "TransitionCases", + "declaredShortName": null, + "documentation": [], + "elementId": "2804aaa9-4449-549e-b85e-f731b1f46288", + "filterCondition": [], + "importedMembership": [], + "isImpliedIncluded": true, + "isLibraryElement": false, + "member": [ + { + "@id": "93867435-c2c2-584f-9288-378804b1674c" + }, + { + "@id": "944239e2-da22-5343-b4d7-73d746f7ef1c" + }, + { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + }, + { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + } + ], + "membership": [ + { + "@id": "a19e7003-d9e6-59e9-b0a5-4e1a3e757091" + }, + { + "@id": "ec1d1419-e4d0-5c01-9912-c8eea72a51af" + }, + { + "@id": "999a6db2-1a16-5d27-a9d3-ca3d88587c7b" + }, + { + "@id": "cd4445d1-60c6-5668-9847-6a0b6e13224c" + } + ], + "name": "TransitionCases", + "ownedAnnotation": [], + "ownedElement": [ + { + "@id": "93867435-c2c2-584f-9288-378804b1674c" + }, + { + "@id": "944239e2-da22-5343-b4d7-73d746f7ef1c" + }, + { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + }, + { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + } + ], + "ownedImport": [], + "ownedMember": [ + { + "@id": "93867435-c2c2-584f-9288-378804b1674c" + }, + { + "@id": "944239e2-da22-5343-b4d7-73d746f7ef1c" + }, + { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + }, + { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + } + ], + "ownedMembership": [ + { + "@id": "a19e7003-d9e6-59e9-b0a5-4e1a3e757091" + }, + { + "@id": "ec1d1419-e4d0-5c01-9912-c8eea72a51af" + }, + { + "@id": "999a6db2-1a16-5d27-a9d3-ca3d88587c7b" + }, + { + "@id": "cd4445d1-60c6-5668-9847-6a0b6e13224c" + } + ], + "ownedRelationship": [ + { + "@id": "a19e7003-d9e6-59e9-b0a5-4e1a3e757091" + }, + { + "@id": "ec1d1419-e4d0-5c01-9912-c8eea72a51af" + }, + { + "@id": "999a6db2-1a16-5d27-a9d3-ca3d88587c7b" + }, + { + "@id": "cd4445d1-60c6-5668-9847-6a0b6e13224c" + } + ], + "owner": { + "@id": "dc519949-f1d0-53f5-a39c-6a245afcc5b1" + }, + "owningMembership": { + "@id": "40c2274b-72fa-54ff-8e2f-96b809076f46" + }, + "owningNamespace": { + "@id": "dc519949-f1d0-53f5-a39c-6a245afcc5b1" + }, + "owningRelationship": { + "@id": "40c2274b-72fa-54ff-8e2f-96b809076f46" + }, + "qualifiedName": "TransitionCases", + "shortName": null, + "textualRepresentation": [] + }, + { + "@id": "a19e7003-d9e6-59e9-b0a5-4e1a3e757091", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "a19e7003-d9e6-59e9-b0a5-4e1a3e757091", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "93867435-c2c2-584f-9288-378804b1674c" + }, + "memberElementId": "93867435-c2c2-584f-9288-378804b1674c", + "memberName": "Go", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "2804aaa9-4449-549e-b85e-f731b1f46288" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "93867435-c2c2-584f-9288-378804b1674c" + }, + "ownedMemberElementId": "93867435-c2c2-584f-9288-378804b1674c", + "ownedMemberName": "Go", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "93867435-c2c2-584f-9288-378804b1674c" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "2804aaa9-4449-549e-b85e-f731b1f46288" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "2804aaa9-4449-549e-b85e-f731b1f46288" + }, + { + "@id": "93867435-c2c2-584f-9288-378804b1674c" + } + ], + "shortName": null, + "source": [ + { + "@id": "2804aaa9-4449-549e-b85e-f731b1f46288" + } + ], + "target": [ + { + "@id": "93867435-c2c2-584f-9288-378804b1674c" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "93867435-c2c2-584f-9288-378804b1674c", + "@type": "ItemDefinition", + "aliasIds": [], + "declaredName": "Go", + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "documentation": [], + "elementId": "93867435-c2c2-584f-9288-378804b1674c", + "endFeature": [], + "feature": [], + "featureMembership": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isConjugated": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isSufficient": false, + "isVariation": false, + "member": [], + "membership": [], + "multiplicity": null, + "name": "Go", + "output": [], + "ownedAction": [], + "ownedAllocation": [], + "ownedAnalysisCase": [], + "ownedAnnotation": [], + "ownedAttribute": [], + "ownedCalculation": [], + "ownedCase": [], + "ownedConcern": [], + "ownedConjugator": null, + "ownedConnection": [], + "ownedConstraint": [], + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedEnumeration": [], + "ownedFeature": [], + "ownedFeatureMembership": [], + "ownedFlow": [], + "ownedImport": [], + "ownedInterface": [], + "ownedIntersecting": [], + "ownedItem": [], + "ownedMember": [], + "ownedMembership": [], + "ownedMetadata": [], + "ownedOccurrence": [], + "ownedPart": [], + "ownedPort": [], + "ownedReference": [], + "ownedRelationship": [ + { + "@id": "29481ee0-157c-5855-b953-b9a6d7565474" + } + ], + "ownedRendering": [], + "ownedRequirement": [], + "ownedSpecialization": [ + { + "@id": "29481ee0-157c-5855-b953-b9a6d7565474" + } + ], + "ownedState": [], + "ownedSubclassification": [ + { + "@id": "29481ee0-157c-5855-b953-b9a6d7565474" + } + ], + "ownedTransition": [], + "ownedUnioning": [], + "ownedUsage": [], + "ownedUseCase": [], + "ownedVerificationCase": [], + "ownedView": [], + "ownedViewpoint": [], + "owner": { + "@id": "2804aaa9-4449-549e-b85e-f731b1f46288" + }, + "owningMembership": { + "@id": "a19e7003-d9e6-59e9-b0a5-4e1a3e757091" + }, + "owningNamespace": { + "@id": "2804aaa9-4449-549e-b85e-f731b1f46288" + }, + "owningRelationship": { + "@id": "a19e7003-d9e6-59e9-b0a5-4e1a3e757091" + }, + "qualifiedName": "TransitionCases::Go", + "shortName": null, + "textualRepresentation": [], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "ec1d1419-e4d0-5c01-9912-c8eea72a51af", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "ec1d1419-e4d0-5c01-9912-c8eea72a51af", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "944239e2-da22-5343-b4d7-73d746f7ef1c" + }, + "memberElementId": "944239e2-da22-5343-b4d7-73d746f7ef1c", + "memberName": "Reset", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "2804aaa9-4449-549e-b85e-f731b1f46288" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "944239e2-da22-5343-b4d7-73d746f7ef1c" + }, + "ownedMemberElementId": "944239e2-da22-5343-b4d7-73d746f7ef1c", + "ownedMemberName": "Reset", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "944239e2-da22-5343-b4d7-73d746f7ef1c" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "2804aaa9-4449-549e-b85e-f731b1f46288" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "2804aaa9-4449-549e-b85e-f731b1f46288" + }, + { + "@id": "944239e2-da22-5343-b4d7-73d746f7ef1c" + } + ], + "shortName": null, + "source": [ + { + "@id": "2804aaa9-4449-549e-b85e-f731b1f46288" + } + ], + "target": [ + { + "@id": "944239e2-da22-5343-b4d7-73d746f7ef1c" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "944239e2-da22-5343-b4d7-73d746f7ef1c", + "@type": "ActionDefinition", + "action": [], + "aliasIds": [], + "declaredName": "Reset", + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "documentation": [], + "elementId": "944239e2-da22-5343-b4d7-73d746f7ef1c", + "endFeature": [], + "feature": [], + "featureMembership": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isConjugated": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isSufficient": false, + "isVariation": false, + "member": [], + "membership": [], + "multiplicity": null, + "name": "Reset", + "output": [], + "ownedAction": [], + "ownedAllocation": [], + "ownedAnalysisCase": [], + "ownedAnnotation": [], + "ownedAttribute": [], + "ownedCalculation": [], + "ownedCase": [], + "ownedConcern": [], + "ownedConjugator": null, + "ownedConnection": [], + "ownedConstraint": [], + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedEnumeration": [], + "ownedFeature": [], + "ownedFeatureMembership": [], + "ownedFlow": [], + "ownedImport": [], + "ownedInterface": [], + "ownedIntersecting": [], + "ownedItem": [], + "ownedMember": [], + "ownedMembership": [], + "ownedMetadata": [], + "ownedOccurrence": [], + "ownedPart": [], + "ownedPort": [], + "ownedReference": [], + "ownedRelationship": [ + { + "@id": "a561334d-468f-5227-89f7-443784d7683d" + } + ], + "ownedRendering": [], + "ownedRequirement": [], + "ownedSpecialization": [ + { + "@id": "a561334d-468f-5227-89f7-443784d7683d" + } + ], + "ownedState": [], + "ownedSubclassification": [ + { + "@id": "a561334d-468f-5227-89f7-443784d7683d" + } + ], + "ownedTransition": [], + "ownedUnioning": [], + "ownedUsage": [], + "ownedUseCase": [], + "ownedVerificationCase": [], + "ownedView": [], + "ownedViewpoint": [], + "owner": { + "@id": "2804aaa9-4449-549e-b85e-f731b1f46288" + }, + "owningMembership": { + "@id": "ec1d1419-e4d0-5c01-9912-c8eea72a51af" + }, + "owningNamespace": { + "@id": "2804aaa9-4449-549e-b85e-f731b1f46288" + }, + "owningRelationship": { + "@id": "ec1d1419-e4d0-5c01-9912-c8eea72a51af" + }, + "parameter": [], + "qualifiedName": "TransitionCases::Reset", + "shortName": null, + "step": [], + "textualRepresentation": [], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "999a6db2-1a16-5d27-a9d3-ca3d88587c7b", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "999a6db2-1a16-5d27-a9d3-ca3d88587c7b", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + }, + "memberElementId": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d", + "memberName": "ready", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "2804aaa9-4449-549e-b85e-f731b1f46288" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + }, + "ownedMemberElementId": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d", + "ownedMemberName": "ready", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "2804aaa9-4449-549e-b85e-f731b1f46288" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "2804aaa9-4449-549e-b85e-f731b1f46288" + }, + { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + } + ], + "shortName": null, + "source": [ + { + "@id": "2804aaa9-4449-549e-b85e-f731b1f46288" + } + ], + "target": [ + { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d", + "@type": "AttributeUsage", + "aliasIds": [], + "attributeDefinition": [ + { + "@id": "d1e9242d-b2e3-5270-bf69-4f4fb0447193" + } + ], + "chainingFeature": [], + "crossFeature": null, + "declaredName": "ready", + "declaredShortName": null, + "definition": [ + { + "@id": "d1e9242d-b2e3-5270-bf69-4f4fb0447193" + } + ], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": true, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [], + "membership": [], + "multiplicity": null, + "name": "ready", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "ceb5469d-f5cd-5c64-b09f-a43760876a65" + }, + { + "@id": "4deaf063-0c81-50f1-8745-aa59e7a351da" + } + ], + "ownedSpecialization": [ + { + "@id": "ceb5469d-f5cd-5c64-b09f-a43760876a65" + }, + { + "@id": "4deaf063-0c81-50f1-8745-aa59e7a351da" + } + ], + "ownedSubsetting": [ + { + "@id": "4deaf063-0c81-50f1-8745-aa59e7a351da" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [ + { + "@id": "ceb5469d-f5cd-5c64-b09f-a43760876a65" + } + ], + "ownedUnioning": [], + "owner": { + "@id": "2804aaa9-4449-549e-b85e-f731b1f46288" + }, + "owningDefinition": null, + "owningFeatureMembership": null, + "owningMembership": { + "@id": "999a6db2-1a16-5d27-a9d3-ca3d88587c7b" + }, + "owningNamespace": { + "@id": "2804aaa9-4449-549e-b85e-f731b1f46288" + }, + "owningRelationship": { + "@id": "999a6db2-1a16-5d27-a9d3-ca3d88587c7b" + }, + "owningType": null, + "owningUsage": null, + "qualifiedName": "TransitionCases::ready", + "shortName": null, + "textualRepresentation": [], + "type": [ + { + "@id": "d1e9242d-b2e3-5270-bf69-4f4fb0447193" + } + ], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "ceb5469d-f5cd-5c64-b09f-a43760876a65", + "@type": "FeatureTyping", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "ceb5469d-f5cd-5c64-b09f-a43760876a65", + "general": { + "@id": "d1e9242d-b2e3-5270-bf69-4f4fb0447193" + }, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + }, + "owningRelationship": null, + "owningType": { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + }, + { + "@id": "d1e9242d-b2e3-5270-bf69-4f4fb0447193" + } + ], + "shortName": null, + "source": [ + { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + } + ], + "specific": { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + }, + "target": [ + { + "@id": "d1e9242d-b2e3-5270-bf69-4f4fb0447193" + } + ], + "textualRepresentation": [], + "type": { + "@id": "d1e9242d-b2e3-5270-bf69-4f4fb0447193" + }, + "typedFeature": { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + } + }, + { + "@id": "cd4445d1-60c6-5668-9847-6a0b6e13224c", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "cd4445d1-60c6-5668-9847-6a0b6e13224c", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "memberElementId": "81fda28a-0183-5937-9618-f3bb94591956", + "memberName": "Modes", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "2804aaa9-4449-549e-b85e-f731b1f46288" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "ownedMemberElementId": "81fda28a-0183-5937-9618-f3bb94591956", + "ownedMemberName": "Modes", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "2804aaa9-4449-549e-b85e-f731b1f46288" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "2804aaa9-4449-549e-b85e-f731b1f46288" + }, + { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + } + ], + "shortName": null, + "source": [ + { + "@id": "2804aaa9-4449-549e-b85e-f731b1f46288" + } + ], + "target": [ + { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "81fda28a-0183-5937-9618-f3bb94591956", + "@type": "StateDefinition", + "action": [ + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + } + ], + "aliasIds": [], + "declaredName": "Modes", + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "doAction": null, + "documentation": [], + "elementId": "81fda28a-0183-5937-9618-f3bb94591956", + "endFeature": [], + "entryAction": null, + "exitAction": null, + "feature": [ + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + }, + { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + } + ], + "featureMembership": [ + { + "@id": "229b1763-542c-555b-83e9-ea24bb283117" + }, + { + "@id": "f33648d8-6402-558d-99ca-d29eda1c3513" + }, + { + "@id": "840632a5-1a27-5b2f-9a3b-904f15864f3d" + }, + { + "@id": "8c205049-d9e4-575a-be8f-6644af654b5b" + }, + { + "@id": "bcf38b49-bc08-5a51-a3ec-d22746acba64" + }, + { + "@id": "1abbc071-8fb4-53a0-a9ba-b46da1fb45d2" + } + ], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isConjugated": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isParallel": false, + "isSufficient": false, + "isVariation": false, + "member": [ + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + }, + { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + } + ], + "membership": [ + { + "@id": "229b1763-542c-555b-83e9-ea24bb283117" + }, + { + "@id": "f33648d8-6402-558d-99ca-d29eda1c3513" + }, + { + "@id": "840632a5-1a27-5b2f-9a3b-904f15864f3d" + }, + { + "@id": "8c205049-d9e4-575a-be8f-6644af654b5b" + }, + { + "@id": "bcf38b49-bc08-5a51-a3ec-d22746acba64" + }, + { + "@id": "1abbc071-8fb4-53a0-a9ba-b46da1fb45d2" + } + ], + "multiplicity": null, + "name": "Modes", + "output": [], + "ownedAction": [ + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + } + ], + "ownedAllocation": [], + "ownedAnalysisCase": [], + "ownedAnnotation": [], + "ownedAttribute": [], + "ownedCalculation": [], + "ownedCase": [], + "ownedConcern": [], + "ownedConjugator": null, + "ownedConnection": [ + { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + } + ], + "ownedConstraint": [], + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + }, + { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + } + ], + "ownedEndFeature": [], + "ownedEnumeration": [], + "ownedFeature": [ + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + }, + { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + } + ], + "ownedFeatureMembership": [ + { + "@id": "229b1763-542c-555b-83e9-ea24bb283117" + }, + { + "@id": "f33648d8-6402-558d-99ca-d29eda1c3513" + }, + { + "@id": "840632a5-1a27-5b2f-9a3b-904f15864f3d" + }, + { + "@id": "8c205049-d9e4-575a-be8f-6644af654b5b" + }, + { + "@id": "bcf38b49-bc08-5a51-a3ec-d22746acba64" + }, + { + "@id": "1abbc071-8fb4-53a0-a9ba-b46da1fb45d2" + } + ], + "ownedFlow": [], + "ownedImport": [], + "ownedInterface": [], + "ownedIntersecting": [], + "ownedItem": [], + "ownedMember": [ + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + }, + { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + } + ], + "ownedMembership": [ + { + "@id": "229b1763-542c-555b-83e9-ea24bb283117" + }, + { + "@id": "f33648d8-6402-558d-99ca-d29eda1c3513" + }, + { + "@id": "840632a5-1a27-5b2f-9a3b-904f15864f3d" + }, + { + "@id": "8c205049-d9e4-575a-be8f-6644af654b5b" + }, + { + "@id": "bcf38b49-bc08-5a51-a3ec-d22746acba64" + }, + { + "@id": "1abbc071-8fb4-53a0-a9ba-b46da1fb45d2" + } + ], + "ownedMetadata": [], + "ownedOccurrence": [ + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + } + ], + "ownedPart": [], + "ownedPort": [], + "ownedReference": [], + "ownedRelationship": [ + { + "@id": "229b1763-542c-555b-83e9-ea24bb283117" + }, + { + "@id": "f33648d8-6402-558d-99ca-d29eda1c3513" + }, + { + "@id": "840632a5-1a27-5b2f-9a3b-904f15864f3d" + }, + { + "@id": "8c205049-d9e4-575a-be8f-6644af654b5b" + }, + { + "@id": "bcf38b49-bc08-5a51-a3ec-d22746acba64" + }, + { + "@id": "1abbc071-8fb4-53a0-a9ba-b46da1fb45d2" + }, + { + "@id": "7db6375c-342d-53a4-b550-f257260ec578" + } + ], + "ownedRendering": [], + "ownedRequirement": [], + "ownedSpecialization": [ + { + "@id": "7db6375c-342d-53a4-b550-f257260ec578" + } + ], + "ownedState": [ + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + } + ], + "ownedSubclassification": [ + { + "@id": "7db6375c-342d-53a4-b550-f257260ec578" + } + ], + "ownedTransition": [ + { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + } + ], + "ownedUnioning": [], + "ownedUsage": [ + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + }, + { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + } + ], + "ownedUseCase": [], + "ownedVerificationCase": [], + "ownedView": [], + "ownedViewpoint": [], + "owner": { + "@id": "2804aaa9-4449-549e-b85e-f731b1f46288" + }, + "owningMembership": { + "@id": "cd4445d1-60c6-5668-9847-6a0b6e13224c" + }, + "owningNamespace": { + "@id": "2804aaa9-4449-549e-b85e-f731b1f46288" + }, + "owningRelationship": { + "@id": "cd4445d1-60c6-5668-9847-6a0b6e13224c" + }, + "parameter": [], + "qualifiedName": "TransitionCases::Modes", + "shortName": null, + "state": [ + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + } + ], + "step": [ + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + } + ], + "textualRepresentation": [], + "unioningType": [], + "usage": [ + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + }, + { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + } + ], + "variant": [], + "variantMembership": [] + }, + { + "@id": "229b1763-542c-555b-83e9-ea24bb283117", + "@type": "FeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "229b1763-542c-555b-83e9-ea24bb283117", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + "memberElementId": "eb580a55-5649-5be2-9fe7-d7e6526f0c46", + "memberName": "x", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + "ownedMemberElementId": "eb580a55-5649-5be2-9fe7-d7e6526f0c46", + "ownedMemberFeature": { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + "ownedMemberName": "x", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "owningRelationship": null, + "owningType": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + } + ], + "shortName": null, + "source": [ + { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + } + ], + "target": [ + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46", + "@type": "StateUsage", + "actionDefinition": [], + "aliasIds": [], + "behavior": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": "x", + "declaredShortName": null, + "definition": [], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "doAction": null, + "documentation": [], + "elementId": "eb580a55-5649-5be2-9fe7-d7e6526f0c46", + "endFeature": [], + "endOwningType": null, + "entryAction": null, + "exitAction": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + "featuringType": [], + "importedMembership": [], + "individualDefinition": null, + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": true, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isOrdered": false, + "isParallel": false, + "isPortion": false, + "isReference": false, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [], + "membership": [], + "multiplicity": null, + "name": "x", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "occurrenceDefinition": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "24dee6d6-1540-5fb0-955c-3f725233a22e" + } + ], + "ownedSpecialization": [ + { + "@id": "24dee6d6-1540-5fb0-955c-3f725233a22e" + } + ], + "ownedSubsetting": [ + { + "@id": "24dee6d6-1540-5fb0-955c-3f725233a22e" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "owningDefinition": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "owningFeatureMembership": { + "@id": "229b1763-542c-555b-83e9-ea24bb283117" + }, + "owningMembership": { + "@id": "229b1763-542c-555b-83e9-ea24bb283117" + }, + "owningNamespace": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "owningRelationship": { + "@id": "229b1763-542c-555b-83e9-ea24bb283117" + }, + "owningType": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "owningUsage": null, + "parameter": [], + "portionKind": null, + "qualifiedName": "TransitionCases::Modes::x", + "shortName": null, + "stateDefinition": [], + "textualRepresentation": [], + "type": [], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "f33648d8-6402-558d-99ca-d29eda1c3513", + "@type": "FeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "f33648d8-6402-558d-99ca-d29eda1c3513", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + "memberElementId": "cca4f9b5-be00-50ed-86ee-8b17efab256d", + "memberName": "y", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + "ownedMemberElementId": "cca4f9b5-be00-50ed-86ee-8b17efab256d", + "ownedMemberFeature": { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + "ownedMemberName": "y", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "owningRelationship": null, + "owningType": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + } + ], + "shortName": null, + "source": [ + { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + } + ], + "target": [ + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d", + "@type": "StateUsage", + "actionDefinition": [], + "aliasIds": [], + "behavior": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": "y", + "declaredShortName": null, + "definition": [], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "doAction": null, + "documentation": [], + "elementId": "cca4f9b5-be00-50ed-86ee-8b17efab256d", + "endFeature": [], + "endOwningType": null, + "entryAction": null, + "exitAction": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + "featuringType": [], + "importedMembership": [], + "individualDefinition": null, + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": true, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isOrdered": false, + "isParallel": false, + "isPortion": false, + "isReference": false, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [], + "membership": [], + "multiplicity": null, + "name": "y", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "occurrenceDefinition": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "d54ee9d9-436d-5cf3-80ba-a438743d3523" + } + ], + "ownedSpecialization": [ + { + "@id": "d54ee9d9-436d-5cf3-80ba-a438743d3523" + } + ], + "ownedSubsetting": [ + { + "@id": "d54ee9d9-436d-5cf3-80ba-a438743d3523" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "owningDefinition": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "owningFeatureMembership": { + "@id": "f33648d8-6402-558d-99ca-d29eda1c3513" + }, + "owningMembership": { + "@id": "f33648d8-6402-558d-99ca-d29eda1c3513" + }, + "owningNamespace": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "owningRelationship": { + "@id": "f33648d8-6402-558d-99ca-d29eda1c3513" + }, + "owningType": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "owningUsage": null, + "parameter": [], + "portionKind": null, + "qualifiedName": "TransitionCases::Modes::y", + "shortName": null, + "stateDefinition": [], + "textualRepresentation": [], + "type": [], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "840632a5-1a27-5b2f-9a3b-904f15864f3d", + "@type": "FeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "840632a5-1a27-5b2f-9a3b-904f15864f3d", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + }, + "memberElementId": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b", + "memberName": null, + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + }, + "ownedMemberElementId": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b", + "ownedMemberFeature": { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + }, + "ownedMemberName": null, + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "owningRelationship": null, + "owningType": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + } + ], + "shortName": null, + "source": [ + { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + } + ], + "target": [ + { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b", + "@type": "SuccessionAsUsage", + "aliasIds": [], + "association": [], + "chainingFeature": [], + "connectorEnd": [ + { + "@id": "847c1458-09dd-569f-9f71-c5123904d723" + }, + { + "@id": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf" + } + ], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "defaultFeaturingType": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "definition": [], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b", + "endFeature": [ + { + "@id": "847c1458-09dd-569f-9f71-c5123904d723" + }, + { + "@id": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf" + } + ], + "endOwningType": null, + "feature": [ + { + "@id": "847c1458-09dd-569f-9f71-c5123904d723" + }, + { + "@id": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf" + } + ], + "featureMembership": [ + { + "@id": "dad9cb72-dbb7-51b7-add7-f0d8b1ac65cd" + }, + { + "@id": "fe7b337d-bd02-5603-9522-028f51724737" + } + ], + "featureTarget": { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": true, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [ + { + "@id": "847c1458-09dd-569f-9f71-c5123904d723" + }, + { + "@id": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf" + } + ], + "membership": [ + { + "@id": "dad9cb72-dbb7-51b7-add7-f0d8b1ac65cd" + }, + { + "@id": "fe7b337d-bd02-5603-9522-028f51724737" + } + ], + "multiplicity": null, + "name": null, + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [ + { + "@id": "847c1458-09dd-569f-9f71-c5123904d723" + }, + { + "@id": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf" + } + ], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [ + { + "@id": "847c1458-09dd-569f-9f71-c5123904d723" + }, + { + "@id": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf" + } + ], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "847c1458-09dd-569f-9f71-c5123904d723" + }, + { + "@id": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf" + } + ], + "ownedEndFeature": [ + { + "@id": "847c1458-09dd-569f-9f71-c5123904d723" + }, + { + "@id": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf" + } + ], + "ownedFeature": [ + { + "@id": "847c1458-09dd-569f-9f71-c5123904d723" + }, + { + "@id": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf" + } + ], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [ + { + "@id": "dad9cb72-dbb7-51b7-add7-f0d8b1ac65cd" + }, + { + "@id": "fe7b337d-bd02-5603-9522-028f51724737" + } + ], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [ + { + "@id": "847c1458-09dd-569f-9f71-c5123904d723" + }, + { + "@id": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf" + } + ], + "ownedMembership": [ + { + "@id": "dad9cb72-dbb7-51b7-add7-f0d8b1ac65cd" + }, + { + "@id": "fe7b337d-bd02-5603-9522-028f51724737" + } + ], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelatedElement": [], + "ownedRelationship": [ + { + "@id": "dad9cb72-dbb7-51b7-add7-f0d8b1ac65cd" + }, + { + "@id": "fe7b337d-bd02-5603-9522-028f51724737" + }, + { + "@id": "1315343f-a477-5d77-a769-28f2c987ac02" + } + ], + "ownedSpecialization": [ + { + "@id": "1315343f-a477-5d77-a769-28f2c987ac02" + } + ], + "ownedSubsetting": [ + { + "@id": "1315343f-a477-5d77-a769-28f2c987ac02" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "owningDefinition": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "owningFeatureMembership": { + "@id": "840632a5-1a27-5b2f-9a3b-904f15864f3d" + }, + "owningMembership": { + "@id": "840632a5-1a27-5b2f-9a3b-904f15864f3d" + }, + "owningNamespace": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "owningRelatedElement": null, + "owningRelationship": { + "@id": "840632a5-1a27-5b2f-9a3b-904f15864f3d" + }, + "owningType": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "owningUsage": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "4f9ef3e3-7e26-56a4-b523-6d0684968a5d" + }, + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + } + ], + "relatedFeature": [ + { + "@id": "4f9ef3e3-7e26-56a4-b523-6d0684968a5d" + }, + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + } + ], + "shortName": null, + "source": [ + { + "@id": "4f9ef3e3-7e26-56a4-b523-6d0684968a5d" + } + ], + "sourceFeature": { + "@id": "4f9ef3e3-7e26-56a4-b523-6d0684968a5d" + }, + "target": [ + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + } + ], + "targetFeature": [ + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + } + ], + "textualRepresentation": [], + "type": [], + "unioningType": [], + "usage": [ + { + "@id": "847c1458-09dd-569f-9f71-c5123904d723" + }, + { + "@id": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf" + } + ], + "variant": [], + "variantMembership": [] + }, + { + "@id": "dad9cb72-dbb7-51b7-add7-f0d8b1ac65cd", + "@type": "EndFeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "dad9cb72-dbb7-51b7-add7-f0d8b1ac65cd", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "847c1458-09dd-569f-9f71-c5123904d723" + }, + "memberElementId": "847c1458-09dd-569f-9f71-c5123904d723", + "memberName": "earlierOccurrence", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "847c1458-09dd-569f-9f71-c5123904d723" + }, + "ownedMemberElementId": "847c1458-09dd-569f-9f71-c5123904d723", + "ownedMemberFeature": { + "@id": "847c1458-09dd-569f-9f71-c5123904d723" + }, + "ownedMemberName": "earlierOccurrence", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "847c1458-09dd-569f-9f71-c5123904d723" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + }, + "owningRelationship": null, + "owningType": { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + }, + { + "@id": "847c1458-09dd-569f-9f71-c5123904d723" + } + ], + "shortName": null, + "source": [ + { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + } + ], + "target": [ + { + "@id": "847c1458-09dd-569f-9f71-c5123904d723" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "847c1458-09dd-569f-9f71-c5123904d723", + "@type": "ReferenceUsage", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "definition": [ + { + "@id": "0f9954b1-8e58-5280-aa33-965dab2789b6" + }, + { + "@id": "80f4284e-73b1-589c-ad80-e25f33022e4f" + }, + { + "@id": "d5b4e7df-e644-5f2f-b95e-cf6f1f6c076d" + }, + { + "@id": "6e44fcc3-4ac4-5e93-a695-61791fa23309" + } + ], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "847c1458-09dd-569f-9f71-c5123904d723", + "endFeature": [], + "endOwningType": { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + }, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "847c1458-09dd-569f-9f71-c5123904d723" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": true, + "isDerived": false, + "isEnd": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": true, + "isSufficient": false, + "isUnique": true, + "isVariable": true, + "isVariation": false, + "mayTimeVary": true, + "member": [], + "membership": [], + "multiplicity": null, + "name": "earlierOccurrence", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [ + { + "@id": "65c53ffd-9757-5d1c-ab82-ae033445a662" + } + ], + "ownedReferenceSubsetting": { + "@id": "5edf40ca-6f32-5807-bf00-dc27f33be09b" + }, + "ownedRelationship": [ + { + "@id": "5edf40ca-6f32-5807-bf00-dc27f33be09b" + }, + { + "@id": "65c53ffd-9757-5d1c-ab82-ae033445a662" + } + ], + "ownedSpecialization": [ + { + "@id": "5edf40ca-6f32-5807-bf00-dc27f33be09b" + }, + { + "@id": "65c53ffd-9757-5d1c-ab82-ae033445a662" + } + ], + "ownedSubsetting": [ + { + "@id": "5edf40ca-6f32-5807-bf00-dc27f33be09b" + }, + { + "@id": "65c53ffd-9757-5d1c-ab82-ae033445a662" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + }, + "owningDefinition": null, + "owningFeatureMembership": { + "@id": "dad9cb72-dbb7-51b7-add7-f0d8b1ac65cd" + }, + "owningMembership": { + "@id": "dad9cb72-dbb7-51b7-add7-f0d8b1ac65cd" + }, + "owningNamespace": { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + }, + "owningRelationship": { + "@id": "dad9cb72-dbb7-51b7-add7-f0d8b1ac65cd" + }, + "owningType": { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + }, + "owningUsage": { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + }, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [], + "type": [ + { + "@id": "0f9954b1-8e58-5280-aa33-965dab2789b6" + }, + { + "@id": "80f4284e-73b1-589c-ad80-e25f33022e4f" + }, + { + "@id": "d5b4e7df-e644-5f2f-b95e-cf6f1f6c076d" + }, + { + "@id": "6e44fcc3-4ac4-5e93-a695-61791fa23309" + } + ], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "5edf40ca-6f32-5807-bf00-dc27f33be09b", + "@type": "ReferenceSubsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "5edf40ca-6f32-5807-bf00-dc27f33be09b", + "general": { + "@id": "4f9ef3e3-7e26-56a4-b523-6d0684968a5d" + }, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "847c1458-09dd-569f-9f71-c5123904d723" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "847c1458-09dd-569f-9f71-c5123904d723" + }, + "owningRelationship": null, + "owningType": { + "@id": "847c1458-09dd-569f-9f71-c5123904d723" + }, + "qualifiedName": null, + "referencedFeature": { + "@id": "4f9ef3e3-7e26-56a4-b523-6d0684968a5d" + }, + "referencingFeature": { + "@id": "847c1458-09dd-569f-9f71-c5123904d723" + }, + "relatedElement": [ + { + "@id": "847c1458-09dd-569f-9f71-c5123904d723" + }, + { + "@id": "4f9ef3e3-7e26-56a4-b523-6d0684968a5d" + } + ], + "shortName": null, + "source": [ + { + "@id": "847c1458-09dd-569f-9f71-c5123904d723" + } + ], + "specific": { + "@id": "847c1458-09dd-569f-9f71-c5123904d723" + }, + "subsettedFeature": { + "@id": "4f9ef3e3-7e26-56a4-b523-6d0684968a5d" + }, + "subsettingFeature": { + "@id": "847c1458-09dd-569f-9f71-c5123904d723" + }, + "target": [ + { + "@id": "4f9ef3e3-7e26-56a4-b523-6d0684968a5d" + } + ], + "textualRepresentation": [] + }, + { + "@id": "fe7b337d-bd02-5603-9522-028f51724737", + "@type": "EndFeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "fe7b337d-bd02-5603-9522-028f51724737", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf" + }, + "memberElementId": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf", + "memberName": "laterOccurrence", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf" + }, + "ownedMemberElementId": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf", + "ownedMemberFeature": { + "@id": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf" + }, + "ownedMemberName": "laterOccurrence", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + }, + "owningRelationship": null, + "owningType": { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + }, + { + "@id": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf" + } + ], + "shortName": null, + "source": [ + { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + } + ], + "target": [ + { + "@id": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf", + "@type": "ReferenceUsage", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "definition": [], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf", + "endFeature": [], + "endOwningType": { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + }, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": true, + "isDerived": false, + "isEnd": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": true, + "isSufficient": false, + "isUnique": true, + "isVariable": true, + "isVariation": false, + "mayTimeVary": true, + "member": [], + "membership": [], + "multiplicity": null, + "name": "laterOccurrence", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [ + { + "@id": "b18447d7-0dff-5bf2-b387-00cef2636883" + } + ], + "ownedReferenceSubsetting": { + "@id": "c2ef2684-3aa4-5077-877b-be60380d7948" + }, + "ownedRelationship": [ + { + "@id": "c2ef2684-3aa4-5077-877b-be60380d7948" + }, + { + "@id": "b18447d7-0dff-5bf2-b387-00cef2636883" + } + ], + "ownedSpecialization": [ + { + "@id": "c2ef2684-3aa4-5077-877b-be60380d7948" + }, + { + "@id": "b18447d7-0dff-5bf2-b387-00cef2636883" + } + ], + "ownedSubsetting": [ + { + "@id": "c2ef2684-3aa4-5077-877b-be60380d7948" + }, + { + "@id": "b18447d7-0dff-5bf2-b387-00cef2636883" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + }, + "owningDefinition": null, + "owningFeatureMembership": { + "@id": "fe7b337d-bd02-5603-9522-028f51724737" + }, + "owningMembership": { + "@id": "fe7b337d-bd02-5603-9522-028f51724737" + }, + "owningNamespace": { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + }, + "owningRelationship": { + "@id": "fe7b337d-bd02-5603-9522-028f51724737" + }, + "owningType": { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + }, + "owningUsage": { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + }, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "c2ef2684-3aa4-5077-877b-be60380d7948", + "@type": "ReferenceSubsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "c2ef2684-3aa4-5077-877b-be60380d7948", + "general": { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf" + }, + "owningRelationship": null, + "owningType": { + "@id": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf" + }, + "qualifiedName": null, + "referencedFeature": { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + "referencingFeature": { + "@id": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf" + }, + "relatedElement": [ + { + "@id": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf" + }, + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + } + ], + "shortName": null, + "source": [ + { + "@id": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf" + } + ], + "specific": { + "@id": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf" + }, + "subsettedFeature": { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + "subsettingFeature": { + "@id": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf" + }, + "target": [ + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + } + ], + "textualRepresentation": [] + }, + { + "@id": "8c205049-d9e4-575a-be8f-6644af654b5b", + "@type": "FeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "8c205049-d9e4-575a-be8f-6644af654b5b", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + "memberElementId": "f913e1e6-2fdf-57eb-b628-967530fecfb5", + "memberName": "triggered", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + "ownedMemberElementId": "f913e1e6-2fdf-57eb-b628-967530fecfb5", + "ownedMemberFeature": { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + "ownedMemberName": "triggered", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "owningRelationship": null, + "owningType": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + } + ], + "shortName": null, + "source": [ + { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + } + ], + "target": [ + { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5", + "@type": "TransitionUsage", + "actionDefinition": [], + "aliasIds": [], + "behavior": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": "triggered", + "declaredShortName": null, + "definition": [], + "differencingType": [], + "directedFeature": [ + { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28" + } + ], + "directedUsage": [ + { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28" + } + ], + "direction": null, + "documentation": [], + "effectAction": [], + "elementId": "f913e1e6-2fdf-57eb-b628-967530fecfb5", + "endFeature": [], + "endOwningType": null, + "feature": [ + { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28" + }, + { + "@id": "f6935a96-bd19-51cd-844b-2a22150106bc" + } + ], + "featureMembership": [ + { + "@id": "aca69b86-06f1-5658-90b4-b46c32734405" + }, + { + "@id": "fade24b6-075f-5ae3-a451-d9bf40661361" + } + ], + "featureTarget": { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + "featuringType": [], + "guardExpression": [], + "importedMembership": [], + "individualDefinition": null, + "inheritedFeature": [], + "inheritedMembership": [], + "input": [ + { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28" + } + ], + "intersectingType": [], + "isAbstract": false, + "isComposite": true, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": false, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [ + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28" + }, + { + "@id": "f6935a96-bd19-51cd-844b-2a22150106bc" + }, + { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + } + ], + "membership": [ + { + "@id": "cf344e9a-c723-55bb-ace5-8ae07759f54a" + }, + { + "@id": "aca69b86-06f1-5658-90b4-b46c32734405" + }, + { + "@id": "fade24b6-075f-5ae3-a451-d9bf40661361" + }, + { + "@id": "da002308-6d84-57d9-ac77-aa73e2533d7e" + } + ], + "multiplicity": null, + "name": "triggered", + "nestedAction": [ + { + "@id": "f6935a96-bd19-51cd-844b-2a22150106bc" + } + ], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [ + { + "@id": "f6935a96-bd19-51cd-844b-2a22150106bc" + } + ], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [ + { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28" + } + ], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [ + { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28" + }, + { + "@id": "f6935a96-bd19-51cd-844b-2a22150106bc" + } + ], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "occurrenceDefinition": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28" + }, + { + "@id": "f6935a96-bd19-51cd-844b-2a22150106bc" + }, + { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + } + ], + "ownedEndFeature": [], + "ownedFeature": [ + { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28" + }, + { + "@id": "f6935a96-bd19-51cd-844b-2a22150106bc" + } + ], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [ + { + "@id": "aca69b86-06f1-5658-90b4-b46c32734405" + }, + { + "@id": "fade24b6-075f-5ae3-a451-d9bf40661361" + } + ], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [ + { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28" + }, + { + "@id": "f6935a96-bd19-51cd-844b-2a22150106bc" + }, + { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + } + ], + "ownedMembership": [ + { + "@id": "cf344e9a-c723-55bb-ace5-8ae07759f54a" + }, + { + "@id": "aca69b86-06f1-5658-90b4-b46c32734405" + }, + { + "@id": "fade24b6-075f-5ae3-a451-d9bf40661361" + }, + { + "@id": "da002308-6d84-57d9-ac77-aa73e2533d7e" + } + ], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "cf344e9a-c723-55bb-ace5-8ae07759f54a" + }, + { + "@id": "aca69b86-06f1-5658-90b4-b46c32734405" + }, + { + "@id": "fade24b6-075f-5ae3-a451-d9bf40661361" + }, + { + "@id": "da002308-6d84-57d9-ac77-aa73e2533d7e" + }, + { + "@id": "691fb9b1-3d99-53aa-b53a-b9cc1f3760a5" + } + ], + "ownedSpecialization": [ + { + "@id": "691fb9b1-3d99-53aa-b53a-b9cc1f3760a5" + } + ], + "ownedSubsetting": [ + { + "@id": "691fb9b1-3d99-53aa-b53a-b9cc1f3760a5" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "owningDefinition": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "owningFeatureMembership": { + "@id": "8c205049-d9e4-575a-be8f-6644af654b5b" + }, + "owningMembership": { + "@id": "8c205049-d9e4-575a-be8f-6644af654b5b" + }, + "owningNamespace": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "owningRelationship": { + "@id": "8c205049-d9e4-575a-be8f-6644af654b5b" + }, + "owningType": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "owningUsage": null, + "parameter": [ + { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28" + } + ], + "portionKind": null, + "qualifiedName": "TransitionCases::Modes::triggered", + "shortName": null, + "source": { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + "succession": { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + }, + "target": { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + "textualRepresentation": [], + "triggerAction": [ + { + "@id": "f6935a96-bd19-51cd-844b-2a22150106bc" + } + ], + "type": [], + "unioningType": [], + "usage": [ + { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28" + }, + { + "@id": "f6935a96-bd19-51cd-844b-2a22150106bc" + } + ], + "variant": [], + "variantMembership": [] + }, + { + "@id": "cf344e9a-c723-55bb-ace5-8ae07759f54a", + "@type": "Membership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "cf344e9a-c723-55bb-ace5-8ae07759f54a", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + "memberElementId": "eb580a55-5649-5be2-9fe7-d7e6526f0c46", + "memberName": "x", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + } + ], + "shortName": null, + "source": [ + { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + } + ], + "target": [ + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "aca69b86-06f1-5658-90b4-b46c32734405", + "@type": "ParameterMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "aca69b86-06f1-5658-90b4-b46c32734405", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28" + }, + "memberElementId": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28", + "memberName": null, + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28" + }, + "ownedMemberElementId": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28", + "ownedMemberFeature": { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28" + }, + "ownedMemberName": "transitionLinkSource", + "ownedMemberParameter": { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28" + }, + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + "owningRelationship": null, + "owningType": { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28" + } + ], + "shortName": null, + "source": [ + { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + } + ], + "target": [ + { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28", + "@type": "ReferenceUsage", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "definition": [], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": "in", + "documentation": [], + "elementId": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": true, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [], + "membership": [], + "multiplicity": null, + "name": "transitionLinkSource", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [ + { + "@id": "c01dc9ac-2caa-5b82-9dcf-74aa8d3cb2f5" + } + ], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "eeda4c5c-673e-5581-af35-b2f8442a490f" + }, + { + "@id": "c01dc9ac-2caa-5b82-9dcf-74aa8d3cb2f5" + } + ], + "ownedSpecialization": [ + { + "@id": "eeda4c5c-673e-5581-af35-b2f8442a490f" + }, + { + "@id": "c01dc9ac-2caa-5b82-9dcf-74aa8d3cb2f5" + } + ], + "ownedSubsetting": [ + { + "@id": "eeda4c5c-673e-5581-af35-b2f8442a490f" + }, + { + "@id": "c01dc9ac-2caa-5b82-9dcf-74aa8d3cb2f5" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + "owningDefinition": null, + "owningFeatureMembership": { + "@id": "aca69b86-06f1-5658-90b4-b46c32734405" + }, + "owningMembership": { + "@id": "aca69b86-06f1-5658-90b4-b46c32734405" + }, + "owningNamespace": { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + "owningRelationship": { + "@id": "aca69b86-06f1-5658-90b4-b46c32734405" + }, + "owningType": { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + "owningUsage": { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + "qualifiedName": "TransitionCases::Modes::triggered::transitionLinkSource", + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "fade24b6-075f-5ae3-a451-d9bf40661361", + "@type": "TransitionFeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "fade24b6-075f-5ae3-a451-d9bf40661361", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "kind": "trigger", + "memberElement": { + "@id": "f6935a96-bd19-51cd-844b-2a22150106bc" + }, + "memberElementId": "f6935a96-bd19-51cd-844b-2a22150106bc", + "memberName": "accepter", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "f6935a96-bd19-51cd-844b-2a22150106bc" + }, + "ownedMemberElementId": "f6935a96-bd19-51cd-844b-2a22150106bc", + "ownedMemberFeature": { + "@id": "f6935a96-bd19-51cd-844b-2a22150106bc" + }, + "ownedMemberName": "accepter", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "f6935a96-bd19-51cd-844b-2a22150106bc" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + "owningRelationship": null, + "owningType": { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + { + "@id": "f6935a96-bd19-51cd-844b-2a22150106bc" + } + ], + "shortName": null, + "source": [ + { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + } + ], + "target": [ + { + "@id": "f6935a96-bd19-51cd-844b-2a22150106bc" + } + ], + "textualRepresentation": [], + "transitionFeature": { + "@id": "f6935a96-bd19-51cd-844b-2a22150106bc" + }, + "visibility": "public" + }, + { + "@id": "f6935a96-bd19-51cd-844b-2a22150106bc", + "@type": "AcceptActionUsage", + "actionDefinition": [], + "aliasIds": [], + "behavior": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "definition": [], + "differencingType": [], + "directedFeature": [ + { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + } + ], + "directedUsage": [ + { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + } + ], + "direction": null, + "documentation": [], + "elementId": "f6935a96-bd19-51cd-844b-2a22150106bc", + "endFeature": [], + "endOwningType": null, + "feature": [ + { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + } + ], + "featureMembership": [ + { + "@id": "423271e9-8f4a-587e-bf0b-12abbcde6d1b" + } + ], + "featureTarget": { + "@id": "f6935a96-bd19-51cd-844b-2a22150106bc" + }, + "featuringType": [], + "importedMembership": [], + "individualDefinition": null, + "inheritedFeature": [], + "inheritedMembership": [], + "input": [ + { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + } + ], + "intersectingType": [], + "isAbstract": false, + "isComposite": true, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": false, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [ + { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + } + ], + "membership": [ + { + "@id": "423271e9-8f4a-587e-bf0b-12abbcde6d1b" + } + ], + "multiplicity": null, + "name": "accepter", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [ + { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + } + ], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [ + { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + } + ], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "occurrenceDefinition": [], + "output": [ + { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + } + ], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + } + ], + "ownedEndFeature": [], + "ownedFeature": [ + { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + } + ], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [ + { + "@id": "423271e9-8f4a-587e-bf0b-12abbcde6d1b" + } + ], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [ + { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + } + ], + "ownedMembership": [ + { + "@id": "423271e9-8f4a-587e-bf0b-12abbcde6d1b" + } + ], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "423271e9-8f4a-587e-bf0b-12abbcde6d1b" + }, + { + "@id": "8ae173ab-9735-512f-9341-10bed354c9d6" + } + ], + "ownedSpecialization": [ + { + "@id": "8ae173ab-9735-512f-9341-10bed354c9d6" + } + ], + "ownedSubsetting": [ + { + "@id": "8ae173ab-9735-512f-9341-10bed354c9d6" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + "owningDefinition": null, + "owningFeatureMembership": { + "@id": "fade24b6-075f-5ae3-a451-d9bf40661361" + }, + "owningMembership": { + "@id": "fade24b6-075f-5ae3-a451-d9bf40661361" + }, + "owningNamespace": { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + "owningRelationship": { + "@id": "fade24b6-075f-5ae3-a451-d9bf40661361" + }, + "owningType": { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + "owningUsage": { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + "parameter": [ + { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + } + ], + "payloadArgument": null, + "payloadParameter": { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + }, + "portionKind": null, + "qualifiedName": "TransitionCases::Modes::triggered::accepter", + "receiverArgument": null, + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [], + "usage": [ + { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + } + ], + "variant": [], + "variantMembership": [] + }, + { + "@id": "423271e9-8f4a-587e-bf0b-12abbcde6d1b", + "@type": "ParameterMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "423271e9-8f4a-587e-bf0b-12abbcde6d1b", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + }, + "memberElementId": "14a059af-4d3b-5a44-8cb9-f48028c36af9", + "memberName": "payload", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "f6935a96-bd19-51cd-844b-2a22150106bc" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + }, + "ownedMemberElementId": "14a059af-4d3b-5a44-8cb9-f48028c36af9", + "ownedMemberFeature": { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + }, + "ownedMemberName": "payload", + "ownedMemberParameter": { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + }, + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "f6935a96-bd19-51cd-844b-2a22150106bc" + }, + "owningRelationship": null, + "owningType": { + "@id": "f6935a96-bd19-51cd-844b-2a22150106bc" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "f6935a96-bd19-51cd-844b-2a22150106bc" + }, + { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + } + ], + "shortName": null, + "source": [ + { + "@id": "f6935a96-bd19-51cd-844b-2a22150106bc" + } + ], + "target": [ + { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9", + "@type": "ReferenceUsage", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "definition": [ + { + "@id": "93867435-c2c2-584f-9288-378804b1674c" + } + ], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": "inout", + "documentation": [], + "elementId": "14a059af-4d3b-5a44-8cb9-f48028c36af9", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": true, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [], + "membership": [], + "multiplicity": null, + "name": "payload", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [ + { + "@id": "3548912e-7dd4-52f5-bfc9-acef23f01b9f" + } + ], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "47ce379b-9a90-5ca6-8bb1-b21955575fdc" + }, + { + "@id": "7f30f3e7-5ea2-5518-9ad4-3cc03f55446d" + }, + { + "@id": "3548912e-7dd4-52f5-bfc9-acef23f01b9f" + } + ], + "ownedSpecialization": [ + { + "@id": "47ce379b-9a90-5ca6-8bb1-b21955575fdc" + }, + { + "@id": "7f30f3e7-5ea2-5518-9ad4-3cc03f55446d" + }, + { + "@id": "3548912e-7dd4-52f5-bfc9-acef23f01b9f" + } + ], + "ownedSubsetting": [ + { + "@id": "7f30f3e7-5ea2-5518-9ad4-3cc03f55446d" + }, + { + "@id": "3548912e-7dd4-52f5-bfc9-acef23f01b9f" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [ + { + "@id": "47ce379b-9a90-5ca6-8bb1-b21955575fdc" + } + ], + "ownedUnioning": [], + "owner": { + "@id": "f6935a96-bd19-51cd-844b-2a22150106bc" + }, + "owningDefinition": null, + "owningFeatureMembership": { + "@id": "423271e9-8f4a-587e-bf0b-12abbcde6d1b" + }, + "owningMembership": { + "@id": "423271e9-8f4a-587e-bf0b-12abbcde6d1b" + }, + "owningNamespace": { + "@id": "f6935a96-bd19-51cd-844b-2a22150106bc" + }, + "owningRelationship": { + "@id": "423271e9-8f4a-587e-bf0b-12abbcde6d1b" + }, + "owningType": { + "@id": "f6935a96-bd19-51cd-844b-2a22150106bc" + }, + "owningUsage": { + "@id": "f6935a96-bd19-51cd-844b-2a22150106bc" + }, + "qualifiedName": "TransitionCases::Modes::triggered::accepter::payload", + "shortName": null, + "textualRepresentation": [], + "type": [ + { + "@id": "93867435-c2c2-584f-9288-378804b1674c" + } + ], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "47ce379b-9a90-5ca6-8bb1-b21955575fdc", + "@type": "FeatureTyping", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "47ce379b-9a90-5ca6-8bb1-b21955575fdc", + "general": { + "@id": "93867435-c2c2-584f-9288-378804b1674c" + }, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + }, + "owningRelationship": null, + "owningType": { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + }, + { + "@id": "93867435-c2c2-584f-9288-378804b1674c" + } + ], + "shortName": null, + "source": [ + { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + } + ], + "specific": { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + }, + "target": [ + { + "@id": "93867435-c2c2-584f-9288-378804b1674c" + } + ], + "textualRepresentation": [], + "type": { + "@id": "93867435-c2c2-584f-9288-378804b1674c" + }, + "typedFeature": { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + } + }, + { + "@id": "da002308-6d84-57d9-ac77-aa73e2533d7e", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "da002308-6d84-57d9-ac77-aa73e2533d7e", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + }, + "memberElementId": "84b85b32-2e9a-5718-bb6a-428ab490d1de", + "memberName": null, + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + }, + "ownedMemberElementId": "84b85b32-2e9a-5718-bb6a-428ab490d1de", + "ownedMemberName": null, + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + } + ], + "shortName": null, + "source": [ + { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + } + ], + "target": [ + { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de", + "@type": "SuccessionAsUsage", + "aliasIds": [], + "association": [], + "chainingFeature": [], + "connectorEnd": [ + { + "@id": "99957371-03b3-5a8c-892c-a3bef51b298c" + }, + { + "@id": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f" + } + ], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "defaultFeaturingType": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "definition": [], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "84b85b32-2e9a-5718-bb6a-428ab490d1de", + "endFeature": [ + { + "@id": "99957371-03b3-5a8c-892c-a3bef51b298c" + }, + { + "@id": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f" + } + ], + "endOwningType": null, + "feature": [ + { + "@id": "99957371-03b3-5a8c-892c-a3bef51b298c" + }, + { + "@id": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f" + } + ], + "featureMembership": [ + { + "@id": "f8720fef-526e-5254-9df6-afa8ae85d8d4" + }, + { + "@id": "d8b9642d-77d6-5fb1-96b3-85a090ff2f57" + } + ], + "featureTarget": { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": true, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [ + { + "@id": "99957371-03b3-5a8c-892c-a3bef51b298c" + }, + { + "@id": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f" + } + ], + "membership": [ + { + "@id": "f8720fef-526e-5254-9df6-afa8ae85d8d4" + }, + { + "@id": "d8b9642d-77d6-5fb1-96b3-85a090ff2f57" + } + ], + "multiplicity": null, + "name": null, + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [ + { + "@id": "99957371-03b3-5a8c-892c-a3bef51b298c" + }, + { + "@id": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f" + } + ], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [ + { + "@id": "99957371-03b3-5a8c-892c-a3bef51b298c" + }, + { + "@id": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f" + } + ], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "99957371-03b3-5a8c-892c-a3bef51b298c" + }, + { + "@id": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f" + } + ], + "ownedEndFeature": [ + { + "@id": "99957371-03b3-5a8c-892c-a3bef51b298c" + }, + { + "@id": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f" + } + ], + "ownedFeature": [ + { + "@id": "99957371-03b3-5a8c-892c-a3bef51b298c" + }, + { + "@id": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f" + } + ], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [ + { + "@id": "f8720fef-526e-5254-9df6-afa8ae85d8d4" + }, + { + "@id": "d8b9642d-77d6-5fb1-96b3-85a090ff2f57" + } + ], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [ + { + "@id": "99957371-03b3-5a8c-892c-a3bef51b298c" + }, + { + "@id": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f" + } + ], + "ownedMembership": [ + { + "@id": "f8720fef-526e-5254-9df6-afa8ae85d8d4" + }, + { + "@id": "d8b9642d-77d6-5fb1-96b3-85a090ff2f57" + } + ], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelatedElement": [], + "ownedRelationship": [ + { + "@id": "f8720fef-526e-5254-9df6-afa8ae85d8d4" + }, + { + "@id": "d8b9642d-77d6-5fb1-96b3-85a090ff2f57" + }, + { + "@id": "324ee4f2-385a-5d20-8fbe-a2b3594ae77b" + } + ], + "ownedSpecialization": [ + { + "@id": "324ee4f2-385a-5d20-8fbe-a2b3594ae77b" + } + ], + "ownedSubsetting": [ + { + "@id": "324ee4f2-385a-5d20-8fbe-a2b3594ae77b" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + "owningDefinition": null, + "owningFeatureMembership": null, + "owningMembership": { + "@id": "da002308-6d84-57d9-ac77-aa73e2533d7e" + }, + "owningNamespace": { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + "owningRelatedElement": null, + "owningRelationship": { + "@id": "da002308-6d84-57d9-ac77-aa73e2533d7e" + }, + "owningType": null, + "owningUsage": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + } + ], + "relatedFeature": [ + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + } + ], + "shortName": null, + "source": [ + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + } + ], + "sourceFeature": { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + "target": [ + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + } + ], + "targetFeature": [ + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + } + ], + "textualRepresentation": [], + "type": [], + "unioningType": [], + "usage": [ + { + "@id": "99957371-03b3-5a8c-892c-a3bef51b298c" + }, + { + "@id": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f" + } + ], + "variant": [], + "variantMembership": [] + }, + { + "@id": "f8720fef-526e-5254-9df6-afa8ae85d8d4", + "@type": "EndFeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "f8720fef-526e-5254-9df6-afa8ae85d8d4", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "99957371-03b3-5a8c-892c-a3bef51b298c" + }, + "memberElementId": "99957371-03b3-5a8c-892c-a3bef51b298c", + "memberName": "earlierOccurrence", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "99957371-03b3-5a8c-892c-a3bef51b298c" + }, + "ownedMemberElementId": "99957371-03b3-5a8c-892c-a3bef51b298c", + "ownedMemberFeature": { + "@id": "99957371-03b3-5a8c-892c-a3bef51b298c" + }, + "ownedMemberName": "earlierOccurrence", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "99957371-03b3-5a8c-892c-a3bef51b298c" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + }, + "owningRelationship": null, + "owningType": { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + }, + { + "@id": "99957371-03b3-5a8c-892c-a3bef51b298c" + } + ], + "shortName": null, + "source": [ + { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + } + ], + "target": [ + { + "@id": "99957371-03b3-5a8c-892c-a3bef51b298c" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "99957371-03b3-5a8c-892c-a3bef51b298c", + "@type": "ReferenceUsage", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "definition": [], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "99957371-03b3-5a8c-892c-a3bef51b298c", + "endFeature": [], + "endOwningType": { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + }, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "99957371-03b3-5a8c-892c-a3bef51b298c" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": true, + "isDerived": false, + "isEnd": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": true, + "isSufficient": false, + "isUnique": true, + "isVariable": true, + "isVariation": false, + "mayTimeVary": true, + "member": [], + "membership": [], + "multiplicity": null, + "name": "earlierOccurrence", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [ + { + "@id": "d627471b-a3f9-5d6b-bb0b-d458e748936c" + } + ], + "ownedReferenceSubsetting": { + "@id": "bc019a85-a7bf-5648-8587-a6a06cb56812" + }, + "ownedRelationship": [ + { + "@id": "bc019a85-a7bf-5648-8587-a6a06cb56812" + }, + { + "@id": "d627471b-a3f9-5d6b-bb0b-d458e748936c" + } + ], + "ownedSpecialization": [ + { + "@id": "bc019a85-a7bf-5648-8587-a6a06cb56812" + }, + { + "@id": "d627471b-a3f9-5d6b-bb0b-d458e748936c" + } + ], + "ownedSubsetting": [ + { + "@id": "bc019a85-a7bf-5648-8587-a6a06cb56812" + }, + { + "@id": "d627471b-a3f9-5d6b-bb0b-d458e748936c" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + }, + "owningDefinition": null, + "owningFeatureMembership": { + "@id": "f8720fef-526e-5254-9df6-afa8ae85d8d4" + }, + "owningMembership": { + "@id": "f8720fef-526e-5254-9df6-afa8ae85d8d4" + }, + "owningNamespace": { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + }, + "owningRelationship": { + "@id": "f8720fef-526e-5254-9df6-afa8ae85d8d4" + }, + "owningType": { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + }, + "owningUsage": { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + }, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "d8b9642d-77d6-5fb1-96b3-85a090ff2f57", + "@type": "EndFeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "d8b9642d-77d6-5fb1-96b3-85a090ff2f57", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f" + }, + "memberElementId": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f", + "memberName": "laterOccurrence", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f" + }, + "ownedMemberElementId": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f", + "ownedMemberFeature": { + "@id": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f" + }, + "ownedMemberName": "laterOccurrence", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + }, + "owningRelationship": null, + "owningType": { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + }, + { + "@id": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f" + } + ], + "shortName": null, + "source": [ + { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + } + ], + "target": [ + { + "@id": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f", + "@type": "ReferenceUsage", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "definition": [], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f", + "endFeature": [], + "endOwningType": { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + }, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": true, + "isDerived": false, + "isEnd": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": true, + "isSufficient": false, + "isUnique": true, + "isVariable": true, + "isVariation": false, + "mayTimeVary": true, + "member": [], + "membership": [], + "multiplicity": null, + "name": "laterOccurrence", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [ + { + "@id": "1eae1db4-3568-5414-8023-f35ab74d5c1e" + } + ], + "ownedReferenceSubsetting": { + "@id": "12b54611-a6ce-5a86-b2f8-50e687e4afe1" + }, + "ownedRelationship": [ + { + "@id": "12b54611-a6ce-5a86-b2f8-50e687e4afe1" + }, + { + "@id": "1eae1db4-3568-5414-8023-f35ab74d5c1e" + } + ], + "ownedSpecialization": [ + { + "@id": "12b54611-a6ce-5a86-b2f8-50e687e4afe1" + }, + { + "@id": "1eae1db4-3568-5414-8023-f35ab74d5c1e" + } + ], + "ownedSubsetting": [ + { + "@id": "12b54611-a6ce-5a86-b2f8-50e687e4afe1" + }, + { + "@id": "1eae1db4-3568-5414-8023-f35ab74d5c1e" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + }, + "owningDefinition": null, + "owningFeatureMembership": { + "@id": "d8b9642d-77d6-5fb1-96b3-85a090ff2f57" + }, + "owningMembership": { + "@id": "d8b9642d-77d6-5fb1-96b3-85a090ff2f57" + }, + "owningNamespace": { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + }, + "owningRelationship": { + "@id": "d8b9642d-77d6-5fb1-96b3-85a090ff2f57" + }, + "owningType": { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + }, + "owningUsage": { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + }, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "12b54611-a6ce-5a86-b2f8-50e687e4afe1", + "@type": "ReferenceSubsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "12b54611-a6ce-5a86-b2f8-50e687e4afe1", + "general": { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f" + }, + "owningRelationship": null, + "owningType": { + "@id": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f" + }, + "qualifiedName": null, + "referencedFeature": { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + "referencingFeature": { + "@id": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f" + }, + "relatedElement": [ + { + "@id": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f" + }, + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + } + ], + "shortName": null, + "source": [ + { + "@id": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f" + } + ], + "specific": { + "@id": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f" + }, + "subsettedFeature": { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + "subsettingFeature": { + "@id": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f" + }, + "target": [ + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + } + ], + "textualRepresentation": [] + }, + { + "@id": "bcf38b49-bc08-5a51-a3ec-d22746acba64", + "@type": "FeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "bcf38b49-bc08-5a51-a3ec-d22746acba64", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + "memberElementId": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee", + "memberName": "guarded", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + "ownedMemberElementId": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee", + "ownedMemberFeature": { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + "ownedMemberName": "guarded", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "owningRelationship": null, + "owningType": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + } + ], + "shortName": null, + "source": [ + { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + } + ], + "target": [ + { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee", + "@type": "TransitionUsage", + "actionDefinition": [], + "aliasIds": [], + "behavior": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": "guarded", + "declaredShortName": null, + "definition": [], + "differencingType": [], + "directedFeature": [ + { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a" + } + ], + "directedUsage": [ + { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a" + } + ], + "direction": null, + "documentation": [], + "effectAction": [], + "elementId": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee", + "endFeature": [], + "endOwningType": null, + "feature": [ + { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a" + }, + { + "@id": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac" + }, + { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + } + ], + "featureMembership": [ + { + "@id": "6d22d6a8-e734-5e31-b4fb-19fcf6c96140" + }, + { + "@id": "6f069f5e-0260-5ece-b258-087e743c541a" + }, + { + "@id": "f58c3057-4717-5e8c-8dc9-7d7d1a344953" + } + ], + "featureTarget": { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + "featuringType": [], + "guardExpression": [ + { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + } + ], + "importedMembership": [], + "individualDefinition": null, + "inheritedFeature": [], + "inheritedMembership": [], + "input": [ + { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a" + } + ], + "intersectingType": [], + "isAbstract": false, + "isComposite": true, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": false, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [ + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a" + }, + { + "@id": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac" + }, + { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + }, + { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + } + ], + "membership": [ + { + "@id": "f4d8dbe5-5add-523b-ba04-806d861fcdbf" + }, + { + "@id": "6d22d6a8-e734-5e31-b4fb-19fcf6c96140" + }, + { + "@id": "6f069f5e-0260-5ece-b258-087e743c541a" + }, + { + "@id": "f58c3057-4717-5e8c-8dc9-7d7d1a344953" + }, + { + "@id": "29c386df-d73a-5b63-b021-3138bc7bf931" + } + ], + "multiplicity": null, + "name": "guarded", + "nestedAction": [ + { + "@id": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac" + } + ], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [ + { + "@id": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac" + } + ], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [ + { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a" + } + ], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [ + { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a" + }, + { + "@id": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac" + } + ], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "occurrenceDefinition": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a" + }, + { + "@id": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac" + }, + { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + }, + { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + } + ], + "ownedEndFeature": [], + "ownedFeature": [ + { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a" + }, + { + "@id": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac" + }, + { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + } + ], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [ + { + "@id": "6d22d6a8-e734-5e31-b4fb-19fcf6c96140" + }, + { + "@id": "6f069f5e-0260-5ece-b258-087e743c541a" + }, + { + "@id": "f58c3057-4717-5e8c-8dc9-7d7d1a344953" + } + ], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [ + { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a" + }, + { + "@id": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac" + }, + { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + }, + { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + } + ], + "ownedMembership": [ + { + "@id": "f4d8dbe5-5add-523b-ba04-806d861fcdbf" + }, + { + "@id": "6d22d6a8-e734-5e31-b4fb-19fcf6c96140" + }, + { + "@id": "6f069f5e-0260-5ece-b258-087e743c541a" + }, + { + "@id": "f58c3057-4717-5e8c-8dc9-7d7d1a344953" + }, + { + "@id": "29c386df-d73a-5b63-b021-3138bc7bf931" + } + ], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "f4d8dbe5-5add-523b-ba04-806d861fcdbf" + }, + { + "@id": "6d22d6a8-e734-5e31-b4fb-19fcf6c96140" + }, + { + "@id": "6f069f5e-0260-5ece-b258-087e743c541a" + }, + { + "@id": "f58c3057-4717-5e8c-8dc9-7d7d1a344953" + }, + { + "@id": "29c386df-d73a-5b63-b021-3138bc7bf931" + }, + { + "@id": "957cb8ea-92cc-5244-a909-fafdccd08c8c" + } + ], + "ownedSpecialization": [ + { + "@id": "957cb8ea-92cc-5244-a909-fafdccd08c8c" + } + ], + "ownedSubsetting": [ + { + "@id": "957cb8ea-92cc-5244-a909-fafdccd08c8c" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "owningDefinition": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "owningFeatureMembership": { + "@id": "bcf38b49-bc08-5a51-a3ec-d22746acba64" + }, + "owningMembership": { + "@id": "bcf38b49-bc08-5a51-a3ec-d22746acba64" + }, + "owningNamespace": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "owningRelationship": { + "@id": "bcf38b49-bc08-5a51-a3ec-d22746acba64" + }, + "owningType": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "owningUsage": null, + "parameter": [ + { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a" + } + ], + "portionKind": null, + "qualifiedName": "TransitionCases::Modes::guarded", + "shortName": null, + "source": { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + "succession": { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + }, + "target": { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + "textualRepresentation": [], + "triggerAction": [ + { + "@id": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac" + } + ], + "type": [], + "unioningType": [], + "usage": [ + { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a" + }, + { + "@id": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac" + } + ], + "variant": [], + "variantMembership": [] + }, + { + "@id": "f4d8dbe5-5add-523b-ba04-806d861fcdbf", + "@type": "Membership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "f4d8dbe5-5add-523b-ba04-806d861fcdbf", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + "memberElementId": "cca4f9b5-be00-50ed-86ee-8b17efab256d", + "memberName": "y", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + } + ], + "shortName": null, + "source": [ + { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + } + ], + "target": [ + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "6d22d6a8-e734-5e31-b4fb-19fcf6c96140", + "@type": "ParameterMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "6d22d6a8-e734-5e31-b4fb-19fcf6c96140", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a" + }, + "memberElementId": "85a278ad-aed1-54ec-be04-11e9f72daa5a", + "memberName": null, + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a" + }, + "ownedMemberElementId": "85a278ad-aed1-54ec-be04-11e9f72daa5a", + "ownedMemberFeature": { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a" + }, + "ownedMemberName": "transitionLinkSource", + "ownedMemberParameter": { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a" + }, + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + "owningRelationship": null, + "owningType": { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a" + } + ], + "shortName": null, + "source": [ + { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + } + ], + "target": [ + { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a", + "@type": "ReferenceUsage", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "definition": [], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": "in", + "documentation": [], + "elementId": "85a278ad-aed1-54ec-be04-11e9f72daa5a", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": true, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [], + "membership": [], + "multiplicity": null, + "name": "transitionLinkSource", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [ + { + "@id": "20539639-4f71-5bee-81d5-ccc04b72bb08" + } + ], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "8cc6b285-b341-5e87-b1de-dc954e0f18c4" + }, + { + "@id": "20539639-4f71-5bee-81d5-ccc04b72bb08" + } + ], + "ownedSpecialization": [ + { + "@id": "8cc6b285-b341-5e87-b1de-dc954e0f18c4" + }, + { + "@id": "20539639-4f71-5bee-81d5-ccc04b72bb08" + } + ], + "ownedSubsetting": [ + { + "@id": "8cc6b285-b341-5e87-b1de-dc954e0f18c4" + }, + { + "@id": "20539639-4f71-5bee-81d5-ccc04b72bb08" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + "owningDefinition": null, + "owningFeatureMembership": { + "@id": "6d22d6a8-e734-5e31-b4fb-19fcf6c96140" + }, + "owningMembership": { + "@id": "6d22d6a8-e734-5e31-b4fb-19fcf6c96140" + }, + "owningNamespace": { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + "owningRelationship": { + "@id": "6d22d6a8-e734-5e31-b4fb-19fcf6c96140" + }, + "owningType": { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + "owningUsage": { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + "qualifiedName": "TransitionCases::Modes::guarded::transitionLinkSource", + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "6f069f5e-0260-5ece-b258-087e743c541a", + "@type": "TransitionFeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "6f069f5e-0260-5ece-b258-087e743c541a", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "kind": "trigger", + "memberElement": { + "@id": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac" + }, + "memberElementId": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac", + "memberName": "accepter", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac" + }, + "ownedMemberElementId": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac", + "ownedMemberFeature": { + "@id": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac" + }, + "ownedMemberName": "accepter", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + "owningRelationship": null, + "owningType": { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + { + "@id": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac" + } + ], + "shortName": null, + "source": [ + { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + } + ], + "target": [ + { + "@id": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac" + } + ], + "textualRepresentation": [], + "transitionFeature": { + "@id": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac" + }, + "visibility": "public" + }, + { + "@id": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac", + "@type": "AcceptActionUsage", + "actionDefinition": [], + "aliasIds": [], + "behavior": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "definition": [], + "differencingType": [], + "directedFeature": [ + { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + } + ], + "directedUsage": [ + { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + } + ], + "direction": null, + "documentation": [], + "elementId": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac", + "endFeature": [], + "endOwningType": null, + "feature": [ + { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + } + ], + "featureMembership": [ + { + "@id": "0fe9103d-8440-5c26-affb-3575f74e9682" + } + ], + "featureTarget": { + "@id": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac" + }, + "featuringType": [], + "importedMembership": [], + "individualDefinition": null, + "inheritedFeature": [], + "inheritedMembership": [], + "input": [ + { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + } + ], + "intersectingType": [], + "isAbstract": false, + "isComposite": true, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": false, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [ + { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + } + ], + "membership": [ + { + "@id": "0fe9103d-8440-5c26-affb-3575f74e9682" + } + ], + "multiplicity": null, + "name": "accepter", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [ + { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + } + ], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [ + { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + } + ], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "occurrenceDefinition": [], + "output": [ + { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + } + ], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + } + ], + "ownedEndFeature": [], + "ownedFeature": [ + { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + } + ], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [ + { + "@id": "0fe9103d-8440-5c26-affb-3575f74e9682" + } + ], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [ + { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + } + ], + "ownedMembership": [ + { + "@id": "0fe9103d-8440-5c26-affb-3575f74e9682" + } + ], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "0fe9103d-8440-5c26-affb-3575f74e9682" + }, + { + "@id": "cd462f79-ba27-5a3a-9c17-5ce1566a11a1" + } + ], + "ownedSpecialization": [ + { + "@id": "cd462f79-ba27-5a3a-9c17-5ce1566a11a1" + } + ], + "ownedSubsetting": [ + { + "@id": "cd462f79-ba27-5a3a-9c17-5ce1566a11a1" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + "owningDefinition": null, + "owningFeatureMembership": { + "@id": "6f069f5e-0260-5ece-b258-087e743c541a" + }, + "owningMembership": { + "@id": "6f069f5e-0260-5ece-b258-087e743c541a" + }, + "owningNamespace": { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + "owningRelationship": { + "@id": "6f069f5e-0260-5ece-b258-087e743c541a" + }, + "owningType": { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + "owningUsage": { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + "parameter": [ + { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + } + ], + "payloadArgument": null, + "payloadParameter": { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + }, + "portionKind": null, + "qualifiedName": "TransitionCases::Modes::guarded::accepter", + "receiverArgument": null, + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [], + "usage": [ + { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + } + ], + "variant": [], + "variantMembership": [] + }, + { + "@id": "0fe9103d-8440-5c26-affb-3575f74e9682", + "@type": "ParameterMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "0fe9103d-8440-5c26-affb-3575f74e9682", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + }, + "memberElementId": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a", + "memberName": "payload", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + }, + "ownedMemberElementId": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a", + "ownedMemberFeature": { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + }, + "ownedMemberName": "payload", + "ownedMemberParameter": { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + }, + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac" + }, + "owningRelationship": null, + "owningType": { + "@id": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac" + }, + { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + } + ], + "shortName": null, + "source": [ + { + "@id": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac" + } + ], + "target": [ + { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a", + "@type": "ReferenceUsage", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "definition": [ + { + "@id": "93867435-c2c2-584f-9288-378804b1674c" + } + ], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": "inout", + "documentation": [], + "elementId": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": true, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [], + "membership": [], + "multiplicity": null, + "name": "payload", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [ + { + "@id": "24bec017-4527-55fd-85b1-d9e6e5072f81" + } + ], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "2a67f9da-5213-513b-a38c-3b8d1c8e0e03" + }, + { + "@id": "232484ae-2333-5e06-a1ff-0d64215a4466" + }, + { + "@id": "24bec017-4527-55fd-85b1-d9e6e5072f81" + } + ], + "ownedSpecialization": [ + { + "@id": "2a67f9da-5213-513b-a38c-3b8d1c8e0e03" + }, + { + "@id": "232484ae-2333-5e06-a1ff-0d64215a4466" + }, + { + "@id": "24bec017-4527-55fd-85b1-d9e6e5072f81" + } + ], + "ownedSubsetting": [ + { + "@id": "232484ae-2333-5e06-a1ff-0d64215a4466" + }, + { + "@id": "24bec017-4527-55fd-85b1-d9e6e5072f81" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [ + { + "@id": "2a67f9da-5213-513b-a38c-3b8d1c8e0e03" + } + ], + "ownedUnioning": [], + "owner": { + "@id": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac" + }, + "owningDefinition": null, + "owningFeatureMembership": { + "@id": "0fe9103d-8440-5c26-affb-3575f74e9682" + }, + "owningMembership": { + "@id": "0fe9103d-8440-5c26-affb-3575f74e9682" + }, + "owningNamespace": { + "@id": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac" + }, + "owningRelationship": { + "@id": "0fe9103d-8440-5c26-affb-3575f74e9682" + }, + "owningType": { + "@id": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac" + }, + "owningUsage": { + "@id": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac" + }, + "qualifiedName": "TransitionCases::Modes::guarded::accepter::payload", + "shortName": null, + "textualRepresentation": [], + "type": [ + { + "@id": "93867435-c2c2-584f-9288-378804b1674c" + } + ], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "2a67f9da-5213-513b-a38c-3b8d1c8e0e03", + "@type": "FeatureTyping", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "2a67f9da-5213-513b-a38c-3b8d1c8e0e03", + "general": { + "@id": "93867435-c2c2-584f-9288-378804b1674c" + }, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + }, + "owningRelationship": null, + "owningType": { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + }, + { + "@id": "93867435-c2c2-584f-9288-378804b1674c" + } + ], + "shortName": null, + "source": [ + { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + } + ], + "specific": { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + }, + "target": [ + { + "@id": "93867435-c2c2-584f-9288-378804b1674c" + } + ], + "textualRepresentation": [], + "type": { + "@id": "93867435-c2c2-584f-9288-378804b1674c" + }, + "typedFeature": { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + } + }, + { + "@id": "f58c3057-4717-5e8c-8dc9-7d7d1a344953", + "@type": "TransitionFeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "f58c3057-4717-5e8c-8dc9-7d7d1a344953", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "kind": "guard", + "memberElement": { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + }, + "memberElementId": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac", + "memberName": null, + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + }, + "ownedMemberElementId": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac", + "ownedMemberFeature": { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + }, + "ownedMemberName": null, + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + "owningRelationship": null, + "owningType": { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + } + ], + "shortName": null, + "source": [ + { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + } + ], + "target": [ + { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + } + ], + "textualRepresentation": [], + "transitionFeature": { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + }, + "visibility": "public" + }, + { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac", + "@type": "FeatureReferenceExpression", + "aliasIds": [], + "behavior": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "differencingType": [], + "directedFeature": [ + { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + } + ], + "direction": null, + "documentation": [], + "elementId": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac", + "endFeature": [], + "endOwningType": null, + "feature": [ + { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + } + ], + "featureMembership": [ + { + "@id": "f01798f0-4af1-5e9c-9ffb-8e5ca152800a" + } + ], + "featureTarget": { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + }, + "featuringType": [], + "function": null, + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isModelLevelEvaluable": true, + "isOrdered": false, + "isPortion": false, + "isSufficient": false, + "isUnique": true, + "isVariable": false, + "member": [ + { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + }, + { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + }, + { + "@id": "39d52089-5ce9-5a43-ba79-e0c91b78139d" + } + ], + "membership": [ + { + "@id": "3775fda6-b905-5204-8e9f-cc599637316c" + }, + { + "@id": "f01798f0-4af1-5e9c-9ffb-8e5ca152800a" + }, + { + "@id": "1ee5bd99-a694-5061-8d5d-fe13517abff8" + } + ], + "multiplicity": null, + "name": null, + "output": [ + { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + } + ], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + }, + { + "@id": "39d52089-5ce9-5a43-ba79-e0c91b78139d" + } + ], + "ownedEndFeature": [], + "ownedFeature": [ + { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + } + ], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [ + { + "@id": "f01798f0-4af1-5e9c-9ffb-8e5ca152800a" + } + ], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [ + { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + }, + { + "@id": "39d52089-5ce9-5a43-ba79-e0c91b78139d" + } + ], + "ownedMembership": [ + { + "@id": "3775fda6-b905-5204-8e9f-cc599637316c" + }, + { + "@id": "f01798f0-4af1-5e9c-9ffb-8e5ca152800a" + }, + { + "@id": "1ee5bd99-a694-5061-8d5d-fe13517abff8" + } + ], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "3775fda6-b905-5204-8e9f-cc599637316c" + }, + { + "@id": "876777a1-4824-58f7-867b-09c917a39882" + }, + { + "@id": "f01798f0-4af1-5e9c-9ffb-8e5ca152800a" + }, + { + "@id": "1ee5bd99-a694-5061-8d5d-fe13517abff8" + } + ], + "ownedSpecialization": [ + { + "@id": "876777a1-4824-58f7-867b-09c917a39882" + } + ], + "ownedSubsetting": [ + { + "@id": "876777a1-4824-58f7-867b-09c917a39882" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + "owningFeatureMembership": { + "@id": "f58c3057-4717-5e8c-8dc9-7d7d1a344953" + }, + "owningMembership": { + "@id": "f58c3057-4717-5e8c-8dc9-7d7d1a344953" + }, + "owningNamespace": { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + "owningRelationship": { + "@id": "f58c3057-4717-5e8c-8dc9-7d7d1a344953" + }, + "owningType": { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + "parameter": [ + { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + } + ], + "qualifiedName": null, + "referent": { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + }, + "result": { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + }, + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [] + }, + { + "@id": "3775fda6-b905-5204-8e9f-cc599637316c", + "@type": "Membership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "3775fda6-b905-5204-8e9f-cc599637316c", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + }, + "memberElementId": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d", + "memberName": "ready", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + }, + { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + } + ], + "shortName": null, + "source": [ + { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + } + ], + "target": [ + { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "29c386df-d73a-5b63-b021-3138bc7bf931", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "29c386df-d73a-5b63-b021-3138bc7bf931", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + }, + "memberElementId": "a5bbd945-f7d2-52da-89e1-87636e299f51", + "memberName": null, + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + }, + "ownedMemberElementId": "a5bbd945-f7d2-52da-89e1-87636e299f51", + "ownedMemberName": null, + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + } + ], + "shortName": null, + "source": [ + { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + } + ], + "target": [ + { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51", + "@type": "SuccessionAsUsage", + "aliasIds": [], + "association": [], + "chainingFeature": [], + "connectorEnd": [ + { + "@id": "6e96dce4-93f6-54b8-8b2e-77be485cf578" + }, + { + "@id": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b" + } + ], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "defaultFeaturingType": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "definition": [], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "a5bbd945-f7d2-52da-89e1-87636e299f51", + "endFeature": [ + { + "@id": "6e96dce4-93f6-54b8-8b2e-77be485cf578" + }, + { + "@id": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b" + } + ], + "endOwningType": null, + "feature": [ + { + "@id": "6e96dce4-93f6-54b8-8b2e-77be485cf578" + }, + { + "@id": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b" + } + ], + "featureMembership": [ + { + "@id": "d312acc6-fff4-59cc-9d02-8dca3d5cba78" + }, + { + "@id": "8c4ceb36-73a5-52f1-99a5-2ae07e97b127" + } + ], + "featureTarget": { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": true, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [ + { + "@id": "6e96dce4-93f6-54b8-8b2e-77be485cf578" + }, + { + "@id": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b" + } + ], + "membership": [ + { + "@id": "d312acc6-fff4-59cc-9d02-8dca3d5cba78" + }, + { + "@id": "8c4ceb36-73a5-52f1-99a5-2ae07e97b127" + } + ], + "multiplicity": null, + "name": null, + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [ + { + "@id": "6e96dce4-93f6-54b8-8b2e-77be485cf578" + }, + { + "@id": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b" + } + ], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [ + { + "@id": "6e96dce4-93f6-54b8-8b2e-77be485cf578" + }, + { + "@id": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b" + } + ], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "6e96dce4-93f6-54b8-8b2e-77be485cf578" + }, + { + "@id": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b" + } + ], + "ownedEndFeature": [ + { + "@id": "6e96dce4-93f6-54b8-8b2e-77be485cf578" + }, + { + "@id": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b" + } + ], + "ownedFeature": [ + { + "@id": "6e96dce4-93f6-54b8-8b2e-77be485cf578" + }, + { + "@id": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b" + } + ], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [ + { + "@id": "d312acc6-fff4-59cc-9d02-8dca3d5cba78" + }, + { + "@id": "8c4ceb36-73a5-52f1-99a5-2ae07e97b127" + } + ], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [ + { + "@id": "6e96dce4-93f6-54b8-8b2e-77be485cf578" + }, + { + "@id": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b" + } + ], + "ownedMembership": [ + { + "@id": "d312acc6-fff4-59cc-9d02-8dca3d5cba78" + }, + { + "@id": "8c4ceb36-73a5-52f1-99a5-2ae07e97b127" + } + ], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelatedElement": [], + "ownedRelationship": [ + { + "@id": "d312acc6-fff4-59cc-9d02-8dca3d5cba78" + }, + { + "@id": "8c4ceb36-73a5-52f1-99a5-2ae07e97b127" + }, + { + "@id": "8c125c6f-8f73-5a01-8125-fcf3aa26c89a" + } + ], + "ownedSpecialization": [ + { + "@id": "8c125c6f-8f73-5a01-8125-fcf3aa26c89a" + } + ], + "ownedSubsetting": [ + { + "@id": "8c125c6f-8f73-5a01-8125-fcf3aa26c89a" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + "owningDefinition": null, + "owningFeatureMembership": null, + "owningMembership": { + "@id": "29c386df-d73a-5b63-b021-3138bc7bf931" + }, + "owningNamespace": { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + "owningRelatedElement": null, + "owningRelationship": { + "@id": "29c386df-d73a-5b63-b021-3138bc7bf931" + }, + "owningType": null, + "owningUsage": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + } + ], + "relatedFeature": [ + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + } + ], + "shortName": null, + "source": [ + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + } + ], + "sourceFeature": { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + "target": [ + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + } + ], + "targetFeature": [ + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + } + ], + "textualRepresentation": [], + "type": [], + "unioningType": [], + "usage": [ + { + "@id": "6e96dce4-93f6-54b8-8b2e-77be485cf578" + }, + { + "@id": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b" + } + ], + "variant": [], + "variantMembership": [] + }, + { + "@id": "d312acc6-fff4-59cc-9d02-8dca3d5cba78", + "@type": "EndFeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "d312acc6-fff4-59cc-9d02-8dca3d5cba78", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "6e96dce4-93f6-54b8-8b2e-77be485cf578" + }, + "memberElementId": "6e96dce4-93f6-54b8-8b2e-77be485cf578", + "memberName": "earlierOccurrence", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "6e96dce4-93f6-54b8-8b2e-77be485cf578" + }, + "ownedMemberElementId": "6e96dce4-93f6-54b8-8b2e-77be485cf578", + "ownedMemberFeature": { + "@id": "6e96dce4-93f6-54b8-8b2e-77be485cf578" + }, + "ownedMemberName": "earlierOccurrence", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "6e96dce4-93f6-54b8-8b2e-77be485cf578" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + }, + "owningRelationship": null, + "owningType": { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + }, + { + "@id": "6e96dce4-93f6-54b8-8b2e-77be485cf578" + } + ], + "shortName": null, + "source": [ + { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + } + ], + "target": [ + { + "@id": "6e96dce4-93f6-54b8-8b2e-77be485cf578" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "6e96dce4-93f6-54b8-8b2e-77be485cf578", + "@type": "ReferenceUsage", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "definition": [], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "6e96dce4-93f6-54b8-8b2e-77be485cf578", + "endFeature": [], + "endOwningType": { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + }, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "6e96dce4-93f6-54b8-8b2e-77be485cf578" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": true, + "isDerived": false, + "isEnd": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": true, + "isSufficient": false, + "isUnique": true, + "isVariable": true, + "isVariation": false, + "mayTimeVary": true, + "member": [], + "membership": [], + "multiplicity": null, + "name": "earlierOccurrence", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [ + { + "@id": "5fab2e3b-8e96-5f54-9432-0d218de28617" + } + ], + "ownedReferenceSubsetting": { + "@id": "27abbd5b-fe9e-5d42-bb3c-cd6ab40205df" + }, + "ownedRelationship": [ + { + "@id": "27abbd5b-fe9e-5d42-bb3c-cd6ab40205df" + }, + { + "@id": "5fab2e3b-8e96-5f54-9432-0d218de28617" + } + ], + "ownedSpecialization": [ + { + "@id": "27abbd5b-fe9e-5d42-bb3c-cd6ab40205df" + }, + { + "@id": "5fab2e3b-8e96-5f54-9432-0d218de28617" + } + ], + "ownedSubsetting": [ + { + "@id": "27abbd5b-fe9e-5d42-bb3c-cd6ab40205df" + }, + { + "@id": "5fab2e3b-8e96-5f54-9432-0d218de28617" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + }, + "owningDefinition": null, + "owningFeatureMembership": { + "@id": "d312acc6-fff4-59cc-9d02-8dca3d5cba78" + }, + "owningMembership": { + "@id": "d312acc6-fff4-59cc-9d02-8dca3d5cba78" + }, + "owningNamespace": { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + }, + "owningRelationship": { + "@id": "d312acc6-fff4-59cc-9d02-8dca3d5cba78" + }, + "owningType": { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + }, + "owningUsage": { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + }, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "8c4ceb36-73a5-52f1-99a5-2ae07e97b127", + "@type": "EndFeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "8c4ceb36-73a5-52f1-99a5-2ae07e97b127", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b" + }, + "memberElementId": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b", + "memberName": "laterOccurrence", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b" + }, + "ownedMemberElementId": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b", + "ownedMemberFeature": { + "@id": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b" + }, + "ownedMemberName": "laterOccurrence", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + }, + "owningRelationship": null, + "owningType": { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + }, + { + "@id": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b" + } + ], + "shortName": null, + "source": [ + { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + } + ], + "target": [ + { + "@id": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b", + "@type": "ReferenceUsage", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "definition": [], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b", + "endFeature": [], + "endOwningType": { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + }, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": true, + "isDerived": false, + "isEnd": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": true, + "isSufficient": false, + "isUnique": true, + "isVariable": true, + "isVariation": false, + "mayTimeVary": true, + "member": [], + "membership": [], + "multiplicity": null, + "name": "laterOccurrence", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [ + { + "@id": "7c2b623e-5884-5cfe-95fd-95d6d9865371" + } + ], + "ownedReferenceSubsetting": { + "@id": "1a2a774a-9b06-5bf3-a55f-2d77bb6360e6" + }, + "ownedRelationship": [ + { + "@id": "1a2a774a-9b06-5bf3-a55f-2d77bb6360e6" + }, + { + "@id": "7c2b623e-5884-5cfe-95fd-95d6d9865371" + } + ], + "ownedSpecialization": [ + { + "@id": "1a2a774a-9b06-5bf3-a55f-2d77bb6360e6" + }, + { + "@id": "7c2b623e-5884-5cfe-95fd-95d6d9865371" + } + ], + "ownedSubsetting": [ + { + "@id": "1a2a774a-9b06-5bf3-a55f-2d77bb6360e6" + }, + { + "@id": "7c2b623e-5884-5cfe-95fd-95d6d9865371" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + }, + "owningDefinition": null, + "owningFeatureMembership": { + "@id": "8c4ceb36-73a5-52f1-99a5-2ae07e97b127" + }, + "owningMembership": { + "@id": "8c4ceb36-73a5-52f1-99a5-2ae07e97b127" + }, + "owningNamespace": { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + }, + "owningRelationship": { + "@id": "8c4ceb36-73a5-52f1-99a5-2ae07e97b127" + }, + "owningType": { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + }, + "owningUsage": { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + }, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "1a2a774a-9b06-5bf3-a55f-2d77bb6360e6", + "@type": "ReferenceSubsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "1a2a774a-9b06-5bf3-a55f-2d77bb6360e6", + "general": { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b" + }, + "owningRelationship": null, + "owningType": { + "@id": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b" + }, + "qualifiedName": null, + "referencedFeature": { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + "referencingFeature": { + "@id": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b" + }, + "relatedElement": [ + { + "@id": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b" + }, + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + } + ], + "shortName": null, + "source": [ + { + "@id": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b" + } + ], + "specific": { + "@id": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b" + }, + "subsettedFeature": { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + "subsettingFeature": { + "@id": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b" + }, + "target": [ + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + } + ], + "textualRepresentation": [] + }, + { + "@id": "1abbc071-8fb4-53a0-a9ba-b46da1fb45d2", + "@type": "FeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "1abbc071-8fb4-53a0-a9ba-b46da1fb45d2", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + }, + "memberElementId": "02089055-4a65-5de8-bd2b-c66b0a627b0b", + "memberName": "effectful", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + }, + "ownedMemberElementId": "02089055-4a65-5de8-bd2b-c66b0a627b0b", + "ownedMemberFeature": { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + }, + "ownedMemberName": "effectful", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "owningRelationship": null, + "owningType": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + } + ], + "shortName": null, + "source": [ + { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + } + ], + "target": [ + { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b", + "@type": "TransitionUsage", + "actionDefinition": [], + "aliasIds": [], + "behavior": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": "effectful", + "declaredShortName": null, + "definition": [], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "effectAction": [ + { + "@id": "b9fa3146-fc73-528e-bcaa-1137d127278c" + } + ], + "elementId": "02089055-4a65-5de8-bd2b-c66b0a627b0b", + "endFeature": [], + "endOwningType": null, + "feature": [ + { + "@id": "b9fa3146-fc73-528e-bcaa-1137d127278c" + } + ], + "featureMembership": [ + { + "@id": "f748c477-974d-5d61-8411-c47cf6d54bae" + } + ], + "featureTarget": { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + }, + "featuringType": [], + "guardExpression": [], + "importedMembership": [], + "individualDefinition": null, + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": true, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": false, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [ + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + { + "@id": "b9fa3146-fc73-528e-bcaa-1137d127278c" + }, + { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + } + ], + "membership": [ + { + "@id": "18967339-8d3a-58a9-b7c2-d4f3e5343e23" + }, + { + "@id": "f748c477-974d-5d61-8411-c47cf6d54bae" + }, + { + "@id": "5cf0f498-cc73-5d01-9558-6b3bb25a9929" + } + ], + "multiplicity": null, + "name": "effectful", + "nestedAction": [ + { + "@id": "b9fa3146-fc73-528e-bcaa-1137d127278c" + } + ], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [ + { + "@id": "b9fa3146-fc73-528e-bcaa-1137d127278c" + } + ], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [ + { + "@id": "b9fa3146-fc73-528e-bcaa-1137d127278c" + } + ], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "occurrenceDefinition": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "b9fa3146-fc73-528e-bcaa-1137d127278c" + }, + { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + } + ], + "ownedEndFeature": [], + "ownedFeature": [ + { + "@id": "b9fa3146-fc73-528e-bcaa-1137d127278c" + } + ], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [ + { + "@id": "f748c477-974d-5d61-8411-c47cf6d54bae" + } + ], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [ + { + "@id": "b9fa3146-fc73-528e-bcaa-1137d127278c" + }, + { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + } + ], + "ownedMembership": [ + { + "@id": "18967339-8d3a-58a9-b7c2-d4f3e5343e23" + }, + { + "@id": "f748c477-974d-5d61-8411-c47cf6d54bae" + }, + { + "@id": "5cf0f498-cc73-5d01-9558-6b3bb25a9929" + } + ], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "18967339-8d3a-58a9-b7c2-d4f3e5343e23" + }, + { + "@id": "f748c477-974d-5d61-8411-c47cf6d54bae" + }, + { + "@id": "5cf0f498-cc73-5d01-9558-6b3bb25a9929" + }, + { + "@id": "67919ffa-93ad-51c7-aca2-e19dc7566b71" + } + ], + "ownedSpecialization": [ + { + "@id": "67919ffa-93ad-51c7-aca2-e19dc7566b71" + } + ], + "ownedSubsetting": [ + { + "@id": "67919ffa-93ad-51c7-aca2-e19dc7566b71" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "owningDefinition": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "owningFeatureMembership": { + "@id": "1abbc071-8fb4-53a0-a9ba-b46da1fb45d2" + }, + "owningMembership": { + "@id": "1abbc071-8fb4-53a0-a9ba-b46da1fb45d2" + }, + "owningNamespace": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "owningRelationship": { + "@id": "1abbc071-8fb4-53a0-a9ba-b46da1fb45d2" + }, + "owningType": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "owningUsage": null, + "parameter": [], + "portionKind": null, + "qualifiedName": "TransitionCases::Modes::effectful", + "shortName": null, + "source": { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + "succession": { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + }, + "target": { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + "textualRepresentation": [], + "triggerAction": [], + "type": [], + "unioningType": [], + "usage": [ + { + "@id": "b9fa3146-fc73-528e-bcaa-1137d127278c" + } + ], + "variant": [], + "variantMembership": [] + }, + { + "@id": "18967339-8d3a-58a9-b7c2-d4f3e5343e23", + "@type": "Membership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "18967339-8d3a-58a9-b7c2-d4f3e5343e23", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + "memberElementId": "eb580a55-5649-5be2-9fe7-d7e6526f0c46", + "memberName": "x", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + }, + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + } + ], + "shortName": null, + "source": [ + { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + } + ], + "target": [ + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "f748c477-974d-5d61-8411-c47cf6d54bae", + "@type": "TransitionFeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "f748c477-974d-5d61-8411-c47cf6d54bae", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "kind": "effect", + "memberElement": { + "@id": "b9fa3146-fc73-528e-bcaa-1137d127278c" + }, + "memberElementId": "b9fa3146-fc73-528e-bcaa-1137d127278c", + "memberName": "reset", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "b9fa3146-fc73-528e-bcaa-1137d127278c" + }, + "ownedMemberElementId": "b9fa3146-fc73-528e-bcaa-1137d127278c", + "ownedMemberFeature": { + "@id": "b9fa3146-fc73-528e-bcaa-1137d127278c" + }, + "ownedMemberName": "reset", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "b9fa3146-fc73-528e-bcaa-1137d127278c" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + }, + "owningRelationship": null, + "owningType": { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + }, + { + "@id": "b9fa3146-fc73-528e-bcaa-1137d127278c" + } + ], + "shortName": null, + "source": [ + { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + } + ], + "target": [ + { + "@id": "b9fa3146-fc73-528e-bcaa-1137d127278c" + } + ], + "textualRepresentation": [], + "transitionFeature": { + "@id": "b9fa3146-fc73-528e-bcaa-1137d127278c" + }, + "visibility": "public" + }, + { + "@id": "b9fa3146-fc73-528e-bcaa-1137d127278c", + "@type": "PerformActionUsage", + "actionDefinition": [ + { + "@id": "944239e2-da22-5343-b4d7-73d746f7ef1c" + } + ], + "aliasIds": [], + "behavior": [ + { + "@id": "944239e2-da22-5343-b4d7-73d746f7ef1c" + } + ], + "chainingFeature": [], + "crossFeature": null, + "declaredName": "reset", + "declaredShortName": null, + "definition": [ + { + "@id": "944239e2-da22-5343-b4d7-73d746f7ef1c" + } + ], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "b9fa3146-fc73-528e-bcaa-1137d127278c", + "endFeature": [], + "endOwningType": null, + "eventOccurrence": { + "@id": "b9fa3146-fc73-528e-bcaa-1137d127278c" + }, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "b9fa3146-fc73-528e-bcaa-1137d127278c" + }, + "featuringType": [], + "importedMembership": [], + "individualDefinition": null, + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isIndividual": false, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": true, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [], + "membership": [], + "multiplicity": null, + "name": "reset", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "occurrenceDefinition": [ + { + "@id": "944239e2-da22-5343-b4d7-73d746f7ef1c" + } + ], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "f9766571-41aa-5dd1-8764-26551e6a4d7c" + }, + { + "@id": "0a55051c-1d00-5da1-ae55-ae6f02c9f65a" + } + ], + "ownedSpecialization": [ + { + "@id": "f9766571-41aa-5dd1-8764-26551e6a4d7c" + }, + { + "@id": "0a55051c-1d00-5da1-ae55-ae6f02c9f65a" + } + ], + "ownedSubsetting": [ + { + "@id": "0a55051c-1d00-5da1-ae55-ae6f02c9f65a" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [ + { + "@id": "f9766571-41aa-5dd1-8764-26551e6a4d7c" + } + ], + "ownedUnioning": [], + "owner": { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + }, + "owningDefinition": null, + "owningFeatureMembership": { + "@id": "f748c477-974d-5d61-8411-c47cf6d54bae" + }, + "owningMembership": { + "@id": "f748c477-974d-5d61-8411-c47cf6d54bae" + }, + "owningNamespace": { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + }, + "owningRelationship": { + "@id": "f748c477-974d-5d61-8411-c47cf6d54bae" + }, + "owningType": { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + }, + "owningUsage": { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + }, + "parameter": [], + "performedAction": { + "@id": "b9fa3146-fc73-528e-bcaa-1137d127278c" + }, + "portionKind": null, + "qualifiedName": "TransitionCases::Modes::effectful::reset", + "shortName": null, + "textualRepresentation": [], + "type": [ + { + "@id": "944239e2-da22-5343-b4d7-73d746f7ef1c" + } + ], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "f9766571-41aa-5dd1-8764-26551e6a4d7c", + "@type": "FeatureTyping", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "f9766571-41aa-5dd1-8764-26551e6a4d7c", + "general": { + "@id": "944239e2-da22-5343-b4d7-73d746f7ef1c" + }, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "b9fa3146-fc73-528e-bcaa-1137d127278c" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "b9fa3146-fc73-528e-bcaa-1137d127278c" + }, + "owningRelationship": null, + "owningType": { + "@id": "b9fa3146-fc73-528e-bcaa-1137d127278c" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "b9fa3146-fc73-528e-bcaa-1137d127278c" + }, + { + "@id": "944239e2-da22-5343-b4d7-73d746f7ef1c" + } + ], + "shortName": null, + "source": [ + { + "@id": "b9fa3146-fc73-528e-bcaa-1137d127278c" + } + ], + "specific": { + "@id": "b9fa3146-fc73-528e-bcaa-1137d127278c" + }, + "target": [ + { + "@id": "944239e2-da22-5343-b4d7-73d746f7ef1c" + } + ], + "textualRepresentation": [], + "type": { + "@id": "944239e2-da22-5343-b4d7-73d746f7ef1c" + }, + "typedFeature": { + "@id": "b9fa3146-fc73-528e-bcaa-1137d127278c" + } + }, + { + "@id": "5cf0f498-cc73-5d01-9558-6b3bb25a9929", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "5cf0f498-cc73-5d01-9558-6b3bb25a9929", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + }, + "memberElementId": "b73ea64c-b57c-564d-8cfa-b4d35d3547db", + "memberName": null, + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + }, + "ownedMemberElementId": "b73ea64c-b57c-564d-8cfa-b4d35d3547db", + "ownedMemberName": null, + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + }, + { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + } + ], + "shortName": null, + "source": [ + { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + } + ], + "target": [ + { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db", + "@type": "SuccessionAsUsage", + "aliasIds": [], + "association": [], + "chainingFeature": [], + "connectorEnd": [ + { + "@id": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737" + }, + { + "@id": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded" + } + ], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "defaultFeaturingType": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "definition": [], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "b73ea64c-b57c-564d-8cfa-b4d35d3547db", + "endFeature": [ + { + "@id": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737" + }, + { + "@id": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded" + } + ], + "endOwningType": null, + "feature": [ + { + "@id": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737" + }, + { + "@id": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded" + } + ], + "featureMembership": [ + { + "@id": "d8be9923-8572-51c4-b93c-936e88d93fe1" + }, + { + "@id": "cda7b3ce-1abf-58da-9505-b4b06ce9c5cd" + } + ], + "featureTarget": { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": true, + "isSufficient": false, + "isUnique": true, + "isVariable": null, + "isVariation": false, + "mayTimeVary": null, + "member": [ + { + "@id": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737" + }, + { + "@id": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded" + } + ], + "membership": [ + { + "@id": "d8be9923-8572-51c4-b93c-936e88d93fe1" + }, + { + "@id": "cda7b3ce-1abf-58da-9505-b4b06ce9c5cd" + } + ], + "multiplicity": null, + "name": null, + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [ + { + "@id": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737" + }, + { + "@id": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded" + } + ], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [ + { + "@id": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737" + }, + { + "@id": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded" + } + ], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737" + }, + { + "@id": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded" + } + ], + "ownedEndFeature": [ + { + "@id": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737" + }, + { + "@id": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded" + } + ], + "ownedFeature": [ + { + "@id": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737" + }, + { + "@id": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded" + } + ], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [ + { + "@id": "d8be9923-8572-51c4-b93c-936e88d93fe1" + }, + { + "@id": "cda7b3ce-1abf-58da-9505-b4b06ce9c5cd" + } + ], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [ + { + "@id": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737" + }, + { + "@id": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded" + } + ], + "ownedMembership": [ + { + "@id": "d8be9923-8572-51c4-b93c-936e88d93fe1" + }, + { + "@id": "cda7b3ce-1abf-58da-9505-b4b06ce9c5cd" + } + ], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelatedElement": [], + "ownedRelationship": [ + { + "@id": "d8be9923-8572-51c4-b93c-936e88d93fe1" + }, + { + "@id": "cda7b3ce-1abf-58da-9505-b4b06ce9c5cd" + }, + { + "@id": "0e2b1780-e9ba-5c31-a222-e524c49943a4" + } + ], + "ownedSpecialization": [ + { + "@id": "0e2b1780-e9ba-5c31-a222-e524c49943a4" + } + ], + "ownedSubsetting": [ + { + "@id": "0e2b1780-e9ba-5c31-a222-e524c49943a4" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + }, + "owningDefinition": null, + "owningFeatureMembership": null, + "owningMembership": { + "@id": "5cf0f498-cc73-5d01-9558-6b3bb25a9929" + }, + "owningNamespace": { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + }, + "owningRelatedElement": null, + "owningRelationship": { + "@id": "5cf0f498-cc73-5d01-9558-6b3bb25a9929" + }, + "owningType": null, + "owningUsage": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + } + ], + "relatedFeature": [ + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + } + ], + "shortName": null, + "source": [ + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + } + ], + "sourceFeature": { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + "target": [ + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + } + ], + "targetFeature": [ + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + } + ], + "textualRepresentation": [], + "type": [], + "unioningType": [], + "usage": [ + { + "@id": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737" + }, + { + "@id": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded" + } + ], + "variant": [], + "variantMembership": [] + }, + { + "@id": "d8be9923-8572-51c4-b93c-936e88d93fe1", + "@type": "EndFeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "d8be9923-8572-51c4-b93c-936e88d93fe1", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737" + }, + "memberElementId": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737", + "memberName": "earlierOccurrence", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737" + }, + "ownedMemberElementId": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737", + "ownedMemberFeature": { + "@id": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737" + }, + "ownedMemberName": "earlierOccurrence", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + }, + "owningRelationship": null, + "owningType": { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + }, + { + "@id": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737" + } + ], + "shortName": null, + "source": [ + { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + } + ], + "target": [ + { + "@id": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737", + "@type": "ReferenceUsage", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "definition": [], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737", + "endFeature": [], + "endOwningType": { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + }, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": true, + "isDerived": false, + "isEnd": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": true, + "isSufficient": false, + "isUnique": true, + "isVariable": true, + "isVariation": false, + "mayTimeVary": true, + "member": [], + "membership": [], + "multiplicity": null, + "name": "earlierOccurrence", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [ + { + "@id": "4210a887-80b2-5ea4-b852-156bd6b9e739" + } + ], + "ownedReferenceSubsetting": { + "@id": "7218a1db-a85d-5c02-b8ad-1ad5d26eaeef" + }, + "ownedRelationship": [ + { + "@id": "7218a1db-a85d-5c02-b8ad-1ad5d26eaeef" + }, + { + "@id": "4210a887-80b2-5ea4-b852-156bd6b9e739" + } + ], + "ownedSpecialization": [ + { + "@id": "7218a1db-a85d-5c02-b8ad-1ad5d26eaeef" + }, + { + "@id": "4210a887-80b2-5ea4-b852-156bd6b9e739" + } + ], + "ownedSubsetting": [ + { + "@id": "7218a1db-a85d-5c02-b8ad-1ad5d26eaeef" + }, + { + "@id": "4210a887-80b2-5ea4-b852-156bd6b9e739" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + }, + "owningDefinition": null, + "owningFeatureMembership": { + "@id": "d8be9923-8572-51c4-b93c-936e88d93fe1" + }, + "owningMembership": { + "@id": "d8be9923-8572-51c4-b93c-936e88d93fe1" + }, + "owningNamespace": { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + }, + "owningRelationship": { + "@id": "d8be9923-8572-51c4-b93c-936e88d93fe1" + }, + "owningType": { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + }, + "owningUsage": { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + }, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "cda7b3ce-1abf-58da-9505-b4b06ce9c5cd", + "@type": "EndFeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "cda7b3ce-1abf-58da-9505-b4b06ce9c5cd", + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded" + }, + "memberElementId": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded", + "memberName": "laterOccurrence", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded" + }, + "ownedMemberElementId": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded", + "ownedMemberFeature": { + "@id": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded" + }, + "ownedMemberName": "laterOccurrence", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + }, + "owningRelationship": null, + "owningType": { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + }, + { + "@id": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded" + } + ], + "shortName": null, + "source": [ + { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + } + ], + "target": [ + { + "@id": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded", + "@type": "ReferenceUsage", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "definition": [], + "differencingType": [], + "directedFeature": [], + "directedUsage": [], + "direction": null, + "documentation": [], + "elementId": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded", + "endFeature": [], + "endOwningType": { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + }, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": true, + "isDerived": false, + "isEnd": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isReference": true, + "isSufficient": false, + "isUnique": true, + "isVariable": true, + "isVariation": false, + "mayTimeVary": true, + "member": [], + "membership": [], + "multiplicity": null, + "name": "laterOccurrence", + "nestedAction": [], + "nestedAllocation": [], + "nestedAnalysisCase": [], + "nestedAttribute": [], + "nestedCalculation": [], + "nestedCase": [], + "nestedConcern": [], + "nestedConnection": [], + "nestedConstraint": [], + "nestedEnumeration": [], + "nestedFlow": [], + "nestedInterface": [], + "nestedItem": [], + "nestedMetadata": [], + "nestedOccurrence": [], + "nestedPart": [], + "nestedPort": [], + "nestedReference": [], + "nestedRendering": [], + "nestedRequirement": [], + "nestedState": [], + "nestedTransition": [], + "nestedUsage": [], + "nestedUseCase": [], + "nestedVerificationCase": [], + "nestedView": [], + "nestedViewpoint": [], + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [ + { + "@id": "5495ee57-6547-57ec-8fe5-929468a90ac4" + } + ], + "ownedReferenceSubsetting": { + "@id": "d4732792-1feb-5f6a-8d18-8826057bdc31" + }, + "ownedRelationship": [ + { + "@id": "d4732792-1feb-5f6a-8d18-8826057bdc31" + }, + { + "@id": "5495ee57-6547-57ec-8fe5-929468a90ac4" + } + ], + "ownedSpecialization": [ + { + "@id": "d4732792-1feb-5f6a-8d18-8826057bdc31" + }, + { + "@id": "5495ee57-6547-57ec-8fe5-929468a90ac4" + } + ], + "ownedSubsetting": [ + { + "@id": "d4732792-1feb-5f6a-8d18-8826057bdc31" + }, + { + "@id": "5495ee57-6547-57ec-8fe5-929468a90ac4" + } + ], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + }, + "owningDefinition": null, + "owningFeatureMembership": { + "@id": "cda7b3ce-1abf-58da-9505-b4b06ce9c5cd" + }, + "owningMembership": { + "@id": "cda7b3ce-1abf-58da-9505-b4b06ce9c5cd" + }, + "owningNamespace": { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + }, + "owningRelationship": { + "@id": "cda7b3ce-1abf-58da-9505-b4b06ce9c5cd" + }, + "owningType": { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + }, + "owningUsage": { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + }, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [], + "type": [], + "unioningType": [], + "usage": [], + "variant": [], + "variantMembership": [] + }, + { + "@id": "d4732792-1feb-5f6a-8d18-8826057bdc31", + "@type": "ReferenceSubsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "d4732792-1feb-5f6a-8d18-8826057bdc31", + "general": { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + "isImplied": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded" + }, + "owningRelationship": null, + "owningType": { + "@id": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded" + }, + "qualifiedName": null, + "referencedFeature": { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + "referencingFeature": { + "@id": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded" + }, + "relatedElement": [ + { + "@id": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded" + }, + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + } + ], + "shortName": null, + "source": [ + { + "@id": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded" + } + ], + "specific": { + "@id": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded" + }, + "subsettedFeature": { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + "subsettingFeature": { + "@id": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded" + }, + "target": [ + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + } + ], + "textualRepresentation": [] + }, + { + "@id": "29481ee0-157c-5855-b953-b9a6d7565474", + "@type": "Subclassification", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "29481ee0-157c-5855-b953-b9a6d7565474", + "general": { + "@id": "8e9bd20f-ea8f-5a87-9759-f196d58bdd1a" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningClassifier": { + "@id": "93867435-c2c2-584f-9288-378804b1674c" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "93867435-c2c2-584f-9288-378804b1674c" + }, + "owningRelationship": null, + "owningType": { + "@id": "93867435-c2c2-584f-9288-378804b1674c" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "93867435-c2c2-584f-9288-378804b1674c" + }, + { + "@id": "8e9bd20f-ea8f-5a87-9759-f196d58bdd1a" + } + ], + "shortName": null, + "source": [ + { + "@id": "93867435-c2c2-584f-9288-378804b1674c" + } + ], + "specific": { + "@id": "93867435-c2c2-584f-9288-378804b1674c" + }, + "subclassifier": { + "@id": "93867435-c2c2-584f-9288-378804b1674c" + }, + "superclassifier": { + "@id": "8e9bd20f-ea8f-5a87-9759-f196d58bdd1a" + }, + "target": [ + { + "@id": "8e9bd20f-ea8f-5a87-9759-f196d58bdd1a" + } + ], + "textualRepresentation": [] + }, + { + "@id": "a561334d-468f-5227-89f7-443784d7683d", + "@type": "Subclassification", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "a561334d-468f-5227-89f7-443784d7683d", + "general": { + "@id": "6e44fcc3-4ac4-5e93-a695-61791fa23309" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningClassifier": { + "@id": "944239e2-da22-5343-b4d7-73d746f7ef1c" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "944239e2-da22-5343-b4d7-73d746f7ef1c" + }, + "owningRelationship": null, + "owningType": { + "@id": "944239e2-da22-5343-b4d7-73d746f7ef1c" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "944239e2-da22-5343-b4d7-73d746f7ef1c" + }, + { + "@id": "6e44fcc3-4ac4-5e93-a695-61791fa23309" + } + ], + "shortName": null, + "source": [ + { + "@id": "944239e2-da22-5343-b4d7-73d746f7ef1c" + } + ], + "specific": { + "@id": "944239e2-da22-5343-b4d7-73d746f7ef1c" + }, + "subclassifier": { + "@id": "944239e2-da22-5343-b4d7-73d746f7ef1c" + }, + "superclassifier": { + "@id": "6e44fcc3-4ac4-5e93-a695-61791fa23309" + }, + "target": [ + { + "@id": "6e44fcc3-4ac4-5e93-a695-61791fa23309" + } + ], + "textualRepresentation": [] + }, + { + "@id": "4deaf063-0c81-50f1-8745-aa59e7a351da", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "4deaf063-0c81-50f1-8745-aa59e7a351da", + "general": { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + }, + "owningRelationship": null, + "owningType": { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + }, + { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + } + ], + "shortName": null, + "source": [ + { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + } + ], + "specific": { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + }, + "subsettedFeature": { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + }, + "subsettingFeature": { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + }, + "target": [ + { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + } + ], + "textualRepresentation": [] + }, + { + "@id": "7db6375c-342d-53a4-b550-f257260ec578", + "@type": "Subclassification", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "7db6375c-342d-53a4-b550-f257260ec578", + "general": { + "@id": "0f9954b1-8e58-5280-aa33-965dab2789b6" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningClassifier": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "owningRelationship": null, + "owningType": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + { + "@id": "0f9954b1-8e58-5280-aa33-965dab2789b6" + } + ], + "shortName": null, + "source": [ + { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + } + ], + "specific": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "subclassifier": { + "@id": "81fda28a-0183-5937-9618-f3bb94591956" + }, + "superclassifier": { + "@id": "0f9954b1-8e58-5280-aa33-965dab2789b6" + }, + "target": [ + { + "@id": "0f9954b1-8e58-5280-aa33-965dab2789b6" + } + ], + "textualRepresentation": [] + }, + { + "@id": "24dee6d6-1540-5fb0-955c-3f725233a22e", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "24dee6d6-1540-5fb0-955c-3f725233a22e", + "general": { + "@id": "9e6571be-37ab-5c17-8af9-c3463c7e0d06" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + "owningRelationship": null, + "owningType": { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + { + "@id": "9e6571be-37ab-5c17-8af9-c3463c7e0d06" + } + ], + "shortName": null, + "source": [ + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + } + ], + "specific": { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + "subsettedFeature": { + "@id": "9e6571be-37ab-5c17-8af9-c3463c7e0d06" + }, + "subsettingFeature": { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + "target": [ + { + "@id": "9e6571be-37ab-5c17-8af9-c3463c7e0d06" + } + ], + "textualRepresentation": [] + }, + { + "@id": "d54ee9d9-436d-5cf3-80ba-a438743d3523", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "d54ee9d9-436d-5cf3-80ba-a438743d3523", + "general": { + "@id": "9e6571be-37ab-5c17-8af9-c3463c7e0d06" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + "owningRelationship": null, + "owningType": { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + { + "@id": "9e6571be-37ab-5c17-8af9-c3463c7e0d06" + } + ], + "shortName": null, + "source": [ + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + } + ], + "specific": { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + "subsettedFeature": { + "@id": "9e6571be-37ab-5c17-8af9-c3463c7e0d06" + }, + "subsettingFeature": { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + "target": [ + { + "@id": "9e6571be-37ab-5c17-8af9-c3463c7e0d06" + } + ], + "textualRepresentation": [] + }, + { + "@id": "1315343f-a477-5d77-a769-28f2c987ac02", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "1315343f-a477-5d77-a769-28f2c987ac02", + "general": { + "@id": "0e1bba0a-81f0-518c-8415-d1976bd38f8d" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + }, + "owningRelationship": null, + "owningType": { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + }, + { + "@id": "0e1bba0a-81f0-518c-8415-d1976bd38f8d" + } + ], + "shortName": null, + "source": [ + { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + } + ], + "specific": { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + }, + "subsettedFeature": { + "@id": "0e1bba0a-81f0-518c-8415-d1976bd38f8d" + }, + "subsettingFeature": { + "@id": "52f41b33-b0dd-5c82-af0b-6c60345a9c6b" + }, + "target": [ + { + "@id": "0e1bba0a-81f0-518c-8415-d1976bd38f8d" + } + ], + "textualRepresentation": [] + }, + { + "@id": "65c53ffd-9757-5d1c-ab82-ae033445a662", + "@type": "Redefinition", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "65c53ffd-9757-5d1c-ab82-ae033445a662", + "general": { + "@id": "7d7065b6-1bb8-5bb5-b421-cc92f2e84584" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "847c1458-09dd-569f-9f71-c5123904d723" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "847c1458-09dd-569f-9f71-c5123904d723" + }, + "owningRelationship": null, + "owningType": { + "@id": "847c1458-09dd-569f-9f71-c5123904d723" + }, + "qualifiedName": null, + "redefinedFeature": { + "@id": "7d7065b6-1bb8-5bb5-b421-cc92f2e84584" + }, + "redefiningFeature": { + "@id": "847c1458-09dd-569f-9f71-c5123904d723" + }, + "relatedElement": [ + { + "@id": "847c1458-09dd-569f-9f71-c5123904d723" + }, + { + "@id": "7d7065b6-1bb8-5bb5-b421-cc92f2e84584" + } + ], + "shortName": null, + "source": [ + { + "@id": "847c1458-09dd-569f-9f71-c5123904d723" + } + ], + "specific": { + "@id": "847c1458-09dd-569f-9f71-c5123904d723" + }, + "subsettedFeature": { + "@id": "7d7065b6-1bb8-5bb5-b421-cc92f2e84584" + }, + "subsettingFeature": { + "@id": "847c1458-09dd-569f-9f71-c5123904d723" + }, + "target": [ + { + "@id": "7d7065b6-1bb8-5bb5-b421-cc92f2e84584" + } + ], + "textualRepresentation": [] + }, + { + "@id": "b18447d7-0dff-5bf2-b387-00cef2636883", + "@type": "Redefinition", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "b18447d7-0dff-5bf2-b387-00cef2636883", + "general": { + "@id": "99bd4b60-e5a9-55fb-8cea-1dcf517e50ec" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf" + }, + "owningRelationship": null, + "owningType": { + "@id": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf" + }, + "qualifiedName": null, + "redefinedFeature": { + "@id": "99bd4b60-e5a9-55fb-8cea-1dcf517e50ec" + }, + "redefiningFeature": { + "@id": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf" + }, + "relatedElement": [ + { + "@id": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf" + }, + { + "@id": "99bd4b60-e5a9-55fb-8cea-1dcf517e50ec" + } + ], + "shortName": null, + "source": [ + { + "@id": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf" + } + ], + "specific": { + "@id": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf" + }, + "subsettedFeature": { + "@id": "99bd4b60-e5a9-55fb-8cea-1dcf517e50ec" + }, + "subsettingFeature": { + "@id": "7b9490e5-3eb5-5871-ab9c-1b535cccbdcf" + }, + "target": [ + { + "@id": "99bd4b60-e5a9-55fb-8cea-1dcf517e50ec" + } + ], + "textualRepresentation": [] + }, + { + "@id": "691fb9b1-3d99-53aa-b53a-b9cc1f3760a5", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "691fb9b1-3d99-53aa-b53a-b9cc1f3760a5", + "general": { + "@id": "59665626-a20d-5308-aafb-d676b210142f" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + "owningRelationship": null, + "owningType": { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + { + "@id": "59665626-a20d-5308-aafb-d676b210142f" + } + ], + "shortName": null, + "source": [ + { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + } + ], + "specific": { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + "subsettedFeature": { + "@id": "59665626-a20d-5308-aafb-d676b210142f" + }, + "subsettingFeature": { + "@id": "f913e1e6-2fdf-57eb-b628-967530fecfb5" + }, + "target": [ + { + "@id": "59665626-a20d-5308-aafb-d676b210142f" + } + ], + "textualRepresentation": [] + }, + { + "@id": "eeda4c5c-673e-5581-af35-b2f8442a490f", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "eeda4c5c-673e-5581-af35-b2f8442a490f", + "general": { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28" + }, + "owningRelationship": null, + "owningType": { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28" + }, + { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + } + ], + "shortName": null, + "source": [ + { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28" + } + ], + "specific": { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28" + }, + "subsettedFeature": { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + }, + "subsettingFeature": { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28" + }, + "target": [ + { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + } + ], + "textualRepresentation": [] + }, + { + "@id": "c01dc9ac-2caa-5b82-9dcf-74aa8d3cb2f5", + "@type": "Redefinition", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "c01dc9ac-2caa-5b82-9dcf-74aa8d3cb2f5", + "general": { + "@id": "79252dcf-845e-5151-a0e9-28ee09987171" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28" + }, + "owningRelationship": null, + "owningType": { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28" + }, + "qualifiedName": null, + "redefinedFeature": { + "@id": "79252dcf-845e-5151-a0e9-28ee09987171" + }, + "redefiningFeature": { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28" + }, + "relatedElement": [ + { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28" + }, + { + "@id": "79252dcf-845e-5151-a0e9-28ee09987171" + } + ], + "shortName": null, + "source": [ + { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28" + } + ], + "specific": { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28" + }, + "subsettedFeature": { + "@id": "79252dcf-845e-5151-a0e9-28ee09987171" + }, + "subsettingFeature": { + "@id": "c22bdd75-9c92-52d2-93b5-2c6cf2488a28" + }, + "target": [ + { + "@id": "79252dcf-845e-5151-a0e9-28ee09987171" + } + ], + "textualRepresentation": [] + }, + { + "@id": "8ae173ab-9735-512f-9341-10bed354c9d6", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "8ae173ab-9735-512f-9341-10bed354c9d6", + "general": { + "@id": "7a441137-6036-55c3-8112-b1404ad90a5f" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "f6935a96-bd19-51cd-844b-2a22150106bc" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "f6935a96-bd19-51cd-844b-2a22150106bc" + }, + "owningRelationship": null, + "owningType": { + "@id": "f6935a96-bd19-51cd-844b-2a22150106bc" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "f6935a96-bd19-51cd-844b-2a22150106bc" + }, + { + "@id": "7a441137-6036-55c3-8112-b1404ad90a5f" + } + ], + "shortName": null, + "source": [ + { + "@id": "f6935a96-bd19-51cd-844b-2a22150106bc" + } + ], + "specific": { + "@id": "f6935a96-bd19-51cd-844b-2a22150106bc" + }, + "subsettedFeature": { + "@id": "7a441137-6036-55c3-8112-b1404ad90a5f" + }, + "subsettingFeature": { + "@id": "f6935a96-bd19-51cd-844b-2a22150106bc" + }, + "target": [ + { + "@id": "7a441137-6036-55c3-8112-b1404ad90a5f" + } + ], + "textualRepresentation": [] + }, + { + "@id": "7f30f3e7-5ea2-5518-9ad4-3cc03f55446d", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "7f30f3e7-5ea2-5518-9ad4-3cc03f55446d", + "general": { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + }, + "owningRelationship": null, + "owningType": { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + }, + { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + } + ], + "shortName": null, + "source": [ + { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + } + ], + "specific": { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + }, + "subsettedFeature": { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + }, + "subsettingFeature": { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + }, + "target": [ + { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + } + ], + "textualRepresentation": [] + }, + { + "@id": "3548912e-7dd4-52f5-bfc9-acef23f01b9f", + "@type": "Redefinition", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "3548912e-7dd4-52f5-bfc9-acef23f01b9f", + "general": { + "@id": "780fbe59-dd70-56b5-bbd2-3d2f904daff3" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + }, + "owningRelationship": null, + "owningType": { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + }, + "qualifiedName": null, + "redefinedFeature": { + "@id": "780fbe59-dd70-56b5-bbd2-3d2f904daff3" + }, + "redefiningFeature": { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + }, + "relatedElement": [ + { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + }, + { + "@id": "780fbe59-dd70-56b5-bbd2-3d2f904daff3" + } + ], + "shortName": null, + "source": [ + { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + } + ], + "specific": { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + }, + "subsettedFeature": { + "@id": "780fbe59-dd70-56b5-bbd2-3d2f904daff3" + }, + "subsettingFeature": { + "@id": "14a059af-4d3b-5a44-8cb9-f48028c36af9" + }, + "target": [ + { + "@id": "780fbe59-dd70-56b5-bbd2-3d2f904daff3" + } + ], + "textualRepresentation": [] + }, + { + "@id": "324ee4f2-385a-5d20-8fbe-a2b3594ae77b", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "324ee4f2-385a-5d20-8fbe-a2b3594ae77b", + "general": { + "@id": "0e1bba0a-81f0-518c-8415-d1976bd38f8d" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + }, + "owningRelationship": null, + "owningType": { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + }, + { + "@id": "0e1bba0a-81f0-518c-8415-d1976bd38f8d" + } + ], + "shortName": null, + "source": [ + { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + } + ], + "specific": { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + }, + "subsettedFeature": { + "@id": "0e1bba0a-81f0-518c-8415-d1976bd38f8d" + }, + "subsettingFeature": { + "@id": "84b85b32-2e9a-5718-bb6a-428ab490d1de" + }, + "target": [ + { + "@id": "0e1bba0a-81f0-518c-8415-d1976bd38f8d" + } + ], + "textualRepresentation": [] + }, + { + "@id": "bc019a85-a7bf-5648-8587-a6a06cb56812", + "@type": "ReferenceSubsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "bc019a85-a7bf-5648-8587-a6a06cb56812", + "general": { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "99957371-03b3-5a8c-892c-a3bef51b298c" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "99957371-03b3-5a8c-892c-a3bef51b298c" + }, + "owningRelationship": null, + "owningType": { + "@id": "99957371-03b3-5a8c-892c-a3bef51b298c" + }, + "qualifiedName": null, + "referencedFeature": { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + "referencingFeature": { + "@id": "99957371-03b3-5a8c-892c-a3bef51b298c" + }, + "relatedElement": [ + { + "@id": "99957371-03b3-5a8c-892c-a3bef51b298c" + }, + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + } + ], + "shortName": null, + "source": [ + { + "@id": "99957371-03b3-5a8c-892c-a3bef51b298c" + } + ], + "specific": { + "@id": "99957371-03b3-5a8c-892c-a3bef51b298c" + }, + "subsettedFeature": { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + "subsettingFeature": { + "@id": "99957371-03b3-5a8c-892c-a3bef51b298c" + }, + "target": [ + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + } + ], + "textualRepresentation": [] + }, + { + "@id": "d627471b-a3f9-5d6b-bb0b-d458e748936c", + "@type": "Redefinition", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "d627471b-a3f9-5d6b-bb0b-d458e748936c", + "general": { + "@id": "7d7065b6-1bb8-5bb5-b421-cc92f2e84584" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "99957371-03b3-5a8c-892c-a3bef51b298c" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "99957371-03b3-5a8c-892c-a3bef51b298c" + }, + "owningRelationship": null, + "owningType": { + "@id": "99957371-03b3-5a8c-892c-a3bef51b298c" + }, + "qualifiedName": null, + "redefinedFeature": { + "@id": "7d7065b6-1bb8-5bb5-b421-cc92f2e84584" + }, + "redefiningFeature": { + "@id": "99957371-03b3-5a8c-892c-a3bef51b298c" + }, + "relatedElement": [ + { + "@id": "99957371-03b3-5a8c-892c-a3bef51b298c" + }, + { + "@id": "7d7065b6-1bb8-5bb5-b421-cc92f2e84584" + } + ], + "shortName": null, + "source": [ + { + "@id": "99957371-03b3-5a8c-892c-a3bef51b298c" + } + ], + "specific": { + "@id": "99957371-03b3-5a8c-892c-a3bef51b298c" + }, + "subsettedFeature": { + "@id": "7d7065b6-1bb8-5bb5-b421-cc92f2e84584" + }, + "subsettingFeature": { + "@id": "99957371-03b3-5a8c-892c-a3bef51b298c" + }, + "target": [ + { + "@id": "7d7065b6-1bb8-5bb5-b421-cc92f2e84584" + } + ], + "textualRepresentation": [] + }, + { + "@id": "1eae1db4-3568-5414-8023-f35ab74d5c1e", + "@type": "Redefinition", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "1eae1db4-3568-5414-8023-f35ab74d5c1e", + "general": { + "@id": "99bd4b60-e5a9-55fb-8cea-1dcf517e50ec" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f" + }, + "owningRelationship": null, + "owningType": { + "@id": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f" + }, + "qualifiedName": null, + "redefinedFeature": { + "@id": "99bd4b60-e5a9-55fb-8cea-1dcf517e50ec" + }, + "redefiningFeature": { + "@id": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f" + }, + "relatedElement": [ + { + "@id": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f" + }, + { + "@id": "99bd4b60-e5a9-55fb-8cea-1dcf517e50ec" + } + ], + "shortName": null, + "source": [ + { + "@id": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f" + } + ], + "specific": { + "@id": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f" + }, + "subsettedFeature": { + "@id": "99bd4b60-e5a9-55fb-8cea-1dcf517e50ec" + }, + "subsettingFeature": { + "@id": "f3300e66-e9a6-5ccc-b327-4a61dcd3227f" + }, + "target": [ + { + "@id": "99bd4b60-e5a9-55fb-8cea-1dcf517e50ec" + } + ], + "textualRepresentation": [] + }, + { + "@id": "957cb8ea-92cc-5244-a909-fafdccd08c8c", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "957cb8ea-92cc-5244-a909-fafdccd08c8c", + "general": { + "@id": "59665626-a20d-5308-aafb-d676b210142f" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + "owningRelationship": null, + "owningType": { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + { + "@id": "59665626-a20d-5308-aafb-d676b210142f" + } + ], + "shortName": null, + "source": [ + { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + } + ], + "specific": { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + "subsettedFeature": { + "@id": "59665626-a20d-5308-aafb-d676b210142f" + }, + "subsettingFeature": { + "@id": "18b3eefc-5ef5-5abe-84a3-fb44836d20ee" + }, + "target": [ + { + "@id": "59665626-a20d-5308-aafb-d676b210142f" + } + ], + "textualRepresentation": [] + }, + { + "@id": "8cc6b285-b341-5e87-b1de-dc954e0f18c4", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "8cc6b285-b341-5e87-b1de-dc954e0f18c4", + "general": { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a" + }, + "owningRelationship": null, + "owningType": { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a" + }, + { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + } + ], + "shortName": null, + "source": [ + { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a" + } + ], + "specific": { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a" + }, + "subsettedFeature": { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + }, + "subsettingFeature": { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a" + }, + "target": [ + { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + } + ], + "textualRepresentation": [] + }, + { + "@id": "20539639-4f71-5bee-81d5-ccc04b72bb08", + "@type": "Redefinition", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "20539639-4f71-5bee-81d5-ccc04b72bb08", + "general": { + "@id": "79252dcf-845e-5151-a0e9-28ee09987171" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a" + }, + "owningRelationship": null, + "owningType": { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a" + }, + "qualifiedName": null, + "redefinedFeature": { + "@id": "79252dcf-845e-5151-a0e9-28ee09987171" + }, + "redefiningFeature": { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a" + }, + "relatedElement": [ + { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a" + }, + { + "@id": "79252dcf-845e-5151-a0e9-28ee09987171" + } + ], + "shortName": null, + "source": [ + { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a" + } + ], + "specific": { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a" + }, + "subsettedFeature": { + "@id": "79252dcf-845e-5151-a0e9-28ee09987171" + }, + "subsettingFeature": { + "@id": "85a278ad-aed1-54ec-be04-11e9f72daa5a" + }, + "target": [ + { + "@id": "79252dcf-845e-5151-a0e9-28ee09987171" + } + ], + "textualRepresentation": [] + }, + { + "@id": "cd462f79-ba27-5a3a-9c17-5ce1566a11a1", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "cd462f79-ba27-5a3a-9c17-5ce1566a11a1", + "general": { + "@id": "7a441137-6036-55c3-8112-b1404ad90a5f" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac" + }, + "owningRelationship": null, + "owningType": { + "@id": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac" + }, + { + "@id": "7a441137-6036-55c3-8112-b1404ad90a5f" + } + ], + "shortName": null, + "source": [ + { + "@id": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac" + } + ], + "specific": { + "@id": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac" + }, + "subsettedFeature": { + "@id": "7a441137-6036-55c3-8112-b1404ad90a5f" + }, + "subsettingFeature": { + "@id": "89b1754b-de6e-5320-af5c-ec8eecfcf0ac" + }, + "target": [ + { + "@id": "7a441137-6036-55c3-8112-b1404ad90a5f" + } + ], + "textualRepresentation": [] + }, + { + "@id": "232484ae-2333-5e06-a1ff-0d64215a4466", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "232484ae-2333-5e06-a1ff-0d64215a4466", + "general": { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + }, + "owningRelationship": null, + "owningType": { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + }, + { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + } + ], + "shortName": null, + "source": [ + { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + } + ], + "specific": { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + }, + "subsettedFeature": { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + }, + "subsettingFeature": { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + }, + "target": [ + { + "@id": "3176ab6a-8d7b-5e14-b263-57bd30f77f78" + } + ], + "textualRepresentation": [] + }, + { + "@id": "24bec017-4527-55fd-85b1-d9e6e5072f81", + "@type": "Redefinition", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "24bec017-4527-55fd-85b1-d9e6e5072f81", + "general": { + "@id": "780fbe59-dd70-56b5-bbd2-3d2f904daff3" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + }, + "owningRelationship": null, + "owningType": { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + }, + "qualifiedName": null, + "redefinedFeature": { + "@id": "780fbe59-dd70-56b5-bbd2-3d2f904daff3" + }, + "redefiningFeature": { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + }, + "relatedElement": [ + { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + }, + { + "@id": "780fbe59-dd70-56b5-bbd2-3d2f904daff3" + } + ], + "shortName": null, + "source": [ + { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + } + ], + "specific": { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + }, + "subsettedFeature": { + "@id": "780fbe59-dd70-56b5-bbd2-3d2f904daff3" + }, + "subsettingFeature": { + "@id": "20de5d5b-15d3-54ce-bb2a-9f2bbc6a534a" + }, + "target": [ + { + "@id": "780fbe59-dd70-56b5-bbd2-3d2f904daff3" + } + ], + "textualRepresentation": [] + }, + { + "@id": "876777a1-4824-58f7-867b-09c917a39882", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "876777a1-4824-58f7-867b-09c917a39882", + "general": { + "@id": "c590aa58-6c78-5aeb-b1c9-a784abcb2e29" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + }, + "owningRelationship": null, + "owningType": { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + }, + { + "@id": "c590aa58-6c78-5aeb-b1c9-a784abcb2e29" + } + ], + "shortName": null, + "source": [ + { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + } + ], + "specific": { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + }, + "subsettedFeature": { + "@id": "c590aa58-6c78-5aeb-b1c9-a784abcb2e29" + }, + "subsettingFeature": { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + }, + "target": [ + { + "@id": "c590aa58-6c78-5aeb-b1c9-a784abcb2e29" + } + ], + "textualRepresentation": [] + }, + { + "@id": "f01798f0-4af1-5e9c-9ffb-8e5ca152800a", + "@type": "ReturnParameterMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "f01798f0-4af1-5e9c-9ffb-8e5ca152800a", + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + }, + "memberElementId": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d", + "memberName": "result", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + }, + "ownedMemberElementId": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d", + "ownedMemberFeature": { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + }, + "ownedMemberName": "result", + "ownedMemberParameter": { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + }, + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + }, + "owningRelationship": null, + "owningType": { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + }, + { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + } + ], + "shortName": null, + "source": [ + { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + } + ], + "target": [ + { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d", + "@type": "Feature", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "direction": "out", + "documentation": [], + "elementId": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d", + "endFeature": [], + "endOwningType": null, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isSufficient": false, + "isUnique": true, + "isVariable": false, + "member": [], + "membership": [], + "multiplicity": null, + "name": "result", + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [ + { + "@id": "00f94f53-abe5-5602-bc1c-0585bec29dcd" + } + ], + "ownedReferenceSubsetting": null, + "ownedRelationship": [ + { + "@id": "609cd6d7-c3b5-5d68-ae62-1980dffda019" + }, + { + "@id": "e38fa9a0-a287-5e0d-9999-e07577cf0e65" + }, + { + "@id": "00f94f53-abe5-5602-bc1c-0585bec29dcd" + } + ], + "ownedSpecialization": [ + { + "@id": "609cd6d7-c3b5-5d68-ae62-1980dffda019" + }, + { + "@id": "00f94f53-abe5-5602-bc1c-0585bec29dcd" + } + ], + "ownedSubsetting": [ + { + "@id": "609cd6d7-c3b5-5d68-ae62-1980dffda019" + }, + { + "@id": "00f94f53-abe5-5602-bc1c-0585bec29dcd" + } + ], + "ownedTypeFeaturing": [ + { + "@id": "e38fa9a0-a287-5e0d-9999-e07577cf0e65" + } + ], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + }, + "owningFeatureMembership": { + "@id": "f01798f0-4af1-5e9c-9ffb-8e5ca152800a" + }, + "owningMembership": { + "@id": "f01798f0-4af1-5e9c-9ffb-8e5ca152800a" + }, + "owningNamespace": { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + }, + "owningRelationship": { + "@id": "f01798f0-4af1-5e9c-9ffb-8e5ca152800a" + }, + "owningType": { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + }, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [], + "type": [ + { + "@id": "d5b4e7df-e644-5f2f-b95e-cf6f1f6c076d" + }, + { + "@id": "d1e9242d-b2e3-5270-bf69-4f4fb0447193" + } + ], + "unioningType": [] + }, + { + "@id": "609cd6d7-c3b5-5d68-ae62-1980dffda019", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "609cd6d7-c3b5-5d68-ae62-1980dffda019", + "general": { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + }, + "owningRelationship": null, + "owningType": { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + }, + { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + } + ], + "shortName": null, + "source": [ + { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + } + ], + "specific": { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + }, + "subsettedFeature": { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + }, + "subsettingFeature": { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + }, + "target": [ + { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + } + ], + "textualRepresentation": [] + }, + { + "@id": "e38fa9a0-a287-5e0d-9999-e07577cf0e65", + "@type": "TypeFeaturing", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "e38fa9a0-a287-5e0d-9999-e07577cf0e65", + "featureOfType": { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + }, + "featuringType": { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeatureOfType": { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + }, + { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + } + ], + "shortName": null, + "source": [ + { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + } + ], + "target": [ + { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + } + ], + "textualRepresentation": [] + }, + { + "@id": "00f94f53-abe5-5602-bc1c-0585bec29dcd", + "@type": "Redefinition", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "00f94f53-abe5-5602-bc1c-0585bec29dcd", + "general": { + "@id": "d4c65e7a-f5cd-5e32-bb56-93a0cfa01d23" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + }, + "owningRelationship": null, + "owningType": { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + }, + "qualifiedName": null, + "redefinedFeature": { + "@id": "d4c65e7a-f5cd-5e32-bb56-93a0cfa01d23" + }, + "redefiningFeature": { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + }, + "relatedElement": [ + { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + }, + { + "@id": "d4c65e7a-f5cd-5e32-bb56-93a0cfa01d23" + } + ], + "shortName": null, + "source": [ + { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + } + ], + "specific": { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + }, + "subsettedFeature": { + "@id": "d4c65e7a-f5cd-5e32-bb56-93a0cfa01d23" + }, + "subsettingFeature": { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + }, + "target": [ + { + "@id": "d4c65e7a-f5cd-5e32-bb56-93a0cfa01d23" + } + ], + "textualRepresentation": [] + }, + { + "@id": "1ee5bd99-a694-5061-8d5d-fe13517abff8", + "@type": "OwningMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "1ee5bd99-a694-5061-8d5d-fe13517abff8", + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "39d52089-5ce9-5a43-ba79-e0c91b78139d" + }, + "memberElementId": "39d52089-5ce9-5a43-ba79-e0c91b78139d", + "memberName": null, + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "39d52089-5ce9-5a43-ba79-e0c91b78139d" + }, + "ownedMemberElementId": "39d52089-5ce9-5a43-ba79-e0c91b78139d", + "ownedMemberName": null, + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "39d52089-5ce9-5a43-ba79-e0c91b78139d" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + }, + { + "@id": "39d52089-5ce9-5a43-ba79-e0c91b78139d" + } + ], + "shortName": null, + "source": [ + { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + } + ], + "target": [ + { + "@id": "39d52089-5ce9-5a43-ba79-e0c91b78139d" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "39d52089-5ce9-5a43-ba79-e0c91b78139d", + "@type": "BindingConnector", + "aliasIds": [], + "association": [], + "chainingFeature": [], + "connectorEnd": [ + { + "@id": "0c39244b-b4df-5128-88ad-efd31c9873a6" + }, + { + "@id": "5712c2ba-0774-5bd7-b49d-834f2e724450" + } + ], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "defaultFeaturingType": { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + }, + "differencingType": [], + "directedFeature": [], + "direction": null, + "documentation": [], + "elementId": "39d52089-5ce9-5a43-ba79-e0c91b78139d", + "endFeature": [ + { + "@id": "0c39244b-b4df-5128-88ad-efd31c9873a6" + }, + { + "@id": "5712c2ba-0774-5bd7-b49d-834f2e724450" + } + ], + "endOwningType": null, + "feature": [ + { + "@id": "0c39244b-b4df-5128-88ad-efd31c9873a6" + }, + { + "@id": "5712c2ba-0774-5bd7-b49d-834f2e724450" + } + ], + "featureMembership": [ + { + "@id": "c229ffed-c89e-5ab8-972b-19f087c68b53" + }, + { + "@id": "06afb105-f542-5443-94ca-b044b0711b39" + } + ], + "featureTarget": { + "@id": "39d52089-5ce9-5a43-ba79-e0c91b78139d" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": false, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isSufficient": false, + "isUnique": true, + "isVariable": false, + "member": [ + { + "@id": "0c39244b-b4df-5128-88ad-efd31c9873a6" + }, + { + "@id": "5712c2ba-0774-5bd7-b49d-834f2e724450" + } + ], + "membership": [ + { + "@id": "c229ffed-c89e-5ab8-972b-19f087c68b53" + }, + { + "@id": "06afb105-f542-5443-94ca-b044b0711b39" + } + ], + "multiplicity": null, + "name": null, + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [ + { + "@id": "0c39244b-b4df-5128-88ad-efd31c9873a6" + }, + { + "@id": "5712c2ba-0774-5bd7-b49d-834f2e724450" + } + ], + "ownedEndFeature": [ + { + "@id": "0c39244b-b4df-5128-88ad-efd31c9873a6" + }, + { + "@id": "5712c2ba-0774-5bd7-b49d-834f2e724450" + } + ], + "ownedFeature": [ + { + "@id": "0c39244b-b4df-5128-88ad-efd31c9873a6" + }, + { + "@id": "5712c2ba-0774-5bd7-b49d-834f2e724450" + } + ], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [ + { + "@id": "c229ffed-c89e-5ab8-972b-19f087c68b53" + }, + { + "@id": "06afb105-f542-5443-94ca-b044b0711b39" + } + ], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [ + { + "@id": "0c39244b-b4df-5128-88ad-efd31c9873a6" + }, + { + "@id": "5712c2ba-0774-5bd7-b49d-834f2e724450" + } + ], + "ownedMembership": [ + { + "@id": "c229ffed-c89e-5ab8-972b-19f087c68b53" + }, + { + "@id": "06afb105-f542-5443-94ca-b044b0711b39" + } + ], + "ownedRedefinition": [], + "ownedReferenceSubsetting": null, + "ownedRelatedElement": [], + "ownedRelationship": [ + { + "@id": "c229ffed-c89e-5ab8-972b-19f087c68b53" + }, + { + "@id": "06afb105-f542-5443-94ca-b044b0711b39" + } + ], + "ownedSpecialization": [], + "ownedSubsetting": [], + "ownedTypeFeaturing": [], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + }, + "owningFeatureMembership": null, + "owningMembership": { + "@id": "1ee5bd99-a694-5061-8d5d-fe13517abff8" + }, + "owningNamespace": { + "@id": "f8b32c4a-91e0-58f1-a602-e8b5a02af4ac" + }, + "owningRelatedElement": null, + "owningRelationship": { + "@id": "1ee5bd99-a694-5061-8d5d-fe13517abff8" + }, + "owningType": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + }, + { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + } + ], + "relatedFeature": [ + { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + }, + { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + } + ], + "shortName": null, + "source": [ + { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + } + ], + "sourceFeature": { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + }, + "target": [ + { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + } + ], + "targetFeature": [ + { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + } + ], + "textualRepresentation": [], + "type": [], + "unioningType": [] + }, + { + "@id": "c229ffed-c89e-5ab8-972b-19f087c68b53", + "@type": "EndFeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "c229ffed-c89e-5ab8-972b-19f087c68b53", + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "0c39244b-b4df-5128-88ad-efd31c9873a6" + }, + "memberElementId": "0c39244b-b4df-5128-88ad-efd31c9873a6", + "memberName": "thisThing", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "39d52089-5ce9-5a43-ba79-e0c91b78139d" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "0c39244b-b4df-5128-88ad-efd31c9873a6" + }, + "ownedMemberElementId": "0c39244b-b4df-5128-88ad-efd31c9873a6", + "ownedMemberFeature": { + "@id": "0c39244b-b4df-5128-88ad-efd31c9873a6" + }, + "ownedMemberName": "thisThing", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "0c39244b-b4df-5128-88ad-efd31c9873a6" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "39d52089-5ce9-5a43-ba79-e0c91b78139d" + }, + "owningRelationship": null, + "owningType": { + "@id": "39d52089-5ce9-5a43-ba79-e0c91b78139d" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "39d52089-5ce9-5a43-ba79-e0c91b78139d" + }, + { + "@id": "0c39244b-b4df-5128-88ad-efd31c9873a6" + } + ], + "shortName": null, + "source": [ + { + "@id": "39d52089-5ce9-5a43-ba79-e0c91b78139d" + } + ], + "target": [ + { + "@id": "0c39244b-b4df-5128-88ad-efd31c9873a6" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "0c39244b-b4df-5128-88ad-efd31c9873a6", + "@type": "Feature", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "direction": null, + "documentation": [], + "elementId": "0c39244b-b4df-5128-88ad-efd31c9873a6", + "endFeature": [], + "endOwningType": { + "@id": "39d52089-5ce9-5a43-ba79-e0c91b78139d" + }, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "0c39244b-b4df-5128-88ad-efd31c9873a6" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isSufficient": false, + "isUnique": true, + "isVariable": false, + "member": [], + "membership": [], + "multiplicity": null, + "name": "thisThing", + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": { + "@id": "d79c4426-9cee-5059-9f0f-fda9d98346a7" + }, + "ownedRelationship": [ + { + "@id": "d79c4426-9cee-5059-9f0f-fda9d98346a7" + }, + { + "@id": "993feabc-0a0e-5253-8066-74415eea3c8c" + } + ], + "ownedSpecialization": [ + { + "@id": "d79c4426-9cee-5059-9f0f-fda9d98346a7" + } + ], + "ownedSubsetting": [ + { + "@id": "d79c4426-9cee-5059-9f0f-fda9d98346a7" + } + ], + "ownedTypeFeaturing": [ + { + "@id": "993feabc-0a0e-5253-8066-74415eea3c8c" + } + ], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "39d52089-5ce9-5a43-ba79-e0c91b78139d" + }, + "owningFeatureMembership": { + "@id": "c229ffed-c89e-5ab8-972b-19f087c68b53" + }, + "owningMembership": { + "@id": "c229ffed-c89e-5ab8-972b-19f087c68b53" + }, + "owningNamespace": { + "@id": "39d52089-5ce9-5a43-ba79-e0c91b78139d" + }, + "owningRelationship": { + "@id": "c229ffed-c89e-5ab8-972b-19f087c68b53" + }, + "owningType": { + "@id": "39d52089-5ce9-5a43-ba79-e0c91b78139d" + }, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [], + "type": [ + { + "@id": "d1e9242d-b2e3-5270-bf69-4f4fb0447193" + } + ], + "unioningType": [] + }, + { + "@id": "d79c4426-9cee-5059-9f0f-fda9d98346a7", + "@type": "ReferenceSubsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "d79c4426-9cee-5059-9f0f-fda9d98346a7", + "general": { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "0c39244b-b4df-5128-88ad-efd31c9873a6" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "0c39244b-b4df-5128-88ad-efd31c9873a6" + }, + "owningRelationship": null, + "owningType": { + "@id": "0c39244b-b4df-5128-88ad-efd31c9873a6" + }, + "qualifiedName": null, + "referencedFeature": { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + }, + "referencingFeature": { + "@id": "0c39244b-b4df-5128-88ad-efd31c9873a6" + }, + "relatedElement": [ + { + "@id": "0c39244b-b4df-5128-88ad-efd31c9873a6" + }, + { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + } + ], + "shortName": null, + "source": [ + { + "@id": "0c39244b-b4df-5128-88ad-efd31c9873a6" + } + ], + "specific": { + "@id": "0c39244b-b4df-5128-88ad-efd31c9873a6" + }, + "subsettedFeature": { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + }, + "subsettingFeature": { + "@id": "0c39244b-b4df-5128-88ad-efd31c9873a6" + }, + "target": [ + { + "@id": "2f8cf3a6-adcf-5f8d-a34a-24a38eb7dd5d" + } + ], + "textualRepresentation": [] + }, + { + "@id": "993feabc-0a0e-5253-8066-74415eea3c8c", + "@type": "TypeFeaturing", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "993feabc-0a0e-5253-8066-74415eea3c8c", + "featureOfType": { + "@id": "0c39244b-b4df-5128-88ad-efd31c9873a6" + }, + "featuringType": { + "@id": "39d52089-5ce9-5a43-ba79-e0c91b78139d" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeatureOfType": { + "@id": "0c39244b-b4df-5128-88ad-efd31c9873a6" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "0c39244b-b4df-5128-88ad-efd31c9873a6" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "0c39244b-b4df-5128-88ad-efd31c9873a6" + }, + { + "@id": "39d52089-5ce9-5a43-ba79-e0c91b78139d" + } + ], + "shortName": null, + "source": [ + { + "@id": "0c39244b-b4df-5128-88ad-efd31c9873a6" + } + ], + "target": [ + { + "@id": "39d52089-5ce9-5a43-ba79-e0c91b78139d" + } + ], + "textualRepresentation": [] + }, + { + "@id": "06afb105-f542-5443-94ca-b044b0711b39", + "@type": "EndFeatureMembership", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "06afb105-f542-5443-94ca-b044b0711b39", + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "memberElement": { + "@id": "5712c2ba-0774-5bd7-b49d-834f2e724450" + }, + "memberElementId": "5712c2ba-0774-5bd7-b49d-834f2e724450", + "memberName": "sameThing", + "memberShortName": null, + "membershipOwningNamespace": { + "@id": "39d52089-5ce9-5a43-ba79-e0c91b78139d" + }, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedMemberElement": { + "@id": "5712c2ba-0774-5bd7-b49d-834f2e724450" + }, + "ownedMemberElementId": "5712c2ba-0774-5bd7-b49d-834f2e724450", + "ownedMemberFeature": { + "@id": "5712c2ba-0774-5bd7-b49d-834f2e724450" + }, + "ownedMemberName": "sameThing", + "ownedMemberShortName": null, + "ownedRelatedElement": [ + { + "@id": "5712c2ba-0774-5bd7-b49d-834f2e724450" + } + ], + "ownedRelationship": [], + "owner": null, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "39d52089-5ce9-5a43-ba79-e0c91b78139d" + }, + "owningRelationship": null, + "owningType": { + "@id": "39d52089-5ce9-5a43-ba79-e0c91b78139d" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "39d52089-5ce9-5a43-ba79-e0c91b78139d" + }, + { + "@id": "5712c2ba-0774-5bd7-b49d-834f2e724450" + } + ], + "shortName": null, + "source": [ + { + "@id": "39d52089-5ce9-5a43-ba79-e0c91b78139d" + } + ], + "target": [ + { + "@id": "5712c2ba-0774-5bd7-b49d-834f2e724450" + } + ], + "textualRepresentation": [], + "visibility": "public" + }, + { + "@id": "5712c2ba-0774-5bd7-b49d-834f2e724450", + "@type": "Feature", + "aliasIds": [], + "chainingFeature": [], + "crossFeature": null, + "declaredName": null, + "declaredShortName": null, + "differencingType": [], + "directedFeature": [], + "direction": null, + "documentation": [], + "elementId": "5712c2ba-0774-5bd7-b49d-834f2e724450", + "endFeature": [], + "endOwningType": { + "@id": "39d52089-5ce9-5a43-ba79-e0c91b78139d" + }, + "feature": [], + "featureMembership": [], + "featureTarget": { + "@id": "5712c2ba-0774-5bd7-b49d-834f2e724450" + }, + "featuringType": [], + "importedMembership": [], + "inheritedFeature": [], + "inheritedMembership": [], + "input": [], + "intersectingType": [], + "isAbstract": false, + "isComposite": false, + "isConjugated": false, + "isConstant": false, + "isDerived": false, + "isEnd": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "isOrdered": false, + "isPortion": false, + "isSufficient": false, + "isUnique": true, + "isVariable": false, + "member": [], + "membership": [], + "multiplicity": null, + "name": "sameThing", + "output": [], + "ownedAnnotation": [], + "ownedConjugator": null, + "ownedCrossSubsetting": null, + "ownedDifferencing": [], + "ownedDisjoining": [], + "ownedElement": [], + "ownedEndFeature": [], + "ownedFeature": [], + "ownedFeatureChaining": [], + "ownedFeatureInverting": [], + "ownedFeatureMembership": [], + "ownedImport": [], + "ownedIntersecting": [], + "ownedMember": [], + "ownedMembership": [], + "ownedRedefinition": [], + "ownedReferenceSubsetting": { + "@id": "70adb5d0-1a0b-502f-98d0-aaf39272a696" + }, + "ownedRelationship": [ + { + "@id": "70adb5d0-1a0b-502f-98d0-aaf39272a696" + }, + { + "@id": "d14c7479-75f2-5ce4-955b-623d0fc601bf" + } + ], + "ownedSpecialization": [ + { + "@id": "70adb5d0-1a0b-502f-98d0-aaf39272a696" + } + ], + "ownedSubsetting": [ + { + "@id": "70adb5d0-1a0b-502f-98d0-aaf39272a696" + } + ], + "ownedTypeFeaturing": [ + { + "@id": "d14c7479-75f2-5ce4-955b-623d0fc601bf" + } + ], + "ownedTyping": [], + "ownedUnioning": [], + "owner": { + "@id": "39d52089-5ce9-5a43-ba79-e0c91b78139d" + }, + "owningFeatureMembership": { + "@id": "06afb105-f542-5443-94ca-b044b0711b39" + }, + "owningMembership": { + "@id": "06afb105-f542-5443-94ca-b044b0711b39" + }, + "owningNamespace": { + "@id": "39d52089-5ce9-5a43-ba79-e0c91b78139d" + }, + "owningRelationship": { + "@id": "06afb105-f542-5443-94ca-b044b0711b39" + }, + "owningType": { + "@id": "39d52089-5ce9-5a43-ba79-e0c91b78139d" + }, + "qualifiedName": null, + "shortName": null, + "textualRepresentation": [], + "type": [ + { + "@id": "d5b4e7df-e644-5f2f-b95e-cf6f1f6c076d" + }, + { + "@id": "d1e9242d-b2e3-5270-bf69-4f4fb0447193" + } + ], + "unioningType": [] + }, + { + "@id": "70adb5d0-1a0b-502f-98d0-aaf39272a696", + "@type": "ReferenceSubsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "70adb5d0-1a0b-502f-98d0-aaf39272a696", + "general": { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "5712c2ba-0774-5bd7-b49d-834f2e724450" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "5712c2ba-0774-5bd7-b49d-834f2e724450" + }, + "owningRelationship": null, + "owningType": { + "@id": "5712c2ba-0774-5bd7-b49d-834f2e724450" + }, + "qualifiedName": null, + "referencedFeature": { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + }, + "referencingFeature": { + "@id": "5712c2ba-0774-5bd7-b49d-834f2e724450" + }, + "relatedElement": [ + { + "@id": "5712c2ba-0774-5bd7-b49d-834f2e724450" + }, + { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + } + ], + "shortName": null, + "source": [ + { + "@id": "5712c2ba-0774-5bd7-b49d-834f2e724450" + } + ], + "specific": { + "@id": "5712c2ba-0774-5bd7-b49d-834f2e724450" + }, + "subsettedFeature": { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + }, + "subsettingFeature": { + "@id": "5712c2ba-0774-5bd7-b49d-834f2e724450" + }, + "target": [ + { + "@id": "7d9a7dbf-840e-5d56-80cf-4f84c26a659d" + } + ], + "textualRepresentation": [] + }, + { + "@id": "d14c7479-75f2-5ce4-955b-623d0fc601bf", + "@type": "TypeFeaturing", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "d14c7479-75f2-5ce4-955b-623d0fc601bf", + "featureOfType": { + "@id": "5712c2ba-0774-5bd7-b49d-834f2e724450" + }, + "featuringType": { + "@id": "39d52089-5ce9-5a43-ba79-e0c91b78139d" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeatureOfType": { + "@id": "5712c2ba-0774-5bd7-b49d-834f2e724450" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "5712c2ba-0774-5bd7-b49d-834f2e724450" + }, + "owningRelationship": null, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "5712c2ba-0774-5bd7-b49d-834f2e724450" + }, + { + "@id": "39d52089-5ce9-5a43-ba79-e0c91b78139d" + } + ], + "shortName": null, + "source": [ + { + "@id": "5712c2ba-0774-5bd7-b49d-834f2e724450" + } + ], + "target": [ + { + "@id": "39d52089-5ce9-5a43-ba79-e0c91b78139d" + } + ], + "textualRepresentation": [] + }, + { + "@id": "8c125c6f-8f73-5a01-8125-fcf3aa26c89a", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "8c125c6f-8f73-5a01-8125-fcf3aa26c89a", + "general": { + "@id": "0e1bba0a-81f0-518c-8415-d1976bd38f8d" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + }, + "owningRelationship": null, + "owningType": { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + }, + { + "@id": "0e1bba0a-81f0-518c-8415-d1976bd38f8d" + } + ], + "shortName": null, + "source": [ + { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + } + ], + "specific": { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + }, + "subsettedFeature": { + "@id": "0e1bba0a-81f0-518c-8415-d1976bd38f8d" + }, + "subsettingFeature": { + "@id": "a5bbd945-f7d2-52da-89e1-87636e299f51" + }, + "target": [ + { + "@id": "0e1bba0a-81f0-518c-8415-d1976bd38f8d" + } + ], + "textualRepresentation": [] + }, + { + "@id": "27abbd5b-fe9e-5d42-bb3c-cd6ab40205df", + "@type": "ReferenceSubsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "27abbd5b-fe9e-5d42-bb3c-cd6ab40205df", + "general": { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "6e96dce4-93f6-54b8-8b2e-77be485cf578" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "6e96dce4-93f6-54b8-8b2e-77be485cf578" + }, + "owningRelationship": null, + "owningType": { + "@id": "6e96dce4-93f6-54b8-8b2e-77be485cf578" + }, + "qualifiedName": null, + "referencedFeature": { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + "referencingFeature": { + "@id": "6e96dce4-93f6-54b8-8b2e-77be485cf578" + }, + "relatedElement": [ + { + "@id": "6e96dce4-93f6-54b8-8b2e-77be485cf578" + }, + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + } + ], + "shortName": null, + "source": [ + { + "@id": "6e96dce4-93f6-54b8-8b2e-77be485cf578" + } + ], + "specific": { + "@id": "6e96dce4-93f6-54b8-8b2e-77be485cf578" + }, + "subsettedFeature": { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + }, + "subsettingFeature": { + "@id": "6e96dce4-93f6-54b8-8b2e-77be485cf578" + }, + "target": [ + { + "@id": "cca4f9b5-be00-50ed-86ee-8b17efab256d" + } + ], + "textualRepresentation": [] + }, + { + "@id": "5fab2e3b-8e96-5f54-9432-0d218de28617", + "@type": "Redefinition", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "5fab2e3b-8e96-5f54-9432-0d218de28617", + "general": { + "@id": "7d7065b6-1bb8-5bb5-b421-cc92f2e84584" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "6e96dce4-93f6-54b8-8b2e-77be485cf578" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "6e96dce4-93f6-54b8-8b2e-77be485cf578" + }, + "owningRelationship": null, + "owningType": { + "@id": "6e96dce4-93f6-54b8-8b2e-77be485cf578" + }, + "qualifiedName": null, + "redefinedFeature": { + "@id": "7d7065b6-1bb8-5bb5-b421-cc92f2e84584" + }, + "redefiningFeature": { + "@id": "6e96dce4-93f6-54b8-8b2e-77be485cf578" + }, + "relatedElement": [ + { + "@id": "6e96dce4-93f6-54b8-8b2e-77be485cf578" + }, + { + "@id": "7d7065b6-1bb8-5bb5-b421-cc92f2e84584" + } + ], + "shortName": null, + "source": [ + { + "@id": "6e96dce4-93f6-54b8-8b2e-77be485cf578" + } + ], + "specific": { + "@id": "6e96dce4-93f6-54b8-8b2e-77be485cf578" + }, + "subsettedFeature": { + "@id": "7d7065b6-1bb8-5bb5-b421-cc92f2e84584" + }, + "subsettingFeature": { + "@id": "6e96dce4-93f6-54b8-8b2e-77be485cf578" + }, + "target": [ + { + "@id": "7d7065b6-1bb8-5bb5-b421-cc92f2e84584" + } + ], + "textualRepresentation": [] + }, + { + "@id": "7c2b623e-5884-5cfe-95fd-95d6d9865371", + "@type": "Redefinition", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "7c2b623e-5884-5cfe-95fd-95d6d9865371", + "general": { + "@id": "99bd4b60-e5a9-55fb-8cea-1dcf517e50ec" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b" + }, + "owningRelationship": null, + "owningType": { + "@id": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b" + }, + "qualifiedName": null, + "redefinedFeature": { + "@id": "99bd4b60-e5a9-55fb-8cea-1dcf517e50ec" + }, + "redefiningFeature": { + "@id": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b" + }, + "relatedElement": [ + { + "@id": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b" + }, + { + "@id": "99bd4b60-e5a9-55fb-8cea-1dcf517e50ec" + } + ], + "shortName": null, + "source": [ + { + "@id": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b" + } + ], + "specific": { + "@id": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b" + }, + "subsettedFeature": { + "@id": "99bd4b60-e5a9-55fb-8cea-1dcf517e50ec" + }, + "subsettingFeature": { + "@id": "9b43ac9e-2ad8-5aff-968c-b2bce4ad476b" + }, + "target": [ + { + "@id": "99bd4b60-e5a9-55fb-8cea-1dcf517e50ec" + } + ], + "textualRepresentation": [] + }, + { + "@id": "67919ffa-93ad-51c7-aca2-e19dc7566b71", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "67919ffa-93ad-51c7-aca2-e19dc7566b71", + "general": { + "@id": "59665626-a20d-5308-aafb-d676b210142f" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + }, + "owningRelationship": null, + "owningType": { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + }, + { + "@id": "59665626-a20d-5308-aafb-d676b210142f" + } + ], + "shortName": null, + "source": [ + { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + } + ], + "specific": { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + }, + "subsettedFeature": { + "@id": "59665626-a20d-5308-aafb-d676b210142f" + }, + "subsettingFeature": { + "@id": "02089055-4a65-5de8-bd2b-c66b0a627b0b" + }, + "target": [ + { + "@id": "59665626-a20d-5308-aafb-d676b210142f" + } + ], + "textualRepresentation": [] + }, + { + "@id": "0a55051c-1d00-5da1-ae55-ae6f02c9f65a", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "0a55051c-1d00-5da1-ae55-ae6f02c9f65a", + "general": { + "@id": "0cc065ef-4e93-5aed-a3f3-5e8cbb417021" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "b9fa3146-fc73-528e-bcaa-1137d127278c" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "b9fa3146-fc73-528e-bcaa-1137d127278c" + }, + "owningRelationship": null, + "owningType": { + "@id": "b9fa3146-fc73-528e-bcaa-1137d127278c" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "b9fa3146-fc73-528e-bcaa-1137d127278c" + }, + { + "@id": "0cc065ef-4e93-5aed-a3f3-5e8cbb417021" + } + ], + "shortName": null, + "source": [ + { + "@id": "b9fa3146-fc73-528e-bcaa-1137d127278c" + } + ], + "specific": { + "@id": "b9fa3146-fc73-528e-bcaa-1137d127278c" + }, + "subsettedFeature": { + "@id": "0cc065ef-4e93-5aed-a3f3-5e8cbb417021" + }, + "subsettingFeature": { + "@id": "b9fa3146-fc73-528e-bcaa-1137d127278c" + }, + "target": [ + { + "@id": "0cc065ef-4e93-5aed-a3f3-5e8cbb417021" + } + ], + "textualRepresentation": [] + }, + { + "@id": "0e2b1780-e9ba-5c31-a222-e524c49943a4", + "@type": "Subsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "0e2b1780-e9ba-5c31-a222-e524c49943a4", + "general": { + "@id": "0e1bba0a-81f0-518c-8415-d1976bd38f8d" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + }, + "owningRelationship": null, + "owningType": { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + }, + "qualifiedName": null, + "relatedElement": [ + { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + }, + { + "@id": "0e1bba0a-81f0-518c-8415-d1976bd38f8d" + } + ], + "shortName": null, + "source": [ + { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + } + ], + "specific": { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + }, + "subsettedFeature": { + "@id": "0e1bba0a-81f0-518c-8415-d1976bd38f8d" + }, + "subsettingFeature": { + "@id": "b73ea64c-b57c-564d-8cfa-b4d35d3547db" + }, + "target": [ + { + "@id": "0e1bba0a-81f0-518c-8415-d1976bd38f8d" + } + ], + "textualRepresentation": [] + }, + { + "@id": "7218a1db-a85d-5c02-b8ad-1ad5d26eaeef", + "@type": "ReferenceSubsetting", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "7218a1db-a85d-5c02-b8ad-1ad5d26eaeef", + "general": { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737" + }, + "owningRelationship": null, + "owningType": { + "@id": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737" + }, + "qualifiedName": null, + "referencedFeature": { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + "referencingFeature": { + "@id": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737" + }, + "relatedElement": [ + { + "@id": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737" + }, + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + } + ], + "shortName": null, + "source": [ + { + "@id": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737" + } + ], + "specific": { + "@id": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737" + }, + "subsettedFeature": { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + }, + "subsettingFeature": { + "@id": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737" + }, + "target": [ + { + "@id": "eb580a55-5649-5be2-9fe7-d7e6526f0c46" + } + ], + "textualRepresentation": [] + }, + { + "@id": "4210a887-80b2-5ea4-b852-156bd6b9e739", + "@type": "Redefinition", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "4210a887-80b2-5ea4-b852-156bd6b9e739", + "general": { + "@id": "7d7065b6-1bb8-5bb5-b421-cc92f2e84584" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737" + }, + "owningRelationship": null, + "owningType": { + "@id": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737" + }, + "qualifiedName": null, + "redefinedFeature": { + "@id": "7d7065b6-1bb8-5bb5-b421-cc92f2e84584" + }, + "redefiningFeature": { + "@id": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737" + }, + "relatedElement": [ + { + "@id": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737" + }, + { + "@id": "7d7065b6-1bb8-5bb5-b421-cc92f2e84584" + } + ], + "shortName": null, + "source": [ + { + "@id": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737" + } + ], + "specific": { + "@id": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737" + }, + "subsettedFeature": { + "@id": "7d7065b6-1bb8-5bb5-b421-cc92f2e84584" + }, + "subsettingFeature": { + "@id": "c1d230fb-17eb-5ac1-b3d3-b768eb68b737" + }, + "target": [ + { + "@id": "7d7065b6-1bb8-5bb5-b421-cc92f2e84584" + } + ], + "textualRepresentation": [] + }, + { + "@id": "5495ee57-6547-57ec-8fe5-929468a90ac4", + "@type": "Redefinition", + "aliasIds": [], + "declaredName": null, + "declaredShortName": null, + "documentation": [], + "elementId": "5495ee57-6547-57ec-8fe5-929468a90ac4", + "general": { + "@id": "99bd4b60-e5a9-55fb-8cea-1dcf517e50ec" + }, + "isImplied": true, + "isImpliedIncluded": true, + "isLibraryElement": false, + "name": null, + "ownedAnnotation": [], + "ownedElement": [], + "ownedRelatedElement": [], + "ownedRelationship": [], + "owner": null, + "owningFeature": { + "@id": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded" + }, + "owningMembership": null, + "owningNamespace": null, + "owningRelatedElement": { + "@id": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded" + }, + "owningRelationship": null, + "owningType": { + "@id": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded" + }, + "qualifiedName": null, + "redefinedFeature": { + "@id": "99bd4b60-e5a9-55fb-8cea-1dcf517e50ec" + }, + "redefiningFeature": { + "@id": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded" + }, + "relatedElement": [ + { + "@id": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded" + }, + { + "@id": "99bd4b60-e5a9-55fb-8cea-1dcf517e50ec" + } + ], + "shortName": null, + "source": [ + { + "@id": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded" + } + ], + "specific": { + "@id": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded" + }, + "subsettedFeature": { + "@id": "99bd4b60-e5a9-55fb-8cea-1dcf517e50ec" + }, + "subsettingFeature": { + "@id": "c1373d24-0ddb-5026-b8ce-1e7ef44d0ded" + }, + "target": [ + { + "@id": "99bd4b60-e5a9-55fb-8cea-1dcf517e50ec" + } + ], + "textualRepresentation": [] + } +] diff --git a/tests/export/testdata/ontology-known-violations.txt b/tests/export/testdata/ontology-known-violations.txt index c18adbc20c..2d37055e0f 100644 --- a/tests/export/testdata/ontology-known-violations.txt +++ b/tests/export/testdata/ontology-known-violations.txt @@ -1,14 +1,13 @@ # Known disagreements between the graphs this tool writes and the OMG SysML v2 -# metamodel as Open-MBEE/sysmlv2-rdf-ontology renders it (version 202407). Each +# metamodel table generated from the pilot's SysML.ecore (version 20250201). Each # line is one violation key — ` ` — and the reason it # is expected; TestGoldenGraphsMatchOntology (internal/translate/export) fails on any # key that is not listed here, and on any listed key no fixture violates any # more. The inventory is tracked in docs/project/roadmap.md § D7 and § D8. # # A key names no element, so this list survives a change of element identity. -# The ontology records no abstractness, so a subject typed by a metaclass that is -# abstract in the metamodel would not be among these findings; every metaclass -# written is checked concrete against the pilot's ecore models by hand instead. +# A subject typed by a metaclass the ecore declares abstract is an abstract-class +# violation, and none is listed: every metaclass this tool writes is concrete. # 1. Properties the metamodel declares on a relationship or membership element # that this tool collapses into the element itself. Ownership and visibility no @@ -17,6 +16,7 @@ domain-mismatch AttributeUsage value # FeatureValue_value: the feature value is written on the usage instead of a FeatureValue membership domain-mismatch ReferenceUsage value # FeatureValue_value: same collapse on a kindless usage's value domain-mismatch AssignmentActionUsage value # FeatureValue_value: same collapse on an assignment's target value +domain-mismatch PayloadFeature value # FeatureValue_value: same collapse on a flow payload's value (`message of cmd : P = m.cmd`) domain-mismatch PartUsage lowerBound # MultiplicityRange_lowerBound: the multiplicity is written on the usage instead of a MultiplicityRange domain-mismatch PartUsage upperBound # MultiplicityRange_upperBound: the multiplicity is written on the usage instead of a MultiplicityRange domain-mismatch ReferenceUsage lowerBound # MultiplicityRange_lowerBound: same collapse on a kindless usage @@ -53,16 +53,11 @@ literal-for-object-property FeatureChaining chainingFeature # F literal-for-object-property FeatureChaining relatedElement # Relationship_relatedElement: same literal on the minted FeatureChaining's relatedElement end literal-for-object-property FeatureChaining target # Relationship_target: same literal on the minted FeatureChaining's target end -# 3. Metaclass names this tool writes into the SysML namespace that the 202407 -# rendering does not declare at all. -unknown-class FlowUsage - # 202407 names this metaclass FlowConnectionUsage; SysML.owl declares no FlowUsage -unknown-class PayloadFeature - # 202407 names this metaclass ItemFeature; SysML.owl declares no PayloadFeature -unknown-class FlowEnd - # 202407 names this metaclass ItemFlowEnd; SysML.owl declares no FlowEnd -unknown-class TerminateActionUsage - # SysML.owl declares no TerminateActionUsage at all (no Terminate* class exists in it) -unknown-class ClassUsage - # a KerML `class` written as a usage; SysML.owl declares Class, a classifier, and no ClassUsage -unknown-class IndividualDefinition - # `individual def`, standardly an OccurrenceDefinition with isIndividual; SysML.owl declares no IndividualDefinition -unknown-class IndividualUsage - # `individual` usage, standardly an OccurrenceUsage with isIndividual; SysML.owl declares no IndividualUsage -unknown-class ConstructorExpression - # KerML 1.0 `new T(...)`, an InstantiationExpression the pilot writes; the 202407 rendering predates the metaclass +# 3. Metaclass names this tool writes into the SysML namespace that the metamodel +# does not declare at all. +unknown-class ClassUsage - # a KerML `class` written as a usage; the metamodel declares Class, a classifier, and no ClassUsage +unknown-class IndividualDefinition - # `individual def`, standardly an OccurrenceDefinition with isIndividual; the metamodel declares no IndividualDefinition +unknown-class IndividualUsage - # `individual` usage, standardly an OccurrenceUsage with isIndividual; the metamodel declares no IndividualUsage # 4. Metaclasses of this tool's own extension namespace, for constructs it has no # standard metaclass for. Deliberately outside the standard vocabulary, so the @@ -106,9 +101,8 @@ unknown-property ActionUsage via # the port an accep unknown-property ReferenceUsage isAccept # notation flag for an accept parameter, no metamodel property unknown-property ReferenceUsage isResult # notation flag for a result parameter, no metamodel property unknown-property PartUsage isChain # notation flag for a feature chain, no metamodel property -unknown-property PartUsage isVariant # Usage::isVariant, which the 202407 rendering omits; the metamodel derives it from the VariantMembership +unknown-property PartUsage isVariant # Usage::isVariant, which the metamodel's ecore does not declare; the variant is its VariantMembership unknown-property EnumerationUsage isVariant # Usage::isVariant on an enumerated value, a variant of its enumeration definition; omitted the same way unknown-property Connector isAll # Type::isSufficient (`connector all from a to b`), written under the notation's own name unknown-property AttributeUsage isAll # Type::isSufficient (`portion feature all slices`), written under the notation's own name -unknown-property AttributeUsage isConstant # Feature::isReadOnly in the 202407 rendering, whose `readonly` the notation has since respelled `const`; written under the notation's own name literal-for-object-property FeatureChainExpression targetFeature # FeatureChainExpression_targetFeature: the `result` of an invocation is no element of the graph and is written as a name diff --git a/tests/export/toolkit_json_import_test.go b/tests/export/toolkit_json_import_test.go new file mode 100644 index 0000000000..9fd36baaff --- /dev/null +++ b/tests/export/toolkit_json_import_test.go @@ -0,0 +1,263 @@ +package export_test + +import ( + "bytes" + "encoding/json" + "os" + "path/filepath" + "strings" + "testing" + + "github.com/Open-MBEE/OpenSysML/internal/syntax/diag" + "github.com/Open-MBEE/OpenSysML/internal/syntax/parser" + "github.com/Open-MBEE/OpenSysML/internal/syntax/source" + "github.com/Open-MBEE/OpenSysML/internal/translate/export" + "github.com/Open-MBEE/OpenSysML/internal/workspace/model" +) + +func toolkitFixture(t *testing.T, name string) []byte { + t.Helper() + data, err := os.ReadFile(filepath.Join("testdata", "interchange", name)) + if err != nil { + t.Fatal(err) + } + return data +} + +func decodeToolkitFixture(t *testing.T, name string, warn func(string)) []byte { + t.Helper() + graph, err := export.ReadAPIJSON(toolkitFixture(t, name)) + if err != nil { + t.Fatalf("ReadAPIJSON: %v", err) + } + out, err := export.ToSysMLWarn(graph, warn) + if err != nil { + t.Fatalf("ToSysMLWarn: %v", err) + } + file := source.New(name+".sysml", out) + p := parser.New(file) + p.ParseFile() + if len(p.Diagnostics) > 0 { + t.Fatalf("the decoded notation does not parse: %v\n%s", p.Diagnostics, out) + } + ws := model.NewWorkspace() + ws.Open(name+".sysml", out, 1) + for _, diagnostic := range ws.Diagnostics(name + ".sysml") { + if diagnostic.Severity == diag.SeverityError { + t.Errorf("the decoded notation does not validate: %s\n%s", diagnostic.Message, out) + } + } + return out +} + +func TestToolkitFlowEndAndPayload(t *testing.T) { + out := decodeToolkitFixture(t, "flow_ends.toolkit.full.json", nil) + want := toolkitFixture(t, "flow_ends.golden.sysml") + if !bytes.Equal(out, want) { + t.Fatalf("the decoded flow notation changed:\n--- want ---\n%s\n--- got ---\n%s", want, out) + } + if !strings.Contains(string(out), "flow of Payload from source.holder.payload to target.holder.payload;") { + t.Fatalf("the flow ends or payload were not written in the flow head:\n%s", out) + } + if strings.Contains(string(out), "composite flow") { + t.Fatalf("the flow has a composite modifier the toolkit parser does not accept:\n%s", out) + } +} + +func TestToolkitSatisfyByRoundTripsAsReference(t *testing.T) { + out := decodeToolkitFixture(t, "satisfy_by.toolkit.full.json", nil) + if !strings.Contains(string(out), "satisfy mission by vehicle.engine;") { + t.Fatalf("the satisfy subject was not written as a `by` reference:\n%s", out) + } +} + +func TestToolkitFlowEndRefusesUnrepresentableDetails(t *testing.T) { + for _, tc := range []struct { + name string + edit func([]map[string]any) + want string + }{ + { + name: "declared name", + edit: func(objects []map[string]any) { + for _, object := range objects { + if object["@type"] == "FlowEnd" { + object["declaredName"] = "explicit" + return + } + } + }, + want: "declares a name", + }, + { + name: "mismatched derived name", + edit: func(objects []map[string]any) { + for _, object := range objects { + if object["@type"] == "ReferenceUsage" && object["name"] == "payload" { + object["name"] = "wrong" + } + } + }, + want: "derived name does not match", + }, + } { + t.Run(tc.name, func(t *testing.T) { + var objects []map[string]any + if err := json.Unmarshal(toolkitFixture(t, "flow_ends.toolkit.full.json"), &objects); err != nil { + t.Fatal(err) + } + tc.edit(objects) + data, err := json.Marshal(objects) + if err != nil { + t.Fatal(err) + } + graph, err := export.ReadAPIJSON(data) + if err != nil { + t.Fatalf("ReadAPIJSON: %v", err) + } + _, err = export.ToSysML(graph) + if err == nil || !strings.Contains(err.Error(), tc.want) { + t.Fatalf("ToSysML error = %v, want %q", err, tc.want) + } + }) + } +} + +func TestToolkitTransitionClauses(t *testing.T) { + out := decodeToolkitFixture(t, "transitions.toolkit.full.json", nil) + want := toolkitFixture(t, "transitions.golden.sysml") + if !bytes.Equal(out, want) { + t.Fatalf("the decoded transition notation changed:\n--- want ---\n%s\n--- got ---\n%s", want, out) + } + text := string(out) + for _, clause := range []string{ + "transition triggered first x accept Go then y;", + "transition guarded first y accept Go if ready then x;", + "transition effectful first x do action reset : Reset then y;", + } { + if !strings.Contains(text, clause) { + t.Errorf("the decoded transition notation lacks %q:\n%s", clause, text) + } + } + for _, line := range strings.Split(text, "\n") { + if strings.TrimSpace(line) == "first start then x;" { + return + } + } + t.Fatalf("the entry was not kept as the positional `first start then x;` form:\n%s", text) +} + +func TestToolkitTransitionSourceUsesRedefinitionTarget(t *testing.T) { + var objects []map[string]any + if err := json.Unmarshal(toolkitFixture(t, "transitions.toolkit.full.json"), &objects); err != nil { + t.Fatal(err) + } + changed := false + for _, object := range objects { + if object["@type"] == "ReferenceUsage" && object["name"] == "transitionLinkSource" { + object["name"] = "derivedNameChanged" + changed = true + break + } + } + if !changed { + t.Fatal("the toolkit transition source parameter was not found") + } + data, err := json.Marshal(objects) + if err != nil { + t.Fatal(err) + } + graph, err := export.ReadAPIJSON(data) + if err != nil { + t.Fatalf("ReadAPIJSON: %v", err) + } + out, err := export.ToSysML(graph) + if err != nil { + t.Fatalf("ToSysML: %v", err) + } + if !bytes.Contains(out, []byte("transition triggered first x accept Go then y;")) { + t.Fatalf("the source was not recovered from its implied Redefinition target:\n%s", out) + } +} + +func TestToolkitInferredSuccessionClause(t *testing.T) { + out := decodeToolkitFixture(t, "successions.toolkit.full.json", nil) + want := toolkitFixture(t, "successions.golden.sysml") + if !bytes.Equal(out, want) { + t.Fatalf("the decoded succession notation changed:\n--- want ---\n%s\n--- got ---\n%s", want, out) + } + if !strings.Contains(string(out), "succession first firstEvent then secondEvent;") { + t.Fatalf("the inferred succession lacks its required `first` clause:\n%s", out) + } +} + +func TestToolkitLibraryFallbackWarns(t *testing.T) { + const oldID = "11111111-2222-4333-8444-555555555555" + var warnings []string + // The toolkit fixture's ScalarValues::Real stub has a hand-edited element ID. + out := decodeToolkitFixture(t, "library_identity.toolkit.full.json", func(message string) { + warnings = append(warnings, message) + }) + want := toolkitFixture(t, "library_identity.golden.sysml") + if !bytes.Equal(out, want) { + t.Fatalf("the decoded library notation changed:\n--- want ---\n%s\n--- got ---\n%s", want, out) + } + if !strings.Contains(string(out), "library package DocumentLibrary") { + t.Fatalf("the document-defined library package was not written as notation:\n%s", out) + } + if len(warnings) != 1 { + t.Fatalf("warnings = %v, want one library identity warning", warnings) + } + for _, part := range []string{oldID, "resolved by its qualified name ScalarValues::Real", "14c0aa22-5489-59b5-b438-ded26e83ba31"} { + if !strings.Contains(warnings[0], part) { + t.Errorf("warning %q does not identify %q", warnings[0], part) + } + } +} + +func TestToolkitUnmatchedLibraryStubRefuses(t *testing.T) { + graph, err := export.ReadAPIJSON(toolkitFixture(t, "library_unmatched.toolkit.full.json")) + if err != nil { + t.Fatalf("ReadAPIJSON: %v", err) + } + _, err = export.ToSysMLWarn(graph, nil) + if err == nil { + t.Fatal("an unmatched library stub decoded") + } + for _, part := range []string{"11111111-2222-4333-8444-555555555555", "Missing::MissingType"} { + if !strings.Contains(err.Error(), part) { + t.Errorf("error %q does not identify %q", err, part) + } + } +} + +func TestToolkitLibraryFallbackRequiresCompatibleMetaclass(t *testing.T) { + const oldID = "11111111-2222-4333-8444-555555555555" + var objects []map[string]any + if err := json.Unmarshal(toolkitFixture(t, "library_identity.toolkit.full.json"), &objects); err != nil { + t.Fatal(err) + } + for _, object := range objects { + if object["@id"] == oldID { + object["@type"] = "PartDefinition" + } + } + data, err := json.Marshal(objects) + if err != nil { + t.Fatal(err) + } + graph, err := export.ReadAPIJSON(data) + if err != nil { + t.Fatalf("ReadAPIJSON: %v", err) + } + var warnings []string + _, err = export.ToSysMLWarn(graph, func(message string) { + warnings = append(warnings, message) + }) + if err == nil || !strings.Contains(err.Error(), oldID) || !strings.Contains(err.Error(), "ScalarValues::Real") { + t.Fatalf("ToSysMLWarn error = %v, want the incompatible library identity and stated name", err) + } + if len(warnings) != 0 { + t.Errorf("warnings = %v, want no fallback warning for an incompatible metaclass", warnings) + } +} diff --git a/tests/export/transition_succession_test.go b/tests/export/transition_succession_test.go index b03a6d3187..39d23a1e8d 100644 --- a/tests/export/transition_succession_test.go +++ b/tests/export/transition_succession_test.go @@ -1,10 +1,14 @@ package export_test import ( + "encoding/json" + "errors" + "fmt" "strings" "testing" "github.com/Open-MBEE/OpenSysML/internal/translate/convert" + "github.com/Open-MBEE/OpenSysML/internal/translate/export" ) // A `transition t first a then b;` owns its succession as a SuccessionAsUsage @@ -76,7 +80,8 @@ func TestTransitionOwnsItsSuccession(t *testing.T) { // The grammar's member order puts the TransitionSuccessionMember after the // guard and effect memberships and before the body's (SysML.xtext -// TransitionUsage): the ownedRelationship list states it in that order. +// TransitionUsage): the ownedRelationship list states it in that order, after +// the FeatureChainMember naming the source and the EmptyParameterMember. func TestTransitionSuccessionFollowsEffectAndPrecedesBody(t *testing.T) { src := `package T { attribute g : Boolean; @@ -93,8 +98,8 @@ func TestTransitionSuccessionFollowsEffectAndPrecedesBody(t *testing.T) { turtle, back := graphOnlyRoundTrip(t, "t.sysml", []byte(src)) graph := string(turtle) if !strings.Contains(graph, - "sysml:ownedRelationship expr:T__S__t_pguard_om, elmt:T__S__t___400_om, elmt:T__S__t_succession_om, elmt:T__S__t__inner_om ;") { - t.Errorf("the memberships should order guard, effect, succession, body:\n%s", graph) + "sysml:ownedRelationship expr:T__S__t_psourcemember, elmt:T__S__t_linkparam_om, expr:T__S__t_pguard_om, elmt:T__S__t___400_om, elmt:T__S__t_succession_om, elmt:T__S__t__inner_om ;") { + t.Errorf("the memberships should order source, parameter, guard, effect, succession, body:\n%s", graph) } notation := string(back) for _, want := range []string{"transition t first a if g do send a to b then c {\n", "state inner;\n"} { @@ -128,3 +133,272 @@ func TestTransitionSuccessionDisagreementIsRefused(t *testing.T) { t.Errorf("a succession targeting c under a transition targeting b should be refused") } } + +// A named transition owns, ahead of its trigger, the FeatureChainMember naming +// its source and an EmptyParameterMember, and a second EmptyParameterMember +// ahead of a trigger it owns (SysML-textual-bnf TransitionUsage, :1281-1290); a +// chained source or target is an owned feature chain (FeatureChainMember +// :1111-1116, OwnedReferenceSubsetting :463-466), not the feature it reaches. +func TestTransitionOwnsItsSourceParameterAndChainedEnds(t *testing.T) { + src := "package P {\n item def Sig;\n state def S {\n entry;\n then a;\n state a;\n state b {\n entry;\n then c;\n state c;\n }\n" + + " transition t first a then b.c;\n transition u first a accept Sig then b;\n transition v first b.c then a;\n }\n}\n" + if diagnostics := diagnosticMessages("m.sysml", []byte(src)); len(diagnostics) > 0 { + t.Fatalf("the model should analyse clean:\n%s", strings.Join(diagnostics, "\n")) + } + if _, back := graphOnlyRoundTrip(t, "m.sysml", []byte(src)); string(back) != src { + t.Fatalf("the notation changed\n--- want ---\n%s\n--- got ---\n%s", src, back) + } + + doc, err := convert.Convert("m.sysml", []byte(src), convert.FormatSysML, convert.FormatAPIJSON) + if err != nil { + t.Fatalf("to api-json: %v", err) + } + var elements []map[string]any + if err := json.Unmarshal(doc, &elements); err != nil { + t.Fatal(err) + } + byID := map[string]map[string]any{} + for _, e := range elements { + byID[e["@id"].(string)] = e + } + ref := func(v any) string { + id, _ := v.(map[string]any)["@id"].(string) + return id + } + refs := func(v any) []string { + var out []string + list, _ := v.([]any) + for _, r := range list { + out = append(out, ref(r)) + } + return out + } + // chain is the qualified names a chain Feature chains, or nil. + chain := func(id string) []string { return refs(byID[id]["chainingFeature"]) } + transitions := map[string]map[string]any{} + for _, e := range elements { + if e["@type"] == "TransitionUsage" { + transitions[e["declaredName"].(string)] = e + } + } + for _, tc := range []struct { + name string + head []string // metaclasses of the owned relationships ahead of the succession + source []string // the source member: one element, or a chain + target []string // the target end's referenced feature: one element, or a chain + chainSource bool + chainTarget bool + }{ + {"t", []string{"Membership", "ParameterMembership"}, []string{"P__S__a"}, []string{"P__S__b", "P__S__b__c"}, false, true}, + {"u", []string{"Membership", "ParameterMembership", "ParameterMembership", "TransitionFeatureMembership"}, []string{"P__S__a"}, []string{"P__S__b"}, false, false}, + {"v", []string{"OwningMembership", "ParameterMembership"}, []string{"P__S__b", "P__S__b__c"}, []string{"P__S__a"}, true, false}, + } { + transition := transitions[tc.name] + if transition == nil { + t.Fatalf("no transition %s in the API JSON", tc.name) + } + owned := refs(transition["ownedRelationship"]) + if len(owned) < len(tc.head)+1 { + t.Fatalf("%s: ownedRelationship %v, want %v ahead of the succession", tc.name, owned, tc.head) + } + for i, metaclass := range tc.head { + if got := byID[owned[i]]["@type"]; got != metaclass { + t.Errorf("%s: owned relationship %d is a %v, want %s", tc.name, i, got, metaclass) + } + } + source := byID[owned[0]] + if tc.chainSource { + if got := chain(refs(source["ownedRelatedElement"])[0]); strings.Join(got, ",") != strings.Join(tc.source, ",") { + t.Errorf("%s: source chain %v, want %v", tc.name, got, tc.source) + } + } else if got := ref(source["memberElement"]); got != tc.source[0] { + t.Errorf("%s: source member %s, want %s", tc.name, got, tc.source[0]) + } + for _, membership := range owned[1:] { + if byID[membership]["@type"] != "ParameterMembership" { + continue + } + parameter := byID[refs(byID[membership]["ownedRelatedElement"])[0]] + if parameter["@type"] != "ReferenceUsage" || parameter["declaredName"] != nil { + t.Errorf("%s: parameter %v, want an EmptyUsage", tc.name, parameter) + } + } + succession := byID[ref(transition["succession"])] + ends := refs(succession["connectorEnd"]) + subsetting := byID[ref(byID[ends[1]]["ownedReferenceSubsetting"])] + referenced := ref(subsetting["referencedFeature"]) + if tc.chainTarget { + if got := chain(referenced); strings.Join(got, ",") != strings.Join(tc.target, ",") { + t.Errorf("%s: target chain %v, want %v", tc.name, got, tc.target) + } + } else if referenced != tc.target[0] { + t.Errorf("%s: target %s, want %s", tc.name, referenced, tc.target[0]) + } + } + if _, err := convert.Convert("m.json", doc, convert.FormatAPIJSON, convert.FormatSysML); err != nil { + t.Errorf("the API JSON did not read back: %v", err) + } + + // A source member naming another state than the transition's source is + // refused: the notation writes the source once. + turtle, err := convert.Convert("m.sysml", []byte(src), convert.FormatSysML, convert.FormatTurtle) + if err != nil { + t.Fatalf("to turtle: %v", err) + } + graph := string(withoutTriples(t, turtle, "sysx:sourceText")) + const member = "expr:P__S__t_psourcemember\n" + at := strings.Index(graph, member) + if at < 0 { + t.Fatalf("no source member %s in the graph:\n%s", member, graph) + } + block := graph[at:] + if end := strings.Index(block, "\n\n"); end >= 0 { + block = block[:end] + } + edited := strings.Replace(graph, block, strings.Replace(block, "sysml:memberElement elmt:P__S__a", "sysml:memberElement elmt:P__S__b", 1), 1) + if edited == graph { + t.Fatalf("the source member was not edited:\n%s", block) + } + _, err = convert.Convert("m.ttl", []byte(edited), convert.FormatTurtle, convert.FormatSysML) + var unsupported *export.UnsupportedError + if !errors.As(err, &unsupported) || !strings.Contains(err.Error(), "source") { + t.Errorf("expected the disagreeing source member to be refused, got %v", err) + } +} + +// A graph in the API element form reads back as written with only the +// structure stating each transition's head: without the collapsed source and +// target, the source member, source chain and chained succession end state +// them; and a chain stated only by its derived chainingFeature list, with no +// FeatureChaining elements, reaches the same features. (A transition with a +// trigger does not yet read from the element form.) +func TestTransitionStructureAloneReadsBack(t *testing.T) { + src := "package P {\n state def S {\n state a;\n state b {\n state c;\n }\n" + + " transition t first a then b.c;\n transition v first b.c then a;\n transition w first a then b;\n }\n}\n" + doc, err := convert.Convert("m.sysml", []byte(src), convert.FormatSysML, convert.FormatAPIJSON) + if err != nil { + t.Fatalf("to api-json: %v", err) + } + var elements []map[string]any + if err := json.Unmarshal(doc, &elements); err != nil { + t.Fatal(err) + } + chainings := map[string]bool{} + for _, e := range elements { + if e["@type"] == "FeatureChaining" { + chainings[fmt.Sprint(e["@id"])] = true + } + } + if len(chainings) == 0 { + t.Fatal("the graph states no FeatureChaining") + } + // elementForm is the document in the element form, every element stating + // its defaults, the transitions with no collapsed source or target, and + // without FeatureChaining elements when dropChainings says so. + elementForm := func(dropChainings bool) []byte { + var out []map[string]any + for _, original := range elements { + if dropChainings && chainings[fmt.Sprint(original["@id"])] { + continue + } + e := map[string]any{"isImpliedIncluded": false} + for key, value := range original { + if list, ok := value.([]any); ok && dropChainings { + var keep []any + for _, item := range list { + if ref, ok := item.(map[string]any); !ok || !chainings[fmt.Sprint(ref["@id"])] { + keep = append(keep, item) + } + } + value = keep + } + e[key] = value + } + if e["@type"] == "TransitionUsage" { + delete(e, "source") + delete(e, "target") + } + out = append(out, e) + } + document, err := json.Marshal(out) + if err != nil { + t.Fatal(err) + } + return document + } + for _, tc := range []struct { + name string + dropChainings bool + }{ + {"no collapsed source or target", false}, + {"chains by their chainingFeature lists", true}, + } { + t.Run(tc.name, func(t *testing.T) { + back, err := convert.Convert("m.json", elementForm(tc.dropChainings), convert.FormatAPIJSON, convert.FormatSysML) + if err != nil { + t.Fatalf("back to notation: %v", err) + } + if string(back) != src { + t.Errorf("the notation changed\n--- want ---\n%s\n--- got ---\n%s", src, back) + } + }) + } +} + +// A transition whose head states a chain as its endpoint names that chain: a +// structural chain reaching the same feature through other links (`a1.c` +// against `a2.c`, both `T::c`) is refused, not written in its place. The head's +// own chain, or the feature it reaches, agrees. +func TestTransitionChainEndpointsCompareByTheirLinks(t *testing.T) { + src := "package P {\n state def T {\n state c;\n }\n state def S {\n state a1 : T;\n state a2 : T;\n state b;\n" + + " transition v first a1.c then b;\n transition w first a2.c then b;\n transition x first b then a1.c;\n transition y first b then a2.c;\n }\n}\n" + if diagnostics := diagnosticMessages("m.sysml", []byte(src)); len(diagnostics) > 0 { + t.Fatalf("the model should analyse clean:\n%s", strings.Join(diagnostics, "\n")) + } + turtle, err := convert.Convert("m.sysml", []byte(src), convert.FormatSysML, convert.FormatTurtle) + if err != nil { + t.Fatalf("to turtle: %v", err) + } + graph := string(withoutTriples(t, turtle, "sysx:sourceText")) + // restate points a transition's collapsed endpoint, T::c, at a chain feature. + restate := func(t *testing.T, transition, property, to string) string { + t.Helper() + blocks := strings.Split(graph, "\n\n") + edited := false + line := "sysml:" + property + " elmt:P__T__c " + for i, block := range blocks { + if strings.HasPrefix(block, transition+"\n") && strings.Contains(block, line) { + blocks[i], edited = strings.Replace(block, line, "sysml:"+property+" "+to+" ", 1), true + } + } + if !edited { + t.Fatalf("%s states no %s:\n%s", transition, line, graph) + } + return strings.Join(blocks, "\n\n") + } + for _, tc := range []struct { + name, transition, property, to string + refused bool + }{ + {"source chain through other links", "elmt:P__S__v", "source", "expr:P__S__w_psourcechain", true}, + {"its own source chain", "elmt:P__S__v", "source", "expr:P__S__v_psourcechain", false}, + {"target chain through other links", "elmt:P__S__x", "target", "expr:P__S__y_succession_pend1_pchain", true}, + {"its own target chain", "elmt:P__S__x", "target", "expr:P__S__x_succession_pend1_pchain", false}, + } { + t.Run(tc.name, func(t *testing.T) { + if !strings.Contains(graph, tc.to+"\n") { + t.Fatalf("no chain %s in the graph", tc.to) + } + back, err := convert.Convert("m.ttl", []byte(restate(t, tc.transition, tc.property, tc.to)), convert.FormatTurtle, convert.FormatSysML) + var unsupported *export.UnsupportedError + switch { + case tc.refused && (!errors.As(err, &unsupported) || !strings.Contains(err.Error(), tc.property)): + t.Errorf("expected the disagreeing %s to be refused, got %v\n%s", tc.property, err, back) + case !tc.refused && err != nil: + t.Errorf("the transition's own chain should agree: %v", err) + case !tc.refused && string(back) != src: + t.Errorf("the notation changed\n--- want ---\n%s\n--- got ---\n%s", src, back) + } + }) + } +} diff --git a/tests/export/variation_rdf_test.go b/tests/export/variation_rdf_test.go index a81e3dc6ea..37438e24ca 100644 --- a/tests/export/variation_rdf_test.go +++ b/tests/export/variation_rdf_test.go @@ -1,10 +1,13 @@ package export_test import ( + "encoding/json" + "errors" "strings" "testing" "github.com/Open-MBEE/OpenSysML/internal/translate/convert" + "github.com/Open-MBEE/OpenSysML/internal/translate/export" "github.com/Open-MBEE/OpenSysML/internal/translate/rdf" ) @@ -106,6 +109,30 @@ func TestEnumerationVariationComesBackFromTheGraphAlone(t *testing.T) { } } +func TestForeignEnumerationAbstractFlagWritesNoKeyword(t *testing.T) { + turtle, err := convert.Convert("enum.sysml", []byte(enumVariationModel), convert.FormatSysML, convert.FormatTurtle) + if err != nil { + t.Fatalf("to turtle: %v", err) + } + turtle = withoutTriples(t, withoutSourceText(t, turtle), "sysml:isAbstract") + graph, err := rdf.ParseTurtle(turtle) + if err != nil { + t.Fatalf("parse turtle: %v", err) + } + graph.Add(rdf.ElementIRI("V::Level"), rdf.IRI(rdf.SysML+"isAbstract"), rdf.Bool(true)) + + text, err := export.ToSysML(graph) + if err != nil { + t.Fatalf("back to notation: %v", err) + } + if strings.Contains(string(text), "abstract enum def") { + t.Fatalf("enumeration abstractness has no grammar prefix:\n%s", text) + } + if _, err := convert.Convert("enum.sysml", text, convert.FormatSysML, convert.FormatTurtle); err != nil { + t.Fatalf("parse notation: %v\n%s", err, text) + } +} + // A graph from another tool may flag an enumerated value sysml:isVariant under // a plain OwningMembership; the flag is still not written back as `variant`. func TestForeignEnumeratedValueFlagWritesNoKeyword(t *testing.T) { @@ -145,3 +172,210 @@ func TestNestedEnumerationVariationRoundTrips(t *testing.T) { } `) } + +// variantReferenceModel names existing features as variants, by a lone name, a +// qualified name and a feature chain; B declares a second e1 for the refusal. +const variantReferenceModel = "package P {\n part def E;\n part def B {\n part e1 : E;\n }\n part def Q {\n part k : E;\n }\n" + + " part q : Q;\n part e1 : E;\n part e2 : E;\n variation part def V {\n variant e1;\n variant P::e2;\n variant q.k;\n }\n}\n" + +// A bare `variant x;` is a VariantReference (SysML-textual-bnf :343-345): a +// ReferenceUsage whose owned ReferenceSubsetting references the feature x names +// outside the variation, or the chain of features, declaring no name of its own. +func TestVariantReferenceOwnsAReferenceSubsetting(t *testing.T) { + if diagnostics := diagnosticMessages("m.sysml", []byte(variantReferenceModel)); len(diagnostics) > 0 { + t.Fatalf("the model should analyse clean:\n%s", strings.Join(diagnostics, "\n")) + } + turtle, err := convert.Convert("m.sysml", []byte(variantReferenceModel), convert.FormatSysML, convert.FormatTurtle) + if err != nil { + t.Fatalf("to turtle: %v", err) + } + graph := string(turtle) + for _, want := range []string{ + "elmt:P__V__e1\n a sysml:ReferenceUsage", + "sysml:referencedFeature elmt:P__e1", + "sysml:referencedFeature elmt:P__e2", + "sysml:chainingFeature elmt:P__q, elmt:P__Q__k", + } { + if !strings.Contains(graph, want) { + t.Errorf("the graph should state %q:\n%s", want, graph) + } + } + for _, block := range strings.Split(graph, "\n\n") { + if strings.HasPrefix(block, "elmt:P__V_") && !strings.HasPrefix(block, "elmt:P__V__e1_") && + (strings.Contains(block, "a sysml:PartUsage") || strings.Contains(block, "sysml:declaredName")) { + t.Errorf("a variant reference should declare no usage or name of its own:\n%s", block) + } + } + if n := strings.Count(graph, "a sysml:ReferenceSubsetting"); n != 3 { + t.Errorf("each of the three variants should own a ReferenceSubsetting, found %d:\n%s", n, graph) + } + back, err := convert.Convert("m.ttl", withoutSourceText(t, turtle), convert.FormatTurtle, convert.FormatSysML) + if err != nil { + t.Fatalf("back to notation from the mapping alone: %v\n%s", err, turtle) + } + if string(back) != variantReferenceModel { + t.Fatalf("the notation changed\n--- want ---\n%s\n--- got ---\n%s", variantReferenceModel, back) + } + + doc, err := convert.Convert("m.sysml", []byte(variantReferenceModel), convert.FormatSysML, convert.FormatAPIJSON) + if err != nil { + t.Fatalf("to api-json: %v", err) + } + var elements []map[string]any + if err := json.Unmarshal(doc, &elements); err != nil { + t.Fatal(err) + } + byID := map[string]map[string]any{} + for _, e := range elements { + id, _ := e["@id"].(string) + byID[id] = e + } + ref := func(v any) string { + id, _ := v.(map[string]any)["@id"].(string) + return id + } + variants := 0 + for _, e := range elements { + if e["@type"] != "VariantMembership" { + continue + } + variants++ + usage := byID[ref(e["ownedVariantUsage"])] + if usage["@type"] != "ReferenceUsage" || usage["declaredName"] != nil { + t.Errorf("%v: a %v declaring %v, want an unnamed ReferenceUsage", usage["@id"], usage["@type"], usage["declaredName"]) + } + subsetting := byID[ref(usage["ownedReferenceSubsetting"])] + if subsetting == nil || byID[ref(subsetting["referencedFeature"])] == nil { + t.Errorf("%v: ownedReferenceSubsetting %v does not reference a feature in the output", usage["@id"], usage["ownedReferenceSubsetting"]) + } + } + if variants != 3 { + t.Errorf("want three variant memberships, found %d", variants) + } + if _, err := convert.Convert("m.json", doc, convert.FormatAPIJSON, convert.FormatSysML); err != nil { + t.Errorf("the API JSON did not read back: %v", err) + } + + // A variant referencing a feature its name does not reach from the + // variation is refused rather than written as `variant e1;` naming another. + blocks := strings.Split(string(withoutSourceText(t, turtle)), "\n\n") + for i, block := range blocks { + if strings.HasPrefix(block, "elmt:P__V__e1\n") || strings.HasPrefix(block, "elmt:P__V__e1_rs\n") { + block = strings.ReplaceAll(block, "elmt:P__e1 ", "elmt:P__B__e1 ") + blocks[i] = strings.ReplaceAll(block, `\"P__e1\"`, `\"P__B__e1\"`) + } + } + retargeted := strings.Join(blocks, "\n\n") + if !strings.Contains(retargeted, "sysml:references elmt:P__B__e1 ;") { + t.Fatalf("the variant was not retargeted:\n%s", retargeted) + } + if _, err := convert.Convert("m.ttl", []byte(retargeted), convert.FormatTurtle, convert.FormatSysML); err == nil || + !strings.Contains(err.Error(), "`variant e1` does not name P::B::e1") { + t.Errorf("expected the retargeted variant to be refused, got %v", err) + } +} + +// A `variant x;` is a VariantReference by its syntax: one whose name resolves +// to nothing keeps x as the name it references, the way an unresolved +// reference is kept, rather than becoming a part usage declaring x. +func TestUnresolvedVariantReferenceKeepsItsName(t *testing.T) { + src := "package P {\n variation part def V {\n variant missing;\n }\n}\n" + turtle, err := convert.Convert("m.sysml", []byte(src), convert.FormatSysML, convert.FormatTurtle) + if err != nil { + t.Fatalf("to turtle: %v", err) + } + var variant string + for _, block := range strings.Split(string(turtle), "\n\n") { + if strings.HasPrefix(block, "elmt:P__V__missing\n") { + variant = block + } + } + for _, want := range []string{"a sysml:ReferenceUsage", `sysml:references "missing"`} { + if !strings.Contains(variant, want) { + t.Errorf("the variant should state %q:\n%s", want, variant) + } + } + if strings.Contains(variant, "sysml:declaredName") { + t.Errorf("the variant should declare no name:\n%s", variant) + } + back, err := convert.Convert("m.ttl", withoutSourceText(t, turtle), convert.FormatTurtle, convert.FormatSysML) + if err != nil { + t.Fatalf("back to notation from the mapping alone: %v", err) + } + if string(back) != src { + t.Fatalf("the notation changed\n--- want ---\n%s\n--- got ---\n%s", src, back) + } +} + +// An anonymous variant whose reference the graph keeps as a single name it +// links to nothing is refused: `variant e2;` would be a variant named e2, and +// a single name has no reference form. +func TestAnonymousVariantWithASingleNameLiteralIsRefused(t *testing.T) { + turtle, err := convert.Convert("m.sysml", []byte(variantReferenceModel), convert.FormatSysML, convert.FormatTurtle) + if err != nil { + t.Fatalf("to turtle: %v", err) + } + // The `variant P::e2;` member is anonymous; its reference becomes the literal "e2". + blocks := strings.Split(string(withoutSourceText(t, turtle)), "\n\n") + for i, block := range blocks { + if strings.HasPrefix(block, "elmt:P__V___401\n") || strings.HasPrefix(block, "elmt:P__V___401_rs\n") { + block = strings.ReplaceAll(block, "elmt:P__e2 ", `"e2" `) + blocks[i] = strings.ReplaceAll(block, `{\"@id\":\"P__e2\"}`, `\"e2\"`) + } + } + literal := strings.Join(blocks, "\n\n") + if !strings.Contains(literal, `sysml:references "e2" ;`) { + t.Fatalf("the variant was not given a literal reference:\n%s", literal) + } + _, err = convert.Convert("m.ttl", []byte(literal), convert.FormatTurtle, convert.FormatSysML) + var unsupported *export.UnsupportedError + if !errors.As(err, &unsupported) || !strings.Contains(err.Error(), "a single name has no reference form") { + t.Errorf("expected the literal variant to be refused, got %v", err) + } +} + +// A VariantReference takes no usage prefix: `variant ref x;` declares the +// reference usage x (SysML-textual-bnf VariantUsageElement → ReferenceUsage), +// keeping its name and its `ref`. +func TestPrefixedVariantDeclaresItsName(t *testing.T) { + src := "package P {\n part def E;\n part x : E;\n variation part def V {\n variant ref x;\n }\n}\n" + if diagnostics := diagnosticMessages("m.sysml", []byte(src)); len(diagnostics) > 0 { + t.Fatalf("the model should analyse clean:\n%s", strings.Join(diagnostics, "\n")) + } + turtle, err := convert.Convert("m.sysml", []byte(src), convert.FormatSysML, convert.FormatTurtle) + if err != nil { + t.Fatalf("to turtle: %v", err) + } + graph := string(turtle) + if !strings.Contains(graph, `sysml:declaredName "x"`) || strings.Contains(graph, "a sysml:ReferenceSubsetting") { + t.Errorf("`variant ref x;` should declare x and reference nothing:\n%s", graph) + } + back, err := convert.Convert("m.ttl", withoutSourceText(t, turtle), convert.FormatTurtle, convert.FormatSysML) + if err != nil { + t.Fatalf("back to notation from the mapping alone: %v", err) + } + if string(back) != src { + t.Fatalf("the notation changed\n--- want ---\n%s\n--- got ---\n%s", src, back) + } +} + +// A variant named by an unrestricted name keeps it one name, resolved or not: +// `variant 'a::b';` is not the qualified reference `variant a::b;`. +func TestQuotedVariantNamesStayOneName(t *testing.T) { + for _, src := range []string{ + "package P {\n variation part def V {\n variant 'a::b';\n }\n}\n", + "package P {\n part 'a::b';\n part 'it\\'s';\n variation part def V {\n variant 'a::b';\n variant 'it\\'s';\n }\n}\n", + } { + turtle, err := convert.Convert("m.sysml", []byte(src), convert.FormatSysML, convert.FormatTurtle) + if err != nil { + t.Fatalf("to turtle: %v", err) + } + back, err := convert.Convert("m.ttl", withoutSourceText(t, turtle), convert.FormatTurtle, convert.FormatSysML) + if err != nil { + t.Fatalf("back to notation from the mapping alone: %v", err) + } + if string(back) != src { + t.Errorf("the notation changed\n--- want ---\n%s\n--- got ---\n%s", src, back) + } + } +} diff --git a/tests/grpc/testdata/conformance/symbol_attributes.sysml b/tests/grpc/testdata/conformance/symbol_attributes.sysml index 2b365b5712..bdb40c80ba 100644 --- a/tests/grpc/testdata/conformance/symbol_attributes.sysml +++ b/tests/grpc/testdata/conformance/symbol_attributes.sysml @@ -14,7 +14,7 @@ package demo { attribute redefines mass = 1600.0 [SI::kg]; attribute wheels : Integer = 4; attribute ratio : Real = 1.5 + 0.5; - attribute derived : Real = wheels * 2; + attribute 'derived' : Real = wheels * 2; part engine : Engine; } diff --git a/tests/hygiene/release_config_test.go b/tests/hygiene/release_config_test.go new file mode 100644 index 0000000000..591e368fa2 --- /dev/null +++ b/tests/hygiene/release_config_test.go @@ -0,0 +1,362 @@ +package hygiene + +import ( + "os" + "strings" + "testing" + + "gopkg.in/yaml.v3" +) + +// The five service binaries every release publishes. A package released from a +// tag ships a digest table pinning all of them for that tag, and the release +// jobs assert it after packaging; this test holds the config to that. +var serviceAssets = []string{ + "sysml-grpc-darwin-amd64", + "sysml-grpc-darwin-arm64", + "sysml-grpc-linux-amd64", + "sysml-grpc-linux-arm64", + "sysml-grpc-windows-amd64.exe", +} + +type circleConfig struct { + Jobs map[string]struct{ Steps []yaml.Node } `yaml:"jobs"` + // A workflows entry is a workflow, apart from the `version` key. + Workflows map[string]yaml.Node `yaml:"workflows"` +} + +type workflow struct{ Jobs []yaml.Node } + +func (c circleConfig) workflow(t *testing.T, name string) workflow { + t.Helper() + node, ok := c.Workflows[name] + if !ok { + t.Fatalf("no %s workflow", name) + } + var w workflow + if err := node.Decode(&w); err != nil { + t.Fatalf("decode %s workflow: %v", name, err) + } + return w +} + +type runStep struct { + Name string + Command string +} + +func loadCircleConfig(t *testing.T) circleConfig { + t.Helper() + raw, err := os.ReadFile("../../.circleci/config.yml") + if err != nil { + t.Fatalf("read .circleci/config.yml: %v", err) + } + var config circleConfig + if err := yaml.Unmarshal(raw, &config); err != nil { + t.Fatalf("parse .circleci/config.yml: %v", err) + } + return config +} + +// runSteps flattens a job's steps, descending into when/unless blocks, into the +// run steps in the order they execute. +func runSteps(t *testing.T, steps []yaml.Node) []runStep { + t.Helper() + var runs []runStep + for _, step := range steps { + if step.Kind != yaml.MappingNode || len(step.Content) < 2 { + continue + } + key, value := step.Content[0].Value, step.Content[1] + switch key { + case "run": + var run runStep + if err := value.Decode(&run); err != nil { + t.Fatalf("decode run step: %v", err) + } + runs = append(runs, run) + case "when", "unless": + var block struct{ Steps []yaml.Node } + if err := value.Decode(&block); err != nil { + t.Fatalf("decode %s block: %v", key, err) + } + runs = append(runs, runSteps(t, block.Steps)...) + } + } + return runs +} + +// stepIndex is the position of the first run step whose command contains every +// fragment, or -1. +func stepIndex(runs []runStep, fragments ...string) int { + for i, run := range runs { + if containsAll(run.Command, fragments...) { + return i + } + } + return -1 +} + +func containsAll(text string, fragments ...string) bool { + for _, fragment := range fragments { + if !strings.Contains(text, fragment) { + return false + } + } + return true +} + +func stepHasBareStep(steps []yaml.Node, name string) bool { + for _, step := range steps { + if step.Kind == yaml.ScalarNode && step.Value == name { + return true + } + if step.Kind == yaml.MappingNode && len(step.Content) >= 1 && step.Content[0].Value == name { + return true + } + } + return false +} + +// requiresOf is what the named workflow job requires. +func requiresOf(t *testing.T, workflow workflow, name string) []string { + t.Helper() + for _, job := range workflow.Jobs { + if job.Kind != yaml.MappingNode || len(job.Content) < 2 { + continue + } + var spec struct { + Name string `yaml:"name"` + Requires []string `yaml:"requires"` + } + if err := job.Content[1].Decode(&spec); err != nil { + t.Fatalf("decode workflow job %s: %v", job.Content[0].Value, err) + } + if spec.Name == name { + return spec.Requires + } + } + t.Fatalf("workflow has no job named %q", name) + return nil +} + +func requireAll(t *testing.T, what string, have []string, want ...string) { + t.Helper() + for _, w := range want { + found := false + for _, h := range have { + if h == w { + found = true + } + } + if !found { + t.Errorf("%s does not require %q (requires %q)", what, w, have) + } + } +} + +// TestPythonDistributionIsStampedWithItsReleaseDigests holds the release +// workflow to the order the Python wheel depends on: the service binaries are +// built first, their digests are stamped into the table the distribution ships +// before `python -m build`, the built wheel and sdist are asserted to pin all +// five assets for the tag, and the manifest build-release signs is written over +// the final distribution and checked against the wheel's pins before signing. +func TestPythonDistributionIsStampedWithItsReleaseDigests(t *testing.T) { + config := loadCircleConfig(t) + + binaries, ok := config.Jobs["build-release-binaries"] + if !ok { + t.Fatal("no build-release-binaries job: the binaries must be built before the Python distribution") + } + binarySteps := runSteps(t, binaries.Steps) + if stepIndex(binarySteps, "make build-grpc", "dist/grpc/sysml-grpc-windows-amd64.exe") < 0 { + t.Error("build-release-binaries does not build the sysml-grpc binaries into dist/grpc") + } + if stepIndex(binarySteps, "SHA256SUMS.txt") >= 0 { + t.Error("build-release-binaries writes the checksum manifest, which must list the wheel built after it") + } + + python, ok := config.Jobs["build-python-package"] + if !ok { + t.Fatal("no build-python-package job") + } + if !stepHasBareStep(python.Steps, "attach_workspace") { + t.Error("build-python-package does not attach the workspace that carries dist/grpc") + } + pythonSteps := runSteps(t, python.Steps) + stamp := stepIndex(pythonSteps, + "client/python/scripts/pin_release_checksums.py", + `--version "${CIRCLE_TAG}"`, + "--from-binaries dist/grpc", + "--table client/python/opensysml/release-digests.json", + ) + build := stepIndex(pythonSteps, "python -m build") + assert := stepIndex(pythonSteps, "release-digests.json", "zipfile", "tarfile", "pinned_digest") + switch { + case stamp < 0: + t.Error("build-python-package does not stamp the release's digests from dist/grpc into the distribution's table") + case build < 0: + t.Error("build-python-package does not run python -m build") + case stamp > build: + t.Errorf("the digest stamp (step %d) runs after python -m build (step %d), so the wheel ships without it", stamp, build) + } + switch { + case assert < 0: + t.Error("build-python-package does not assert the built wheel and sdist pin the release's service digests") + case assert < build: + t.Errorf("the distribution assertion (step %d) runs before python -m build (step %d)", assert, build) + default: + for _, asset := range serviceAssets { + if !strings.Contains(pythonSteps[assert].Command, asset) { + t.Errorf("the distribution assertion does not require %s", asset) + } + } + } + + releaseJob, ok := config.Jobs["build-release"] + if !ok { + t.Fatal("no build-release job") + } + releaseSteps := runSteps(t, releaseJob.Steps) + manifest := stepIndex(releaseSteps, "> SHA256SUMS.txt", "opensysml-*.whl") + check := stepIndex(releaseSteps, "SHA256SUMS.txt", "release-digests.json", "zipfile", "nothing was signed") + sign := stepIndex(releaseSteps, "cosign sign-blob SHA256SUMS.txt") + switch { + case manifest < 0: + t.Error("build-release does not write SHA256SUMS.txt over the Python distribution") + case sign < 0: + t.Error("build-release does not sign SHA256SUMS.txt") + case check < 0: + t.Error("build-release does not check the wheel's pins against the manifest it signs") + case !(manifest < check && check < sign): + t.Errorf("build-release must write the manifest (step %d), check the wheel against it (step %d), then sign it (step %d)", manifest, check, sign) + } + if stepIndex(releaseSteps, "make build-grpc") >= 0 { + t.Error("build-release rebuilds binaries, so the bytes signed are not the bytes the distribution was stamped from") + } + + release := config.workflow(t, "release") + requireAll(t, "Build Python distribution", requiresOf(t, release, "Build Python distribution"), "Build release binaries") + requireAll(t, "Build release artifacts", requiresOf(t, release, "Build release artifacts"), "Build release binaries", "Build Python distribution") + requireAll(t, "Publish GitHub release", requiresOf(t, release, "Publish GitHub release"), "Build release artifacts") +} + +// TestRustCrateIsStampedWithItsReleaseDigests holds publish-crates to the same +// contract: stamp from the signed manifest before cargo package, then assert +// the packaged crate pins all five assets for the tag. +func TestRustCrateIsStampedWithItsReleaseDigests(t *testing.T) { + config := loadCircleConfig(t) + crates, ok := config.Jobs["publish-crates"] + if !ok { + t.Fatal("no publish-crates job") + } + steps := runSteps(t, crates.Steps) + stamp := stepIndex(steps, + "client/python/scripts/pin_release_checksums.py", + "--from-manifest dist/SHA256SUMS.txt", + "--table client/rust/opensysml/release-digests.json", + ) + pack := stepIndex(steps, "cargo package") + assert := stepIndex(steps, "release-digests.json", "tarfile") + switch { + case stamp < 0: + t.Error("publish-crates does not stamp the release's digests into the crate's table") + case pack < 0: + t.Error("publish-crates does not run cargo package") + case stamp > pack: + t.Errorf("the digest stamp (step %d) runs after cargo package (step %d)", stamp, pack) + } + if assert < 0 { + t.Fatal("publish-crates does not assert the packaged crate pins the release's service digests") + } + for _, asset := range serviceAssets { + if !strings.Contains(steps[assert].Command, asset) { + t.Errorf("the crate assertion does not require %s", asset) + } + } +} + +// persistedPaths is every path the steps persist to the workspace, including +// those inside when/unless blocks. +func persistedPaths(t *testing.T, steps []yaml.Node) []string { + t.Helper() + var paths []string + for _, step := range steps { + if step.Kind != yaml.MappingNode || len(step.Content) < 2 { + continue + } + key, value := step.Content[0].Value, step.Content[1] + switch key { + case "persist_to_workspace": + var persist struct { + Root string `yaml:"root"` + Paths []string `yaml:"paths"` + } + if err := value.Decode(&persist); err != nil { + t.Fatalf("decode persist_to_workspace: %v", err) + } + if persist.Root != "." { + t.Errorf("persist_to_workspace root is %q; the release jobs share root .", persist.Root) + } + paths = append(paths, persist.Paths...) + case "when", "unless": + var block struct{ Steps []yaml.Node } + if err := value.Decode(&block); err != nil { + t.Fatalf("decode %s block: %v", key, err) + } + paths = append(paths, persistedPaths(t, block.Steps)...) + } + } + return paths +} + +// TestReleaseJobsPersistDisjointWorkspaceLayers holds build-release to +// persisting only the files it writes. Workspace layers are additive, and a +// path persisted by two upstream jobs fails the attach in every job +// downstream of both, which is every publish job: build-release-binaries +// persists the whole dist tree, so build-release must not persist it again. +func TestReleaseJobsPersistDisjointWorkspaceLayers(t *testing.T) { + config := loadCircleConfig(t) + binaries, ok := config.Jobs["build-release-binaries"] + if !ok { + t.Fatal("no build-release-binaries job") + } + release, ok := config.Jobs["build-release"] + if !ok { + t.Fatal("no build-release job") + } + + upstream := persistedPaths(t, binaries.Steps) + requireAll(t, "build-release-binaries persists", upstream, "dist") + + // Everything build-release writes into dist: the manifest and what signs + // it, the sidecars opensysml reads, and the Python distribution it copies in. + own := func(path string) bool { + if !strings.HasPrefix(path, "dist/") { + return false + } + switch { + case strings.Contains(path, "SHA256SUMS.txt"), + strings.Contains(path, "provenance.intoto.json"), + strings.HasSuffix(path, ".sha256"), + strings.HasSuffix(path, ".whl"), + strings.HasPrefix(path, "dist/opensysml-[0-9]"): + return true + } + return false + } + persisted := persistedPaths(t, release.Steps) + for _, path := range persisted { + if !own(path) { + t.Errorf("build-release persists %q, which build-release-binaries' layer already carries; persist only the files build-release writes", path) + } + } + requireAll(t, "build-release persists", persisted, + "dist/SHA256SUMS.txt", + "dist/SHA256SUMS.txt.bundle", + "dist/provenance.intoto.json.bundle", + "dist/grpc/*.sha256", + "dist/opensysml-*-py3-none-any.whl", + "dist/opensysml-[0-9]*.tar.gz", + ) +} diff --git a/tests/migrate/migrate_test.go b/tests/migrate/migrate_test.go index 9f6ba21e00..0aeb45669e 100644 --- a/tests/migrate/migrate_test.go +++ b/tests/migrate/migrate_test.go @@ -314,6 +314,7 @@ func TestRejectsNonXMI(t *testing.T) { var constructFixtures = []string{ "plant_states", "transition_relocation", + "orthogonal_initials", "station_points", "submachine_params", "operation_extra_params", diff --git a/tests/migrate/relations_test.go b/tests/migrate/relations_test.go index 5c1d4ad440..937be53332 100644 --- a/tests/migrate/relations_test.go +++ b/tests/migrate/relations_test.go @@ -1119,7 +1119,7 @@ func TestOpaqueBodiesCheckCastBoundsAndUsageEnds(t *testing.T) { func TestCollectionModifiersAreWritten(t *testing.T) { r := migrateDocument(t, ` - + @@ -1141,24 +1141,37 @@ func TestCollectionModifiersAreWritten(t *testing.T) { `, ` `) - wantLine(t, r.Notation, "attribute o : ScalarValues::Real[0..*] ordered;") - wantLine(t, r.Notation, "part n : A[2] nonunique;") - wantLine(t, r.Notation, "ref part b : A ordered nonunique :> n;") + wantLine(t, r.Notation, "attribute o : ScalarValues::Real[0..*] ordered nonunique;") + wantLine(t, r.Notation, "part n : A[2];") + wantLine(t, r.Notation, "ref part b : A ordered :> n;") wantLine(t, r.Notation, "ref part u : A;") wantLine(t, r.Notation, "end 'first' : A[0..*] ordered;") - for _, id := range []string{"_o", "_n", "_b", "_u", "_e1"} { + for _, id := range []string{"_o", "_u", "_e1"} { if es := entriesFor(r, id); len(es) != 1 || es[0].Verdict != migrate.Mapped { t.Errorf("%s entries = %+v", id, es) } } - if diags := errors(t, "t.sysml", r.Notation); len(diags) > 0 { - t.Errorf("%v", diags) + // The v1 composite `n` is isUnique=false, but a composite part in a part + // implicitly subsets the unique Items::Item::subparts, which uniqueness + // conformance forbids a nonunique feature; `b` subsets `n`, so it follows. + // The modifier is dropped and the drop recorded, never silent. + for id, want := range map[string]string{ + "_n": "nonunique is not written: a part in a part def implicitly subsets Items::Item::subparts, which is unique", + "_b": "nonunique is not written: it subsets n, which is written unique", + } { + es := entriesFor(r, id) + if len(es) != 1 || es[0].Verdict != migrate.Approximated || es[0].Note != want { + t.Errorf("%s entries = %+v", id, es) + } + } + for _, d := range errors(t, "t.sysml", r.Notation) { + t.Errorf("%v", d) } ttl, err := convert.Convert("t.sysml", r.Notation, convert.FormatSysML, convert.FormatTurtle) if err != nil { t.Fatal(err) } - for _, want := range []string{"isOrdered", "isNonunique"} { + for _, want := range []string{"isOrdered", `isUnique "false"`} { if !strings.Contains(string(ttl), want) { t.Errorf("Turtle lacks %s", want) } diff --git a/tests/migrate/states_test.go b/tests/migrate/states_test.go index 6ca8633e2c..2302346798 100644 --- a/tests/migrate/states_test.go +++ b/tests/migrate/states_test.go @@ -184,13 +184,12 @@ func TestNestedTransitionRelocatesToCommonAncestor(t *testing.T) { for _, opts := range []migrate.Options{{}, {Strict: true}} { r := migrateFixtureFileOptions(t, "transition_relocation", opts) wantLine(t, r.Notation, "transition first Work.Run accept Stop then Parked.Ready;") - wantNote(t, r, "_region4Init", migrate.Unmapped, "the initial transition's target has no v2 form here") - wantNote(t, r, "_crossRegionInit", migrate.Unmapped, "its target lies in an orthogonal region") - if !strings.Contains(string(r.Notation), "no default entry: these regions have no written entry: 'region4'") { - t.Errorf("the region without a written initial entry has no default-entry note:\n%s", r.Notation) - } - if strings.Contains(string(r.Notation), "entry; then Parallel::region3::wait3;") { - t.Errorf("an initial transition into an orthogonal region was written:\n%s", r.Notation) + wantNote(t, r, "_region4Init", migrate.Approximated, "coincides with region3's own entry into 'wait3'") + wantNote(t, r, "_crossRegionInit", migrate.Approximated, "coincides with region3's own entry into 'wait3'") + wantLine(t, r.Notation, "no default entry: these regions have no written entry: 'region4'") + wantLine(t, r.Notation, "every initial pseudostate of the region enters another region: nothing enters this one") + if strings.Count(string(r.Notation), "then wait3;") != 1 { + t.Errorf("region3's entry into wait3 is not written exactly once:\n%s", r.Notation) } } @@ -208,6 +207,102 @@ func TestNestedTransitionRelocatesToCommonAncestor(t *testing.T) { } } +// testdata/xmi/orthogonal_initials.xmi: an initial pseudostate whose transition enters a +// sibling orthogonal region is written as the entry of the region owning its target — the +// sub-state of a parallel state, or the body of a nested composite state — unless that +// region has an entry of its own: one into the same vertex it coincides with, one into +// another it is refused for. A region's own initial is the one entering it, before any +// duplicate is refused. +func TestInitialIntoOrthogonalRegionEntersThatRegion(t *testing.T) { + for _, opts := range []migrate.Options{{}, {Strict: true}} { + r := migrateFixtureFileOptions(t, "orthogonal_initials", opts) + s := string(r.Notation) + for _, state := range []string{"Donate", "Coincide", "Conflict", "Nested", "Dangle"} { + if !strings.Contains(s, "state "+state+" {\n entry; then regions;") { + t.Errorf("%s has no default entry into its regions:\n%s", state, s) + } + } + if strings.Contains(s, "no default entry") { + t.Errorf("a parallel state lacks a default entry:\n%s", s) + } + + // (a) the stray initial is written as the entry of the sibling region owning its target. + wantLine(t, r.Notation, "state da {\n entry; then da1;") + wantLine(t, r.Notation, "state db {\n entry; then db1;") + wantNote(t, r, "_daOwn", migrate.Mapped, "written as the entry of the region") + wantNote(t, r, "_daStray", migrate.Approximated, "written as the entry of db, which owns its target 'db1', not of da") + wantNote(t, r, "_daStrayT", migrate.Approximated, "its target 'db1' lies in db, an orthogonal region of the pseudostate's, so it is written as the entry of db") + + // (b) the stray initial coincides with the target region's own entry into the same state. + wantLine(t, r.Notation, "state cb {\n entry; then cb1;") + if strings.Count(s, "then cb1;") != 1 { + t.Errorf("cb's entry into cb1 is not written exactly once:\n%s", s) + } + wantNote(t, r, "_cbInit", migrate.Mapped, "written as the entry of the region") + wantNote(t, r, "_caStray", migrate.Approximated, "coincides with cb's own entry into 'cb1'") + wantNote(t, r, "_caStrayT", migrate.Approximated, "coincides with cb's own entry into 'cb1'") + + // (c) the stray initial conflicts with the target region's own entry into another state. + wantLine(t, r.Notation, "state xb {\n entry; then xb1;") + wantLine(t, r.Notation, "state xa {\n /* not migrated: Pseudostate (_xaStray) — the initial transition's target has no v2 form here */") + wantNote(t, r, "_xaStrayT", migrate.Unmapped, "its target 'xb2' lies in xb, an orthogonal region whose own initial pseudostate enters 'xb1'; that entry is kept") + if strings.Contains(s, "then xb2;") { + t.Errorf("the conflicting stray initial was written:\n%s", s) + } + if opts.Strict { + wantNote(t, r, "_xaGuard", migrate.Unmapped, "its transition is not written: its target 'xb2' lies in xb") + } else if len(entriesFor(r, "_xaGuard")) != 0 { + t.Errorf("the guard of a refused transition is reported outside strict mode: %+v", entriesFor(r, "_xaGuard")) + } + + // (d) two initials both entering the region: the first is written, the second refused. + wantLine(t, r.Notation, "state Duplicate {\n /* not migrated: Pseudostate (_uaInit2) — a region has one initial pseudostate; (_uaInit1) is written as it */\n entry; then ua1;") + wantNote(t, r, "_uaInit1", migrate.Mapped, "written as the entry of the region") + + // (e) the target lies in a nested composite state's one region, written as that state's body. + wantLine(t, r.Notation, "state Inner {\n entry; then inner1;") + wantNote(t, r, "_naStray", migrate.Approximated, "written as the entry of the body of 'Inner', which owns its target 'inner1', not of na") + wantNote(t, r, "_naStrayT", migrate.Approximated, "so it is written as the entry of the body of 'Inner'") + + // (f) the target region's own initial has no transition, so it is no entry: the stray one is donated. + wantLine(t, r.Notation, "state gb {\n /* not migrated: Pseudostate (_gbInit) — no transition leaves the initial pseudostate */\n entry; then gb1;") + wantNote(t, r, "_gbInit", migrate.Unmapped, "no transition leaves the initial pseudostate") + wantNote(t, r, "_gaStray", migrate.Approximated, "written as the entry of gb, which owns its target 'gb1', not of ga") + + // (g) a target in a region of another, non-orthogonal state is refused, not donated. + wantLine(t, r.Notation, "state Work {\n /* not migrated: Pseudostate (_wInit) — the initial transition's target has no v2 form here */") + wantNote(t, r, "_wInitT", migrate.Unmapped, "its target 'idle1' lies in 'ir', a region of 'Idle' and no orthogonal region of the pseudostate's; an initial transition enters its own region") + if strings.Count(s, "then idle1;") != 1 { + t.Errorf("Idle's own entry into idle1 is not written exactly once:\n%s", s) + } + if opts.Strict { + wantNote(t, r, "_wInit", migrate.Unmapped, "the initial transition's target has no v2 form here") + } + } + + r := migrateFixtureFile(t, "orthogonal_initials") + s := session(t, r) + meta(t, s, "%instantiate Plant") + meta(t, s, "%state Plant::Life #1") + for _, want := range [][]string{ + {"da1", "db1"}, + {"ca1", "cb1"}, + {"xa1", "xb1"}, + {"ua1"}, + {"na1", "inner1"}, + {"ga1", "gb1"}, + } { + out := meta(t, s, "%current") + for _, state := range want { + if !strings.Contains(out, state) { + t.Errorf("%s is not active:\n%s", state, out) + } + } + meta(t, s, "%send Next") + meta(t, s, "%step") + } +} + // testdata/xmi/station_points.xmi: entry and exit points owned by composite states — on a // nested state, on a state with orthogonal regions, beside a default initial pseudostate // and a shallow history — are written as junctions, a fork and a join of their state; an diff --git a/tests/migrate/testdata/xmi/orthogonal_initials.golden.report.txt b/tests/migrate/testdata/xmi/orthogonal_initials.golden.report.txt new file mode 100644 index 0000000000..fb253b1342 --- /dev/null +++ b/tests/migrate/testdata/xmi/orthogonal_initials.golden.report.txt @@ -0,0 +1,103 @@ +# SysML v1 to v2 migration report: orthogonal_initials.xmi +# migrated 95 element(s): 81 mapped, 8 approximated, 6 unmapped (0 skipped as profile, library or notation-only content, 0 as model elements nothing refers to) + +## unmapped (6) +Pseudostate Plant::Life::main::Conflict::xa:: _xaStray (the initial transition's target has no v2 form here) +Transition Plant::Life::main::Conflict::xa:: _xaStrayT (its target 'xb2' lies in xb, an orthogonal region whose own initial pseudostate enters 'xb1'; that entry is kept) +Pseudostate Plant::Life::main::Dangle::gb:: _gbInit (no transition leaves the initial pseudostate) +Pseudostate Plant::Life::main::Duplicate::ua:: _uaInit2 (a region has one initial pseudostate; (_uaInit1) is written as it) +Pseudostate Site::Cross::main::Work::wr:: _wInit (the initial transition's target has no v2 form here) +Transition Site::Cross::main::Work::wr:: _wInitT (its target 'idle1' lies in 'ir', a region of 'Idle' and no orthogonal region of the pseudostate's; an initial transition enters its own region) + +## approximated (8) +Pseudostate Plant::Life::main::Coincide::ca:: _caStray (coincides with cb's own entry into 'cb1', which its transition also enters from this orthogonal region) +Transition Plant::Life::main::Coincide::ca:: _caStrayT (coincides with cb's own entry into 'cb1', which its transition also enters from this orthogonal region) +Pseudostate Plant::Life::main::Dangle::ga:: _gaStray (written as the entry of gb, which owns its target 'gb1', not of ga, the orthogonal region that owns the pseudostate) +Transition Plant::Life::main::Dangle::ga:: _gaStrayT (its target 'gb1' lies in gb, an orthogonal region of the pseudostate's, so it is written as the entry of gb) +Pseudostate Plant::Life::main::Donate::da:: _daStray (written as the entry of db, which owns its target 'db1', not of da, the orthogonal region that owns the pseudostate) +Transition Plant::Life::main::Donate::da:: _daStrayT (its target 'db1' lies in db, an orthogonal region of the pseudostate's, so it is written as the entry of db) +Pseudostate Plant::Life::main::Nested::na:: _naStray (written as the entry of the body of 'Inner', which owns its target 'inner1', not of na, the orthogonal region that owns the pseudostate) +Transition Plant::Life::main::Nested::na:: _naStrayT (its target 'inner1' lies in the body of 'Inner', an orthogonal region of the pseudostate's, so it is written as the entry of the body of 'Inner') + +## mapped (81) +Model Model _m (the root model's members are written at the top level) +Signal Next _next -> Next +«Block» Class Plant _plant -> Plant +StateMachine Plant::Life _life -> Plant::Life +Region Plant::Life::main _main (the one region is written as the body of its owner) +Pseudostate Plant::Life::main:: _init (written as the entry of the region) +Transition Plant::Life::main:: _enterDonate +Transition Plant::Life::main:: _toCoincide +Transition Plant::Life::main:: _toConflict +Transition Plant::Life::main:: _toDuplicate +Transition Plant::Life::main:: _toNested +Transition Plant::Life::main:: _toDangle +Trigger Plant::Life::main:::: _toCoincideTrigger +Trigger Plant::Life::main:::: _toConflictTrigger +Trigger Plant::Life::main:::: _toDuplicateTrigger +Trigger Plant::Life::main:::: _toNestedTrigger +Trigger Plant::Life::main:::: _toDangleTrigger +State Plant::Life::main::Coincide _coincide -> Coincide +Region Plant::Life::main::Coincide::ca _ca -> ca (the one region is written as the body of its owner; an orthogonal region is written as a sub-state of the parallel state regions) +Pseudostate Plant::Life::main::Coincide::ca:: _caOwn (written as the entry of the region) +Transition Plant::Life::main::Coincide::ca:: _caOwnT +State Plant::Life::main::Coincide::ca::ca1 _ca1 -> ca1 +Region Plant::Life::main::Coincide::cb _cb -> cb (the one region is written as the body of its owner; an orthogonal region is written as a sub-state of the parallel state regions) +Pseudostate Plant::Life::main::Coincide::cb:: _cbInit (written as the entry of the region) +Transition Plant::Life::main::Coincide::cb:: _cbInitT +State Plant::Life::main::Coincide::cb::cb1 _cb1 -> cb1 +State Plant::Life::main::Conflict _conflict -> Conflict +Region Plant::Life::main::Conflict::xa _xa -> xa (the one region is written as the body of its owner; an orthogonal region is written as a sub-state of the parallel state regions) +Pseudostate Plant::Life::main::Conflict::xa:: _xaOwn (written as the entry of the region) +Transition Plant::Life::main::Conflict::xa:: _xaOwnT +State Plant::Life::main::Conflict::xa::xa1 _xa1 -> xa1 +Region Plant::Life::main::Conflict::xb _xb -> xb (the one region is written as the body of its owner; an orthogonal region is written as a sub-state of the parallel state regions) +Pseudostate Plant::Life::main::Conflict::xb:: _xbInit (written as the entry of the region) +Transition Plant::Life::main::Conflict::xb:: _xbInitT +State Plant::Life::main::Conflict::xb::xb1 _xb1 -> xb1 +State Plant::Life::main::Conflict::xb::xb2 _xb2 -> xb2 +State Plant::Life::main::Dangle _dangle -> Dangle +Region Plant::Life::main::Dangle::ga _ga -> ga (the one region is written as the body of its owner; an orthogonal region is written as a sub-state of the parallel state regions) +Pseudostate Plant::Life::main::Dangle::ga:: _gaOwn (written as the entry of the region) +Transition Plant::Life::main::Dangle::ga:: _gaOwnT +State Plant::Life::main::Dangle::ga::ga1 _ga1 -> ga1 +Region Plant::Life::main::Dangle::gb _gb -> gb (the one region is written as the body of its owner; an orthogonal region is written as a sub-state of the parallel state regions) +State Plant::Life::main::Dangle::gb::gb1 _gb1 -> gb1 +State Plant::Life::main::Donate _donate -> Donate +Region Plant::Life::main::Donate::da _da -> da (the one region is written as the body of its owner; an orthogonal region is written as a sub-state of the parallel state regions) +Pseudostate Plant::Life::main::Donate::da:: _daOwn (written as the entry of the region) +Transition Plant::Life::main::Donate::da:: _daOwnT +State Plant::Life::main::Donate::da::da1 _da1 -> da1 +Region Plant::Life::main::Donate::db _db -> db (the one region is written as the body of its owner; an orthogonal region is written as a sub-state of the parallel state regions) +State Plant::Life::main::Donate::db::db1 _db1 -> db1 +State Plant::Life::main::Duplicate _duplicate -> Duplicate +Region Plant::Life::main::Duplicate::ua _ua (the one region is written as the body of its owner) +Pseudostate Plant::Life::main::Duplicate::ua:: _uaInit1 (written as the entry of the region) +Transition Plant::Life::main::Duplicate::ua:: _uaInit1T +State Plant::Life::main::Duplicate::ua::ua1 _ua1 -> ua1 +State Plant::Life::main::Duplicate::ua::ua2 _ua2 -> ua2 +State Plant::Life::main::Nested _nested -> Nested +Region Plant::Life::main::Nested::na _na -> na (the one region is written as the body of its owner; an orthogonal region is written as a sub-state of the parallel state regions) +Pseudostate Plant::Life::main::Nested::na:: _naOwn (written as the entry of the region) +Transition Plant::Life::main::Nested::na:: _naOwnT +State Plant::Life::main::Nested::na::na1 _na1 -> na1 +Region Plant::Life::main::Nested::nb _nb -> nb (the one region is written as the body of its owner; an orthogonal region is written as a sub-state of the parallel state regions) +Pseudostate Plant::Life::main::Nested::nb:: _nbInit (written as the entry of the region) +Transition Plant::Life::main::Nested::nb:: _nbInitT +State Plant::Life::main::Nested::nb::Inner _inner -> Inner +Region Plant::Life::main::Nested::nb::Inner::ni _ni (the one region is written as the body of its owner) +State Plant::Life::main::Nested::nb::Inner::ni::inner1 _inner1 -> inner1 +«Block» Class Site _site -> Site +StateMachine Site::Cross _cross -> Site::Cross +Region Site::Cross::main _crossMain (the one region is written as the body of its owner) +Pseudostate Site::Cross::main:: _crossInit (written as the entry of the region) +Transition Site::Cross::main:: _crossInitT +State Site::Cross::main::Idle _idle -> Idle +Region Site::Cross::main::Idle::ir _ir (the one region is written as the body of its owner) +Pseudostate Site::Cross::main::Idle::ir:: _iInit (written as the entry of the region) +Transition Site::Cross::main::Idle::ir:: _iInitT +State Site::Cross::main::Idle::ir::idle1 _idle1 -> idle1 +State Site::Cross::main::Work _work -> Work +Region Site::Cross::main::Work::wr _wr (the one region is written as the body of its owner) +State Site::Cross::main::Work::wr::work1 _work1 -> work1 +SignalEvent nextEvent _nextEvent (written where a trigger refers to it, as accept Next) diff --git a/tests/migrate/testdata/xmi/orthogonal_initials.golden.sysml b/tests/migrate/testdata/xmi/orthogonal_initials.golden.sysml new file mode 100644 index 0000000000..515259361c --- /dev/null +++ b/tests/migrate/testdata/xmi/orthogonal_initials.golden.sysml @@ -0,0 +1,114 @@ +item def Next; +part def Plant { + state def Life { + entry; then Donate; + state Donate { + entry; then regions; + state regions parallel { + state da { + entry; then da1; + state da1; + } + state db { + entry; then db1; + state db1; + } + } + transition first regions then done; + metadata MigrationMetadata::SynthesizedName about regions; + } + state Coincide { + entry; then regions; + state regions parallel { + state ca { + entry; then ca1; + state ca1; + } + state cb { + entry; then cb1; + state cb1; + } + } + transition first regions then done; + metadata MigrationMetadata::SynthesizedName about regions; + } + state Conflict { + entry; then regions; + state regions parallel { + state xa { + /* not migrated: Pseudostate (_xaStray) — the initial transition's target has no v2 form here */ + /* not migrated: Transition (_xaStrayT) — its target 'xb2' lies in xb, an orthogonal region whose own initial pseudostate enters 'xb1'; that entry is kept */ + entry; then xa1; + state xa1; + } + state xb { + entry; then xb1; + state xb1; + state xb2; + } + } + transition first regions then done; + metadata MigrationMetadata::SynthesizedName about regions; + } + state Duplicate { + /* not migrated: Pseudostate (_uaInit2) — a region has one initial pseudostate; (_uaInit1) is written as it */ + entry; then ua1; + state ua1; + state ua2; + } + state Nested { + entry; then regions; + state regions parallel { + state na { + entry; then na1; + state na1; + } + state nb { + entry; then Inner; + state Inner { + entry; then inner1; + state inner1; + } + } + } + transition first regions then done; + metadata MigrationMetadata::SynthesizedName about regions; + } + state Dangle { + entry; then regions; + state regions parallel { + state ga { + entry; then ga1; + state ga1; + } + state gb { + /* not migrated: Pseudostate (_gbInit) — no transition leaves the initial pseudostate */ + entry; then gb1; + state gb1; + } + } + transition first regions then done; + metadata MigrationMetadata::SynthesizedName about regions; + } + transition first Donate accept Next then Coincide; + transition first Coincide accept Next then Conflict; + transition first Conflict accept Next then Duplicate; + transition first Duplicate accept Next then Nested; + transition first Nested accept Next then Dangle; + } +} +part def Site { + state def Cross { + entry; then Idle; + state Work { + /* not migrated: Pseudostate (_wInit) — the initial transition's target has no v2 form here */ + /* not migrated: Transition (_wInitT) — its target 'idle1' lies in 'ir', a region of 'Idle' and no orthogonal region of the pseudostate's; an initial transition enters its own region */ + /* every initial pseudostate of the region enters another region: nothing enters this one */ + state work1; + } + state Idle { + entry; then idle1; + state idle1; + } + } +} diff --git a/tests/migrate/testdata/xmi/orthogonal_initials.xmi b/tests/migrate/testdata/xmi/orthogonal_initials.xmi new file mode 100644 index 0000000000..6f570a6aa1 --- /dev/null +++ b/tests/migrate/testdata/xmi/orthogonal_initials.xmi @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ready + English + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/migrate/testdata/xmi/transition_relocation.golden.report.txt b/tests/migrate/testdata/xmi/transition_relocation.golden.report.txt index a70c8b4a6f..0a3f2a4738 100644 --- a/tests/migrate/testdata/xmi/transition_relocation.golden.report.txt +++ b/tests/migrate/testdata/xmi/transition_relocation.golden.report.txt @@ -1,9 +1,9 @@ # SysML v1 to v2 migration report: transition_relocation.xmi -# migrated 28 element(s): 26 mapped, 0 approximated, 2 unmapped (0 skipped as profile, library or notation-only content, 0 as model elements nothing refers to) +# migrated 28 element(s): 26 mapped, 2 approximated, 0 unmapped (0 skipped as profile, library or notation-only content, 0 as model elements nothing refers to) -## unmapped (2) -Pseudostate Plant::Life::main::Parallel::region4:: _region4Init (the initial transition's target has no v2 form here) -Transition Plant::Life::main::Parallel::region4:: _crossRegionInit (its target lies in an orthogonal region) +## approximated (2) +Pseudostate Plant::Life::main::Parallel::region4:: _region4Init (coincides with region3's own entry into 'wait3', which its transition also enters from this orthogonal region) +Transition Plant::Life::main::Parallel::region4:: _crossRegionInit (coincides with region3's own entry into 'wait3', which its transition also enters from this orthogonal region) ## mapped (26) Model Model _m (the root model's members are written at the top level) diff --git a/tests/migrate/testdata/xmi/transition_relocation.golden.sysml b/tests/migrate/testdata/xmi/transition_relocation.golden.sysml index a155546ca0..a9145e55f8 100644 --- a/tests/migrate/testdata/xmi/transition_relocation.golden.sysml +++ b/tests/migrate/testdata/xmi/transition_relocation.golden.sysml @@ -18,8 +18,7 @@ part def Plant { state wait3; } state region4 { - /* not migrated: Pseudostate (_region4Init) — the initial transition's target has no v2 form here */ - /* not migrated: Transition (_crossRegionInit) — its target lies in an orthogonal region */ + /* every initial pseudostate of the region enters another region: nothing enters this one */ } } transition first regions then done; diff --git a/tests/migrate/values_test.go b/tests/migrate/values_test.go index eddae147ae..e78ea35ba7 100644 --- a/tests/migrate/values_test.go +++ b/tests/migrate/values_test.go @@ -711,6 +711,32 @@ func TestPartSlotsRedefineThePartByItsInstance(t *testing.T) { wantClean(t, "part-slots.sysml", r) } +// A composite part written unique, although v1 declares it nonunique, cannot +// hold a repeated instance: the slot is unmapped as on any unique feature. +func TestPartSlotRepeatingOnAForcedUniquePartIsUnmapped(t *testing.T) { + r := migrateDocument(t, ` + + + + + + + + + + + + + + `, ` + + `) + wantLine(t, r.Notation, "part spares : MCS[0..*];") + wantNote(t, r, "_q", migrate.Approximated, "nonunique is not written: a part in a part def implicitly subsets Items::Item::subparts, which is unique") + wantNote(t, r, "_sl", migrate.Unmapped, "the slot repeats the value 'mcs 2' on a unique feature; its values are 'mcs 2', 'mcs 2'") + wantClean(t, "part-slot-repeat.sysml", r) +} + // A part slot whose value is not an individual of the part's type has no v2 // form: a literal, an instance without a classifier, an instance of another // block or of a block where an item is due, or a port's slot, since v2 has no diff --git a/tests/ontology/ontology_test.go b/tests/ontology/ontology_test.go index 0d339d661d..028f94325e 100644 --- a/tests/ontology/ontology_test.go +++ b/tests/ontology/ontology_test.go @@ -1,6 +1,10 @@ package ontology_test import ( + "os" + "path/filepath" + "reflect" + "regexp" "strings" "testing" @@ -13,7 +17,8 @@ import ( func TestTableShape(t *testing.T) { properties := ontology.Properties() classes := ontology.Classes() - // The counts SysML.owl 202407 declares; an ontology bump is expected to move them. + enumerations := ontology.Enumerations() + // The counts SysML.ecore 20250201 (pilot 2026-08) declares; a metamodel bump is expected to move them. object, datatype := 0, 0 for _, p := range properties { if p.Kind == ontology.ObjectProperty { @@ -22,16 +27,29 @@ func TestTableShape(t *testing.T) { datatype++ } } - if len(classes) != 172 || object != 348 || datatype != 63 { - t.Errorf("table holds %d classes, %d object and %d datatype properties; want 172, 348, 63", + if len(classes) != 175 || object != 351 || datatype != 64 { + t.Errorf("table holds %d classes, %d object and %d datatype properties; want 175, 351, 64", len(classes), object, datatype) } - if got := len(ontology.AmbiguousNames()); got != 59 { - t.Errorf("got %d unqualified names declared by more than one metaclass, want 59", got) + if len(enumerations) != 7 { + t.Errorf("table holds %d enumerations; want 7", len(enumerations)) } - if ontology.Version == "" || len(ontology.SourceCommit) != 40 { - t.Errorf("table header not recorded: version %q, commit %q", - ontology.Version, ontology.SourceCommit) + for _, bounded := range [][2]string{{"MultiplicityRange", "bound"}, {"Flow", "flowEnd"}} { + // Both have ecore upperBound 2, so their API JSON shape is an array. + if declared, ok := ontology.PropertyOf(bounded[0], bounded[1]); !ok || !declared.Many { + t.Errorf("%s::%s should be Many", bounded[0], bounded[1]) + } + } + if got := len(ontology.AmbiguousNames()); got != 58 { + t.Errorf("got %d unqualified names declared by more than one metaclass, want 58", got) + } + if ontology.Version == "" || ontology.SourceTag == "" || len(ontology.SourceCommit) != 40 { + t.Errorf("table header not recorded: version %q, tag %q, commit %q", + ontology.Version, ontology.SourceTag, ontology.SourceCommit) + } + qualified := make(map[string]bool, len(properties)) + for _, p := range properties { + qualified[p.QualifiedName()] = true } for _, p := range properties { if p.IRI != rdf.SysML+p.DefiningClass+"_"+p.Name { @@ -43,12 +61,25 @@ func TestTableShape(t *testing.T) { if p.Range == "" { t.Errorf("%s: no declared range", p.IRI) } + if p.Ordered && !p.Many { + t.Errorf("%s: Ordered on a single-valued property", p.IRI) + } + for _, ref := range append(append(append([]string(nil), p.Redefines...), p.Subsets...), p.Opposite) { + if ref != "" && !qualified[ref] { + t.Errorf("%s: names %s, which is no declared property", p.IRI, ref) + } + } rangeName := ontology.LocalName(p.Range) _, rangeIsClass := ontology.LookupClass(rangeName) if (p.Kind == ontology.ObjectProperty) != rangeIsClass { t.Errorf("%s: %s ranges over %s, which is%s a declared metaclass", p.IRI, p.Kind, p.Range, map[bool]string{true: "", false: " not"}[rangeIsClass]) } + if p.Kind == ontology.DatatypeProperty && strings.HasPrefix(p.Range, rdf.SysML) { + if _, ok := ontology.LookupEnumeration(rangeName); !ok { + t.Errorf("%s: datatype range %s is not a declared enumeration", p.IRI, rangeName) + } + } } for _, c := range classes { for _, parent := range c.Parents { @@ -62,7 +93,31 @@ func TestTableShape(t *testing.T) { } } -// TestLookups checks the accessors against declarations read out of SysML.owl by +func TestEnumerationLookups(t *testing.T) { + enumeration, ok := ontology.LookupEnumeration("FeatureDirectionKind") + if !ok { + t.Fatal("FeatureDirectionKind is not declared") + } + want := []string{"in", "inout", "out"} + if !reflect.DeepEqual(enumeration.Literals, want) { + t.Errorf("FeatureDirectionKind literals: got %v, want %v", enumeration.Literals, want) + } + enumeration.Literals[0] = "changed" + fresh, ok := ontology.LookupEnumeration("FeatureDirectionKind") + if !ok || !reflect.DeepEqual(fresh.Literals, want) { + t.Errorf("LookupEnumeration returned shared literals: got %v", fresh.Literals) + } + all := ontology.Enumerations() + all[0].Literals[0] = "changed" + if again := ontology.Enumerations(); reflect.DeepEqual(all[0].Literals, again[0].Literals) { + t.Error("Enumerations returned shared literals") + } + if _, ok := ontology.LookupEnumeration("NotAnEnumeration"); ok { + t.Error("NotAnEnumeration should not be declared") + } +} + +// TestLookups checks the accessors against declarations read out of SysML.ecore by // hand, including a name two metaclasses declare. func TestLookups(t *testing.T) { declaredName := ontology.LookupProperty("declaredName") @@ -76,9 +131,35 @@ func TestLookups(t *testing.T) { Kind: ontology.DatatypeProperty, Range: rdf.XSD + "string", } - if declaredName[0] != want { + if !reflect.DeepEqual(declaredName[0], want) { t.Errorf("declaredName: got %+v, want %+v", declaredName[0], want) } + ownedFeature, ok := ontology.PropertyOf("Type", "ownedFeature") + wantOwnedFeature := ontology.Property{ + Name: "ownedFeature", + DefiningClass: "Type", + IRI: rdf.SysML + "Type_ownedFeature", + Kind: ontology.ObjectProperty, + Range: rdf.SysML + "Feature", + Many: true, + Ordered: true, + Derived: true, + Subsets: []string{"Namespace::ownedMember"}, + Opposite: "Feature::owningType", + } + if !ok || !reflect.DeepEqual(ownedFeature, wantOwnedFeature) { + t.Errorf("ownedFeature: got %+v, want %+v", ownedFeature, wantOwnedFeature) + } + memberFeature, _ := ontology.PropertyOf("FeatureMembership", "ownedMemberFeature") + if want := []string{"OwningMembership::ownedMemberElement"}; !reflect.DeepEqual(memberFeature.Redefines, want) { + t.Errorf("ownedMemberFeature: redefines %v, want %v", memberFeature.Redefines, want) + } + if element, _ := ontology.LookupClass("Element"); !element.Abstract { + t.Error("Element should be abstract") + } + if part, _ := ontology.LookupClass("PartUsage"); part.Abstract { + t.Error("PartUsage should be concrete") + } owner := ontology.LookupProperty("owningNamespace") if len(owner) != 1 || owner[0].Kind != ontology.ObjectProperty || owner[0].Range != rdf.SysML+"Namespace" { @@ -104,6 +185,26 @@ func TestLookups(t *testing.T) { } } +var pilotPinRe = regexp.MustCompile(`(?m)^PILOT_(TAG|COMMIT)="\$\{PILOT_(?:TAG|COMMIT):-([^}"]*)\}"`) + +// TestTableFollowsThePilotPin fails when scripts/pilot-pin.sh moves without the +// table being regenerated from the metamodel of the new pin. +func TestTableFollowsThePilotPin(t *testing.T) { + data, err := os.ReadFile(filepath.Join("..", "..", "scripts", "pilot-pin.sh")) + if err != nil { + t.Fatal(err) + } + pin := map[string]string{} + for _, m := range pilotPinRe.FindAllStringSubmatch(string(data), -1) { + pin[m[1]] = m[2] + } + if pin["TAG"] != ontology.SourceTag || pin["COMMIT"] != ontology.SourceCommit { + t.Errorf("table generated from pilot %s %s, scripts/pilot-pin.sh pins %s %s; "+ + "regenerate with ./scripts/download-pilot-metamodel.sh && go run -C tools ./gen/ontology", + ontology.SourceTag, ontology.SourceCommit, pin["TAG"], pin["COMMIT"]) + } +} + // TestCheckReportsEachKind exercises the check on a hand-built graph, one triple // per kind, independently of what the export fixtures happen to contain. func TestCheckReportsEachKind(t *testing.T) { @@ -121,6 +222,8 @@ func TestCheckReportsEachKind(t *testing.T) { graph.Add(untyped, rdf.SysMLTerm("declaredName"), rdf.String("u")) odd := rdf.ElementIRI("M::o") graph.Add(odd, rdf.IRI(rdf.RDFType), rdf.SysMLTerm("NotAMetaclass")) + imp := rdf.ElementIRI("M::i") + graph.Add(imp, rdf.IRI(rdf.RDFType), rdf.SysMLTerm("Import")) want := map[string]string{ "unknown-property PartUsage notAProperty": `named "notAProperty"`, @@ -129,6 +232,7 @@ func TestCheckReportsEachKind(t *testing.T) { "iri-for-datatype-property PartUsage declaredName": "owl:DatatypeProperty", "untyped-subject - -": "no rdf:type", "unknown-class NotAMetaclass -": "not an owl:Class", + "abstract-class Import -": "abstract in the metamodel", } got := make(map[string]string) for _, violation := range ontology.Check(graph) { @@ -150,3 +254,19 @@ func TestCheckReportsEachKind(t *testing.T) { } } } + +// TestCheckReadsTheMostSpecificType checks a subject stating several rdf:types as +// the class the graph reader selects, whatever order the types are stated in. +func TestCheckReadsTheMostSpecificType(t *testing.T) { + for _, order := range [][]string{{"Element", "PartUsage"}, {"PartUsage", "Element"}} { + graph := rdf.NewGraph() + part := rdf.ElementIRI("M::p") + for _, class := range order { + graph.Add(part, rdf.IRI(rdf.RDFType), rdf.SysMLTerm(class)) + } + graph.Add(part, rdf.SysMLTerm("isComposite"), rdf.Bool(true)) // declared on Feature + if got := ontology.Check(graph); len(got) != 0 { + t.Errorf("types %v: unexpected violations %v", order, got) + } + } +} diff --git a/tools/gen/ontology/main.go b/tools/gen/ontology/main.go index 3cd60fa60b..0e27a4501f 100644 --- a/tools/gen/ontology/main.go +++ b/tools/gen/ontology/main.go @@ -1,88 +1,116 @@ -// Command ontology writes internal/translate/rdf/ontology/table.go from a local -// checkout of https://github.com/Open-MBEE/sysmlv2-rdf-ontology, which is not -// vendored here. The checkout's version and commit SHA go into the header, -// making the table reproducible. +// Command ontology writes internal/translate/rdf/ontology/table.go from the OMG +// SysML v2 metamodel's SysML.ecore as the pinned pilot implementation publishes +// it. scripts/download-pilot-metamodel.sh fetches it into build/pilot-metamodel +// at the commit scripts/pilot-pin.sh pins, which the header records. // -// go run -C tools ./gen/ontology -ontology /path/to/sysmlv2-rdf-ontology +// ./scripts/download-pilot-metamodel.sh +// go run -C tools ./gen/ontology [-check] package main import ( + "bytes" "encoding/xml" "errors" "flag" "fmt" "go/format" - "io" "os" "path/filepath" "regexp" "sort" + "strconv" "strings" + "github.com/Open-MBEE/OpenSysML/tools/oracle/baseline" "github.com/Open-MBEE/OpenSysML/tools/oracle/repo" ) -// tablePath is the generated table, relative to the repository root. -const tablePath = "internal/translate/rdf/ontology/table.go" - const ( - sysmlNS = "https://www.omg.org/spec/SysML#" - owlPath = "sysml2/owl/www.omg.org/spec/SysML.owl" - ecorePath = "sysml2/ecore/SysML.ecore" - readme = "sysml2/README.md" - rdfNS = "http://www.w3.org/1999/02/22-rdf-syntax-ns#" - rdfsNS = "http://www.w3.org/2000/01/rdf-schema#" - owlNS = "http://www.w3.org/2002/07/owl#" - template = `// Code generated by tools/gen/ontology. DO NOT EDIT. + // tablePath is the generated table, relative to the repository root. + tablePath = "internal/translate/rdf/ontology/table.go" + // metamodelDir is where scripts/download-pilot-metamodel.sh puts the pilot's model directory. + metamodelDir = "build/pilot-metamodel" + // ecorePath is the metamodel in that directory and in the pilot repository's org.omg.sysml/model. + ecorePath = "SysML.ecore" + stampPath = ".pilot-pin" + // The classifier and feature kinds the Ecore model spells. + ecoreClass = "ecore:EClass" + ecoreEnum = "ecore:EEnum" + ecoreReference = "ecore:EReference" + ecoreAttribute = "ecore:EAttribute" + sysmlNS = "https://www.omg.org/spec/SysML#" + xsdNS = "http://www.w3.org/2001/XMLSchema#" + owlNS = "http://www.w3.org/2002/07/owl#" + xsiNS = "http://www.w3.org/2001/XMLSchema-instance" + regen = "./scripts/download-pilot-metamodel.sh && go run -C tools ./gen/ontology" + template = `// Code generated by tools/gen/ontology. DO NOT EDIT. // -// Source: Open-MBEE/sysmlv2-rdf-ontology, %s -// Ecore: %s (property multiplicities) -// Ontology: SysML v2 metamodel version %s (generated from SysML.ecore) -// Commit: %s +// Source: %s %s, org.omg.sysml/model/SysML.ecore +// Commit: %s +// Metamodel: %s // // Regenerate with (see README.md): // -// go run -C tools ./gen/ontology -ontology +// ./scripts/download-pilot-metamodel.sh +// go run -C tools ./gen/ontology package ontology -// Version is the OMG SysML v2 metamodel version the table was generated from. +// Version is the OMG SysML v2 metamodel version the table was generated from, +// the date in the ecore's namespace URI. const Version = %q -// SourceCommit is the sysmlv2-rdf-ontology commit the table was generated from. +// SourceTag is the pilot implementation release the table was generated from. +const SourceTag = %q + +// SourceCommit is the pilot implementation commit the table was generated from. const SourceCommit = %q -// properties holds every owl:ObjectProperty and owl:DatatypeProperty the -// ontology declares, ordered by IRI. +// properties holds every eStructuralFeature the metamodel declares, ordered by IRI. var properties = []Property{ %s} -// classes holds every owl:Class the ontology declares with its named -// rdfs:subClassOf parents, ordered by name. +// enumerations holds every EEnum and its literals in declaration order, ordered by name. +var enumerations = []Enumeration{ +%s} + +// classes holds every EClass the metamodel declares with its eSuperTypes, ordered by name. var classes = []Class{ %s} ` ) +// datatypeRanges maps an ecore primitive, in the pilot's own spelling and in +// Ecore's, to the XSD or OWL datatype the RDF mapping writes it as. +var datatypeRanges = map[string]string{ + "Boolean": xsdNS + "boolean", "EBoolean": xsdNS + "boolean", + "String": xsdNS + "string", "EString": xsdNS + "string", + "Integer": xsdNS + "int", "EInt": xsdNS + "int", + "Real": owlNS + "real", "EDouble": owlNS + "real", +} + func main() { - root := flag.String("ontology", "", "path to a local Open-MBEE/sysmlv2-rdf-ontology checkout") + dir := flag.String("metamodel", "", "directory holding the pilot's SysML.ecore and its .pilot-pin stamp (default "+metamodelDir+" under the repository root)") out := flag.String("out", "", "generated file to write (default "+tablePath+" under the repository root)") + check := flag.Bool("check", false, "fail if the file differs from a fresh table instead of writing it") flag.Parse() - if *root == "" { - fail(fmt.Errorf("-ontology is required: pass a local sysmlv2-rdf-ontology checkout")) + root, err := repo.Root() + if err != nil { + fail(err) } - if repo.NeedsRoot(*root, *out) { - repoRoot, err := repo.Root() - if err != nil { - fail(err) - } - *root = repo.Resolve(repoRoot, *root) - *out = repo.Resolve(repoRoot, *out) - if *out == "" { - *out = filepath.Join(repoRoot, filepath.FromSlash(tablePath)) - } + pin, err := baseline.ReadPin(root) + if err != nil { + fail(err) + } + *dir = repo.Resolve(root, *dir) + if *dir == "" { + *dir = filepath.Join(root, filepath.FromSlash(metamodelDir)) } - if err := run(*root, *out); err != nil { + *out = repo.Resolve(root, *out) + if *out == "" { + *out = filepath.Join(root, filepath.FromSlash(tablePath)) + } + if err := run(*dir, *out, *check, pin); err != nil { fail(err) } } @@ -92,456 +120,314 @@ func fail(err error) { os.Exit(1) } -func run(root, out string) error { - version, err := ontologyVersion(filepath.Join(root, readme)) +// run generates the table from dir and writes it to out, or with check +// compares it against out; the stamp in dir must name pin. +func run(dir, out string, check bool, pin baseline.Pin) error { + src, err := readStamp(filepath.Join(dir, stampPath)) if err != nil { return err } - commit, err := commitSHA(root) + if src.tag != pin.Tag || src.commit != pin.Commit { + return fmt.Errorf("%s holds the metamodel at %s %s, but %s pins %s %s; rerun ./scripts/download-pilot-metamodel.sh", + dir, src.tag, src.commit, baseline.PinPath, pin.Tag, pin.Commit) + } + pkg, err := parseEcore(filepath.Join(dir, ecorePath)) if err != nil { return err } - decls, err := parseOntology(filepath.Join(root, owlPath)) + version, err := metamodelVersion(pkg.NsURI) if err != nil { return err } - features, err := parseEcore(filepath.Join(root, ecorePath)) + properties, classes, err := tables(pkg) if err != nil { - return err + return fmt.Errorf("%s: %w", ecorePath, err) } - properties, classes, err := tables(decls, features) + enums, err := enumerationTables(pkg) if err != nil { - return err + return fmt.Errorf("%s: %w", ecorePath, err) } - source := fmt.Sprintf(template, owlPath, ecorePath, version, commit, version, commit, - propertyLiterals(properties), classLiterals(classes)) + source := fmt.Sprintf(template, src.repo, src.tag, src.commit, pkg.NsURI, version, src.tag, src.commit, + propertyLiterals(properties), enumerationLiterals(enums), classLiterals(classes)) formatted, err := format.Source([]byte(source)) if err != nil { return fmt.Errorf("format generated source: %w", err) } + if check { + // #nosec G304 -- the table to compare is named on the command line. + have, err := os.ReadFile(out) + if err != nil || !bytes.Equal(have, formatted) { + return fmt.Errorf("%s is stale against %s at %s; regenerate with `%s`", out, ecorePath, src.tag, regen) + } + fmt.Printf("%s is current: %d properties, %d classes (metamodel %s, pilot %s)\n", + out, len(properties), len(classes), version, src.tag) + return nil + } if err := os.WriteFile(out, formatted, 0o600); err != nil { return err } - fmt.Printf("wrote %s: %d properties, %d classes (version %s, commit %s)\n", - out, len(properties), len(classes), version, commit[:12]) + fmt.Printf("wrote %s: %d properties, %d classes (metamodel %s, pilot %s, commit %s)\n", + out, len(properties), len(classes), version, src.tag, src.commit[:12]) return nil } -var ( - versionBadge = regexp.MustCompile(`Version-(\d+)-`) - commitSHAPattern = regexp.MustCompile(`^([0-9a-f]{40}|[0-9a-f]{64})$`) -) +// source is the provenance a fetched metamodel directory's stamp records. +type source struct{ tag, commit, repo string } -// ontologyVersion reads the metamodel version out of the checkout's own README -// badge, so the recorded version cannot drift from the file it describes. -func ontologyVersion(path string) (string, error) { - // #nosec G304 -- the checkout to read is named on the command line. +var commitSHAPattern = regexp.MustCompile(`^[0-9a-f]{40}$`) + +// readStamp reads the " " stamp pilot_fetch_subtrees writes. +func readStamp(path string) (source, error) { + // #nosec G304 -- the stamp sits in the metamodel directory named on the command line. data, err := os.ReadFile(path) if err != nil { - return "", fmt.Errorf("read ontology version: %w", err) + return source{}, fmt.Errorf("read the metamodel's pin stamp (fetch it with ./scripts/download-pilot-metamodel.sh): %w", err) } - match := versionBadge.FindSubmatch(data) - if match == nil { - return "", fmt.Errorf("no Version- badge in %s", path) + fields := strings.Fields(string(data)) + if len(fields) != 3 || !commitSHAPattern.MatchString(fields[1]) { + return source{}, fmt.Errorf("%s: want \" \", got %q", path, strings.TrimSpace(string(data))) } - return string(match[1]), nil + return source{tag: fields[0], commit: fields[1], repo: fields[2]}, nil } -func commitSHA(root string) (string, error) { - gitDir, refsDir, err := gitMetadataDirs(root) - if err != nil { - return "", err - } - headPath := filepath.Join(gitDir, "HEAD") - // #nosec G304 -- git metadata path derives from the requested checkout. - head, err := os.ReadFile(headPath) - if err != nil { - return "", gitMetadataErrorf(headPath, "read HEAD: %w", err) - } - headValue := strings.TrimSpace(string(head)) - if strings.HasPrefix(headValue, "ref:") { - ref := strings.TrimSpace(strings.TrimPrefix(headValue, "ref:")) - if !validGitRef(ref) { - return "", gitMetadataErrorf(headPath, "invalid symbolic ref %q", ref) - } - return commitSHAForRef(refsDir, ref) - } - return validateCommitSHA(headValue, headPath) -} +var nsURIVersion = regexp.MustCompile(`^https://www\.omg\.org/spec/SysML/(\d{8})$`) -type gitMetadataError struct { - path string - err error +// metamodelVersion is the date the ecore's nsURI ends in, the version OMG publishes the metamodel under. +func metamodelVersion(nsURI string) (string, error) { + match := nsURIVersion.FindStringSubmatch(nsURI) + if match == nil { + return "", fmt.Errorf("%s: nsURI %q is not https://www.omg.org/spec/SysML/", ecorePath, nsURI) + } + return match[1], nil } -func (e *gitMetadataError) Error() string { - return fmt.Sprintf("git metadata %s: %v", e.path, e.err) +// ePackage and the types below are the part of the ecore XMI the table reads. +type ePackage struct { + NsURI string `xml:"nsURI,attr"` + Classifiers []eClassifier `xml:"eClassifiers"` + Subpackages []struct{} `xml:"eSubpackages"` } -func (e *gitMetadataError) Unwrap() error { - return e.err +type eClassifier struct { + Type string `xml:"http://www.w3.org/2001/XMLSchema-instance type,attr"` + Name string `xml:"name,attr"` + Abstract bool `xml:"abstract,attr"` + SuperTypes string `xml:"eSuperTypes,attr"` + Features []eFeature `xml:"eStructuralFeatures"` + Literals []eLiteral `xml:"eLiterals"` } -func gitMetadataErrorf(path, format string, args ...any) error { - return &gitMetadataError{path: path, err: fmt.Errorf(format, args...)} +type eLiteral struct { + Name string `xml:"name,attr"` } -func gitMetadataDirs(root string) (string, string, error) { - dotGit := filepath.Join(root, ".git") - info, err := os.Stat(dotGit) - if err != nil { - return "", "", gitMetadataErrorf(dotGit, "read .git: %w", err) - } - gitDir := dotGit - if !info.IsDir() { - // #nosec G304 -- .git is derived from the requested checkout. - data, err := os.ReadFile(dotGit) - if err != nil { - return "", "", gitMetadataErrorf(dotGit, "read gitdir: %w", err) - } - line := strings.TrimSpace(string(data)) - const prefix = "gitdir:" - if !strings.HasPrefix(line, prefix) { - return "", "", gitMetadataErrorf(dotGit, "invalid gitdir file") - } - target := strings.TrimSpace(strings.TrimPrefix(line, prefix)) - if target == "" { - return "", "", gitMetadataErrorf(dotGit, "empty gitdir path") - } - if !filepath.IsAbs(target) { - target = filepath.Join(root, target) - } - gitDir = filepath.Clean(target) - info, err = os.Stat(gitDir) - if err != nil { - return "", "", gitMetadataErrorf(dotGit, "read gitdir %s: %w", gitDir, err) - } - if !info.IsDir() { - return "", "", gitMetadataErrorf(dotGit, "gitdir %s is not a directory", gitDir) - } - } - - refsDir := gitDir - commondirPath := filepath.Join(gitDir, "commondir") - // #nosec G304 -- commondir is inside the requested Git metadata directory. - data, err := os.ReadFile(commondirPath) - if err == nil { - commonDir := strings.TrimSpace(string(data)) - if commonDir == "" { - return "", "", gitMetadataErrorf(commondirPath, "empty common directory path") - } - if !filepath.IsAbs(commonDir) { - commonDir = filepath.Join(gitDir, commonDir) - } - refsDir = filepath.Clean(commonDir) - info, err := os.Stat(refsDir) - if err != nil { - return "", "", gitMetadataErrorf(commondirPath, "read common directory %s: %w", refsDir, err) - } - if !info.IsDir() { - return "", "", gitMetadataErrorf(commondirPath, "common directory %s is not a directory", refsDir) - } - } else if !errors.Is(err, os.ErrNotExist) { - return "", "", gitMetadataErrorf(commondirPath, "read common directory: %w", err) - } - return gitDir, refsDir, nil +type eFeature struct { + Type string `xml:"http://www.w3.org/2001/XMLSchema-instance type,attr"` + Name string `xml:"name,attr"` + EType string `xml:"eType,attr"` + UpperBound string `xml:"upperBound,attr"` + Ordered string `xml:"ordered,attr"` + Derived bool `xml:"derived,attr"` + Opposite string `xml:"eOpposite,attr"` + Annotations []eAnnotation `xml:"eAnnotations"` } -func validGitRef(ref string) bool { - if !strings.HasPrefix(ref, "refs/") || strings.ContainsAny(ref, " \t\r\n") { - return false - } - for _, part := range strings.Split(ref, "/") { - if part == "" || part == "." || part == ".." { - return false - } - } - return true +type eAnnotation struct { + Source string `xml:"source,attr"` + References string `xml:"references,attr"` } -func commitSHAForRef(refsDir, ref string) (string, error) { - loosePath := filepath.Join(refsDir, filepath.FromSlash(ref)) - // #nosec G304 -- ref is validated before it is joined to the Git directory. - data, err := os.ReadFile(loosePath) - if err == nil { - return validateCommitSHA(strings.TrimSpace(string(data)), loosePath) +func parseEcore(path string) (ePackage, error) { + // #nosec G304 -- the metamodel directory is named on the command line. + data, err := os.ReadFile(path) + if err != nil { + return ePackage{}, err } - if !errors.Is(err, os.ErrNotExist) { - return "", gitMetadataErrorf(loosePath, "read ref %s: %w", ref, err) + var pkg ePackage + if err := xml.Unmarshal(data, &pkg); err != nil { + return ePackage{}, fmt.Errorf("%s: %w", path, err) } - - packedPath := filepath.Join(refsDir, "packed-refs") - // #nosec G304 -- packed-refs is inside the requested Git metadata directory. - data, err = os.ReadFile(packedPath) - if err != nil { - return "", gitMetadataErrorf(packedPath, "read ref %s: %w", ref, err) + if len(pkg.Subpackages) > 0 { + return ePackage{}, fmt.Errorf("%s: eSubpackages are not supported; the metamodel is one flat package", path) } - for _, line := range strings.Split(string(data), "\n") { - line = strings.TrimSpace(line) - if line == "" || strings.HasPrefix(line, "#") || strings.HasPrefix(line, "^") { - continue - } - fields := strings.Fields(line) - if len(fields) < 2 || fields[1] != ref { - continue - } - return validateCommitSHA(fields[0], packedPath) + if len(pkg.Classifiers) == 0 { + return ePackage{}, fmt.Errorf("%s: no eClassifiers found", path) } - return "", gitMetadataErrorf(packedPath, "ref %s not found", ref) + return pkg, nil } -func validateCommitSHA(sha, path string) (string, error) { - if !commitSHAPattern.MatchString(sha) { - return "", gitMetadataErrorf(path, "invalid commit SHA %q", sha) - } - return sha, nil +// property and class mirror the generated table's types, which cannot be imported: +// the package they live in does not compile until this has run. +type property struct { + name, definingClass, iri, kind, rangeIRI, opposite string + many, ordered, derived bool + redefines, subsets []string } -// declaration is one top-level RDF/XML declaration in the ontology: an -// owl:Class, owl:ObjectProperty or owl:DatatypeProperty. -type declaration struct { - kind string - iri string - label string - domain string - rangeIRI string +type class struct { + name string + abstract bool parents []string } -// parseOntology reads the declarations out of the RDF/XML. Only top-level elements -// of rdf:RDF are read; the anonymous owl:Restriction axioms nested inside them -// state cardinality rather than hierarchy. -func parseOntology(path string) ([]declaration, error) { - // #nosec G304 -- the checkout to read is named on the command line. - file, err := os.Open(path) - if err != nil { - return nil, err - } - defer file.Close() +type enumeration struct { + name string + literals []string +} - decoder := xml.NewDecoder(file) - var ( - decls []declaration - depth int - ) - for { - token, err := decoder.Token() - if err != nil { - if errors.Is(err, io.EOF) { - break - } - return nil, fmt.Errorf("%s: %w", path, err) - } - start, ok := token.(xml.StartElement) - if !ok { - if _, isEnd := token.(xml.EndElement); isEnd { - depth-- - } +func enumerationTables(pkg ePackage) ([]enumeration, error) { + var enums []enumeration + for _, classifier := range pkg.Classifiers { + if classifier.Type != ecoreEnum { continue } - depth++ - if depth != 2 { - continue + if len(classifier.Literals) == 0 { + return nil, fmt.Errorf("EEnum %s has no literals", classifier.Name) } - kind := start.Name.Space + start.Name.Local - switch kind { - case owlNS + "Class", owlNS + "ObjectProperty", owlNS + "DatatypeProperty": - default: - continue - } - decl, err := readDeclaration(decoder, start) - if err != nil { - return nil, fmt.Errorf("%s: %w", path, err) + enum := enumeration{name: classifier.Name, literals: make([]string, 0, len(classifier.Literals))} + for _, literal := range classifier.Literals { + if literal.Name == "" { + return nil, fmt.Errorf("EEnum %s has a literal without a name", classifier.Name) + } + enum.literals = append(enum.literals, literal.Name) } - depth-- - decl.kind = start.Name.Local - decls = append(decls, decl) - } - if len(decls) == 0 { - return nil, fmt.Errorf("%s: no declarations found", path) + enums = append(enums, enum) } - return decls, nil + sort.Slice(enums, func(i, j int) bool { return enums[i].name < enums[j].name }) + return enums, nil } -// readDeclaration consumes one declaration element, reading the direct children -// that carry the table's data and skipping the rest. -func readDeclaration(decoder *xml.Decoder, start xml.StartElement) (declaration, error) { - decl := declaration{iri: attr(start, rdfNS, "about")} - if decl.iri == "" { - return decl, fmt.Errorf("%s declaration without rdf:about", start.Name.Local) - } - for { - token, err := decoder.Token() - if err != nil { - return decl, err +// tables reads the classes and properties out of the package, checking every +// cross-reference resolves inside it. +func tables(pkg ePackage) ([]property, []class, error) { + kinds := map[string]string{} + features := map[string]bool{} + for _, c := range pkg.Classifiers { + if c.Name == "" { + return nil, nil, errors.New("eClassifiers without a name") } - switch t := token.(type) { - case xml.EndElement: - if t.Name == start.Name { - return decl, nil - } - case xml.StartElement: - name := t.Name.Space + t.Name.Local - resource := attr(t, rdfNS, "resource") - switch { - case name == rdfsNS+"label": - text, err := decoder.Token() - if err != nil { - return decl, err - } - if chars, ok := text.(xml.CharData); ok { - decl.label = strings.TrimSpace(string(chars)) - } - case name == rdfsNS+"domain" && resource != "": - decl.domain = resource - case name == rdfsNS+"range" && resource != "": - decl.rangeIRI = resource - case name == rdfsNS+"subClassOf" && resource != "": - decl.parents = append(decl.parents, resource) - default: - if resource == "" { - if err := decoder.Skip(); err != nil { - return decl, err - } - } - } + if _, dup := kinds[c.Name]; dup { + return nil, nil, fmt.Errorf("eClassifiers %s declared twice", c.Name) + } + kinds[c.Name] = c.Type + for _, f := range c.Features { + features[c.Name+"::"+f.Name] = true } } -} - -// parseEcore reads the metamodel's own ecore into a feature table: -// ecoreFeatures[class][feature] is the feature's upperBound attribute, "-1" -// for an unbounded multiplicity. eStructuralFeatures are read under their -// owning eClassifiers element wherever it sits in the package tree. -type ecoreFeatures map[string]map[string]string - -func parseEcore(path string) (ecoreFeatures, error) { - // #nosec G304 -- the checkout to read is named on the command line. - file, err := os.Open(path) - if err != nil { - return nil, err - } - defer file.Close() - - features := ecoreFeatures{} - var classes []string - decoder := xml.NewDecoder(file) - for { - token, err := decoder.Token() - if err != nil { - if errors.Is(err, io.EOF) { - break + var ( + properties []property + classes []class + ) + for _, c := range pkg.Classifiers { + if c.Type != ecoreClass { + if len(c.Features) > 0 { + return nil, nil, fmt.Errorf("%s: a %s with eStructuralFeatures", c.Name, c.Type) } - return nil, fmt.Errorf("%s: %w", path, err) + continue } - switch t := token.(type) { - case xml.StartElement: - switch t.Name.Local { - case "eClassifiers": - classes = append(classes, attr(t, "", "name")) - case "eStructuralFeatures": - if len(classes) == 0 { - return nil, fmt.Errorf("%s: eStructuralFeatures outside any eClassifiers", path) - } - name := attr(t, "", "name") - class := classes[len(classes)-1] - if features[class] == nil { - features[class] = map[string]string{} - } - features[class][name] = attr(t, "", "upperBound") + var parents []string + for _, ref := range strings.Fields(c.SuperTypes) { + parent, ok := strings.CutPrefix(ref, "#//") + if !ok || kinds[parent] != ecoreClass { + return nil, nil, fmt.Errorf("%s: eSuperTypes %s is no EClass of the package", c.Name, ref) } - case xml.EndElement: - if t.Name.Local == "eClassifiers" && len(classes) > 0 { - classes = classes[:len(classes)-1] + parents = append(parents, parent) + } + sort.Strings(parents) + classes = append(classes, class{name: c.Name, abstract: c.Abstract, parents: parents}) + for _, f := range c.Features { + p, err := newProperty(c.Name, f, kinds, features) + if err != nil { + return nil, nil, fmt.Errorf("%s::%s: %w", c.Name, f.Name, err) } + properties = append(properties, p) } } - if len(features) == 0 { - return nil, fmt.Errorf("%s: no eStructuralFeatures found", path) - } - return features, nil + sort.Slice(properties, func(i, j int) bool { return properties[i].iri < properties[j].iri }) + sort.Slice(classes, func(i, j int) bool { return classes[i].name < classes[j].name }) + return properties, classes, nil } -func attr(element xml.StartElement, space, local string) string { - for _, a := range element.Attr { - if a.Name.Local == local && (a.Name.Space == space || a.Name.Space == "") { - return a.Value +func newProperty(defining string, f eFeature, kinds map[string]string, features map[string]bool) (property, error) { + if f.Name == "" || strings.Contains(f.Name, "_") { + return property{}, fmt.Errorf("feature name %q cannot form a _ IRI", f.Name) + } + many, err := isMany(f.UpperBound) + if err != nil { + return property{}, err + } + p := property{ + name: f.Name, + definingClass: defining, + iri: sysmlNS + defining + "_" + f.Name, + many: many, + derived: f.Derived, + } + p.ordered = p.many && f.Ordered != "false" + local, isLocal := strings.CutPrefix(f.EType, "#//") + switch { + case f.Type == ecoreReference && isLocal && kinds[local] == ecoreClass: + p.kind, p.rangeIRI = "ObjectProperty", sysmlNS+local + case f.Type == ecoreAttribute && isLocal && kinds[local] == ecoreEnum: + p.kind, p.rangeIRI = "DatatypeProperty", sysmlNS+local + case f.Type == ecoreAttribute && !isLocal: + _, primitive, _ := strings.Cut(f.EType, "#//") + if p.rangeIRI = datatypeRanges[primitive]; p.rangeIRI == "" { + return property{}, fmt.Errorf("eType %q is no primitive the table maps", f.EType) + } + p.kind = "DatatypeProperty" + default: + return property{}, fmt.Errorf("a %s typed %q, which the table cannot range over", f.Type, f.EType) + } + if f.Opposite != "" { + var opposite []string + if opposite, err = featureRefs(f.Opposite, features); err != nil { + return property{}, fmt.Errorf("eOpposite: %w", err) + } + if len(opposite) != 1 { + return property{}, fmt.Errorf("eOpposite %q names %d features", f.Opposite, len(opposite)) + } + p.opposite = opposite[0] + } + for _, a := range f.Annotations { + switch a.Source { + case "redefines": + p.redefines, err = featureRefs(a.References, features) + case "subsets": + p.subsets, err = featureRefs(a.References, features) + } + if err != nil { + return property{}, fmt.Errorf("%s: %w", a.Source, err) } } - return "" -} - -// property and class mirror the generated table's types, which cannot be imported: -// the package they live in does not compile until this has run. -type property struct { - name, definingClass, iri, kind, rangeIRI string - many bool + return p, nil } -type class struct { - name string - parents []string +// isMany is EMF's ETypedElement.isMany: a bound above 1, or -1 (unbounded). An absent +// bound is ecore's default 1; -2 (unspecified) is single-valued, and EcoreValidator rejects the rest. +func isMany(upperBound string) (bool, error) { + if upperBound == "" { + return false, nil + } + n, err := strconv.Atoi(upperBound) + if err != nil || n == 0 || n < -2 { + return false, fmt.Errorf("upperBound %q is not -2, -1 or a positive integer, as ecore requires", upperBound) + } + return n > 1 || n == -1, nil } -func tables(decls []declaration, features ecoreFeatures) ([]property, []class, error) { - var ( - properties []property - classes []class - ) - for _, decl := range decls { - if !strings.HasPrefix(decl.iri, sysmlNS) { - return nil, nil, fmt.Errorf("declaration outside the SysML namespace: %s", decl.iri) - } - local := strings.TrimPrefix(decl.iri, sysmlNS) - if decl.kind == "Class" { - var parents []string - for _, parent := range decl.parents { - if strings.HasPrefix(parent, sysmlNS) { - parents = append(parents, strings.TrimPrefix(parent, sysmlNS)) - } - } - sort.Strings(parents) - classes = append(classes, class{name: local, parents: parents}) - continue - } - defining, name, ok := strings.Cut(local, "_") - if !ok { - return nil, nil, fmt.Errorf("property IRI is not _: %s", decl.iri) - } - // The label is the unqualified name; disagreement with the IRI would - // mean the two conventions cannot be mapped onto each other by name. - if decl.label != "" && decl.label != name { - return nil, nil, fmt.Errorf("%s: rdfs:label %q does not match the IRI's property name %q", - decl.iri, decl.label, name) - } - if decl.domain == "" { - return nil, nil, fmt.Errorf("%s: no rdfs:domain", decl.iri) - } - if domain := strings.TrimPrefix(decl.domain, sysmlNS); domain != defining { - return nil, nil, fmt.Errorf("%s: rdfs:domain %s is not the qualifying metaclass %s", - decl.iri, domain, defining) - } - kind := "ObjectProperty" - if decl.kind == "DatatypeProperty" { - kind = "DatatypeProperty" +// featureRefs turns "#//Class/feature ..." references into "Class::feature" names, each a declared feature. +func featureRefs(refs string, features map[string]bool) ([]string, error) { + var out []string + for _, ref := range strings.Fields(refs) { + path, ok := strings.CutPrefix(ref, "#//") + owner, name, qualified := strings.Cut(path, "/") + if !ok || !qualified || !features[owner+"::"+name] { + return nil, fmt.Errorf("%s is no eStructuralFeature of the package", ref) } - upper, ok := features[defining][name] - if !ok { - return nil, nil, fmt.Errorf("%s: no eStructuralFeatures %s.%s in %s", - decl.iri, defining, name, ecorePath) - } - properties = append(properties, property{ - name: name, - definingClass: defining, - iri: decl.iri, - kind: kind, - rangeIRI: decl.rangeIRI, - many: upper == "-1", - }) + out = append(out, owner+"::"+name) } - sort.Slice(properties, func(i, j int) bool { return properties[i].iri < properties[j].iri }) - sort.Slice(classes, func(i, j int) bool { return classes[i].name < classes[j].name }) - return properties, classes, nil + return out, nil } func propertyLiterals(properties []property) string { @@ -549,8 +435,22 @@ func propertyLiterals(properties []property) string { for _, p := range properties { fmt.Fprintf(&b, "\t{Name: %q, DefiningClass: %q, IRI: %q, Kind: %s, Range: %q", p.name, p.definingClass, p.iri, p.kind, p.rangeIRI) - if p.many { - b.WriteString(", Many: true") + for _, flag := range []struct { + name string + set bool + }{{"Many", p.many}, {"Ordered", p.ordered}, {"Derived", p.derived}} { + if flag.set { + fmt.Fprintf(&b, ", %s: true", flag.name) + } + } + if len(p.redefines) > 0 { + fmt.Fprintf(&b, ", Redefines: %s", stringSlice(p.redefines)) + } + if len(p.subsets) > 0 { + fmt.Fprintf(&b, ", Subsets: %s", stringSlice(p.subsets)) + } + if p.opposite != "" { + fmt.Fprintf(&b, ", Opposite: %q", p.opposite) } b.WriteString("},\n") } @@ -560,15 +460,30 @@ func propertyLiterals(properties []property) string { func classLiterals(classes []class) string { var b strings.Builder for _, c := range classes { - if len(c.parents) == 0 { - fmt.Fprintf(&b, "\t{Name: %q},\n", c.name) - continue + fmt.Fprintf(&b, "\t{Name: %q", c.name) + if c.abstract { + b.WriteString(", Abstract: true") } - quoted := make([]string, len(c.parents)) - for i, parent := range c.parents { - quoted[i] = fmt.Sprintf("%q", parent) + if len(c.parents) > 0 { + fmt.Fprintf(&b, ", Parents: %s", stringSlice(c.parents)) } - fmt.Fprintf(&b, "\t{Name: %q, Parents: []string{%s}},\n", c.name, strings.Join(quoted, ", ")) + b.WriteString("},\n") } return b.String() } + +func enumerationLiterals(enums []enumeration) string { + var b strings.Builder + for _, enum := range enums { + fmt.Fprintf(&b, "\t{Name: %q, Literals: %s},\n", enum.name, stringSlice(enum.literals)) + } + return b.String() +} + +func stringSlice(values []string) string { + quoted := make([]string, len(values)) + for i, v := range values { + quoted[i] = fmt.Sprintf("%q", v) + } + return "[]string{" + strings.Join(quoted, ", ") + "}" +} diff --git a/tools/gen/ontology/main_test.go b/tools/gen/ontology/main_test.go deleted file mode 100644 index f64d55b3f1..0000000000 --- a/tools/gen/ontology/main_test.go +++ /dev/null @@ -1,117 +0,0 @@ -package main - -import ( - "errors" - "os" - "path/filepath" - "strings" - "testing" -) - -const testCommitSHA = "0123456789abcdef0123456789abcdef01234567" - -func TestCommitSHASymrefLooseRef(t *testing.T) { - root := newGitTestRoot(t) - writeGitTestFile(t, filepath.Join(root, ".git", "HEAD"), "ref: refs/heads/main\n") - writeGitTestFile(t, filepath.Join(root, ".git", "refs", "heads", "main"), testCommitSHA+"\n") - - assertCommitSHA(t, root, testCommitSHA) -} - -func TestCommitSHASymrefPackedRefs(t *testing.T) { - root := newGitTestRoot(t) - writeGitTestFile(t, filepath.Join(root, ".git", "HEAD"), "ref: refs/heads/main\n") - writeGitTestFile(t, filepath.Join(root, ".git", "packed-refs"), - "# pack-refs with: peeled fully-peeled\n"+testCommitSHA+" refs/heads/main\n") - - assertCommitSHA(t, root, testCommitSHA) -} - -func TestCommitSHADetachedHead(t *testing.T) { - root := newGitTestRoot(t) - writeGitTestFile(t, filepath.Join(root, ".git", "HEAD"), testCommitSHA+"\n") - - assertCommitSHA(t, root, testCommitSHA) -} - -func TestCommitSHA256DetachedHead(t *testing.T) { - root := newGitTestRoot(t) - sha := strings.Repeat("a", 64) - writeGitTestFile(t, filepath.Join(root, ".git", "HEAD"), sha+"\n") - - assertCommitSHA(t, root, sha) -} - -func TestCommitSHAGitdirFile(t *testing.T) { - root := t.TempDir() - gitDir := filepath.Join(root, "gitdir") - if err := os.MkdirAll(gitDir, 0o700); err != nil { - t.Fatal(err) - } - writeGitTestFile(t, filepath.Join(root, ".git"), "gitdir: gitdir\n") - writeGitTestFile(t, filepath.Join(gitDir, "HEAD"), testCommitSHA+"\n") - - assertCommitSHA(t, root, testCommitSHA) -} - -func TestCommitSHAMissingHead(t *testing.T) { - root := newGitTestRoot(t) - - _, err := commitSHA(root) - assertGitMetadataError(t, err) - if !strings.Contains(err.Error(), filepath.Join(".git", "HEAD")) { - t.Fatalf("error %q does not name HEAD", err) - } -} - -func TestCommitSHAMalformedHead(t *testing.T) { - root := newGitTestRoot(t) - writeGitTestFile(t, filepath.Join(root, ".git", "HEAD"), "deadbeef\n") - - _, err := commitSHA(root) - assertGitMetadataError(t, err) - if !strings.Contains(err.Error(), "invalid commit SHA") { - t.Fatalf("error %q does not identify the invalid SHA", err) - } -} - -func newGitTestRoot(t *testing.T) string { - t.Helper() - root := t.TempDir() - if err := os.Mkdir(filepath.Join(root, ".git"), 0o700); err != nil { - t.Fatal(err) - } - return root -} - -func writeGitTestFile(t *testing.T, path, contents string) { - t.Helper() - if err := os.MkdirAll(filepath.Dir(path), 0o700); err != nil { - t.Fatal(err) - } - if err := os.WriteFile(path, []byte(contents), 0o600); err != nil { - t.Fatal(err) - } -} - -func assertCommitSHA(t *testing.T, root, want string) { - t.Helper() - got, err := commitSHA(root) - if err != nil { - t.Fatalf("commitSHA: %v", err) - } - if got != want { - t.Fatalf("commitSHA = %q, want %q", got, want) - } -} - -func assertGitMetadataError(t *testing.T, err error) { - t.Helper() - if err == nil { - t.Fatal("commitSHA returned nil error") - } - var metadataErr *gitMetadataError - if !errors.As(err, &metadataErr) { - t.Fatalf("error %T is not a gitMetadataError: %v", err, err) - } -} diff --git a/tools/gen/ontology/run_test.go b/tools/gen/ontology/run_test.go index c01c05abe0..547debbf79 100644 --- a/tools/gen/ontology/run_test.go +++ b/tools/gen/ontology/run_test.go @@ -5,102 +5,127 @@ import ( "path/filepath" "strings" "testing" + + "github.com/Open-MBEE/OpenSysML/tools/oracle/baseline" ) -// sampleOntology is a checkout-shaped excerpt: two classes, an object property, a -// datatype property, a nested restriction (skipped) and a foreign parent (dropped). -const sampleOntology = ` - - - - PartUsage - - - - - - - 0 - - - - - - partDefinition - - - - - - - - -` +const ( + testTag = "2026-08" + testCommitSHA = "0123456789abcdef0123456789abcdef01234567" + testRepo = "https://github.com/Systems-Modeling/SysML-v2-Pilot-Implementation.git" +) + +var testPin = baseline.Pin{Tag: testTag, Commit: testCommitSHA} -// sampleEcore carries the features the sample ontology's properties name. +// sampleEcore is a SysML.ecore excerpt: an abstract root, a class with two +// supertypes, an enumeration, every primitive spelling, and every flag the table records. const sampleEcore = ` - - - + + + + + + + + + + + + + + + + + + - - + + + + + + + ` const wantTable = `// Code generated by tools/gen/ontology. DO NOT EDIT. // -// Source: Open-MBEE/sysmlv2-rdf-ontology, sysml2/owl/www.omg.org/spec/SysML.owl -// Ecore: sysml2/ecore/SysML.ecore (property multiplicities) -// Ontology: SysML v2 metamodel version 202407 (generated from SysML.ecore) -// Commit: 0123456789abcdef0123456789abcdef01234567 +// Source: https://github.com/Systems-Modeling/SysML-v2-Pilot-Implementation.git 2026-08, org.omg.sysml/model/SysML.ecore +// Commit: 0123456789abcdef0123456789abcdef01234567 +// Metamodel: https://www.omg.org/spec/SysML/20250201 // // Regenerate with (see README.md): // -// go run -C tools ./gen/ontology -ontology +// ./scripts/download-pilot-metamodel.sh +// go run -C tools ./gen/ontology package ontology -// Version is the OMG SysML v2 metamodel version the table was generated from. -const Version = "202407" +// Version is the OMG SysML v2 metamodel version the table was generated from, +// the date in the ecore's namespace URI. +const Version = "20250201" + +// SourceTag is the pilot implementation release the table was generated from. +const SourceTag = "2026-08" -// SourceCommit is the sysmlv2-rdf-ontology commit the table was generated from. +// SourceCommit is the pilot implementation commit the table was generated from. const SourceCommit = "0123456789abcdef0123456789abcdef01234567" -// properties holds every owl:ObjectProperty and owl:DatatypeProperty the -// ontology declares, ordered by IRI. +// properties holds every eStructuralFeature the metamodel declares, ordered by IRI. var properties = []Property{ + {Name: "isLibraryElement", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_isLibraryElement", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#boolean"}, {Name: "name", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_name", Kind: DatatypeProperty, Range: "http://www.w3.org/2001/XMLSchema#string"}, - {Name: "partDefinition", DefiningClass: "PartUsage", IRI: "https://www.omg.org/spec/SysML#PartUsage_partDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartDefinition", Many: true}, + {Name: "ownedRelationship", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_ownedRelationship", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Many: true, Ordered: true, Opposite: "Element::owningRelatedElement"}, + {Name: "owningRelatedElement", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_owningRelatedElement", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#Element", Opposite: "Element::ownedRelationship"}, + {Name: "visibility", DefiningClass: "Element", IRI: "https://www.omg.org/spec/SysML#Element_visibility", Kind: DatatypeProperty, Range: "https://www.omg.org/spec/SysML#VisibilityKind"}, + {Name: "itemDefinition", DefiningClass: "ItemUsage", IRI: "https://www.omg.org/spec/SysML#ItemUsage_itemDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartDefinition", Many: true, Derived: true}, + {Name: "ownedPart", DefiningClass: "PartDefinition", IRI: "https://www.omg.org/spec/SysML#PartDefinition_ownedPart", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartUsage", Many: true, Ordered: true, Derived: true, Redefines: []string{"Element::ownedRelationship", "ItemUsage::itemDefinition"}}, + {Name: "partDefinition", DefiningClass: "PartUsage", IRI: "https://www.omg.org/spec/SysML#PartUsage_partDefinition", Kind: ObjectProperty, Range: "https://www.omg.org/spec/SysML#PartDefinition", Many: true, Derived: true, Subsets: []string{"ItemUsage::itemDefinition"}}, + {Name: "weight", DefiningClass: "Usage", IRI: "https://www.omg.org/spec/SysML#Usage_weight", Kind: DatatypeProperty, Range: "http://www.w3.org/2002/07/owl#real"}, +} + +// enumerations holds every EEnum and its literals in declaration order, ordered by name. +var enumerations = []Enumeration{ + {Name: "VisibilityKind", Literals: []string{"public"}}, } -// classes holds every owl:Class the ontology declares with its named -// rdfs:subClassOf parents, ordered by name. +// classes holds every EClass the metamodel declares with its eSuperTypes, ordered by name. var classes = []Class{ - {Name: "Element"}, + {Name: "Element", Abstract: true}, + {Name: "ItemUsage", Parents: []string{"Usage"}}, + {Name: "PartDefinition", Parents: []string{"Element"}}, {Name: "PartUsage", Parents: []string{"ItemUsage", "Usage"}}, + {Name: "Usage", Parents: []string{"Element"}}, } ` -// newCheckout lays out the files run reads from a sysmlv2-rdf-ontology checkout. -func newCheckout(t *testing.T, owl string) string { +// newMetamodel lays out the directory scripts/download-pilot-metamodel.sh fetches. +func newMetamodel(t *testing.T, ecore string) string { + t.Helper() + dir := t.TempDir() + writeFile(t, filepath.Join(dir, stampPath), testTag+" "+testCommitSHA+" "+testRepo+"\n") + writeFile(t, filepath.Join(dir, ecorePath), ecore) + return dir +} + +func writeFile(t *testing.T, path, contents string) { t.Helper() - root := newGitTestRoot(t) - writeGitTestFile(t, filepath.Join(root, ".git", "HEAD"), testCommitSHA+"\n") - writeGitTestFile(t, filepath.Join(root, readme), - "# SysML v2 ontology\n\n![version](https://img.shields.io/badge/Version-202407-blue)\n") - writeGitTestFile(t, filepath.Join(root, owlPath), owl) - writeGitTestFile(t, filepath.Join(root, ecorePath), sampleEcore) - return root + if err := os.WriteFile(path, []byte(contents), 0o600); err != nil { + t.Fatal(err) + } } func TestRunWritesTheTable(t *testing.T) { - root := newCheckout(t, sampleOntology) + dir := newMetamodel(t, sampleEcore) out := filepath.Join(t.TempDir(), "table.go") - if err := run(root, out); err != nil { + if err := run(dir, out, false, testPin); err != nil { t.Fatalf("run: %v", err) } got, err := os.ReadFile(out) @@ -112,65 +137,122 @@ func TestRunWritesTheTable(t *testing.T) { } } -func TestRunRejectsAnOntologyTheTableCannotHold(t *testing.T) { - property := func(iri, label, domain string) string { - var b strings.Builder - b.WriteString(``) - if label != "" { - b.WriteString(`` + label + ``) +// TestUpperBoundMultiplicity pins EMF's rule: upper bound 1 (the default) or -2 (unspecified) +// is single-valued; any bound above 1, or -1 (unbounded), is multi-valued. +func TestUpperBoundMultiplicity(t *testing.T) { + for upper, want := range map[string]bool{"": false, "1": false, "-2": false, "2": true, "5": true, "-1": true} { + got, err := isMany(upper) + if err != nil || got != want { + t.Errorf("isMany(%q) = %v, %v; want %v", upper, got, err, want) } - if domain != "" { - b.WriteString(``) + } + for _, upper := range []string{"0", "-3", "many"} { + if _, err := isMany(upper); err == nil { + t.Errorf("isMany(%q) accepted an upper bound ecore cannot mean", upper) } - b.WriteString(``) - return b.String() } +} + +func TestRunWritesABoundedManyProperty(t *testing.T) { + ecore := strings.Replace(sampleEcore, `name="weight" eType=`, `name="weight" upperBound="2" eType=`, 1) + out := filepath.Join(t.TempDir(), "table.go") + if err := run(newMetamodel(t, ecore), out, false, testPin); err != nil { + t.Fatalf("run: %v", err) + } + generated, err := os.ReadFile(out) + if err != nil { + t.Fatal(err) + } + want := `IRI: "https://www.omg.org/spec/SysML#Usage_weight", Kind: DatatypeProperty, Range: "http://www.w3.org/2002/07/owl#real", Many: true, Ordered: true}` + if !strings.Contains(string(generated), want) { + t.Fatalf("upperBound 2 was not generated as Many:\n%s", generated) + } +} + +func TestCheckFailsOnlyOnDrift(t *testing.T) { + dir := newMetamodel(t, sampleEcore) + out := filepath.Join(t.TempDir(), "table.go") + if err := run(dir, out, true, testPin); err == nil || !strings.Contains(err.Error(), "is stale") { + t.Fatalf("check without a table: error %v, want it stale", err) + } + writeFile(t, out, wantTable) + if err := run(dir, out, true, testPin); err != nil { + t.Fatalf("check of the current table: %v", err) + } + writeFile(t, out, strings.Replace(wantTable, `, Derived: true, Subsets`, `, Subsets`, 1)) + if err := run(dir, out, true, testPin); err == nil || !strings.Contains(err.Error(), "is stale") { + t.Fatalf("check of a drifted table: error %v, want it stale", err) + } + if got, _ := os.ReadFile(out); strings.Contains(string(got), `Derived: true, Subsets`) { + t.Fatal("check rewrote the table") + } +} + +func TestRunRefusesAMetamodelOfAnotherPin(t *testing.T) { + dir := newMetamodel(t, sampleEcore) + out := filepath.Join(t.TempDir(), "table.go") + moved := baseline.Pin{Tag: "2026-09", Commit: strings.Repeat("f", 40)} + if err := run(dir, out, false, moved); err == nil || !strings.Contains(err.Error(), "rerun ./scripts/download-pilot-metamodel.sh") { + t.Fatalf("run: error %v, want the stale download named", err) + } + if err := os.Remove(filepath.Join(dir, stampPath)); err != nil { + t.Fatal(err) + } + if err := run(dir, out, false, testPin); err == nil || !strings.Contains(err.Error(), "pin stamp") { + t.Fatalf("run: error %v, want the missing stamp", err) + } + writeFile(t, filepath.Join(dir, stampPath), "2026-08 deadbeef\n") + if err := run(dir, out, false, testPin); err == nil || !strings.Contains(err.Error(), " ") { + t.Fatalf("run: error %v, want the malformed stamp", err) + } +} + +func TestRunRejectsAMetamodelTheTableCannotHold(t *testing.T) { wrap := func(body string) string { - return `` + - body + `` + return `` + body + `` + } + class := func(name, attrs, body string) string { + return `` + body + `` + } + feature := func(kind, name, attrs, body string) string { + return `` + body + `` } + element := func(body string) string { return class("Element", "", body) } cases := []struct { - name, owl, want string + name, ecore, want string }{ - {"no declarations", wrap(``), "no declarations found"}, - {"missing rdf:about", wrap(``), "Class declaration without rdf:about"}, - {"foreign namespace", wrap(``), - "declaration outside the SysML namespace"}, - {"unqualified property", wrap(property(sysmlNS+"name", "", sysmlNS+"Element")), - "property IRI is not _"}, - {"label disagrees", wrap(property(sysmlNS+"Element_name", "title", sysmlNS+"Element")), - `rdfs:label "title" does not match the IRI's property name "name"`}, - {"no domain", wrap(property(sysmlNS+"Element_name", "", "")), "no rdfs:domain"}, - {"domain disagrees", wrap(property(sysmlNS+"Element_name", "", sysmlNS+"Usage")), - "rdfs:domain Usage is not the qualifying metaclass Element"}, - {"truncated file", ``, - "unexpected EOF"}, - {"no ecore feature", wrap(property(sysmlNS+"Element_title", "title", sysmlNS+"Element")), - "no eStructuralFeatures Element.title"}, + {"no classifiers", wrap(``), "no eClassifiers found"}, + {"bad nsURI", strings.Replace(wrap(element("")), "SysML/20250201", "SysML", 1), "is not https://www.omg.org/spec/SysML/"}, + {"subpackage", wrap(element("") + ``), "eSubpackages are not supported"}, + {"duplicate class", wrap(element("") + element("")), "eClassifiers Element declared twice"}, + {"foreign supertype", wrap(class("Usage", `eSuperTypes="#//Thing"`, "")), "eSuperTypes #//Thing is no EClass"}, + {"underscore name", wrap(element(feature("EAttribute", "a_b", `eType="types.ecore#//String"`, ""))), + "cannot form a _ IRI"}, + {"unknown primitive", wrap(element(feature("EAttribute", "n", `eType="types.ecore#//Char"`, ""))), + "no primitive the table maps"}, + {"zero upper bound", wrap(element(feature("EAttribute", "n", `upperBound="0" eType="types.ecore#//String"`, ""))), + `upperBound "0" is not -2, -1 or a positive integer`}, + {"unknown enum range", wrap(element(feature("EAttribute", "n", `eType="#//Missing"`, ""))), + "which the table cannot range over"}, + {"empty enumeration", wrap(``), + "EEnum VisibilityKind has no literals"}, + {"reference to a primitive", wrap(element(feature("EReference", "n", `eType="types.ecore#//String"`, ""))), + "which the table cannot range over"}, + {"dangling opposite", wrap(element(feature("EReference", "n", `eType="#//Element" eOpposite="#//Element/m"`, ""))), + "eOpposite: #//Element/m is no eStructuralFeature"}, + {"dangling subsets", wrap(element(feature("EReference", "n", `eType="#//Element"`, + ``))), "subsets: #//Element/m is no eStructuralFeature"}, + {"unqualified redefines", wrap(element(feature("EReference", "n", `eType="#//Element"`, + ``))), "redefines: #//Element is no eStructuralFeature"}, + {"truncated file", ``, "unexpected EOF"}, } for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { - root := newCheckout(t, tc.owl) - err := run(root, filepath.Join(t.TempDir(), "table.go")) + err := run(newMetamodel(t, tc.ecore), filepath.Join(t.TempDir(), "table.go"), false, testPin) if err == nil || !strings.Contains(err.Error(), tc.want) { t.Fatalf("run: error %v, want one containing %q", err, tc.want) } }) } } - -func TestRunNeedsTheCheckoutsVersionBadge(t *testing.T) { - root := newCheckout(t, sampleOntology) - writeGitTestFile(t, filepath.Join(root, readme), "# no badge here\n") - err := run(root, filepath.Join(t.TempDir(), "table.go")) - if err == nil || !strings.Contains(err.Error(), "no Version- badge") { - t.Fatalf("run: error %v, want the missing badge", err) - } - if err := os.Remove(filepath.Join(root, readme)); err != nil { - t.Fatal(err) - } - err = run(root, filepath.Join(t.TempDir(), "table.go")) - if err == nil || !strings.Contains(err.Error(), "read ontology version") { - t.Fatalf("run: error %v, want the unreadable README", err) - } -} diff --git a/tools/gen/pymetamodel/main.go b/tools/gen/pymetamodel/main.go new file mode 100644 index 0000000000..e085eb4ccd --- /dev/null +++ b/tools/gen/pymetamodel/main.go @@ -0,0 +1,620 @@ +// Command pymetamodel writes the generated Python view of the SysML metamodel. +// +// go run -C tools ./gen/pymetamodel [-check] +package main + +import ( + "bytes" + "flag" + "fmt" + "os" + "path/filepath" + "sort" + "strings" + "unicode" + + "github.com/Open-MBEE/OpenSysML/internal/translate/rdf/ontology" + "github.com/Open-MBEE/OpenSysML/tools/oracle/repo" +) + +const ( + outputPath = "client/python/opensysml/metamodel/_generated.py" + regenerate = "make python-metamodel" + sysmlNS = "https://www.omg.org/spec/SysML#" + xsdNS = "http://www.w3.org/2001/XMLSchema#" + owlNS = "http://www.w3.org/2002/07/owl#" +) + +var runtimeMembers = []string{ + "METACLASS", "JSON_KEYS", "from_json_key", "json_key", "json_id", + "json_type", "json_value", "graph", "metaclass_name", +} + +var pythonKeywords = keywordSet( + "False None True and as assert async await break class continue def del elif else except finally for from global if import in is lambda nonlocal not or pass raise return try while with yield", +) + +func main() { + out := flag.String("out", outputPath, "generated Python module (default "+outputPath+")") + check := flag.Bool("check", false, "fail if the generated module differs from the output") + flag.Parse() + root, err := repo.Root() + if err != nil { + fail(err) + } + *out = repo.Resolve(root, *out) + if *out == "" { + *out = filepath.Join(root, filepath.FromSlash(outputPath)) + } + data, err := generate(ontology.Classes(), ontology.Properties(), ontology.Enumerations(), + ontology.Version, ontology.SourceTag, ontology.SourceCommit) + if err != nil { + fail(err) + } + if *check { + have, err := os.ReadFile(*out) + if err != nil || !bytes.Equal(have, data) { + fail(fmt.Errorf("%s is stale; regenerate with `%s`", *out, regenerate)) + } + fmt.Printf("%s is current: %d classes, %d properties, %d enumerations (metamodel %s, pilot %s)\n", + *out, len(ontology.Classes()), len(ontology.Properties()), len(ontology.Enumerations()), + ontology.Version, ontology.SourceTag) + return + } + if err := os.WriteFile(*out, data, 0o600); err != nil { + fail(err) + } + fmt.Printf("wrote %s: %d classes, %d properties, %d enumerations (metamodel %s, pilot %s)\n", + *out, len(ontology.Classes()), len(ontology.Properties()), len(ontology.Enumerations()), + ontology.Version, ontology.SourceTag) +} + +func fail(err error) { + fmt.Fprintln(os.Stderr, "pymetamodel:", err) + os.Exit(1) +} + +type model struct { + classes []ontology.Class + properties []ontology.Property + enums []ontology.Enumeration + classBy map[string]ontology.Class + enumBy map[string]ontology.Enumeration + mros map[string][]string + effective map[string]map[string]ontology.Property +} + +func generate(classes []ontology.Class, properties []ontology.Property, enums []ontology.Enumeration, + version, tag, commit string) ([]byte, error) { + m, err := newModel(classes, properties, enums) + if err != nil { + return nil, err + } + var b strings.Builder + fmt.Fprintf(&b, `# Code generated by tools/gen/pymetamodel. DO NOT EDIT. +# Metamodel: %s +# Pilot tag: %s +# Pilot commit: %s +# Regenerate with: %s + +from __future__ import annotations + +import builtins +from enum import Enum +from types import MappingProxyType +from typing import ClassVar, Mapping + +from ._runtime import Many, Opt, _ElementBase # pyright: ignore[reportPrivateUsage] + +METAMODEL_VERSION = %q +SOURCE_TAG = %q +SOURCE_COMMIT = %q + +`, version, tag, commit, regenerate, version, tag, commit) + + writeEnums(&b, m) + for _, class := range m.classes { + if err := writeClass(&b, class, m); err != nil { + return nil, err + } + } + writeModuleMembers(&b, m) + return []byte(b.String()), nil +} + +func writeEnums(b *strings.Builder, m *model) { + for _, enum := range m.enums { + fmt.Fprintf(b, "class %s(str, Enum):\n", enum.Name) + for _, literal := range enum.Literals { + fmt.Fprintf(b, " %s = %q\n", strings.ToUpper(literal), literal) + } + b.WriteString("\n\n") + } +} + +func writeClass(b *strings.Builder, class ontology.Class, m *model) error { + switch { + case class.Name == "Element": + fmt.Fprintf(b, "class Element(_ElementBase):\n") + case len(class.Parents) == 0: + fmt.Fprintf(b, "class %s:\n", class.Name) + default: + fmt.Fprintf(b, "class %s(%s):\n", class.Name, strings.Join(class.Parents, ", ")) + } + doc := "Metaclass ``" + class.Name + "``." + if class.Abstract { + doc = "Abstract metaclass ``" + class.Name + "``." + } + fmt.Fprintf(b, " %q\n __slots__ = ()\n", doc) + fmt.Fprintf(b, " METACLASS: ClassVar[str] = %q\n", class.Name) + writeJSONKeys(b, class, m) + for _, property := range m.declaredProperties(class.Name) { + if err := writeProperty(b, class, property, m); err != nil { + return err + } + } + b.WriteString("\n\n") + return nil +} + +func writeProperty(b *strings.Builder, class ontology.Class, property ontology.Property, m *model) error { + snake := toSnake(property.Name) + rangeAnnotation, rangeName, err := m.pythonRange(property) + if err != nil { + return err + } + descriptor := "Opt" + if property.Many { + descriptor = "Many" + } + fmt.Fprintf(b, " %s: %s[%s] = %s(%q, %q", + snake, descriptor, rangeAnnotation, descriptor, property.Name, rangeName) + if property.Many { + fmt.Fprintf(b, ", ordered=%s", pythonBool(property.Ordered)) + } + if property.Derived { + b.WriteString(", derived=True") + } + b.WriteString(")\n") + fmt.Fprintf(b, " %q\n", propertyDoc(class, property)) + if property.Name != snake && !pythonKeywords[property.Name] { + fmt.Fprintf(b, " %s = %s\n", property.Name, snake) + } + return nil +} + +func propertyDoc(class ontology.Class, property ontology.Property) string { + parts := []string{"single"} + if property.Many { + parts = []string{"many"} + if property.Ordered { + parts = append(parts, "ordered") + } + } + if property.Derived { + parts = append(parts, "derived") + } + doc := fmt.Sprintf("``%s::%s`` (%s).", class.Name, property.Name, strings.Join(parts, ", ")) + if len(property.Redefines) > 0 { + targets := make([]string, len(property.Redefines)) + for i, redefined := range property.Redefines { + targets[i] = "``" + redefined + "``" + } + doc += " Redefines " + strings.Join(targets, ", ") + "." + } + return doc +} + +func writeModuleMembers(b *strings.Builder, m *model) { + b.WriteString("REGISTRY: Mapping[str, builtins.type[Element]] = MappingProxyType({\n") + for _, class := range m.classes { + fmt.Fprintf(b, " %q: %s,\n", class.Name, class.Name) + } + b.WriteString("})\n\n") + b.WriteString("ENUMERATIONS: Mapping[str, builtins.type[Enum]] = MappingProxyType({\n") + for _, enum := range m.enums { + fmt.Fprintf(b, " %q: %s,\n", enum.Name, enum.Name) + } + b.WriteString("})\n\nRUNTIME_MEMBERS = frozenset({\n") + for _, name := range runtimeMembers { + fmt.Fprintf(b, " %q,\n", name) + } + b.WriteString("})\n\n__all__ = [\n") + names := make([]string, 0, len(m.classes)+len(m.enums)+7) + for _, class := range m.classes { + names = append(names, class.Name) + } + for _, enum := range m.enums { + names = append(names, enum.Name) + } + names = append(names, "ENUMERATIONS", "METAMODEL_VERSION", "REGISTRY", "RUNTIME_MEMBERS", + "SOURCE_COMMIT", "SOURCE_TAG") + sort.Strings(names) + for _, name := range names { + fmt.Fprintf(b, " %q,\n", name) + } + b.WriteString("]\n") +} + +func newModel(classes []ontology.Class, properties []ontology.Property, + enums []ontology.Enumeration) (*model, error) { + m := &model{ + classes: classes, properties: properties, enums: enums, + classBy: make(map[string]ontology.Class, len(classes)), + enumBy: make(map[string]ontology.Enumeration, len(enums)), + mros: make(map[string][]string, len(classes)), + effective: make(map[string]map[string]ontology.Property, len(classes)), + } + if err := m.index(); err != nil { + return nil, err + } + order, err := m.topologicalOrder() + if err != nil { + return nil, err + } + m.classes = order + for _, class := range m.classes { + if _, err := m.linearize(class.Name, map[string]bool{}); err != nil { + return nil, err + } + } + if err := m.validateDeclarations(); err != nil { + return nil, err + } + if err := m.computeEffective(); err != nil { + return nil, err + } + for _, property := range properties { + if _, _, err := m.pythonRange(property); err != nil { + return nil, err + } + } + return m, nil +} + +// index fills classBy and enumBy, refusing names that are missing, repeated or collide. +func (m *model) index() error { + for _, class := range m.classes { + if class.Name == "" { + return fmt.Errorf("metaclass without a name") + } + if _, duplicate := m.classBy[class.Name]; duplicate { + return fmt.Errorf("metaclass %s is declared more than once", class.Name) + } + m.classBy[class.Name] = class + } + if _, ok := m.classBy["Element"]; !ok { + return fmt.Errorf("metaclass Element is not declared") + } + for _, enum := range m.enums { + if enum.Name == "" || len(enum.Literals) == 0 { + return fmt.Errorf("enumeration %q has no literals", enum.Name) + } + if _, duplicate := m.enumBy[enum.Name]; duplicate { + return fmt.Errorf("enumeration %s is declared more than once", enum.Name) + } + m.enumBy[enum.Name] = enum + } + for name := range m.enumBy { + if _, exists := m.classBy[name]; exists { + return fmt.Errorf("metaclass and enumeration share generated name %s", name) + } + if contains([]string{"METAMODEL_VERSION", "SOURCE_TAG", "SOURCE_COMMIT", "REGISTRY", + "ENUMERATIONS", "RUNTIME_MEMBERS"}, name) { + return fmt.Errorf("enumeration %s collides with a generated module member", name) + } + } + for _, property := range m.properties { + if _, ok := m.classBy[property.DefiningClass]; !ok { + return fmt.Errorf("%s::%s has no declaring metaclass", property.DefiningClass, property.Name) + } + } + return nil +} + +// computeEffective records each class's properties along its linearization, nearest first. +func (m *model) computeEffective() error { + for _, class := range m.classes { + effective := make(map[string]ontology.Property) + for _, ancestor := range m.mros[class.Name] { + for _, property := range m.properties { + if property.DefiningClass != ancestor { + continue + } + if _, exists := effective[property.Name]; !exists { + effective[property.Name] = property + } + } + } + m.effective[class.Name] = effective + if err := m.validateEffective(class.Name, effective); err != nil { + return err + } + } + return nil +} + +func (m *model) validateDeclarations() error { + declared := make(map[string][]string) + for _, property := range m.properties { + names := declared[property.Name] + for _, previous := range names { + if m.ancestor(property.DefiningClass, previous) || m.ancestor(previous, property.DefiningClass) { + return fmt.Errorf("property %s is declared by related metaclasses %s and %s", + property.Name, previous, property.DefiningClass) + } + } + declared[property.Name] = append(names, property.DefiningClass) + snake, camel := toSnake(property.Name), property.Name + for _, name := range []string{snake, camel} { + if contains(runtimeMembers, name) { + return fmt.Errorf("property %s on %s collides with runtime member %s", property.Name, property.DefiningClass, name) + } + if m.classBy[name].Name != "" || m.enumBy[name].Name != "" || + contains([]string{"Opt", "Many", "ClassVar", "Mapping", "MappingProxyType", + "builtins", "str", "bool", "int", "float"}, name) { + return fmt.Errorf("property %s on %s shadows generated class-body name %s", property.Name, property.DefiningClass, name) + } + } + if !pythonIdentifier(snake) { + return fmt.Errorf("property %q has no valid Python name", property.Name) + } + } + for _, enum := range m.enums { + literalNames := map[string]bool{} + for _, literal := range enum.Literals { + member := strings.ToUpper(literal) + if !pythonIdentifier(member) || pythonKeywords[member] { + return fmt.Errorf("enum literal %q in %s does not produce a valid Python identifier", literal, enum.Name) + } + if literalNames[member] { + return fmt.Errorf("enum %s has duplicate Python member %s", enum.Name, member) + } + literalNames[member] = true + } + } + return nil +} + +func (m *model) validateEffective(class string, effective map[string]ontology.Property) error { + names := make(map[string]string, len(effective)) + for key := range effective { + snake := toSnake(key) + if previous, exists := names[snake]; exists { + return fmt.Errorf("%s has property keys %s and %s with the same Python name %s", + class, previous, key, snake) + } + names[snake] = key + } + return nil +} + +func (m *model) topologicalOrder() ([]ontology.Class, error) { + children := make(map[string][]string, len(m.classes)) + remaining := make(map[string]int, len(m.classes)) + for _, class := range m.classes { + remaining[class.Name] = len(class.Parents) + for _, parent := range class.Parents { + if _, ok := m.classBy[parent]; !ok { + return nil, fmt.Errorf("%s has unknown metaclass parent %s", class.Name, parent) + } + children[parent] = append(children[parent], class.Name) + } + } + var ready []string + for name, count := range remaining { + if count == 0 { + ready = append(ready, name) + } + } + sort.Strings(ready) + order := make([]ontology.Class, 0, len(m.classes)) + for len(ready) > 0 { + name := ready[0] + ready = ready[1:] + order = append(order, m.classBy[name]) + for _, child := range children[name] { + remaining[child]-- + if remaining[child] == 0 { + ready = append(ready, child) + } + } + sort.Strings(ready) + } + if len(order) != len(m.classes) { + return nil, fmt.Errorf("metaclass inheritance contains a cycle") + } + return order, nil +} + +func (m *model) linearize(name string, visiting map[string]bool) ([]string, error) { + if mro, ok := m.mros[name]; ok { + return mro, nil + } + if visiting[name] { + return nil, fmt.Errorf("C3 linearization failed for %s: inheritance cycle", name) + } + visiting[name] = true + class := m.classBy[name] + sequences := make([][]string, 0, len(class.Parents)+1) + for _, parent := range class.Parents { + parentMRO, err := m.linearize(parent, visiting) + if err != nil { + return nil, err + } + sequences = append(sequences, append([]string(nil), parentMRO...)) + } + sequences = append(sequences, append([]string(nil), class.Parents...)) + result, err := c3Merge(name, class.Parents, sequences) + if err != nil { + return nil, err + } + delete(visiting, name) + m.mros[name] = result + return result, nil +} + +// c3Merge is the C3 merge of the parents' linearizations and the parent list. +func c3Merge(name string, parents []string, sequences [][]string) ([]string, error) { + result := []string{name} + for { + sequences = nonEmpty(sequences) + if len(sequences) == 0 { + return result, nil + } + candidate := c3Candidate(sequences) + if candidate == "" { + return nil, fmt.Errorf("C3 linearization failed for %s: inconsistent parents %v", name, parents) + } + result = append(result, candidate) + for i, sequence := range sequences { + if sequence[0] == candidate { + sequences[i] = sequence[1:] + } + } + } +} + +func nonEmpty(sequences [][]string) [][]string { + active := sequences[:0] + for _, sequence := range sequences { + if len(sequence) != 0 { + active = append(active, sequence) + } + } + return active +} + +// c3Candidate is the first head that no sequence carries in its tail, or "". +func c3Candidate(sequences [][]string) string { + for _, sequence := range sequences { + if !inTails(sequence[0], sequences) { + return sequence[0] + } + } + return "" +} + +func inTails(head string, sequences [][]string) bool { + for _, other := range sequences { + if contains(other[1:], head) { + return true + } + } + return false +} + +func (m *model) ancestor(class, ancestor string) bool { + for _, name := range m.mros[class] { + if name == ancestor { + return true + } + } + return false +} + +func (m *model) declaredProperties(class string) []ontology.Property { + var out []ontology.Property + for _, property := range m.properties { + if property.DefiningClass == class { + out = append(out, property) + } + } + sort.Slice(out, func(i, j int) bool { return out[i].Name < out[j].Name }) + return out +} + +func (m *model) pythonRange(property ontology.Property) (annotation, name string, err error) { + switch property.Range { + case xsdNS + "boolean": + return "bool", "bool", nil + case xsdNS + "string": + return "str", "str", nil + case xsdNS + "int": + return "int", "int", nil + case owlNS + "real": + return "float", "float", nil + } + if local, ok := strings.CutPrefix(property.Range, sysmlNS); ok { + if _, exists := m.classBy[local]; exists && property.Kind == ontology.ObjectProperty { + return local, local, nil + } + if _, exists := m.enumBy[local]; exists && property.Kind == ontology.DatatypeProperty { + return local, local, nil + } + } + return "", "", fmt.Errorf("%s::%s has unsupported range %q", property.DefiningClass, property.Name, property.Range) +} + +func writeJSONKeys(b *strings.Builder, class ontology.Class, m *model) { + b.WriteString(" JSON_KEYS: ClassVar[Mapping[str, str]] = MappingProxyType({\n") + if class.Name == "Element" { + b.WriteString(" **_ElementBase.JSON_KEYS,\n") + } else { + for i := len(class.Parents) - 1; i >= 0; i-- { + fmt.Fprintf(b, " **%s.JSON_KEYS,\n", class.Parents[i]) + } + } + for _, property := range m.declaredProperties(class.Name) { + fmt.Fprintf(b, " %q: %q,\n", property.Name, toSnake(property.Name)) + } + b.WriteString(" })\n") +} + +func toSnake(name string) string { + runes := []rune(name) + var b strings.Builder + for i, current := range runes { + if i > 0 && unicode.IsUpper(current) { + previous := runes[i-1] + nextIsLower := i+1 < len(runes) && unicode.IsLower(runes[i+1]) + if unicode.IsLower(previous) || unicode.IsDigit(previous) || + (unicode.IsUpper(previous) && nextIsLower) { + b.WriteByte('_') + } + } + b.WriteRune(unicode.ToLower(current)) + } + snake := b.String() + if pythonKeywords[snake] { + return snake + "_" + } + return snake +} + +func pythonIdentifier(name string) bool { + for i, r := range name { + if i == 0 { + if r != '_' && !unicode.IsLetter(r) { + return false + } + } else if r != '_' && !unicode.IsLetter(r) && !unicode.IsDigit(r) { + return false + } + } + return name != "" +} + +func pythonBool(value bool) string { + if value { + return "True" + } + return "False" +} + +func keywordSet(words string) map[string]bool { + out := make(map[string]bool) + for _, word := range strings.Fields(words) { + out[word] = true + } + return out +} + +func contains(values []string, value string) bool { + for _, candidate := range values { + if candidate == value { + return true + } + } + return false +} diff --git a/tools/gen/pymetamodel/main_test.go b/tools/gen/pymetamodel/main_test.go new file mode 100644 index 0000000000..a579661395 --- /dev/null +++ b/tools/gen/pymetamodel/main_test.go @@ -0,0 +1,179 @@ +package main + +import ( + "bytes" + "os" + "os/exec" + "path/filepath" + "strings" + "testing" + + "github.com/Open-MBEE/OpenSysML/internal/translate/rdf/ontology" + "github.com/Open-MBEE/OpenSysML/tools/oracle/repo" +) + +func TestGeneratedMetamodel(t *testing.T) { + generated, err := generate(ontology.Classes(), ontology.Properties(), ontology.Enumerations(), + ontology.Version, ontology.SourceTag, ontology.SourceCommit) + if err != nil { + t.Fatal(err) + } + source := string(generated) + if !strings.Contains(source, `class FeatureDirectionKind(str, Enum):`) || + !strings.Contains(source, ` IN = "in"`) { + t.Fatal("generated enumerations are missing") + } + if strings.Index(source, "class Type(") > strings.Index(source, "class PartUsage(") { + t.Fatal("metaclasses are not generated parent-first") + } + if !strings.Contains(source, `"partDefinition": "part_definition"`) { + t.Fatal("generated JSON-key mapping is missing") + } + root, err := repo.Root() + if err != nil { + t.Fatal(err) + } + committed, err := os.ReadFile(filepath.Join(root, filepath.FromSlash(outputPath))) + if err != nil { + t.Fatal(err) + } + if !bytes.Equal(generated, committed) { + t.Fatal("committed generated Python metamodel is stale") + } +} + +func TestCheckRejectsModifiedOutput(t *testing.T) { + root, err := repo.Root() + if err != nil { + t.Fatal(err) + } + output := filepath.Join(t.TempDir(), "stale.py") + if err := os.WriteFile(output, []byte("stale\n"), 0o600); err != nil { + t.Fatal(err) + } + command := exec.Command("go", "run", "./gen/pymetamodel", "-check", "-out", output) + command.Dir = filepath.Join(root, "tools") + result, err := command.CombinedOutput() + if err == nil || !strings.Contains(string(result), "is stale; regenerate with") { + t.Fatalf("generator check output = %s, error = %v", result, err) + } +} + +func TestC3LinearizationOrdersSharedAncestorsOnce(t *testing.T) { + classes := []ontology.Class{ + {Name: "Element"}, + {Name: "Base", Parents: []string{"Element"}}, + {Name: "Left", Parents: []string{"Base"}}, + {Name: "Right", Parents: []string{"Base"}}, + {Name: "Leaf", Parents: []string{"Left", "Right"}}, + } + m, err := newModel(classes, nil, nil) + if err != nil { + t.Fatal(err) + } + want := []string{"Leaf", "Left", "Right", "Base", "Element"} + if got := strings.Join(m.mros["Leaf"], ","); got != strings.Join(want, ",") { + t.Fatalf("Leaf MRO = %v, want %v", m.mros["Leaf"], want) + } +} + +func TestGeneratorRejectsInvalidTables(t *testing.T) { + tests := []struct { + name string + classes []ontology.Class + properties []ontology.Property + enums []ontology.Enumeration + want string + }{ + { + name: "related property redeclaration", + classes: []ontology.Class{ + {Name: "Element"}, + {Name: "Parent", Parents: []string{"Element"}}, + {Name: "Child", Parents: []string{"Parent"}}, + }, + properties: []ontology.Property{ + testProperty("Parent", "feature"), + testProperty("Child", "feature"), + }, + want: "declared by related metaclasses", + }, + { + name: "duplicate snake name", + classes: []ontology.Class{ + {Name: "Element"}, + {Name: "Node", Parents: []string{"Element"}}, + }, + properties: []ontology.Property{ + testProperty("Node", "someName"), + testProperty("Node", "some_name"), + }, + want: "same Python name", + }, + { + name: "runtime member collision", + classes: []ontology.Class{ + {Name: "Element"}, + {Name: "Node", Parents: []string{"Element"}}, + }, + properties: []ontology.Property{testProperty("Node", "jsonId")}, + want: "collides with runtime member", + }, + { + name: "class body shadowing", + classes: []ontology.Class{ + {Name: "Element"}, + {Name: "Node", Parents: []string{"Element"}}, + }, + properties: []ontology.Property{testProperty("Node", "Mapping")}, + want: "shadows generated class-body name", + }, + { + name: "invalid enum literal", + classes: []ontology.Class{{Name: "Element"}}, + enums: []ontology.Enumeration{{Name: "Direction", Literals: []string{"bad-literal"}}}, + want: "does not produce a valid Python identifier", + }, + { + name: "inconsistent C3 order", + classes: []ontology.Class{ + {Name: "Element"}, + {Name: "O"}, + {Name: "X", Parents: []string{"O"}}, + {Name: "Y", Parents: []string{"O"}}, + {Name: "A", Parents: []string{"X", "Y"}}, + {Name: "B", Parents: []string{"Y", "X"}}, + {Name: "Z", Parents: []string{"A", "B"}}, + }, + want: "C3 linearization failed", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := generate(tt.classes, tt.properties, tt.enums, "version", "tag", "commit") + if err == nil || !strings.Contains(err.Error(), tt.want) { + t.Fatalf("generate error = %v, want substring %q", err, tt.want) + } + }) + } +} + +func TestSnakeCasePreservesAcronymsAndDigits(t *testing.T) { + for input, want := range map[string]string{ + "ownedFeature": "owned_feature", + "XMLValue": "xml_value", + "part2D": "part2_d", + "in": "in_", + } { + if got := toSnake(input); got != want { + t.Errorf("toSnake(%q) = %q, want %q", input, got, want) + } + } +} + +func testProperty(class, name string) ontology.Property { + return ontology.Property{ + Name: name, DefiningClass: class, Kind: ontology.DatatypeProperty, + Range: xsdNS + "string", + } +}