diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..31ffcd8e --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,45 @@ +version: 2 + +multi-ecosystem-groups: + java: + schedule: + interval: daily + +updates: + - package-ecosystem: docker + directories: + - "/fabric-chaincode-docker" + - "/examples/fabric-contract-example-as-service" + schedule: + interval: daily + + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: daily + + - package-ecosystem: gradle + multi-ecosystem-group: java + patterns: + - "*" + directories: + - "/" + - "/fabric-chaincode-docker" + - "/examples/fabric-contract-example-as-service" + - "/examples/fabric-contract-example-gradle" + - "/examples/fabric-contract-example-gradle-kotlin" + - "/examples/ledger-api" + - "/fabric-chaincode-integration-test" + - "/fabric-chaincode-integration-test/src/contracts/bare-gradle" + - "/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api" + - "/fabric-chaincode-integration-test/src/contracts/fabric-shim-api" + - "/fabric-chaincode-shim" + + - package-ecosystem: maven + multi-ecosystem-group: java + patterns: + - "*" + directories: + - "/examples/fabric-contract-example-maven" + - "/fabric-chaincode-integration-test/src/contracts/bare-maven" + - "/fabric-chaincode-integration-test/src/contracts/wrapper-maven" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3ed40537..574ad2b8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,37 +15,46 @@ env: IMAGE_NAME: ${{ github.repository_owner }}/fabric-javaenv jobs: - # Publishing steps to both the Github Packages and the Sonatype - publishjars: - strategy: - fail-fast: false - matrix: - publish_target: - - publishAllPublicationsToGithubPackagesRepository - - publishAllPublicationsToReleaseRepository + publish-github: runs-on: ubuntu-latest permissions: contents: read packages: write steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + - uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5.7.0 with: distribution: "temurin" - java-version: 21 - - uses: gradle/actions/setup-gradle@v4 - - name: Push to registry ${{ matrix.publish_target }} + java-version: 25 + - uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0 + - name: Publish to GitHub Packages run: | - set -xev - ./gradlew -Psigning.key="${SIGNING_KEY}" -Psigning.password="${SIGNING_PASSWORD}" -PossrhUsername="${OSSRH_USER}" -PossrhPassword="${OSSRH_PASSWORD}" ${TARGET} + ./gradlew publishAllPublicationsToGitHubRepository env: - SIGNING_PASSWORD: ${{ secrets.OSSRH_GPG_SECRET_KEY_PASSWORD }} - SIGNING_KEY: ${{ secrets.OSSRH_GPG_SECRET_KEY }} - OSSRH_USER: ${{ secrets.OSSRH_USERNAME }} - OSSRH_PASSWORD: ${{ secrets.OSSRH_TOKEN }} - TARGET: ${{ matrix.publish_target }} + ORG_GRADLE_PROJECT_signingKey: ${{ secrets.OSSRH_GPG_SECRET_KEY }} + ORG_GRADLE_PROJECT_signingPassword: ${{ secrets.OSSRH_GPG_SECRET_KEY_PASSWORD }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + publish-maven: + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + - uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5.7.0 + with: + distribution: "temurin" + java-version: 25 + - uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0 + - name: Publish to Maven Central + run: | + ./gradlew publishAggregationToCentralPortal + env: + ORG_GRADLE_PROJECT_signingKey: ${{ secrets.OSSRH_GPG_SECRET_KEY }} + ORG_GRADLE_PROJECT_signingPassword: ${{ secrets.OSSRH_GPG_SECRET_KEY_PASSWORD }} + ORG_GRADLE_PROJECT_mavenCentralUsername: ${{ secrets.MAVENCENTRAL_USERNAME }} + ORG_GRADLE_PROJECT_mavenCentralPassword: ${{ secrets.MAVENCENTRAL_PASSWORD }} + docker-build-push: name: Push Docker image runs-on: ${{ matrix.arch.runner }} @@ -61,33 +70,33 @@ jobs: - platform: linux-arm64 runner: ubuntu-24.04-arm steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + - uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5.7.0 with: distribution: "temurin" - java-version: 21 - - uses: gradle/actions/setup-gradle@v4 + java-version: 25 + - uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0 - name: Build the dependencies needed for the image run: ./gradlew :fabric-chaincode-docker:copyAllDeps - name: Get commit timestamp run: echo "SOURCE_DATE_EPOCH=$(git log -1 --pretty=%ct)" >> "${GITHUB_ENV}" - name: Login to GitHub Container Registry - uses: docker/login-action@v3 + uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Login to Docker Hub - uses: docker/login-action@v3 + uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0 with: registry: docker.io username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 + uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0 - name: Build image id: build - uses: docker/build-push-action@v6 + uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0 with: file: fabric-chaincode-docker/Dockerfile context: fabric-chaincode-docker @@ -100,7 +109,7 @@ jobs: digest="${{ steps.build.outputs.digest }}" touch "${{ runner.temp }}/digests/${digest#sha256:}" - name: Upload digest - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: digest-${{ matrix.arch.platform }} path: ${{ runner.temp }}/digests/* @@ -121,20 +130,20 @@ jobs: - ghcr.io steps: - name: Download digests - uses: actions/download-artifact@v4 + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: path: ${{ runner.temp }}/digests pattern: digest-* merge-multiple: true - name: Login to ${{ matrix.registry }} - uses: docker/login-action@v3 + uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0 with: registry: ${{ matrix.registry }} username: ${{ matrix.registry == 'docker.io' && secrets.DOCKERHUB_USERNAME || github.actor }} password: ${{ matrix.registry == 'docker.io' && secrets.DOCKERHUB_TOKEN || secrets.GITHUB_TOKEN }} - name: Docker metadata id: meta - uses: docker/metadata-action@v5 + uses: docker/metadata-action@dc802804100637a589fabce1cb79ff13a1411302 # v6.2.0 with: images: ${{ matrix.registry }}/${{ env.IMAGE_NAME }} tags: | @@ -142,7 +151,7 @@ jobs: type=semver,pattern={{major}}.{{minor}} type=semver,pattern={{major}}.{{minor}}.{{patch}} - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 + uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0 - name: Create and push manifest list working-directory: ${{ runner.temp }}/digests run: | diff --git a/.github/workflows/scan.yml b/.github/workflows/scan.yml index b0754fd5..9776f050 100644 --- a/.github/workflows/scan.yml +++ b/.github/workflows/scan.yml @@ -16,17 +16,19 @@ jobs: osv-scanner: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: ref: ${{ inputs.ref }} - - uses: actions/setup-go@v5 # Needed for scanning of v2.5.5 and earlier + # Go needed for scanning of v2.5.5 and earlier + - uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0 with: go-version: stable cache: false - - uses: actions/setup-java@v4 + - uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5.7.0 with: distribution: temurin + # Releases v2.5.7 and earlier do not support Java 25 java-version: 21 - - uses: gradle/actions/setup-gradle@v4 + - uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0 - name: Scan run: make scan diff --git a/.github/workflows/scheduled-scan.yml b/.github/workflows/scheduled-scan.yml index cfbe5687..191af837 100644 --- a/.github/workflows/scheduled-scan.yml +++ b/.github/workflows/scheduled-scan.yml @@ -9,7 +9,7 @@ permissions: contents: read jobs: - latest-release-version: + release-version: name: Get latest release tag runs-on: ubuntu-latest outputs: @@ -18,9 +18,13 @@ jobs: - id: tag-name run: echo "value=$(curl --location --silent --fail "https://api.github.com/repos/${GITHUB_REPOSITORY}/releases/latest" | jq --raw-output '.tag_name')" >> "${GITHUB_OUTPUT}" - scan: - name: Scan ${{ needs.latest-release-version.outputs.tag_name }} - needs: latest-release-version + scan-release: + name: Scan ${{ needs.release-version.outputs.tag_name }} + needs: release-version uses: ./.github/workflows/scan.yml with: - ref: ${{ needs.latest-release-version.outputs.tag_name }} + ref: ${{ needs.release-version.outputs.tag_name }} + + scan-latest: + name: Scan latest + uses: ./.github/workflows/scan.yml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9d45c2a4..9ccdaed2 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -16,31 +16,31 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: ref: ${{ inputs.ref }} - - uses: actions/setup-java@v4 + - uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5.7.0 with: distribution: temurin - java-version: 21 - - uses: gradle/actions/setup-gradle@v4 + java-version: 25 + - uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0 - name: Build and Unit test run: ./gradlew :fabric-chaincode-shim:build intergationtest: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: ref: ${{ inputs.ref }} - - uses: actions/setup-java@v4 + - uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5.7.0 with: distribution: temurin - java-version: 21 - - uses: actions/setup-node@v4 + java-version: 25 + - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: node-version: "lts/*" - - uses: gradle/actions/setup-gradle@v4 + - uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0 - name: Populate chaincode with latest java-version run: | ./gradlew -I $GITHUB_WORKSPACE/fabric-chaincode-integration-test/chaincodebootstrap.gradle -PchaincodeRepoDir=$GITHUB_WORKSPACE/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/repository publishShimPublicationToFabricRepository @@ -66,13 +66,13 @@ jobs: docker: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: ref: ${{ inputs.ref }} - - uses: actions/setup-java@v4 + - uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5.7.0 with: distribution: temurin - java-version: 21 - - uses: gradle/actions/setup-gradle@v4 + java-version: 25 + - uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0 - name: Build Docker image run: ./gradlew :fabric-chaincode-docker:buildImage diff --git a/COMPATIBILITY.md b/COMPATIBILITY.md index 57924e50..b8087a77 100644 --- a/COMPATIBILITY.md +++ b/COMPATIBILITY.md @@ -11,7 +11,8 @@ This table shows the summary of the compatibility of the Java chaincode librarie | v1.4 | 8 | 8 | amd64 | | v2.2 | 11 | 11 | amd64 | | v2.5.0 - v2.5.4 | 11 | 11 | amd64, arm64 | -| v2.5.5+ | 11 | 21 | amd64, arm64 | +| v2.5.5 - v2.5.7 | 11 | 21 | amd64, arm64 | +| v2.5.8+ | 11 | 25 | amd64, arm64 | The Java runtime provided by the chaincode Docker image determines the maximum Java version (and features) that smart contract code can exploit when using the default Java chaincode container. diff --git a/Makefile b/Makefile index 44118a94..c64334c5 100644 --- a/Makefile +++ b/Makefile @@ -16,9 +16,17 @@ endif .PHONY: scan scan: $(osv-scanner) + rm -f fabric-chaincode-shim/gradle.lockfile ./gradlew --quiet :fabric-chaincode-shim:dependencies --write-locks --configuration runtimeClasspath bin/osv-scanner scan --lockfile=fabric-chaincode-shim/gradle.lockfile +.PHONY: scan-all +scan-all: $(osv-scanner) + rm -f fabric-chaincode-shim/gradle.lockfile + ./gradlew --quiet :fabric-chaincode-shim:dependencies --write-locks + bin/osv-scanner scan --lockfile=fabric-chaincode-shim/gradle.lockfile + + .PHONY: install-osv-scanner install-osv-scanner: mkdir -p '$(bin_dir)' diff --git a/RELEASING.md b/RELEASING.md index 7550061e..b4a5308e 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -2,74 +2,32 @@ The following artifacts are created as a result of releasing Fabric Chaincode Java: -- docker images - - [fabric-javaenv](https://hub.docker.com/r/hyperledger/fabric-javaenv) -- Java libraries - - [fabric-chaincode-shim](https://search.maven.org/search?q=a:fabric-chaincode-shim) - -**Note:** A docker image with a matching V.R version is required before releasing a new version of Fabric. +- `fabric-javaenv` Docker images: + - [Docker Hub](https://hub.docker.com/r/hyperledger/fabric-javaenv) + - [GitHub Packages](https://github.com/orgs/hyperledger/packages/container/package/fabric-javaenv) +- `fabric-chaincode-shim` Java libraries: + - [Maven Central](https://central.sonatype.com/artifact/org.hyperledger.fabric-chaincode-java/fabric-chaincode-shim) + - [GitHub Packages](https://github.com/hyperledger/fabric-chaincode-java/packages/50049) ## Before releasing -It's useful to create an issue to keep track of each release, for example [Release v2.1.0](https://jira.hyperledger.org/browse/FABCJ-283). - The following tasks are required before releasing: -- Update version numbers in `build.gradle` files to the required version -- Update test, sample, and docs files to match the new version -- Update the [`COMPATIBILITY.md`](./COMPATIBILITY.md) - -See the [[FABCJ-289] release: 2.2.0 LTS](https://github.com/hyperledger/fabric-chaincode-java/pull/124) pull request for an example, although be careful to search for all versions in the codebase as they're easy to miss and things change! - -Ensure the last branch build passed since exactly this repository state will be released. +- Ensure the version number in `build.gradle` is the required release version. +- Check the last branch build passed since exactly this repository state will be released. ## Create release Creating a GitHub release on the [releases page](https://github.com/hyperledger/fabric-chaincode-java/releases) will trigger the build to publish the new release. -When drafting the release, create a new tag for the new version (with a `v` prefix), e.g. `v2.1.4` +When drafting the release, create a new tag for the new version (with a `v` prefix). For example: `v2.1.4` See previous releases for examples of the title and description. -## Publish Java libraries - -Log on to the [nexus repository manager](https://oss.sonatype.org/#welcome) to manually publish the JARs which were pushed by the release build. - -Find the results of the release build under _Build Promotion > Staging Repositories_ and perform the following steps: - -1. Close - - You should see a series of close activities (see note) - -2. Release using the automatically drop option - - You should see a series of release activities (see note) - -Note: you may need to refresh to update the activities view. - -When the release has completed and the _Staging Repositories_ list is empty, the Java chaincode libraries should appear in the maven repository. They can take some time to appear in the UI but they should exist in the repository sooner. - ## After releasing -- Update version numbers in `build.gradle` files to the next version -- Update test, sample, and docs files to match the new version - -See the [Bump version to 2.2.1](https://github.com/hyperledger/fabric-chaincode-java/pull/127) pull request for an example. It should include almost all the files changed to prepare for the release, except for the release notes and changelog which do not need updating. - -## Interim Build Publishing - -The nightly Azure Pipeline Builds will also publish the 'dev' drivers to Artifactory. These can be accessed via the repository at - -``` - maven { - url "https://hyperledger.jfrog.io/hyperledger/fabric-maven" - } -``` - -These 'dev' drivers are built from the main branch only, and have a version format including the date for example `2.3.1.dev.20210303`. They can be accessed in a build file like this - -``` -dependencies { - compile group: 'org.hyperledger.fabric-chaincode-java', name: 'fabric-chaincode-shim', version: '2.3.1.dev.+' - } -``` +- Update the version number in `build.gradle` to the next version. +- Update image version numbers in `fabric-chaincode-docker/build.gradle` to match the next version. +- Update the `fabric-chaincode-shim` dependency version in all `build.gradle` and `pom.xml` files within `fabric-chaincode-integration-test/src/contracts` to match the next version. +- Update the `fabric-chaincode-shim` dependency version in all `build.gradle`, `build.gradle.kts` and `pom.xml` files within `examples` to match the last _released_ version. +- Check that `COMPATIBILITY.md` is correct and update if required. diff --git a/build.gradle b/build.gradle index d0be9fd6..f89af50f 100644 --- a/build.gradle +++ b/build.gradle @@ -5,12 +5,13 @@ */ plugins { - id "com.github.ben-manes.versions" version "0.52.0" - id "com.diffplug.spotless" version "7.0.4" + id "com.github.ben-manes.versions" version "0.54.0" + id "com.diffplug.spotless" version "8.4.0" + id "com.gradleup.nmcp.aggregation" version "1.5.0" + id "com.gradleup.nmcp" version "1.5.0" apply false } -version = '2.5.6' - +version = '2.5.11' // If the nightly property is set, then this is the scheduled main // build - and we should publish this to artifactory @@ -23,8 +24,21 @@ if (properties.containsKey('NIGHTLY')) { ext.nightly = false } +nmcpAggregation { + centralPortal { + username = findProperty('mavenCentralUsername') + password = findProperty('mavenCentralPassword') + publishingType = "AUTOMATIC" + } +} + +dependencies { + nmcpAggregation(project(':fabric-chaincode-shim')) +} + allprojects { apply plugin: "com.diffplug.spotless" + apply plugin: "com.github.ben-manes.versions" repositories { mavenCentral() @@ -47,26 +61,20 @@ subprojects { group = 'org.hyperledger.fabric-chaincode-java' version = rootProject.version - java { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 - } - compileJava { - if (javaCompiler.get().metadata.languageVersion.canCompileOrRun(10)) { - options.release = 11 - } + options.release = 11 + options.compilerArgs += ['-Werror', '-Xlint:all'] } dependencies { - implementation 'commons-cli:commons-cli:1.9.0' - implementation 'commons-logging:commons-logging:1.3.5' + implementation 'commons-cli:commons-cli:1.11.0' + implementation 'commons-logging:commons-logging:1.3.6' - testImplementation platform('org.junit:junit-bom:5.13.1') + testImplementation platform('org.junit:junit-bom:6.0.3') testImplementation 'org.junit.jupiter:junit-jupiter' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' - testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'org.mockito:mockito-core:5.18.0' + testImplementation 'org.assertj:assertj-core:3.27.7' + testImplementation 'org.mockito:mockito-core:5.23.0' testImplementation 'uk.org.webcompere:system-stubs-jupiter:2.1.8' testImplementation 'org.hamcrest:hamcrest-library:3.0' @@ -79,18 +87,14 @@ subprojects { spotless { java { removeUnusedImports() - palantirJavaFormat('2.67.0').formatJavadoc(true) + palantirJavaFormat().formatJavadoc(true) formatAnnotations() } } } -task printVersionName() { - println rootProject.version -} - // Get the date in the reverse format for sorting -def getDate() { +static def getDate() { def date = new Date() def formattedDate = date.format('yyyyMMdd') return formattedDate diff --git a/ci/azure-pipelines.yml b/ci/azure-pipelines.yml deleted file mode 100644 index 57986c2d..00000000 --- a/ci/azure-pipelines.yml +++ /dev/null @@ -1,228 +0,0 @@ -# Copyright IBM Corp. All Rights Reserved. -# -# SPDX-License-Identifier: Apache-2.0 -# -# fabric-chaincode-java azure pipeline configuration. -# -name: $(SourceBranchName)-$(Date:yyyyMMdd)$(Rev:.rrr) - -# Daily build for final quality -# cf https://crontab.guru/#0_23_*_*_* -schedules: - - cron: "0 10,12,14,16,23 * * *" - displayName: "Chaincode Java Nightly Driver" - branches: - include: - - main - -trigger: - branches: - include: - - "release-2.5" - tags: - include: - - "*" - -# These are custom defined variables, the pipeline one is currently used for the build scripts -# to know to produce tests results in XML format for Azure to consume, for developers -# this isn't set so command line output is given -# -# Chaincode_Java_Creds is the protected group of keys for publishing -# -variables: - - group: Chaincode_Java_Creds - - group: Github-PackageRegistry-Credentials - - group: JARSigningPublish - - name: component - value: fabric-chaincode-java - - name: pipeline - value: ci - - name: PUSH_VERSION - value: stable - - name: FABRIC_VERSION - value: 2.5-stable - -pool: - vmImage: "ubuntu-latest" - -# The stages and jobs, potential for rationalization and optimization -# Keeping it simple and explicit whilst we gain experience -# -stages: - - stage: Build_and_test - jobs: - - job: displayenv - steps: - - template: templates/build-data.yml - - job: main - steps: - - task: Gradle@2 - inputs: - workingDirectory: "" - gradleWrapperFile: "gradlew" - gradleOptions: "-Xmx3072m" - javaHomeOption: "JDKVersion" - jdkVersionOption: "1.8" - jdkArchitectureOption: "x64" - options: "-x javadoc -x :fabric-chaincode-integration-test:test" - publishJUnitResults: true - testResultsFiles: "$(System.DefaultWorkingDirectory)/**/TEST-*.xml" - tasks: "build" - - task: PublishBuildArtifacts@1 - condition: or(succeeded(), failed()) - inputs: - pathToPublish: fabric-chaincode-shim/build/reports/checkstyle/ - artifactName: checkstylereport - displayName: 'Checkstyle' - continueOnError: true - - task: PublishBuildArtifacts@1 - condition: or(succeeded(), failed()) - inputs: - pathToPublish: fabric-chaincode-shim/build/reports/jacoco/ - artifactName: coveragereport - displayName: 'JaCoCo Coverage' - continueOnError: true - - task: PublishTestResults@2 - inputs: - testResultsFormat: 'JUnit' - testResultsFiles: 'fabric-chaincode-shim/build/reports/dependency-check-junit.xml' - mergeTestResults: true - failTaskOnFailedTests: false - testRunTitle: OWASP Dependency Check - displayName: 'Publish OWASP Dependency Check JUnit results' - - task: CopyFiles@2 - inputs: - contents: | - fabric-chaincode-shim/build/reports/dependency-check-*.* - targetFolder: $(Build.ArtifactStagingDirectory)/dependency-check - displayName: 'Collect OWASP Dependency Check results' - - task: PublishBuildArtifacts@1 - inputs: - pathToPublish: $(Build.ArtifactStagingDirectory)/dependency-check - artifactName: 'Dependency Check Report' - displayName: 'Publish full OWASP Dependency Check result' - - task: PublishCodeCoverageResults@1 - inputs: - summaryFileLocation: "$(System.DefaultWorkingDirectory)/**/fabric-chaincode-shim/build/reports/jacoco/test/jacocoTestReport.xml" - # Copy the built artifacts to the staging directory, tgz, and the docker image - - script: | - set -ev - ./gradlew -Psigning.keyId=${SIGNING_ID} -Psigning.password=${SIGNING_PASSWORD} -Psigning.secretKeyRingFile=${KEYRING_FILE} publishShimJarPublicationToMavenLocal - tar -zcvf localmaven.tgz ${HOME}/.m2/repository/org/hyperledger - docker image save hyperledger/fabric-javaenv | gzip > $(Build.ArtifactStagingDirectory)/fabric-javaenv.tar.gz - displayName: 'Package tgz and docker image' - - task: PublishBuildArtifacts@1 - inputs: - pathToPublish: localmaven.tgz - artifactName: java-tgz - - task: PublishBuildArtifacts@1 - inputs: - pathToPublish: $(Build.ArtifactStagingDirectory)/fabric-javaenv.tar.gz - artifactName: javaenv-docker-image - - - job: javadoc - dependsOn: displayenv - variables: - ${{ if eq(variables['Build.SourceBranch'], 'refs/heads/main') }}: - javadoc_release: main - ${{ if ne(variables['Build.SourceBranch'], 'refs/heads/main') }}: - javadoc_release: $[format('release-{0}',dependencies.displayenv.outputs['BuildData.MINOR_PACKAGE_VERSION'])] - steps: - - script: ./gradlew javadoc - displayName: 'Build JavaDoc' - - script: | - if [ -d docs ]; then - mkdir gh-pages - cp -r docs/* gh-pages - fi - displayName: 'Copy gh-pages doc' - condition: eq(variables['Build.SourceBranch'], 'refs/heads/main') - - script: | - git fetch origin - git checkout -b gh-pages origin/gh-pages - mkdir -p $(javadoc_release)/api - rm -rf $(javadoc_release)/api/* - cp -r fabric-chaincode-shim/build/docs/javadoc/* $(javadoc_release)/api - - # if the gh-pages is present from the previous script, then copy across the files across. - if [ -d gh-pages ]; then - find . -maxdepth 1 ! \( -name [.]* -o -name 'gh-pages' -o -name 'main' -o -name 'release-*' \) -exec rm -rf {} \; - cp -r gh-pages/* . - rm -rf gh-pages - fi - displayName: 'Update gh-pages branch' - - script: | - git config --global user.email "hlfdev.azp@gmail.com" - git config --global user.name "Hyperledger Bot" - git add -A - git commit -m "Publishing GitHub Pages" - git push https://$(GITHUB-PAT)@github.com/hyperledger/fabric-chaincode-java.git gh-pages - displayName: 'Commit gh-pages changes' - condition: and(succeeded(),eq(variables['Build.Reason'], 'IndividualCI')) - - # As the next script is more complex and uses loops, run this discretely in a sh file - # Publishing step for git tags - - stage: Publish_tag - condition: and(succeeded('Build_and_test'), startsWith(variables['Build.SourceBranch'], 'refs/tags')) - jobs: - - job: docker_publish - steps: - - template: templates/build-data.yml - - task: DownloadPipelineArtifact@2 - inputs: - artifact: javaenv-docker-image - path: $(Build.SourcesDirectory)/build - - script: | - wget -qO "$PWD/manifest-tool" https://github.com/estesp/manifest-tool/releases/download/v1.0.0/manifest-tool-linux-amd64 - chmod +x ./manifest-tool - - docker image load --input build/fabric-javaenv.tar.gz - docker images - docker login ${DOCKER_REGISTRY_URL} --username=${DOCKER_REGISTRY_USERNAME} --password=${DOCKER_REGISTRY_PASSWORD} - echo "Logged in to docker registry" - # tag javaenv image to PACKAGE_VERSION - docker tag hyperledger/fabric-javaenv hyperledger/fabric-javaenv:amd64-$(BuildData.PACKAGE_VERSION) - # push javaenv to repository - docker push hyperledger/fabric-javaenv:amd64-$(BuildData.PACKAGE_VERSION) - ./manifest-tool push from-args --platforms linux/amd64 --template "hyperledger/fabric-javaenv:amd64-$(BuildData.PACKAGE_VERSION)" --target "hyperledger/fabric-javaenv:$(BuildData.PACKAGE_VERSION)" - ./manifest-tool push from-args --platforms linux/amd64 --template "hyperledger/fabric-javaenv:amd64-$(BuildData.PACKAGE_VERSION)" --target "hyperledger/fabric-javaenv:$(BuildData.MINOR_PACKAGE_VERSION)" - env: - DOCKER_REGISTRY_USERNAME: $(DockerHub-Username) - DOCKER_REGISTRY_PASSWORD: $(DockerHub-Password) - - job: jar_publish - steps: - - template: templates/build-data.yml - - task: DownloadSecureFile@1 - name: keyring - inputs: - secureFile: secring.gpg - - script: | - ./gradlew -Psigning.keyId=${SIGNING_ID} -Psigning.password=${SIGNING_PASSWORD} -Psigning.secretKeyRingFile=${KEYRING_FILE} -PossrhUsername=${OSSRH_USER} -PossrhPassword=${OSSRH_PASSWORD} publishAllPublicationsToReleaseRepository - ./gradlew -Psigning.keyId=${SIGNING_ID} -Psigning.password=${SIGNING_PASSWORD} -Psigning.secretKeyRingFile=${KEYRING_FILE} -PossrhUsername=${OSSRH_USER} -PossrhPassword=${OSSRH_PASSWORD} publishAllPublicationsToSnapshotRepository - env: - SIGNING_ID: $(JAR-Signing-Id) - SIGNING_PASSWORD: $(JAR-Signing-Password) - KEYRING_FILE: $(keyring.secureFilePath) - OSSRH_USER: $(OSSRH-User) - OSSRH_PASSWORD: $(OSSRH-Password) - - # will re-enable when we get a proper userid/password - # - stage: Publish_tag_nightly - # condition: and(succeeded('Build_and_test'), eq(variables['Build.Reason'], 'Schedule')) # only run on the scheduled builds - # jobs: - # - job: jar_publish - # steps: - # - template: templates/build-data.yml - # - task: DownloadSecureFile@1 - # name: keyring - # inputs: - # secureFile: secring.gpg - # - script: | - # ./gradlew -PNIGHTLY=true -Psigning.keyId=${SIGNING_ID} -Psigning.password=${SIGNING_PASSWORD} -Psigning.secretKeyRingFile=${KEYRING_FILE} -PartifactoryUsername=${ARTIFACTORY_USER} -PartifactoryhPassword=${ARTIFACTORY_PASSWORD} publishAllPublicationsToReleaseRepository - # ./gradlew -PNIGHTLY=true -Psigning.keyId=${SIGNING_ID} -Psigning.password=${SIGNING_PASSWORD} -Psigning.secretKeyRingFile=${KEYRING_FILE} -PartifactoryUsername=${ARTIFACTORY_USER} -PartifactoryhPassword=${ARTIFACTORY_PASSWORD} publishAllPublicationsToSnapshotRepository - # env: - # SIGNING_ID: $(JAR-Signing-Id) - # SIGNING_PASSWORD: $(JAR-Signing-Password) - # KEYRING_FILE: $(keyring.secureFilePath) - # ARTIFACTORY_USER: $(ARTIFACTORY-User) - # ARTIFACTORY_PASSWORD: $(ARTIFACTORY-Password) diff --git a/ci/publish_jar_nexus.sh b/ci/publish_jar_nexus.sh deleted file mode 100755 index 12ff7625..00000000 --- a/ci/publish_jar_nexus.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash -# -# SPDX-License-Identifier: Apache-2.0 -# - -# Exit on first error, print all commands. -set -e -set -o pipefail -WORKSPACE="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." && pwd )" - -function abort { - echo "!! Exiting shell script" - echo "!!" "$1" - exit -1 -} - -for binary in shim; do -echo "Pushing fabric-chaincode-$binary.$PUSH_VERSION.jar to maven releases.." -cp $WORKSPACE/fabric-chaincode-$binary/build/libs/fabric-chaincode-$binary-$PUSH_VERSION.jar $WORKSPACE/fabric-chaincode-$binary/build/libs/fabric-chaincode-$binary.$PUSH_VERSION.jar -mvn org.apache.maven.plugins:maven-deploy-plugin:deploy-file \ - -DupdateReleaseInfo=true \ - -Dfile=$WORKSPACE/fabric-chaincode-$binary/build/libs/fabric-chaincode-$binary.$PUSH_VERSION.jar \ - -DpomFile=$WORKSPACE/fabric-chaincode-$binary/build/publications/"$binary"Jar/pom-default.xml \ - -DrepositoryId=hyperledger-releases \ - -Durl=https://nexus.hyperledger.org/content/repositories/releases/ \ - -DgroupId=org.hyperledger.fabric-chaincode-java \ - -Dversion=$PUSH_VERSION \ - -DartifactId=fabric-chaincode-$binary \ - -DgeneratePom=false \ - -DuniqueVersion=false \ - -Dpackaging=jar \ - -gs $GLOBAL_SETTINGS_FILE -s $SETTINGS_FILE -done \ No newline at end of file diff --git a/ci/templates/build-data.yml b/ci/templates/build-data.yml deleted file mode 100644 index ead7e0bc..00000000 --- a/ci/templates/build-data.yml +++ /dev/null @@ -1,16 +0,0 @@ -steps: -- script: | - env | sort - java -version - # handle full version number - VERSION=$(./gradlew -q printVersionName | head -n 1 | cut -d'-' -f1) - VERSION=${VERSION// } - echo Current version in code is :${VERSION}: - echo "##vso[task.setvariable variable=PACKAGE_VERSION;isOutput=true]${VERSION}" - # handle minor version - MINOR_VERSION=$(echo $VERSION | sed 's/^\([0-9]\{1,\}\.[0-9]\{1,\}\)\..*/\1/') - MINOR_VERSION=${MINOR_VERSION// } - echo Current minor version in code is :${MINOR_VERSION}: - echo "##vso[task.setvariable variable=MINOR_PACKAGE_VERSION;isOutput=true]${MINOR_VERSION}" - name: BuildData - displayName: 'Build data' diff --git a/examples/fabric-contract-example-as-service/Dockerfile b/examples/fabric-contract-example-as-service/Dockerfile index 8e21e344..519bfe15 100644 --- a/examples/fabric-contract-example-as-service/Dockerfile +++ b/examples/fabric-contract-example-as-service/Dockerfile @@ -4,7 +4,7 @@ # Example multi-stage dockerfile for Java Chaincode # the first stage -FROM gradle:8-jdk21 AS gradle_build +FROM gradle:9-jdk21 AS gradle_build # copy the build.gradle and src code to the container COPY src/ src/ @@ -15,7 +15,7 @@ RUN gradle build shadowJar # the second stage of our build just needs the compiled files -FROM eclipse-temurin:21-jre +FROM eclipse-temurin:25-jre # copy only the artifacts we need from the first stage and discard the rest COPY --from=gradle_build /home/gradle/build/libs/chaincode.jar /chaincode.jar diff --git a/examples/fabric-contract-example-as-service/build.gradle b/examples/fabric-contract-example-as-service/build.gradle index a8d36524..49803130 100644 --- a/examples/fabric-contract-example-as-service/build.gradle +++ b/examples/fabric-contract-example-as-service/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'com.gradleup.shadow' version '8.3.6' + id 'com.gradleup.shadow' version '9.3.1' id 'java' } @@ -13,11 +13,12 @@ repositories { } dependencies { - implementation 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.5.5' - implementation 'org.json:json:20250517' - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.1' - testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'org.mockito:mockito-core:5.18.0' + implementation 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.5.10' + implementation 'org.json:json:20251224' + testImplementation platform('org.junit:junit-bom:6.0.2') + testImplementation 'org.junit.jupiter:junit-jupiter' + testImplementation 'org.assertj:assertj-core:3.27.7' + testImplementation 'org.mockito:mockito-core:5.21.0' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } @@ -25,6 +26,7 @@ shadowJar { archiveBaseName = 'chaincode' archiveVersion = '' archiveClassifier = '' + duplicatesStrategy = DuplicatesStrategy.INCLUDE mergeServiceFiles() manifest { diff --git a/examples/fabric-contract-example-gradle-kotlin/build.gradle.kts b/examples/fabric-contract-example-gradle-kotlin/build.gradle.kts index 92917bed..8be62e3b 100644 --- a/examples/fabric-contract-example-gradle-kotlin/build.gradle.kts +++ b/examples/fabric-contract-example-gradle-kotlin/build.gradle.kts @@ -5,8 +5,8 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar plugins { - id("com.github.johnrengelman.shadow") version "8.1.1" - id("org.jetbrains.kotlin.jvm") version "1.9.22" + id("com.gradleup.shadow") version "9.3.1" + id("org.jetbrains.kotlin.jvm") version "2.2.21" } @@ -14,12 +14,12 @@ plugins { version = "0.0.1" dependencies { - implementation("org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.5.5") + implementation("org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.5.10") implementation("org.json:json:20250517") implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") - testImplementation("org.junit.jupiter:junit-jupiter:5.13.1") - testImplementation("com.nhaarman.mockitokotlin2:mockito-kotlin:2.1.0") + testImplementation("org.junit.jupiter:junit-jupiter:6.0.1") + testImplementation("com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0") } repositories { @@ -34,6 +34,7 @@ tasks { archiveBaseName = "chaincode" archiveVersion = "" archiveClassifier = "" + duplicatesStrategy = DuplicatesStrategy.INCLUDE mergeServiceFiles() manifest { attributes(mapOf("Main-Class" to "org.hyperledger.fabric.contract.ContractRouter")) diff --git a/examples/fabric-contract-example-gradle/build.gradle b/examples/fabric-contract-example-gradle/build.gradle index a4b82222..84a8faa7 100644 --- a/examples/fabric-contract-example-gradle/build.gradle +++ b/examples/fabric-contract-example-gradle/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'com.gradleup.shadow' version '8.3.6' + id 'com.gradleup.shadow' version '9.3.1' id 'java' } @@ -13,17 +13,20 @@ repositories { } dependencies { - compile 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.5.5' - compile 'org.json:json:20250517' - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.1' - testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'org.mockito:mockito-core:5.18.0' + implementation 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.5.10' + implementation 'org.json:json:20251224' + testImplementation platform('org.junit:junit-bom:6.0.2') + testImplementation 'org.junit.jupiter:junit-jupiter' + testImplementation 'org.assertj:assertj-core:3.27.7' + testImplementation 'org.mockito:mockito-core:5.21.0' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } shadowJar { archiveBaseName = 'chaincode' archiveVersion = '' archiveClassifier = '' + duplicatesStrategy = DuplicatesStrategy.INCLUDE mergeServiceFiles() manifest { diff --git a/examples/fabric-contract-example-maven/pom.xml b/examples/fabric-contract-example-maven/pom.xml index 41d2202f..20aba6a7 100644 --- a/examples/fabric-contract-example-maven/pom.xml +++ b/examples/fabric-contract-example-maven/pom.xml @@ -12,15 +12,11 @@ UTF-8 - 2.5.5 + 2.5.10 - 1.5.15 - 1.7.5 - - - 5.13.1 - 1.13.1 + 1.6.1 + 2.0.18 @@ -31,7 +27,19 @@ - + + + + org.junit + junit-bom + 6.1.2 + pom + import + + + + + @@ -69,56 +77,48 @@ org.junit.jupiter junit-jupiter-api - ${junit.jupiter.version} compile org.junit.jupiter junit-jupiter-params - ${junit.jupiter.version} test org.junit.jupiter junit-jupiter-engine - ${junit.jupiter.version} test - - - org.mockito - mockito-core - 5.18.0 - - - + + org.mockito + mockito-core + 5.23.0 + org.json json - 20231013 + 20260719 src - maven-surefire-plugin - 2.22.0 + 3.5.6 maven-compiler-plugin - 3.1 + 3.15.0 - ${java.version} - ${java.version} + ${java.version} org.apache.maven.plugins maven-shade-plugin - 3.1.0 + 3.6.2 package diff --git a/examples/ledger-api/build.gradle b/examples/ledger-api/build.gradle index 8f94a9b2..ca37b00a 100644 --- a/examples/ledger-api/build.gradle +++ b/examples/ledger-api/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'com.gradleup.shadow' version '8.3.6' + id 'com.gradleup.shadow' version '9.3.1' id 'java' } @@ -13,17 +13,20 @@ repositories { } dependencies { - compile 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.5.5' - compile 'org.json:json:20250517' - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.1' - testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'org.mockito:mockito-core:5.18.0' + implementation 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.5.10' + implementation 'org.json:json:20251224' + testImplementation platform('org.junit:junit-bom:6.0.2') + testImplementation 'org.junit.jupiter:junit-jupiter' + testImplementation 'org.assertj:assertj-core:3.27.7' + testImplementation 'org.mockito:mockito-core:5.21.0' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } shadowJar { archiveBaseName = 'chaincode' archiveVersion = '' archiveClassifier = '' + duplicatesStrategy = DuplicatesStrategy.INCLUDE mergeServiceFiles() manifest { diff --git a/fabric-chaincode-docker/Dockerfile b/fabric-chaincode-docker/Dockerfile index eeaf4303..c68f6c1c 100644 --- a/fabric-chaincode-docker/Dockerfile +++ b/fabric-chaincode-docker/Dockerfile @@ -1,34 +1,34 @@ -ARG JAVA_IMAGE=eclipse-temurin:21-jdk +ARG JAVA_IMAGE=eclipse-temurin:25-jdk FROM ${JAVA_IMAGE} AS builder -ENV DEBIAN_FRONTEND=noninteractive -# Build tools RUN apt-get update \ - && apt-get -y install zip unzip \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* + && apt-get install -y curl zip unzip RUN curl -s "https://get.sdkman.io" | bash SHELL ["/bin/bash", "-c"] -RUN source /root/.sdkman/bin/sdkman-init.sh \ - && sdk install gradle 8.14.2 \ - && sdk install maven 3.9.10 +RUN . /root/.sdkman/bin/sdkman-init.sh \ + && sdk install gradle 9.5.1 \ + && sdk install maven 3.9.15 FROM ${JAVA_IMAGE} AS dependencies -COPY --from=builder /root/.sdkman/candidates/gradle/current /usr/bin/gradle -COPY --from=builder /root/.sdkman/candidates/maven/current /usr/bin/maven +COPY --from=builder /root/.sdkman/candidates/gradle/current /opt/gradle +COPY --from=builder /root/.sdkman/candidates/maven/current /opt/maven SHELL ["/bin/bash", "-c"] -ENV PATH="/usr/bin/maven/bin:/usr/bin/maven/:/usr/bin/gradle:/usr/bin/gradle/bin:${PATH}" +ENV PATH="/opt/maven/bin:/opt/gradle/bin:${PATH}" # Coping libs, scripts and sources -ADD build/distributions/ /root/ +COPY build/distributions/ /root/ #Creating folders structure -RUN mkdir -p /root/chaincode-java/chaincode/src /root/chaincode-java/chaincode/build/out +RUN mkdir -p \ + /root/chaincode-java/chaincode/src \ + /root/chaincode-java/chaincode/build/out \ + /root/chaincode-java/shim-src/fabric-chaincode-integration-test \ + /root/chaincode-java/shim-src/fabric-chaincode-docker #Making scripts runnable RUN chmod +x /root/chaincode-java/start /root/chaincode-java/build.sh @@ -48,10 +48,10 @@ RUN gradle \ WORKDIR /root/chaincode-java # Run the Gradle and Maven commands to generate the wrapper variants # of each tool -#Gradle doesn't run without settings.gradle file, so create one +# Gradle doesn't run without settings.gradle file, so create one RUN touch settings.gradle \ && gradle wrapper \ - && ./gradlew --version \ + && ./gradlew wrapper \ && mvn -N wrapper:wrapper # Creating final javaenv image which will include all required @@ -59,7 +59,7 @@ RUN touch settings.gradle \ FROM ${JAVA_IMAGE} RUN apt-get update \ - && apt-get -y install zip unzip \ + && apt-get install -y zip unzip \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* \ && mkdir -p /chaincode/input \ diff --git a/fabric-chaincode-docker/build.gradle b/fabric-chaincode-docker/build.gradle index b5dbbeb5..d381a4f1 100644 --- a/fabric-chaincode-docker/build.gradle +++ b/fabric-chaincode-docker/build.gradle @@ -5,7 +5,7 @@ */ plugins { - id 'com.bmuschko.docker-remote-api' version '9.4.0' + id 'com.bmuschko.docker-remote-api' version '10.0.0' } repositories { @@ -59,5 +59,5 @@ tasks.register('copyAllDeps', Copy) { tasks.register('buildImage', DockerBuildImage) { dependsOn copyAllDeps inputDir = project.file('Dockerfile').parentFile - images = ['hyperledger/fabric-javaenv', 'hyperledger/fabric-javaenv:2.5', 'hyperledger/fabric-javaenv:amd64-2.5.6', 'hyperledger/fabric-javaenv:amd64-latest'] + images = ['hyperledger/fabric-javaenv', 'hyperledger/fabric-javaenv:2.5', 'hyperledger/fabric-javaenv:2.5.11'] } diff --git a/fabric-chaincode-integration-test/build.gradle b/fabric-chaincode-integration-test/build.gradle index 240c506e..dc4ceeac 100644 --- a/fabric-chaincode-integration-test/build.gradle +++ b/fabric-chaincode-integration-test/build.gradle @@ -1,7 +1,7 @@ dependencies { implementation project(':fabric-chaincode-docker') implementation project(':fabric-chaincode-shim') - implementation 'org.json:json:20250517' + implementation 'org.json:json:20251224' } diff --git a/fabric-chaincode-integration-test/src/contracts/bare-gradle/build.gradle b/fabric-chaincode-integration-test/src/contracts/bare-gradle/build.gradle index e7479c5c..7d24b0b0 100644 --- a/fabric-chaincode-integration-test/src/contracts/bare-gradle/build.gradle +++ b/fabric-chaincode-integration-test/src/contracts/bare-gradle/build.gradle @@ -1,18 +1,13 @@ plugins { - id 'com.gradleup.shadow' version '8.3.6' + id 'com.gradleup.shadow' version '9.3.1' id 'java' } group 'org.hyperledger.fabric-chaincode-java' version '1.0-SNAPSHOT' -java { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 -} - compileJava { - options.compilerArgs.addAll(['--release', '11']) + options.release = 11 } repositories { @@ -23,7 +18,7 @@ repositories { } dependencies { - implementation 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.5.6' + implementation 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.5.11' implementation 'org.hyperledger.fabric:fabric-protos:0.3.7' } @@ -31,6 +26,7 @@ shadowJar { archiveBaseName = 'chaincode' archiveVersion = '' archiveClassifier = '' + duplicatesStrategy = DuplicatesStrategy.INCLUDE mergeServiceFiles() manifest { diff --git a/fabric-chaincode-integration-test/src/contracts/bare-maven/pom.xml b/fabric-chaincode-integration-test/src/contracts/bare-maven/pom.xml index fccbc9e0..3db8e6cb 100644 --- a/fabric-chaincode-integration-test/src/contracts/bare-maven/pom.xml +++ b/fabric-chaincode-integration-test/src/contracts/bare-maven/pom.xml @@ -12,7 +12,7 @@ UTF-8 - 2.5.6 + 2.5.11 @@ -22,11 +22,7 @@ https://www.jitpack.io - artifactory - https://hyperledger.jfrog.io/hyperledger/fabric-maven - - - localfabirc + localfabric file://${project.basedir}/repository @@ -47,7 +43,7 @@ maven-compiler-plugin - 3.11.0 + 3.15.0 ${java.version} @@ -55,7 +51,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.5.0 + 3.6.2 package diff --git a/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/build.gradle b/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/build.gradle index 97d99090..9b5145c1 100644 --- a/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/build.gradle +++ b/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/build.gradle @@ -1,18 +1,13 @@ plugins { - id 'com.gradleup.shadow' version '8.3.6' + id 'com.gradleup.shadow' version '9.3.1' id 'java' } group 'org.hyperledger.fabric-chaincode-java' version '' -java { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 -} - compileJava { - options.compilerArgs.addAll(['--release', '11']) + options.release = 11 } repositories { @@ -23,7 +18,7 @@ repositories { } dependencies { - implementation 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.5.6' + implementation 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.5.11' implementation 'org.hyperledger.fabric:fabric-protos:0.3.7' } @@ -31,6 +26,7 @@ shadowJar { archiveBaseName = 'chaincode' archiveVersion = '' archiveClassifier = '' + duplicatesStrategy = DuplicatesStrategy.INCLUDE mergeServiceFiles() manifest { diff --git a/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/gradle/wrapper/gradle-wrapper.jar b/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/gradle/wrapper/gradle-wrapper.jar index d64cd491..b1b8ef56 100644 Binary files a/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/gradle/wrapper/gradle-wrapper.jar and b/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/gradle/wrapper/gradle-wrapper.jar differ diff --git a/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/gradle/wrapper/gradle-wrapper.properties b/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/gradle/wrapper/gradle-wrapper.properties index e2847c82..df6a6ad7 100644 --- a/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/gradle/wrapper/gradle-wrapper.properties +++ b/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,9 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.1-bin.zip networkTimeout=10000 +retries=0 +retryBackOffMs=500 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/gradlew b/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/gradlew index 1aa94a42..b9bb139f 100755 --- a/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/gradlew +++ b/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/3d91ce3b8caaf77ad09f381f43615b715b53f72c/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -84,7 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -112,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -170,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -203,15 +203,14 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/gradlew.bat b/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/gradlew.bat index 7101f8e4..aa5f10b0 100644 --- a/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/gradlew.bat +++ b/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## @@ -21,8 +23,8 @@ @rem @rem ########################################################################## -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal +@rem Set local scope for the variables, and ensure extensions are enabled +setlocal EnableExtensions set DIRNAME=%~dp0 if "%DIRNAME%"=="" set DIRNAME=. @@ -49,7 +51,7 @@ echo. 1>&2 echo Please set the JAVA_HOME variable in your environment to match the 1>&2 echo location of your Java installation. 1>&2 -goto fail +"%COMSPEC%" /c exit 1 :findJavaFromJavaHome set JAVA_HOME=%JAVA_HOME:"=% @@ -63,30 +65,18 @@ echo. 1>&2 echo Please set the JAVA_HOME variable in your environment to match the 1>&2 echo location of your Java installation. 1>&2 -goto fail +"%COMSPEC%" /c exit 1 :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal +@rem endlocal doesn't take effect until after the line is parsed and variables are expanded +@rem which allows us to clear the local environment before executing the java command +endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel -:omega +:exitWithErrorLevel +@rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts +"%COMSPEC%" /c exit %ERRORLEVEL% diff --git a/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/build.gradle b/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/build.gradle index b59cca3c..68915bea 100644 --- a/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/build.gradle +++ b/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/build.gradle @@ -1,18 +1,13 @@ plugins { - id 'com.gradleup.shadow' version '8.3.6' + id 'com.gradleup.shadow' version '9.3.1' id 'java' } group 'org.hyperledger.fabric-chaincode-java' version '1.0-SNAPSHOT' -java { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 -} - compileJava { - options.compilerArgs.addAll(['--release', '11']) + options.release = 11 } repositories { @@ -23,16 +18,17 @@ repositories { } dependencies { - implementation 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.5.6' + implementation 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.5.11' implementation 'org.hyperledger.fabric:fabric-protos:0.3.7' implementation 'commons-logging:commons-logging:1.3.5' - implementation 'com.google.code.gson:gson:2.13.1' + implementation 'com.google.code.gson:gson:2.13.2' } shadowJar { archiveBaseName = 'chaincode' archiveVersion = '' archiveClassifier = '' + duplicatesStrategy = DuplicatesStrategy.INCLUDE mergeServiceFiles() manifest { diff --git a/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/gradle/wrapper/gradle-wrapper.jar b/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/gradle/wrapper/gradle-wrapper.jar index d64cd491..b1b8ef56 100644 Binary files a/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/gradle/wrapper/gradle-wrapper.jar and b/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/gradle/wrapper/gradle-wrapper.jar differ diff --git a/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/gradle/wrapper/gradle-wrapper.properties b/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/gradle/wrapper/gradle-wrapper.properties index e2847c82..df6a6ad7 100644 --- a/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/gradle/wrapper/gradle-wrapper.properties +++ b/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,9 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.1-bin.zip networkTimeout=10000 +retries=0 +retryBackOffMs=500 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/gradlew b/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/gradlew index 1aa94a42..b9bb139f 100755 --- a/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/gradlew +++ b/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/3d91ce3b8caaf77ad09f381f43615b715b53f72c/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -84,7 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -112,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -170,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -203,15 +203,14 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/gradlew.bat b/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/gradlew.bat index 7101f8e4..aa5f10b0 100644 --- a/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/gradlew.bat +++ b/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## @@ -21,8 +23,8 @@ @rem @rem ########################################################################## -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal +@rem Set local scope for the variables, and ensure extensions are enabled +setlocal EnableExtensions set DIRNAME=%~dp0 if "%DIRNAME%"=="" set DIRNAME=. @@ -49,7 +51,7 @@ echo. 1>&2 echo Please set the JAVA_HOME variable in your environment to match the 1>&2 echo location of your Java installation. 1>&2 -goto fail +"%COMSPEC%" /c exit 1 :findJavaFromJavaHome set JAVA_HOME=%JAVA_HOME:"=% @@ -63,30 +65,18 @@ echo. 1>&2 echo Please set the JAVA_HOME variable in your environment to match the 1>&2 echo location of your Java installation. 1>&2 -goto fail +"%COMSPEC%" /c exit 1 :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal +@rem endlocal doesn't take effect until after the line is parsed and variables are expanded +@rem which allows us to clear the local environment before executing the java command +endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel -:omega +:exitWithErrorLevel +@rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts +"%COMSPEC%" /c exit %ERRORLEVEL% diff --git a/fabric-chaincode-integration-test/src/contracts/wrapper-maven/.mvn/wrapper/maven-wrapper.jar b/fabric-chaincode-integration-test/src/contracts/wrapper-maven/.mvn/wrapper/maven-wrapper.jar index 7967f30d..eebc3c18 100644 Binary files a/fabric-chaincode-integration-test/src/contracts/wrapper-maven/.mvn/wrapper/maven-wrapper.jar and b/fabric-chaincode-integration-test/src/contracts/wrapper-maven/.mvn/wrapper/maven-wrapper.jar differ diff --git a/fabric-chaincode-integration-test/src/contracts/wrapper-maven/.mvn/wrapper/maven-wrapper.properties b/fabric-chaincode-integration-test/src/contracts/wrapper-maven/.mvn/wrapper/maven-wrapper.properties index 9548abd8..cbe629eb 100644 --- a/fabric-chaincode-integration-test/src/contracts/wrapper-maven/.mvn/wrapper/maven-wrapper.properties +++ b/fabric-chaincode-integration-test/src/contracts/wrapper-maven/.mvn/wrapper/maven-wrapper.properties @@ -1,20 +1,4 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -wrapperVersion=3.3.2 +wrapperVersion=3.3.4 distributionType=bin -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.2/maven-wrapper-3.3.2.jar +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.15/apache-maven-3.9.15-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.4/maven-wrapper-3.3.4.jar diff --git a/fabric-chaincode-integration-test/src/contracts/wrapper-maven/mvnw b/fabric-chaincode-integration-test/src/contracts/wrapper-maven/mvnw index 5e9618ca..1ddd97b9 100755 --- a/fabric-chaincode-integration-test/src/contracts/wrapper-maven/mvnw +++ b/fabric-chaincode-integration-test/src/contracts/wrapper-maven/mvnw @@ -19,7 +19,7 @@ # ---------------------------------------------------------------------------- # ---------------------------------------------------------------------------- -# Apache Maven Wrapper startup batch script, version 3.3.2 +# Apache Maven Wrapper startup batch script, version 3.3.4 # # Required ENV vars: # ------------------ @@ -201,6 +201,14 @@ MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} export MAVEN_PROJECTBASEDIR log "$MAVEN_PROJECTBASEDIR" +trim() { + # MWRAPPER-139: + # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. + # Needed for removing poorly interpreted newline sequences when running in more + # exotic environments such as mingw bash on Windows. + printf "%s" "${1}" | tr -d '[:space:]' +} + ########################################################################################## # Extension to allow automatically downloading the maven-wrapper.jar from Maven-central # This allows using the maven wrapper in projects that prohibit checking in binary data. @@ -212,15 +220,13 @@ else log "Couldn't find $wrapperJarPath, downloading it ..." if [ -n "$MVNW_REPOURL" ]; then - wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.3.2/maven-wrapper-3.3.2.jar" + wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.3.4/maven-wrapper-3.3.4.jar" else - wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.2/maven-wrapper-3.3.2.jar" + wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.4/maven-wrapper-3.3.4.jar" fi while IFS="=" read -r key value; do - # Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' ) - safeValue=$(echo "$value" | tr -d '\r') case "$key" in wrapperUrl) - wrapperUrl="$safeValue" + wrapperUrl=$(trim "${value-}") break ;; esac @@ -235,17 +241,17 @@ else log "Found wget ... using wget" [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet" if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + wget ${QUIET:+"$QUIET"} "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" else - wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + wget ${QUIET:+"$QUIET"} --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" fi elif command -v curl >/dev/null; then log "Found curl ... using curl" [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent" if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + curl ${QUIET:+"$QUIET"} -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" else - curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + curl ${QUIET:+"$QUIET"} --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" fi else log "Falling back to using Java to download" @@ -276,7 +282,7 @@ fi wrapperSha256Sum="" while IFS="=" read -r key value; do case "$key" in wrapperSha256Sum) - wrapperSha256Sum=$value + wrapperSha256Sum=$(trim "${value-}") break ;; esac @@ -284,7 +290,7 @@ done <"$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" if [ -n "$wrapperSha256Sum" ]; then wrapperSha256Result=false if command -v sha256sum >/dev/null; then - if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c >/dev/null 2>&1; then + if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c - >/dev/null 2>&1; then wrapperSha256Result=true fi elif command -v shasum >/dev/null; then diff --git a/fabric-chaincode-integration-test/src/contracts/wrapper-maven/mvnw.cmd b/fabric-chaincode-integration-test/src/contracts/wrapper-maven/mvnw.cmd index 1204076a..c453424c 100644 --- a/fabric-chaincode-integration-test/src/contracts/wrapper-maven/mvnw.cmd +++ b/fabric-chaincode-integration-test/src/contracts/wrapper-maven/mvnw.cmd @@ -18,7 +18,7 @@ @REM ---------------------------------------------------------------------------- @REM ---------------------------------------------------------------------------- -@REM Apache Maven Wrapper startup batch script, version 3.3.2 +@REM Apache Maven Wrapper startup batch script, version 3.3.4 @REM @REM Required ENV vars: @REM JAVA_HOME - location of a JDK home dir @@ -119,7 +119,7 @@ SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain -set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.2/maven-wrapper-3.3.2.jar" +set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.4/maven-wrapper-3.3.4.jar" FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B @@ -133,7 +133,7 @@ if exist %WRAPPER_JAR% ( ) ) else ( if not "%MVNW_REPOURL%" == "" ( - SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.3.2/maven-wrapper-3.3.2.jar" + SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.3.4/maven-wrapper-3.3.4.jar" ) if "%MVNW_VERBOSE%" == "true" ( echo Couldn't find %WRAPPER_JAR%, downloading it ... diff --git a/fabric-chaincode-integration-test/src/contracts/wrapper-maven/pom.xml b/fabric-chaincode-integration-test/src/contracts/wrapper-maven/pom.xml index 894443ea..b4d20115 100644 --- a/fabric-chaincode-integration-test/src/contracts/wrapper-maven/pom.xml +++ b/fabric-chaincode-integration-test/src/contracts/wrapper-maven/pom.xml @@ -12,7 +12,7 @@ UTF-8 - 2.5.6 + 2.5.11 @@ -47,7 +47,7 @@ maven-compiler-plugin - 3.11.0 + 3.15.0 ${java.version} @@ -55,7 +55,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.5.0 + 3.6.2 package diff --git a/fabric-chaincode-shim/build.gradle b/fabric-chaincode-shim/build.gradle index 896f86c8..2e4e8f03 100644 --- a/fabric-chaincode-shim/build.gradle +++ b/fabric-chaincode-shim/build.gradle @@ -6,41 +6,42 @@ plugins { id 'maven-publish' - id 'jacoco' id 'signing' + id 'jacoco' id 'pmd' + id 'com.gradleup.nmcp' } pmd { - toolVersion = '7.14.0' + toolVersion = '7.24.0' ruleSetFiles = files('../pmd-ruleset.xml') ruleSets = [] // explicitly set to empty to avoid using the default configuration ignoreFailures = false + consoleOutput = true } pmdTest.enabled = false -configurations { - runtimeClasspath { - resolutionStrategy.activateDependencyLocking() - } +dependencyLocking { + lockAllConfigurations() } -tasks.withType(org.gradle.api.tasks.testing.Test) { +tasks.withType(Test).configureEach { systemProperty 'CORE_CHAINCODE_LOGGING_LEVEL', 'DEBUG' } dependencies { - implementation platform('com.google.protobuf:protobuf-bom:4.31.1') - implementation platform('io.grpc:grpc-bom:1.73.0') - implementation platform('io.opentelemetry:opentelemetry-bom:1.51.0') + implementation platform('com.google.protobuf:protobuf-bom:4.34.1') + implementation platform('io.grpc:grpc-bom:1.81.0') + implementation platform('io.opentelemetry:opentelemetry-bom:1.62.0') + implementation platform("org.bouncycastle:bc-jdk18on-bom:1.84") implementation 'org.hyperledger.fabric:fabric-protos:0.3.7' - implementation 'org.bouncycastle:bcpkix-jdk18on:1.81' - implementation 'org.bouncycastle:bcprov-jdk18on:1.81' - implementation 'io.github.classgraph:classgraph:4.8.179' + implementation 'org.bouncycastle:bcpkix-jdk18on' + implementation 'org.bouncycastle:bcprov-jdk18on' + implementation 'io.github.classgraph:classgraph:4.8.184' implementation 'com.github.erosb:everit-json-schema:1.14.6' - implementation 'org.json:json:20250517' + implementation 'org.json:json:20251224' implementation 'com.google.protobuf:protobuf-java-util' implementation 'io.grpc:grpc-netty-shaded' @@ -49,14 +50,14 @@ dependencies { testImplementation 'io.grpc:grpc-inprocess' implementation 'io.opentelemetry:opentelemetry-api' - implementation 'io.opentelemetry.proto:opentelemetry-proto:1.7.0-alpha' + implementation 'io.opentelemetry.proto:opentelemetry-proto:1.10.0-alpha' implementation 'io.opentelemetry:opentelemetry-sdk' implementation 'io.opentelemetry:opentelemetry-sdk-extension-autoconfigure' implementation 'io.opentelemetry:opentelemetry-sdk-trace' implementation 'io.opentelemetry:opentelemetry-exporter-otlp' implementation 'io.opentelemetry:opentelemetry-extension-trace-propagators' - implementation 'io.opentelemetry.semconv:opentelemetry-semconv:1.32.0' - implementation 'io.opentelemetry.instrumentation:opentelemetry-grpc-1.6:2.16.0-alpha' + implementation 'io.opentelemetry.semconv:opentelemetry-semconv:1.41.1' + implementation 'io.opentelemetry.instrumentation:opentelemetry-grpc-1.6:2.27.0-alpha' } sourceSets { @@ -74,10 +75,6 @@ sourceSets { } -jacoco { - toolVersion = "0.8.12" -} - jacocoTestReport { afterEvaluate { classDirectories.from = files(classDirectories.files.collect { @@ -137,7 +134,7 @@ jacocoTestCoverageVerification { test.finalizedBy(jacocoTestReport) test.finalizedBy(jacocoTestCoverageVerification) -task licenseCheck { +tasks.register('licenseCheck') { group = "license" description = "Checks the License part of each source file" @@ -146,34 +143,37 @@ task licenseCheck { def missing = new LinkedList() sourceSets.forEach { sourceSet -> - sourceSet.allSource.findAll { !it.path.contains("build") && !(it.path.contains("test") && it.path.contains("resources"))}.each { + sourceSet.allSource.findAll { + !it.path.contains("build") && + !(it.path.contains("test") && it.path.contains("resources")) + }.each { file -> - if (!file.name.contains("json")){ - BufferedReader r = new BufferedReader(new FileReader(file)) - def line, hasSPDX = false, hasTraditional = false - while ((line = r.readLine()) != null) { - if (line.contains("SPDX-License-Identifier")) { - hasSPDX = true - break - } - if (line.contains("http://www.apache.org/licenses/LICENSE-2.0")) { - hasTraditional = true - break + if (!file.name.contains("json")) { + BufferedReader r = new BufferedReader(new FileReader(file)) + def line, hasSPDX = false, hasTraditional = false + while ((line = r.readLine()) != null) { + if (line.contains("SPDX-License-Identifier")) { + hasSPDX = true + break + } + if (line.contains("http://www.apache.org/licenses/LICENSE-2.0")) { + hasTraditional = true + break + } } - } - if (!hasSPDX) { - if (hasTraditional) { - noSPDX.add(file) - } else { - missing.add(file) + if (!hasSPDX) { + if (hasTraditional) { + noSPDX.add(file) + } else { + missing.add(file) + } } } - } } } if (noSPDX.isEmpty()) { - println "All remaining files have Apache 2.0 headers" + println "All remaining files have Apache 2.0 headers." } else { println "We are standardizing with the SPDX style license headers." println "The following files contain the traditional license headers which are still valid:" @@ -212,21 +212,17 @@ javadoc { classpath = sourceSets.main.runtimeClasspath - javadoc.options.addStringOption('Xdoclint:none', '-quiet') + options.addStringOption('Xdoclint:none', '-quiet') + options.addStringOption('Xwerror', '-quiet') options.overview = "src/main/java/org/hyperledger/fabric/overview.html" -} -if (JavaVersion.current().isJava8Compatible()) { - project.tasks.withType(Javadoc) { - options.addStringOption('Xdoclint:all', '-quiet') - options.addStringOption('Xwerror', '-quiet') - } } +def final stagingDeployUrl = layout.buildDirectory.dir('staging-deploy') publishing { - publications { - shim(MavenPublication) { + publications { + shim(MavenPublication) { groupId = project.group artifactId = project.name version = project.version @@ -235,10 +231,12 @@ publishing { name = 'JavaChaincodeShim' packaging = 'jar' description = 'Hyperledger Fabric Java Chaincode Shim' - url = 'http://www.hyperledger.org/' + url = 'https://hyperledger.github.io/fabric-chaincode-java/' scm { - url = 'https://github.com/hyperledger/fabric-chaincode-java.git' + connection = 'scm:git:https://github.com/hyperledger/fabric-chaincode-java.git' + developerConnection = 'scm:git:ssh://github.com:hyperledger/fabric-chaincode-java.git' + url = 'https://github.com/hyperledger/fabric-chaincode-java' } licenses { license { @@ -248,45 +246,24 @@ publishing { } developers { - developer { - id = 'gennadylaventman' - name = 'Gennady Laventman' - email = 'gennady@il.ibm.com' - } - developer { - id = 'luiss' - name = 'Luis Sanchez' - email = 'luiss@me.com' - } - developer { - id = 'C0rWin' - name = 'Artem Barger' - email = 'bartem@il.ibm.com' - } developer { id = 'denyeart' name = 'David Enyeart' email = 'enyeart@us.ibm.com' } + developer { + id = 'bestbeforetoday' + name = 'Mark S. Lewis' + email = 'Mark.S.Lewis@outlook.com' + } } } - } - - } - - repositories { - maven { - name = "release" - url = "https://oss.sonatype.org/service/local/staging/deploy/maven2/" - credentials { - username = project.findProperty('ossrhUsername') - password = project.findProperty('ossrhPassword') - } - } + } + repositories { maven { - name = "GitHubPackages" + name = "GitHub" url = "https://maven.pkg.github.com/hyperledger/fabric-chaincode-java" credentials { username = System.getenv("GITHUB_ACTOR") @@ -297,25 +274,24 @@ publishing { } signing { - println "Signing" - if (project.findProperty('signing.key')) { - def signingKey = project.findProperty('signing.key') - def signingPassword = project.findProperty('signing.password') - useInMemoryPgpKeys(signingKey, signingPassword) - - sign publishing.publications.shim - println "... signed" - } else { - println "... no keys to use " + def signingKey = findProperty('signingKey') + def signingPassword = findProperty('signingPassword') + useInMemoryPgpKeys(signingKey, signingPassword) + + required = { + gradle.taskGraph.hasTask(":${project.name}:publishShimPublicationToNmcpRepository") || + gradle.taskGraph.hasTask(":${project.name}:publishShimPublicationToGitHubRepository") } + + sign publishing.publications.shim } // Need to specify the sourcesJar task BEFORE the java{withSourcesJar()} so that it picks up the duplicatesStratergy // otherwise this fails with a duplicates error. // (see https://github.com/gradle/gradle/issues/17236) -task sourcesJar(type: Jar) { - duplicatesStrategy = 'include' +tasks.register('sourcesJar', Jar) { + duplicatesStrategy = DuplicatesStrategy.INCLUDE archiveClassifier = 'sources' from sourceSets.main.allSource } @@ -332,16 +308,16 @@ build.dependsOn licenseCheck import org.gradle.api.tasks.testing.logging.TestExceptionFormat import org.gradle.api.tasks.testing.logging.TestLogEvent -tasks.withType(Test) { +tasks.withType(Test).configureEach { environment "CORE_PEER_LOCALMSPID", "mymsp" testLogging { // set options for log level LIFECYCLE events TestLogEvent.FAILED, - TestLogEvent.PASSED, - TestLogEvent.SKIPPED, - TestLogEvent.STANDARD_OUT + TestLogEvent.PASSED, + TestLogEvent.SKIPPED, + TestLogEvent.STANDARD_OUT exceptionFormat = TestExceptionFormat.FULL showExceptions = true showCauses = true @@ -350,22 +326,23 @@ tasks.withType(Test) { // set options for log level DEBUG and INFO debug { events TestLogEvent.STARTED, - TestLogEvent.FAILED, - TestLogEvent.PASSED, - TestLogEvent.SKIPPED, - TestLogEvent.STANDARD_ERROR, - TestLogEvent.STANDARD_OUT + TestLogEvent.FAILED, + TestLogEvent.PASSED, + TestLogEvent.SKIPPED, + TestLogEvent.STANDARD_ERROR, + TestLogEvent.STANDARD_OUT exceptionFormat = TestExceptionFormat.FULL } info.events = debug.events info.exceptionFormat = debug.exceptionFormat - afterSuite { desc, result -> + afterSuite {desc, result -> if (!desc.parent) { // will match the outermost suite def output = "Results: ${result.resultType} (${result.testCount} tests, ${result.successfulTestCount} successes, ${result.failedTestCount} failures, ${result.skippedTestCount} skipped)" def startItem = '| ', endItem = ' |' def repeatLength = startItem.length() + output.length() + endItem.length() - println('\n' + ('-' * repeatLength) + '\n' + startItem + output + endItem + '\n' + ('-' * repeatLength)) + println('\n' + ('-' * repeatLength) + '\n' + startItem + output + endItem + '\n' + + ('-' * repeatLength)) } } } diff --git a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/Logger.java b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/Logger.java index 35720635..4e8a6e4a 100644 --- a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/Logger.java +++ b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/Logger.java @@ -14,11 +14,15 @@ /** Logger class to use throughout the Contract Implementation. */ public class Logger extends java.util.logging.Logger { + /** + * Subclasses must ensure that a parent logger is set appropriately, for example: + * + *

{@code logger.setParent(java.util.logging.Logger.getLogger("org.hyperledger.fabric"))} + * + * @param name A name for the logger. + */ protected Logger(final String name) { super(name, null); - - // ensure that the parent logger is set - super.setParent(java.util.logging.Logger.getLogger("org.hyperledger.fabric")); } /** @@ -26,7 +30,9 @@ protected Logger(final String name) { * @return Logger */ public static Logger getLogger(final String name) { - return new Logger(name); + Logger result = new Logger(name); + result.setParent(java.util.logging.Logger.getLogger("org.hyperledger.fabric")); + return result; } /** @param msgSupplier */ diff --git a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/contract/ContractRouter.java b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/contract/ContractRouter.java index d7b6f9e5..f8a4232c 100644 --- a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/contract/ContractRouter.java +++ b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/contract/ContractRouter.java @@ -102,7 +102,7 @@ void startRouting() { } } - @SuppressWarnings("PMD.AvoidCatchingThrowable") + @SuppressWarnings("PMD.AvoidCatchingGenericException") private Response processRequest(final ChaincodeStub stub) { LOGGER.info(() -> "Got invoke routing request"); try { diff --git a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/contract/execution/JSONTransactionSerializer.java b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/contract/execution/JSONTransactionSerializer.java index ac2e33b9..c6dd1b92 100644 --- a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/contract/execution/JSONTransactionSerializer.java +++ b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/contract/execution/JSONTransactionSerializer.java @@ -26,7 +26,12 @@ /** Used as the default serialisation for transmission from SDK to Contract. */ @Serializer() -@SuppressWarnings({"PMD.GodClass", "PMD.AvoidLiteralsInIfCondition", "PMD.AvoidDuplicateLiterals"}) +@SuppressWarnings({ + "PMD.GodClass", + "PMD.AvoidLiteralsInIfCondition", + "PMD.AvoidDuplicateLiterals", + "PMD.AvoidDeeplyNestedIfStmts" +}) public class JSONTransactionSerializer implements SerializerInterface { private static final Logger LOGGER = Logger.getLogger(JSONTransactionSerializer.class.getName()); private final TypeRegistry typeRegistry = TypeRegistry.getRegistry(); diff --git a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/contract/routing/impl/SerializerRegistryImpl.java b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/contract/routing/impl/SerializerRegistryImpl.java index 99a41e03..ecd406e8 100644 --- a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/contract/routing/impl/SerializerRegistryImpl.java +++ b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/contract/routing/impl/SerializerRegistryImpl.java @@ -8,6 +8,7 @@ import io.github.classgraph.ClassGraph; import io.github.classgraph.ClassInfo; import io.github.classgraph.ScanResult; +import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -41,15 +42,20 @@ public SerializerInterface getSerializer(final String name, final Serializer.TAR return contents.get(key); } - private SerializerInterface add( - final String name, final Serializer.TARGET target, final Class clazz) + private void add(final String name, final Serializer.TARGET target, final Class clazz) throws InstantiationException, IllegalAccessException { LOGGER.debug(() -> "Adding new Class " + clazz.getCanonicalName() + " for " + target); final String key = name + ":" + target; - final SerializerInterface newObj = clazz.newInstance(); - this.contents.put(key, newObj); - - return newObj; + try { + final SerializerInterface newObj = + (SerializerInterface) clazz.getDeclaredConstructor().newInstance(); + this.contents.put(key, newObj); + } catch (InvocationTargetException | NoSuchMethodException e) { + InstantiationException wrapper = new InstantiationException( + "Exception constructing " + clazz.getCanonicalName() + ": " + e.getMessage()); + wrapper.addSuppressed(e); + throw wrapper; + } } /** @@ -67,10 +73,10 @@ public void findAndSetContents() throws InstantiationException, IllegalAccessExc final Set seenClass = new HashSet<>(); try (ScanResult scanResult = classGraph.scan()) { - for (final ClassInfo classInfo : - scanResult.getClassesWithAnnotation(this.ANNOTATION_CLASS.getCanonicalName())) { + for (final ClassInfo classInfo : scanResult.getClassesWithAnnotation(ANNOTATION_CLASS.getCanonicalName())) { LOGGER.debug(() -> "Found class with contract annotation: " + classInfo.getName()); - final Class cls = (Class) classInfo.loadClass(); + + final Class cls = classInfo.loadClass(); LOGGER.debug("Loaded class"); final String className = cls.getCanonicalName(); diff --git a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/ledger/impl/LedgerImpl.java b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/ledger/impl/LedgerImpl.java index 5d204ba2..347c516e 100644 --- a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/ledger/impl/LedgerImpl.java +++ b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/ledger/impl/LedgerImpl.java @@ -16,7 +16,6 @@ public final class LedgerImpl implements Ledger { * * @param ctx Context transactional context to use */ - @SuppressWarnings("PMD.UnusedFormalParameter") public LedgerImpl(final Context ctx) { // Empty stub } diff --git a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ChaincodeBase.java b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ChaincodeBase.java index a90e6bda..b0831498 100644 --- a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ChaincodeBase.java +++ b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ChaincodeBase.java @@ -202,7 +202,7 @@ public void onNext(final ChaincodeMessage chaincodeMessage) { @Override public void onError(final Throwable t) { LOGGER.severe( - () -> "An error occured on the chaincode stream. Shutting down the chaincode stream." + () -> "An error occurred on the chaincode stream. Shutting down the chaincode stream." + Logging.formatError(t)); chaincodeSupportClient.shutdown(itm); @@ -257,7 +257,7 @@ public void onNext(final ChaincodeMessage chaincodeMessage) { @Override public void onError(final Throwable t) { - LOGGER.severe(() -> "An error occured on the chaincode stream. Shutting down the chaincode stream." + LOGGER.severe(() -> "An error occurred on the chaincode stream. Shutting down the chaincode stream." + Logging.formatError(t)); chaincodeSupportClient.shutdown(itm); diff --git a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ChaincodeServerProperties.java b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ChaincodeServerProperties.java index 8197be59..865c9381 100644 --- a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ChaincodeServerProperties.java +++ b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ChaincodeServerProperties.java @@ -41,7 +41,7 @@ public ChaincodeServerProperties() { * @param permitKeepAliveWithoutCalls whether clients are allowed to send keep-alive HTTP/2 PINGs even if there are * no outstanding RPCs on the connection. */ - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.NullAssignment"}) + @SuppressWarnings({"PMD.NullAssignment"}) public ChaincodeServerProperties( final int portChaincodeServer, final int maxInboundMetadataSize, diff --git a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/NettyGrpcServer.java b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/NettyGrpcServer.java index 00e7c2ac..ac88b9a0 100644 --- a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/NettyGrpcServer.java +++ b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/NettyGrpcServer.java @@ -70,7 +70,6 @@ public NettyGrpcServer(final ChaincodeBase chaincodeBase, final ChaincodeServerP LOGGER.info("PermitKeepAliveTimeMinutes:" + chaincodeServerProperties.getPermitKeepAliveTimeMinutes()); LOGGER.info("KeepAliveTimeMinutes:" + chaincodeServerProperties.getKeepAliveTimeMinutes()); LOGGER.info("PermitKeepAliveWithoutCalls:" + chaincodeServerProperties.getPermitKeepAliveWithoutCalls()); - LOGGER.info("KeyPassword:" + chaincodeServerProperties.getKeyPassword()); LOGGER.info("KeyCertChainFile:" + chaincodeServerProperties.getKeyCertChainFile()); LOGGER.info("KeyFile:" + chaincodeServerProperties.getKeyFile()); LOGGER.info("isTlsEnabled:" + chaincodeServerProperties.isTlsEnabled()); diff --git a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ext/sbe/impl/StateBasedEndorsementImpl.java b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ext/sbe/impl/StateBasedEndorsementImpl.java index 56cae1a0..0cc6b08e 100644 --- a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ext/sbe/impl/StateBasedEndorsementImpl.java +++ b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ext/sbe/impl/StateBasedEndorsementImpl.java @@ -52,7 +52,7 @@ public byte[] policy() { @Override public void addOrgs(final RoleType role, final String... organizations) { MSPRoleType mspRole; - if (RoleType.RoleTypeMember.equals(role)) { + if (RoleType.RoleTypeMember == role) { mspRole = MSPRoleType.MEMBER; } else { mspRole = MSPRoleType.PEER; @@ -78,7 +78,7 @@ public List listOrgs() { private void setMSPIDsFromSP(final SignaturePolicyEnvelope spe) { spe.getIdentitiesList().stream() - .filter(identity -> Classification.ROLE.equals(identity.getPrincipalClassification())) + .filter(identity -> Classification.ROLE == identity.getPrincipalClassification()) .forEach(this::addOrg); } diff --git a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/impl/ChaincodeInvocationTask.java b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/impl/ChaincodeInvocationTask.java index 1f502b36..38865e2d 100644 --- a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/impl/ChaincodeInvocationTask.java +++ b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/impl/ChaincodeInvocationTask.java @@ -96,7 +96,7 @@ public ChaincodeMessage call() { // Call chaincode's invoke // Note in Fabric v2, there won't be any INIT - if (this.type.equals(Type.INIT)) { + if (this.type == Type.INIT) { result = chaincode.init(stub); } else { result = chaincode.invoke(stub); diff --git a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/impl/InvocationStubImpl.java b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/impl/InvocationStubImpl.java index ec0b1ffc..bab0febe 100644 --- a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/impl/InvocationStubImpl.java +++ b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/impl/InvocationStubImpl.java @@ -66,7 +66,7 @@ class InvocationStubImpl implements ChaincodeStub { private static final String UNSPECIFIED_END_KEY = ""; private static final Logger LOGGER = Logger.getLogger(InvocationStubImpl.class.getName()); - public static final String MAX_UNICODE_RUNE = "\udbff\udfff"; + private static final String MAX_UNICODE_RUNE = "\udbff\udfff"; private static final String CORE_PEER_LOCALMSPID = "CORE_PEER_LOCALMSPID"; private static final Function diff --git a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/impl/QueryResultsIteratorImpl.java b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/impl/QueryResultsIteratorImpl.java index 89350204..fdddfb75 100644 --- a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/impl/QueryResultsIteratorImpl.java +++ b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/impl/QueryResultsIteratorImpl.java @@ -107,7 +107,7 @@ public T next() { } @Override - public void close() throws Exception { + public void close() { final ByteString requestPayload = QueryStateClose.newBuilder() .setId(currentQueryResponse.getId()) diff --git a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ledger/QueryResultsIterator.java b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ledger/QueryResultsIterator.java index e31dfcb6..f37b6cab 100644 --- a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ledger/QueryResultsIterator.java +++ b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ledger/QueryResultsIterator.java @@ -12,4 +12,7 @@ * * @param the type of elements returned by the iterator */ -public interface QueryResultsIterator extends Iterable, AutoCloseable {} +public interface QueryResultsIterator extends Iterable, AutoCloseable { + @Override + void close(); +} diff --git a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ledger/QueryResultsIteratorWithMetadata.java b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ledger/QueryResultsIteratorWithMetadata.java index b5c45cfa..9bed89aa 100644 --- a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ledger/QueryResultsIteratorWithMetadata.java +++ b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ledger/QueryResultsIteratorWithMetadata.java @@ -18,4 +18,7 @@ public interface QueryResultsIteratorWithMetadata extends Iterable, AutoCloseable { /** @return Query Metadata */ QueryResponseMetadata getMetadata(); + + @Override + void close(); } diff --git a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/traces/impl/OpenTelemetryTracesProvider.java b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/traces/impl/OpenTelemetryTracesProvider.java index 4801ebe3..a834af04 100644 --- a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/traces/impl/OpenTelemetryTracesProvider.java +++ b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/traces/impl/OpenTelemetryTracesProvider.java @@ -67,6 +67,6 @@ public Span createSpan(final ChaincodeStub stub) { @Override public ClientInterceptor createInterceptor() { - return grpcTracer.newClientInterceptor(); + return grpcTracer.createClientInterceptor(); } } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index a4b76b95..b1b8ef56 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ff23a68d..df6a6ad7 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,9 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.1-bin.zip networkTimeout=10000 +retries=0 +retryBackOffMs=500 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index f5feea6d..b9bb139f 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -57,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/3d91ce3b8caaf77ad09f381f43615b715b53f72c/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -86,8 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -115,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -173,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -206,15 +203,14 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 9b42019c..aa5f10b0 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -23,8 +23,8 @@ @rem @rem ########################################################################## -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal +@rem Set local scope for the variables, and ensure extensions are enabled +setlocal EnableExtensions set DIRNAME=%~dp0 if "%DIRNAME%"=="" set DIRNAME=. @@ -51,7 +51,7 @@ echo. 1>&2 echo Please set the JAVA_HOME variable in your environment to match the 1>&2 echo location of your Java installation. 1>&2 -goto fail +"%COMSPEC%" /c exit 1 :findJavaFromJavaHome set JAVA_HOME=%JAVA_HOME:"=% @@ -65,30 +65,18 @@ echo. 1>&2 echo Please set the JAVA_HOME variable in your environment to match the 1>&2 echo location of your Java installation. 1>&2 -goto fail +"%COMSPEC%" /c exit 1 :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +@rem endlocal doesn't take effect until after the line is parsed and variables are expanded +@rem which allows us to clear the local environment before executing the java command +endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +:exitWithErrorLevel +@rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts +"%COMSPEC%" /c exit %ERRORLEVEL% diff --git a/scripts/changelog.sh b/scripts/changelog.sh deleted file mode 100755 index b74634c4..00000000 --- a/scripts/changelog.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh -# -# Copyright IBM Corp. All Rights Reserved. -# -# SPDX-License-Identifier: Apache-2.0 -# -set -ev - -PREVIOUS_TAG=$1 -NEW_VERSION=$2 - -: ${PREVIOUS_TAG:?} -: ${NEW_VERSION:?} - -echo "## ${NEW_VERSION}" >> CHANGELOG.new -echo "$(date)" >> CHANGELOG.new -echo "" >> CHANGELOG.new -git log ${PREVIOUS_TAG}..HEAD --oneline | grep -v Merge | sed -e "s/\[\{0,1\}\(FAB[^0-9]*-[0-9]*\)\]\{0,1\}/\[\1\](https:\/\/jira.hyperledger.org\/browse\/\1\)/" -e "s/\([0-9|a-z]*\)/* \[\1\](https:\/\/github.com\/hyperledger\/fabric-chaincode-java\/commit\/\1)/" >> CHANGELOG.new -echo "" >> CHANGELOG.new -cat CHANGELOG.md >> CHANGELOG.new -mv -f CHANGELOG.new CHANGELOG.md - diff --git a/scripts/gittag.sh b/scripts/gittag.sh deleted file mode 100755 index c41fd806..00000000 --- a/scripts/gittag.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash -# -# SPDX-License-Identifier: Apache-2.0 -# - -# Exit on first error, print all commands. -set -e -set -o pipefail -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." && pwd )" - -# release name -RELEASE=release-1.4 - -function abort { - echo "!! Exiting shell script" - echo "!!" "$1" - exit -1 -} - -# Run printVersionName task in the root directory, grab the first line and remove anything after the version number -VERSION=$(cd ../ && ./gradlew -q printVersionName | head -n 1 | cut -d'-' -f1) - -echo New version string will be v${VERSION} - -# do the release notes for this new version exist? -if [[ -f "${DIR}/release_notes/v${VERSION}.txt" ]]; then - echo "Release notes exist, hope they make sense!" -else - abort "No releases notes under the file ${DIR}/release_notes/v${NEW_VERSION}.txt exist"; -fi - -git checkout "${RELEASE}" -git pull -git tag -a "v${VERSION}" `git log -n 1 --pretty=oneline | head -c7` -F release_notes/"v${VERSION}".txt -git push origin v${VERSION} HEAD:refs/heads/${RELEASE} \ No newline at end of file diff --git a/scripts/multiarch.sh b/scripts/multiarch.sh deleted file mode 100755 index 5795a46f..00000000 --- a/scripts/multiarch.sh +++ /dev/null @@ -1,81 +0,0 @@ -#!/bin/sh -# -# Copyright IBM Corp. All Rights Reserved. -# -# SPDX-License-Identifier: Apache-2.0 -# - -usage() { - echo "Usage: $0 " - echo " and credentials for the repository" - echo "ENV:" - echo " NS=$NS" - echo " VERSION=$VERSION" - echo " TWO_DIGIT_VERSION=$TWO_DIGIT_VERSION" - exit 1 -} - -missing() { - echo "Error: some image(s) missing from registry" - echo "ENV:" - echo " NS=$NS" - echo " VERSION=$VERSION" - echo " TWO_DIGIT_VERSION=$TWO_DIGIT_VERSION" - exit 1 -} - -failed() { - echo "Error: multiarch manifest push failed" - echo "ENV:" - echo " NS=$NS" - echo " VERSION=$VERSION" - echo " TWO_DIGIT_VERSION=$TWO_DIGIT_VERSION" - exit 1 -} - -USER=${1:-nobody} -PASSWORD=${2:-nohow} -NS=${NS:-hyperledger} -VERSION=${BASE_VERSION:-1.3.0} -TWO_DIGIT_VERSION=${TWO_DIGIT_VERSION:-1.3} - -if [ "$#" -ne 2 ]; then - usage -fi - -# verify that manifest-tool is installed and found on PATH -which manifest-tool -if [ "$?" -ne 0 ]; then - echo "manifest-tool not installed or not found on PATH" - exit 1 -fi - -IMAGES="fabric-javaenv" - -# check that all images have been published -for image in ${IMAGES}; do - docker pull ${NS}/${image}:amd64-${VERSION} || missing -done - -# push the multiarch manifest and tag with just $VERSION and 'latest' -for image in ${IMAGES}; do - manifest-tool --username ${USER} --password ${PASSWORD} push from-args\ - --platforms linux/amd64 --template "${NS}/${image}:ARCH-${VERSION}"\ - --target "${NS}/${image}:${VERSION}" -# manifest-tool --username ${USER} --password ${PASSWORD} push from-args\ -# --platforms linux/amd64 --template "${NS}/${image}:ARCH-${VERSION}"\ -# --target "${NS}/${image}:latest" - manifest-tool --username ${USER} --password ${PASSWORD} push from-args\ - --platforms linux/amd64 --template "${NS}/${image}:ARCH-${VERSION}"\ - --target "${NS}/${image}:${TWO_DIGIT_VERSION}" -done - -# test that manifest is working as expected -for image in ${IMAGES}; do - docker pull ${NS}/${image}:${VERSION} || failed - docker pull ${NS}/${image}:${TWO_DIGIT_VERSION} || failed -# docker pull ${NS}/${image}:latest || failed -done - -echo "Successfully pushed multiarch manifest" -exit 0 diff --git a/scripts/verify-commit.sh b/scripts/verify-commit.sh deleted file mode 100755 index 0fb1dcd8..00000000 --- a/scripts/verify-commit.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/bash -ue - -# -# SPDX-License-Identifier: Apache-2.0 -############################################################################## -# Copyright (c) 2018 IBM Corporation, The Linux Foundation and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License 2.0 -# which accompanies this distribution, and is available at -# https://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -# This script makes several basic commit message validations. -# This is with the purpose of keeping up with the aesthetics of our code. -# Verify if the commit message contains JIRA URLs. -# its-jira pluggin attempts to process jira links and breaks. - -set +ue # Temporarily ignore any errors - -set -o pipefail -echo "----> verify-commit.sh" - -if git rev-list --format=%B --max-count=1 HEAD | grep -io 'http[s]*://jira\..*' > /dev/null ; then - echo 'Error: Remove JIRA URLs from commit message' - echo 'Add jira references as: Issue: -, instead of URLs' - exit 1 -fi - -# Check for trailing white-space (tab or spaces) in any files that were changed -#commit_files=$(git diff-tree --name-only -r HEAD~2..HEAD) -commit_files=$(find ./fabric-chaincode-shim/src -name *.java) - -found_trailing=false -for filename in $commit_files; do - if [[ $(file -b $filename) == "ASCII text"* ]]; then - if egrep -q "\s$" $filename; then - found_trailing=true - echo "Error: Trailing white spaces found in file: $filename" - fi - fi -done - -#if $found_trailing; then -# echo "#### filename:line-num:line ####" -# egrep -n "\s$" $commit_files -# exit 1 -#fi \ No newline at end of file