Skip to content

Release 1.1.0 (2026-02-16)

Bug fixes

  • resolve three CI job failures (#27)
  • standards-compliance: fix markdown lint errors (MD031 blanks around fences, MD040 missing code language, MD060 table separator spacing) in tier3-decisions.md, admin-rest-api-gap-analysis.md, and mq-java-ecosystem.md
  • dependency-audit: replace dependency-review-action (requires Dependency Graph enabled) with mvnw dependency:tree for all events
  • release-gates: guard version divergence check against missing pom.xml on main branch

  • add blank line and Table of Contents to README.md (#29) Fix MD022 (blanks-around-headings) and add required Table of Contents section to satisfy standards-compliance checks.

  • sync mapping data with pymqrest and extract parameters from response (#38) Sync mapping-data.json with the authoritative pymqrest mapping_data.py: add DELETE QALIAS/QLOCAL/QMODEL/QREMOTE commands, add missing response key mappings across 9 qualifiers, and add request key-value mappings for listener replace/noreplace.

Fix a response parsing bug where completionCode, reasonCode, and the parameters wrapper from the MQ REST API commandResponse envelope were included as MQ object attributes. Now only the contents of the parameters sub-object are returned, matching pymqrest behavior.

Update integration tests to use correct mapped attribute names (lowercase replace values, transmission_queue_name, default_input_open_option, start_mode) and specific DELETE qualifiers (QLOCAL, QREMOTE, etc.) instead of the generic DELETE QUEUE.

  • disable MD041 for mkdocs snippet-include files The docs/site/docs/mappings/*.md files are mkdocs snippet includes (--8<-- directives), not standalone markdown documents. MD041 (first line must be a heading) false-positives on these. The awk structural check in standards-compliance already enforces single-H1 for real docs.

  • correct table column count in local MQ container docs Merge the separate QM1/QM2 REST base URL rows into a single row with three columns to satisfy MD056 (table column count consistency).

  • correct snippets base_path resolution for fragment includes (#74) pymdownx.snippets resolves base_path relative to CWD (not the mkdocs.yml location). The previous paths were relative to docs/site/ which caused fragments to either not resolve or self-include when the wrapper file had the same name as the fragment.

Use CWD-relative paths so fragments resolve correctly when mkdocs is invoked from the repository root.

Fixes wphillipmoore/mq-rest-admin-common#32

  • run mike from repo root so snippet base_path resolves in CI (#75) Remove working-directory from mike deploy step and pass -F docs/site/mkdocs.yml instead, so CWD matches the base_path entries in mkdocs.yml.

Ref wphillipmoore/mq-rest-admin-common#32

  • propagate 4 missing mapping entries from canonical JSON (#80) Propagates the fix from mq-rest-admin-common#40 restoring 4 entries dropped during the initial extraction from the Python source:

  • conn.response_key_map: ASTATE, CONN, EXTCONN

  • qstatus.request_key_map: type

Documentation

  • record tier 1 decisions (groupId, Java 17, Maven) (#2) Document the three foundational decisions: Maven groupId (io.github.wphillipmoore), minimum Java version (17), and build tool (Maven). Update open-decisions tracker to reflect resolved items and implicitly converged publishing decisions.

  • record tier 3 architecture decisions (#5) Document HTTP client (java.net.http), JSON library (Gson), API surface (method-per-command with Map params), attribute mapping (3-layer pipeline port), and exception hierarchy (unchecked, sealed) decisions. Add Gson 2.13.2 compile dependency. Update CLAUDE.md architecture section and mark all 5 architecture items as decided in open-decisions.md.

  • update open-decisions to reflect completed implementation (#32) Update purpose to note all library code is implemented with only tooling remaining. Update git hooks entry to reflect adoption of canonical versions from standards-and-conventions (PR #31).

  • add documentation site generator to open decisions (#37)

  • enrich ensure-methods and getting-started pages (#45) Rewrite ensure-methods.md with full explanatory content from enriched common fragment plus detailed Java code examples (basic usage, assertions, queue manager singleton, configuration management).

Rewrite getting-started.md to match pymqrest depth: add strict/lenient mapping, custom overrides with sparse examples, gateway queue manager, diagnostic state, and richer error handling examples.

  • enrich documentation pages and remove inline TOC sections (#47) Enrich all MkDocs documentation pages to match pymqrest reference depth:
  • architecture.md: Java component mapping, diagnostic state, transport interface, mock transport example, gateway builder example
  • mapping-pipeline.md: Java examples for every section, per-call opt-out, corrected snake_case naming (was incorrectly documented as camelCase)
  • API reference pages: complete command tables (~144 methods by verb), auth recommendations (LTPA vs Basic), exception method tables and catch examples, transport parameter docs, mapping sub-map details
  • ensure.md: fixed swapped EnsureResult/EnsureAction descriptions

Fix incorrect attribute names and API references in code examples: - max_q_depth -> max_queue_depth, current_depth -> current_queue_depth - statistics_queue -> queue_statistics, monitoring_queue -> queue_monitoring - e.getReasonCode() -> e.getStatusCode(), e.getCommandResponse() -> e.getPayload()

Remove inline Table of Contents sections from all docs/site/ pages. MkDocs Material provides integrated navigation, making them redundant. Exempt per standards-and-conventions#152 and standard-actions#11.

  • add sync hallucination case study (#48) Root cause analysis of the fabricated sync documentation (issue #44). The doc agent invented a Terraform-style bulk declarative sync system instead of documenting the actual synchronous polling wrappers that were correctly ported from pymqrest.

  • rewrite sync documentation to match actual implementation (#49) The sync docs incorrectly described a bulk declarative configuration management system (Terraform-style sync). Replace with the correct documentation: synchronous polling wrappers around fire-and-forget START/STOP commands, matching the Python reference implementation.

See docs/research/2026-02-14-sync-hallucination-case-study.md for forensic analysis of how the hallucination occurred.

  • close content gaps in ensure, sync, mapping, and getting-started pages (#57)
  • docs: close content gaps in ensure, sync, mapping, and getting-started pages

Inline all narrative content that was previously referenced via --8<-- snippet directives pointing to the non-existent .mq-rest-admin-common fragments directory. The shared fragment architecture will be revisited when the Go repo docs are built.

  • replace BasicAuth with LtpaAuth in examples and remove Next Steps (#61)
  • address medium-severity documentation consistency findings (#63) Enrich contributing.md with AI agent guidance, developer-setup.md with required-repos and CI overview, local-mq-container.md with gateway routing and environment variables, add diagnostic attributes to sync timeout example, add LTPA default note to auth.md, create ai-engineering.md, and set dark mode as default theme palette.

  • address cross-library documentation consistency nits (#67) Standardize nav ordering with full qualifier mapping listings, create examples page, add runtime dependencies and pipeline links to architecture page, and remove Quick Links from home page.

  • switch to shared fragment includes from common repo (#71) Replace duplicated mapping pages, AI engineering, and local MQ container docs with --8<-- snippet includes from mq-rest-admin-common. Delete generate_mapping_docs.py (moved to common) and remove the generate step from the docs workflow.

  • add quality gates documentation page Include the shared quality gates fragment from mq-rest-admin-common and append Java-specific validation pipeline details (Spotless, Checkstyle, Surefire, Failsafe, JaCoCo, SpotBugs, PMD).

  • close stale documentation generator TBD in open-decisions The MkDocs decision was made in PRs #42 and #68 but open-decisions.md still listed it as TBD. Update to reflect the decision and clarify the remaining docs-only validation gap.

Features

  • add repository scaffolding and research documents (#1) Establish the repository structure adapted from pymqrest, including CLAUDE.md/AGENTS.md dual-file documentation strategy, canonical standards references, issue templates, markdownlint config, changelog config, and Java-specific .gitignore. Add research documents covering the MQ Java ecosystem survey, admin REST API gap analysis, project naming decision, and open decisions tracker.

  • add Maven project skeleton (#3) Set up the Maven build with project coordinates (io.github.wphillipmoore:mq-rest-admin:0.1.0-SNAPSHOT), Java 17 compiler configuration, and Maven Wrapper (3.3.4 / Maven 3.9.12). Create the standard src directory layout with package-info.java as the compilation placeholder. Update CLAUDE.md and repository-standards.md with concrete development commands.

  • add testing framework and code quality tooling (#4) Add JUnit 5, Mockito 5, AssertJ for testing with JaCoCo 100% coverage enforcement. Add Spotless + google-java-format, Checkstyle, SpotBugs, and PMD for full static analysis from day 1. Single command ./mvnw verify runs the entire validation pipeline.

  • implement sealed exception hierarchy (#7)

  • add transport interface and response record (#8) Define the HTTP boundary types that all session logic depends on:
  • TransportResponse record with defensive header copying
  • MqRestTransport interface with single postJson method

  • add auth types (Credentials sealed interface + records) (#9) Implement the credential model for MQ REST API authentication as step 3 of the implementation sequence. Adds sealed Credentials interface with three record implementations: BasicAuth, LtpaAuth, and CertificateAuth.

  • add mapping issue types (MappingIssue record + MappingException) (#11) Step 4 of tier 3 implementation: define the error-reporting model for attribute translation failures. MappingDirection and MappingReason enums, MappingIssue record, and MappingException (separate from MqRestException hierarchy, as it represents data-transformation errors).

  • implement attribute mapping pipeline (AttributeMapper + MappingData + MappingOverrideMode) (#12) Implement the 3-layer attribute mapping pipeline that translates between snake_case Python-style attribute names and MQSC parameter names used by the MQ REST API. This is step 5 of the tier 3 implementation sequence.

  • MappingOverrideMode enum (MERGE/REPLACE strategies)

  • MappingData class (JSON loading, factory methods, override merging)
  • AttributeMapper class (key map, value map, key-value map pipeline)
  • Minimal mapping-data.json resource skeleton for testing
  • 75 new tests (165 total), 100% line and branch coverage

  • implement MqRestSession core with Builder, mqscCommand, and helpers (#13) Central session class that ties together URL/header building, MQSC command dispatch, response parsing, error detection, and attribute mapping integration.

  • MqRestSession with Builder pattern (required: URL, qmgr, credentials, transport)

  • mqscCommand method: full pipeline mirroring pymqrest _mqsc_command
  • LTPA login at construction time for LtpaAuth credentials
  • Response parameter mapping and WHERE keyword mapping
  • Session state tracking (lastHttpStatus, lastResponseText, lastResponsePayload, lastCommandPayload)
  • MappingData: add getResponseParameterMacros() and getSnakeToMqscMap() methods
  • MappingData: make hasQualifier() public (needed by session)
  • 100 new tests (280 total), 100% line and branch coverage

  • add 118 command methods to MqRestSession (#14) Add thin command methods that delegate to mqscCommand(), providing the public API surface users call (e.g., displayQueue(), defineQlocal()).

Six method patterns cover all MQSC commands: - Wildcard DISPLAY (2): displayQueue, displayChannel default to "*" - Singleton DISPLAY (3): displayQmgr/Qmstatus/Cmdserv return Map - Optional-name DISPLAY (39): return List - Required-name void (7): 5 DEFINEs + 2 DELETEs with null check - Optional-name void (56): most non-DISPLAY commands - No-name void (11): QMGR/CMDSERV commands

  • add ensure package (EnsureAction, EnsureResult) and 16 ensure methods on MqRestSession (#15) Implements idempotent upsert operations that create-if-not-exists, update-if-different, or leave-unchanged for MQ objects. Mirrors pymqrest MQRESTEnsureMixin.

New types: - EnsureAction enum: CREATED, UPDATED, UNCHANGED - EnsureResult record: action + changed attribute names

New methods on MqRestSession: - valuesMatch(): case-insensitive string comparison helper - extractParametersMap(): unwraps MQ REST API parameters sub-object - ensureObject(): core ensure logic (private) - ensureQmgr(): special case (never CREATED) - 15 standard ensure methods: ensureQlocal, ensureQremote, ensureQalias, ensureQmodel, ensureChannel, ensureAuthinfo, ensureListener, ensureNamelist, ensureProcess, ensureService, ensureTopic, ensureSub, ensureStgclass, ensureComminfo, ensureCfstruct

  • add sync package (SyncOperation, SyncConfig, SyncResult) and 9 sync methods on MqRestSession (#18) Add synchronous start/stop/restart methods with polling for channels, listeners, and services. Includes Clock abstraction for deterministic testing, ObjectTypeConfig for object type dispatch, and hasStatus helper for status detection. 591 tests, 100% coverage.

  • add git hooks for branch protection, commit message, and co-author validation (#21) Ports pre-commit (branch protection + naming) and commit-msg hooks from pymqrest, adapted for the library branching model. Adds a new co-author trailer validator that checks against the approved identity list in docs/repository-standards.md.

  • implement HttpClientTransport with JDK HttpClient (#19) Provides the real HTTP transport behind MqRestTransport using java.net.http.HttpClient and Gson — zero additional runtime dependencies. Supports TLS verification toggle, custom SSLContext for mTLS, timeout propagation, and RFC 9110 header flattening.

  • populate mapping-data.json with full MQ attribute set (#23) Port all 139 MQSC commands, 50 qualifiers, and ~1,300+ attribute mappings from pymqrest's mapping_data.py to the JSON resource file. Update tests to use real attribute names (max_queue_depth vs stub's max_depth.

EOF )

  • add GitHub Actions CI workflow with 6-job pipeline (#25) Set up CI with docs-only detection, standards compliance, dependency audit (GitHub-native dependency-review-action), release gates (SNAPSHOT and version divergence checks), test-and-validate (Java 17/21/25 matrix running full mvnw verify), and integration-tests placeholder.

  • add Error Prone, NullAway, and JSpecify null-safety tooling (#30) Add static analysis tooling and fix Java naming standard deviations tracked in issue #17.

Error Prone + NullAway configured in a JDK 21+ Maven profile so CI on Java 21/25 enforces null-safety at ERROR severity while Java 17 builds compile normally. JSpecify @Nullable annotations applied across all source files. Abbreviated variable names expanded per naming standard Rule 3, and test method abbreviations (ThrowsNpe) replaced with full names (ThrowsNullPointerException).

  • adopt canonical git hooks from standards-and-conventions (#31) Replace hardcoded hook scripts with dynamic branching-model-aware versions from standards-and-conventions#141. The pre-commit hook now reads branching_model from docs/repository-standards.md instead of hardcoding allowed prefixes, and co-author.sh gains whitespace normalization for trailer comparison.

  • add integration test strategy and MQ dev wrapper scripts (#6) Document per-project container isolation via COMPOSE_PROJECT_NAME and port allocation. Add wrapper scripts in scripts/dev/ that delegate to mq-dev-environment with mq-rest-admin-specific ports (9453/9454).

  • wire up CI integration tests with live MQ containers (#35) Replace the placeholder integration-tests CI job with a real workflow that starts MQ containers via the mq-dev-environment composite action and runs Failsafe integration tests against the live REST API.

  • CI job: checkout mq-dev-environment, setup-mq with ports 9453/9454, run ./mvnw verify with MQ_REST_ADMIN_RUN_INTEGRATION=1

  • JaCoCo: exclude *IT.class from 100% coverage enforcement
  • MqRestSessionIT: display, lifecycle, ensure, gateway, and session state tests mirroring pymqrest test_mq_integration.py

  • add MkDocs documentation site with shared fragment architecture (#41)

  • feat: add MkDocs documentation site with shared fragment architecture

Implement cross-repo documentation architecture with a shared common fragments repo and a Java MkDocs Material site. Includes mapping docs generator, maven-javadoc-plugin, CI workflow for GitHub Pages, and complete doc pages for architecture, API reference, and development.

  • add Tier 1 security tooling (CodeQL, attestations, license compliance)
  • Add CodeQL SAST job to CI workflow using standard-actions composite action
  • Add build provenance attestations to publish workflow (attest-build-provenance@v2)
  • Add license compliance check to dependency-audit job using license-maven-plugin

  • add Trivy and Semgrep CI jobs and SBOM generation Add Trivy filesystem vulnerability scanning and Semgrep SAST jobs to CI, gated by docs-only detection. Add CycloneDX SBOM generation to the publish workflow, attached to GitHub Releases.

Ref mq-rest-admin-common#11, #24, #25

  • configure Maven Central publication via Central Portal API Add a release Maven profile with source, javadoc, GPG signing, and central-publishing-maven-plugin. Update the publish workflow to import GPG keys, authenticate with Central Portal, and deploy artifacts. GitHub Release notes now show Maven/Gradle coordinates.