From 39f7c7b20942ab70ce76034169f4664dafc9ef9a Mon Sep 17 00:00:00 2001 From: Andres Almiray Date: Fri, 30 Sep 2022 19:44:03 +0200 Subject: [PATCH] feat(core): Add a WorkflowListener extension. Resolves #968 --- .../extensions/api/ExtensionPoint.java | 5 +- .../api/workflow/WorkflowAdapter.java | 112 +++++ .../api/workflow/WorkflowListener.java | 165 ++++++++ .../workflow/WorkflowListenerException.java | 35 ++ .../model/api/announce/Announcer.java | 2 + .../jreleaser/model/api/deploy/Deployer.java | 2 + .../model/api/deploy/maven/MavenDeployer.java | 2 + .../model/api/hooks/ExecutionEvent.java | 14 +- .../org/jreleaser/bundle/Messages.properties | 1 + .../announcers/ArticleAnnouncer.java | 23 +- .../AbstractAssemblerProcessor.java | 8 +- .../AbstractJavaAssemblerProcessor.java | 6 +- .../assemblers/ArchiveAssemblerProcessor.java | 2 +- .../ArchiveAssemblerProcessorFactory.java | 2 +- .../jreleaser/assemblers/AssemblerUtils.java | 2 +- .../assemblers/JlinkAssemblerProcessor.java | 2 +- .../JlinkAssemblerProcessorFactory.java | 2 +- .../JpackageAssemblerProcessor.java | 2 +- .../JpackageAssemblerProcessorFactory.java | 2 +- .../NativeImageAssemblerProcessor.java | 2 +- .../NativeImageAssemblerProcessorFactory.java | 2 +- .../jreleaser/engine/announce/Announcers.java | 56 ++- .../engine/assemble/AssemblerProcessors.java | 6 +- .../jreleaser/engine/assemble/Assemblers.java | 40 +- .../assemble/DistributionAssembler.java | 8 +- .../engine/context/ModelValidator.java | 2 +- .../deploy/maven/ArtifactDeployers.java | 6 +- .../engine/deploy/maven/MavenDeployers.java | 43 +- .../distribution/DistributionProcessor.java | 46 ++- .../engine/distribution/Distributions.java | 130 +++++- .../engine/download/ArtifactDownloaders.java | 6 +- .../engine/download/Downloaders.java | 43 +- .../engine/download/ProjectDownloader.java | 12 +- .../engine/hooks/CommandHookExecutor.java | 2 +- .../jreleaser/engine/release/Releasers.java | 40 +- .../engine/upload/ArtifactUploaders.java | 6 +- .../engine/upload/ProjectUploader.java | 12 +- .../jreleaser/engine/upload/Uploaders.java | 43 +- .../packagers/AbstractPackagerProcessor.java | 2 +- .../AbstractRepositoryPackagerProcessor.java | 8 +- .../AbstractTemplatePackagerProcessor.java | 2 +- .../packagers/AppImagePackagerProcessor.java | 4 +- .../packagers/AsdfPackagerProcessor.java | 2 +- .../packagers/BrewPackagerProcessor.java | 2 +- .../ChocolateyPackagerProcessor.java | 2 +- .../packagers/FlatpakPackagerProcessor.java | 2 +- .../packagers/JbangPackagerProcessor.java | 2 +- .../packagers/MacportsPackagerProcessor.java | 2 +- .../packagers/ScoopPackagerProcessor.java | 2 +- .../packagers/SnapPackagerProcessor.java | 2 +- .../workflow/AbstractWorkflowItem.java | 5 + .../workflow/PackageWorkflowItem.java | 5 +- .../workflow/PrepareWorkflowItem.java | 5 +- .../workflow/PublishWorkflowItem.java | 5 +- .../org/jreleaser/workflow/WorkflowImpl.java | 119 +++++- .../org/jreleaser/workflow/WorkflowItem.java | 3 + .../impl/DefaultExtensionManager.java | 11 +- .../model/internal/JReleaserContext.java | 185 ++++++++- .../internal/announce/AbstractAnnouncer.java | 2 +- .../model/internal/announce/Announcer.java | 4 +- .../internal/announce/ArticleAnnouncer.java | 8 +- .../internal/announce/DiscordAnnouncer.java | 8 +- .../announce/DiscussionsAnnouncer.java | 8 +- .../internal/announce/GitterAnnouncer.java | 8 +- .../announce/GoogleChatAnnouncer.java | 8 +- .../internal/announce/HttpAnnouncer.java | 8 +- .../internal/announce/HttpAnnouncers.java | 8 +- .../internal/announce/MastodonAnnouncer.java | 8 +- .../announce/MattermostAnnouncer.java | 8 +- .../internal/announce/SdkmanAnnouncer.java | 8 +- .../internal/announce/SlackAnnouncer.java | 8 +- .../internal/announce/SmtpAnnouncer.java | 8 +- .../internal/announce/TeamsAnnouncer.java | 8 +- .../internal/announce/TelegramAnnouncer.java | 8 +- .../internal/announce/TwitterAnnouncer.java | 8 +- .../internal/announce/WebhookAnnouncer.java | 8 +- .../internal/announce/WebhooksAnnouncer.java | 8 +- .../internal/announce/ZulipAnnouncer.java | 8 +- .../internal/assemble/AbstractAssembler.java | 2 +- .../assemble/AbstractJavaAssembler.java | 2 +- .../internal/assemble/ArchiveAssembler.java | 3 +- .../model/internal/assemble/Assembler.java | 4 +- .../internal/assemble/JavaAssembler.java | 2 +- .../internal/assemble/JlinkAssembler.java | 3 +- .../internal/assemble/JpackageAssembler.java | 3 +- .../assemble/NativeImageAssembler.java | 3 +- .../model/internal/deploy/Deployer.java | 4 +- .../deploy/maven/AbstractMavenDeployer.java | 2 +- .../maven/ArtifactoryMavenDeployer.java | 8 +- .../deploy/maven/GiteaMavenDeployer.java | 8 +- .../deploy/maven/GithubMavenDeployer.java | 8 +- .../deploy/maven/GitlabMavenDeployer.java | 8 +- .../model/internal/deploy/maven/Maven.java | 4 +- .../internal/deploy/maven/MavenDeployer.java | 2 +- .../deploy/maven/Nexus2MavenDeployer.java | 8 +- .../internal/distributions/Distribution.java | 6 +- .../internal/download/AbstractDownloader.java | 2 +- .../download/AbstractSshDownloader.java | 2 +- .../model/internal/download/Download.java | 4 +- .../model/internal/download/Downloader.java | 4 +- .../internal/download/FtpDownloader.java | 3 +- .../internal/download/HttpDownloader.java | 3 +- .../internal/download/ScpDownloader.java | 3 +- .../internal/download/SftpDownloader.java | 3 +- .../internal/download/SshDownloader.java | 2 +- .../internal/packagers/AbstractPackager.java | 2 +- .../packagers/AbstractRepositoryPackager.java | 2 +- .../packagers/AbstractTemplatePackager.java | 2 +- .../internal/packagers/AppImagePackager.java | 3 +- .../internal/packagers/AsdfPackager.java | 3 +- .../internal/packagers/BrewPackager.java | 3 +- .../packagers/ChocolateyPackager.java | 3 +- .../internal/packagers/DockerPackager.java | 3 +- .../internal/packagers/FlatpakPackager.java | 3 +- .../internal/packagers/GofishPackager.java | 3 +- .../internal/packagers/JbangPackager.java | 3 +- .../internal/packagers/MacportsPackager.java | 3 +- .../model/internal/packagers/Packager.java | 4 +- .../packagers/RepositoryPackager.java | 2 +- .../internal/packagers/ScoopPackager.java | 3 +- .../internal/packagers/SdkmanPackager.java | 3 +- .../internal/packagers/SnapPackager.java | 3 +- .../internal/packagers/SpecPackager.java | 3 +- .../internal/packagers/TemplatePackager.java | 2 +- .../model/internal/release/BaseReleaser.java | 2 +- .../internal/release/CodebergReleaser.java | 49 ++- .../internal/release/GenericGitReleaser.java | 3 +- .../model/internal/release/GiteaReleaser.java | 3 +- .../internal/release/GithubReleaser.java | 3 +- .../internal/release/GitlabReleaser.java | 3 +- .../model/internal/release/Release.java | 2 +- .../model/internal/release/Releaser.java | 4 +- .../internal/upload/AbstractSshUploader.java | 2 +- .../internal/upload/AbstractUploader.java | 2 +- .../internal/upload/AbstractWebUploader.java | 2 +- .../internal/upload/ArtifactoryUploader.java | 3 +- .../model/internal/upload/FtpUploader.java | 3 +- .../model/internal/upload/GiteaUploader.java | 4 +- .../model/internal/upload/GitlabUploader.java | 3 +- .../model/internal/upload/HttpUploader.java | 3 +- .../model/internal/upload/S3Uploader.java | 3 +- .../model/internal/upload/ScpUploader.java | 3 +- .../model/internal/upload/SftpUploader.java | 3 +- .../model/internal/upload/SshUploader.java | 2 +- .../model/internal/upload/Upload.java | 10 +- .../model/internal/upload/Uploader.java | 4 +- .../model/internal/upload/WebUploader.java | 2 +- .../model/spi/announce/Announcer.java | 4 +- .../spi/assemble/AssemblerProcessor.java | 6 +- .../assemble/AssemblerProcessorFactory.java | 2 +- .../model/spi/deploy/maven/MavenDeployer.java | 3 +- .../deploy/maven/MavenDeployerFactory.java | 4 +- .../spi/download/ArtifactDownloader.java | 2 +- .../download/ArtifactDownloaderFactory.java | 3 +- .../model/spi/release/AbstractReleaser.java | 4 +- .../jreleaser/model/spi/release/Releaser.java | 4 +- .../model/spi/upload/ArtifactUploader.java | 2 +- .../spi/upload/ArtifactUploaderFactory.java | 2 +- .../ArtifactoryArtifactUploader.java | 2 +- .../ArtifactoryArtifactUploaderFactory.java | 3 +- .../artifactory/ArtifactoryMavenDeployer.java | 2 +- .../ArtifactoryMavenDeployerFactory.java | 3 +- .../sdk/codeberg/CodebergReleaser.java | 382 +++++++++++++++++- .../sdk/discord/DiscordAnnouncer.java | 15 +- .../sdk/ftp/FtpArtifactDownloader.java | 2 +- .../sdk/ftp/FtpArtifactDownloaderFactory.java | 3 +- .../sdk/ftp/FtpArtifactUploader.java | 2 +- .../sdk/ftp/FtpArtifactUploaderFactory.java | 3 +- .../sdk/generic/git/GenericGitReleaser.java | 7 +- .../java/org/jreleaser/sdk/gitea/Gitea.java | 48 +-- .../sdk/gitea/GiteaArtifactUploader.java | 2 +- .../gitea/GiteaArtifactUploaderFactory.java | 3 +- .../sdk/gitea/GiteaMavenDeployer.java | 3 +- .../sdk/gitea/GiteaMavenDeployerFactory.java | 3 +- .../jreleaser/sdk/gitea/GiteaReleaser.java | 24 +- .../sdk/github/DiscussionsAnnouncer.java | 15 +- .../sdk/github/GithubMavenDeployer.java | 3 +- .../github/GithubMavenDeployerFactory.java | 3 +- .../jreleaser/sdk/github/GithubReleaser.java | 13 +- .../sdk/gitlab/GitlabArtifactUploader.java | 2 +- .../gitlab/GitlabArtifactUploaderFactory.java | 3 +- .../sdk/gitlab/GitlabMavenDeployer.java | 3 +- .../gitlab/GitlabMavenDeployerFactory.java | 3 +- .../jreleaser/sdk/gitlab/GitlabReleaser.java | 13 +- .../jreleaser/sdk/gitter/GitterAnnouncer.java | 15 +- .../sdk/googlechat/GoogleChatAnnouncer.java | 13 +- .../org/jreleaser/sdk/http/HttpAnnouncer.java | 116 +++--- .../sdk/http/HttpArtifactDownloader.java | 2 +- .../http/HttpArtifactDownloaderFactory.java | 3 +- .../sdk/http/HttpArtifactUploader.java | 3 +- .../sdk/http/HttpArtifactUploaderFactory.java | 3 +- .../commons/AbstractArtifactDownloader.java | 2 +- .../sdk/commons/AbstractArtifactUploader.java | 2 +- .../sdk/commons/AbstractMavenDeployer.java | 3 +- .../sdk/mastodon/MastodonAnnouncer.java | 15 +- .../sdk/mattermost/MattermostAnnouncer.java | 15 +- .../sdk/nexus2/Nexus2MavenDeployer.java | 3 +- .../nexus2/Nexus2MavenDeployerFactory.java | 3 +- .../jreleaser/sdk/s3/S3ArtifactUploader.java | 2 +- .../sdk/s3/S3ArtifactUploaderFactory.java | 3 +- .../jreleaser/sdk/sdkman/SdkmanAnnouncer.java | 19 +- .../jreleaser/sdk/slack/SlackAnnouncer.java | 15 +- .../org/jreleaser/sdk/smtp/SmtpAnnouncer.java | 15 +- .../sdk/ssh/ScpArtifactDownloader.java | 2 +- .../sdk/ssh/ScpArtifactDownloaderFactory.java | 3 +- .../sdk/ssh/ScpArtifactUploader.java | 2 +- .../sdk/ssh/ScpArtifactUploaderFactory.java | 3 +- .../sdk/ssh/SftpArtifactDownloader.java | 2 +- .../ssh/SftpArtifactDownloaderFactory.java | 3 +- .../sdk/ssh/SftpArtifactUploader.java | 2 +- .../sdk/ssh/SftpArtifactUploaderFactory.java | 3 +- .../jreleaser/sdk/teams/TeamsAnnouncer.java | 15 +- .../sdk/telegram/TelegramAnnouncer.java | 15 +- .../sdk/twitter/TwitterAnnouncer.java | 14 +- .../sdk/webhooks/WebhooksAnnouncer.java | 47 ++- .../jreleaser/sdk/zulip/ZulipAnnouncer.java | 15 +- 216 files changed, 2164 insertions(+), 506 deletions(-) create mode 100644 api/jreleaser-model-api/src/main/java/org/jreleaser/extensions/api/workflow/WorkflowAdapter.java create mode 100644 api/jreleaser-model-api/src/main/java/org/jreleaser/extensions/api/workflow/WorkflowListener.java create mode 100644 api/jreleaser-model-api/src/main/java/org/jreleaser/extensions/api/workflow/WorkflowListenerException.java diff --git a/api/jreleaser-model-api/src/main/java/org/jreleaser/extensions/api/ExtensionPoint.java b/api/jreleaser-model-api/src/main/java/org/jreleaser/extensions/api/ExtensionPoint.java index 2192616cf..58df65fac 100644 --- a/api/jreleaser-model-api/src/main/java/org/jreleaser/extensions/api/ExtensionPoint.java +++ b/api/jreleaser-model-api/src/main/java/org/jreleaser/extensions/api/ExtensionPoint.java @@ -17,6 +17,8 @@ */ package org.jreleaser.extensions.api; +import org.jreleaser.model.api.JReleaserContext; + import java.util.Map; /** @@ -29,9 +31,10 @@ public interface ExtensionPoint { /** * Initializes the extension point with values defined in the configuration DSL. * + * @param context the current execution context. * @param properties a {@code Map} of key/value pairs. */ - default void init(Map properties) { + default void init(JReleaserContext context, Map properties) { // noop } } diff --git a/api/jreleaser-model-api/src/main/java/org/jreleaser/extensions/api/workflow/WorkflowAdapter.java b/api/jreleaser-model-api/src/main/java/org/jreleaser/extensions/api/workflow/WorkflowAdapter.java new file mode 100644 index 000000000..351b123cb --- /dev/null +++ b/api/jreleaser-model-api/src/main/java/org/jreleaser/extensions/api/workflow/WorkflowAdapter.java @@ -0,0 +1,112 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright 2020-2022 The JReleaser authors. + * + * Licensed 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 + * + * https://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. + */ +package org.jreleaser.extensions.api.workflow; + +import org.jreleaser.model.api.JReleaserContext; +import org.jreleaser.model.api.announce.Announcer; +import org.jreleaser.model.api.assemble.Assembler; +import org.jreleaser.model.api.deploy.Deployer; +import org.jreleaser.model.api.distributions.Distribution; +import org.jreleaser.model.api.download.Downloader; +import org.jreleaser.model.api.hooks.ExecutionEvent; +import org.jreleaser.model.api.packagers.Packager; +import org.jreleaser.model.api.release.Releaser; +import org.jreleaser.model.api.upload.Uploader; + +/** + * Base implementation of the {@code WorkflowListener} interface. + * + * @author Andres Almiray + * @since 1.3.0 + */ +public class WorkflowAdapter implements WorkflowListener { + @Override + public boolean isContinueOnError() { + return false; + } + + @Override + public void onSessionStart(JReleaserContext context) { + + } + + @Override + public void onSessionEnd(JReleaserContext context) { + + } + + @Override + public void onWorkflowStep(ExecutionEvent event, JReleaserContext context) { + + } + + @Override + public void onAnnounceStep(ExecutionEvent event, JReleaserContext context, Announcer announcer) { + + } + + @Override + public void onAssembleStep(ExecutionEvent event, JReleaserContext context, Assembler assembler) { + + } + + @Override + public void onDeployStep(ExecutionEvent event, JReleaserContext context, Deployer deployer) { + + } + + @Override + public void onDownloadStep(ExecutionEvent event, JReleaserContext context, Downloader downloader) { + + } + + @Override + public void onUploadStep(ExecutionEvent event, JReleaserContext context, Uploader uploader) { + + } + + @Override + public void onReleaseStep(ExecutionEvent event, JReleaserContext context, Releaser releaser) { + + } + + @Override + public void onPackagerPrepareStep(ExecutionEvent event, JReleaserContext context, Distribution distribution, Packager packager) { + + } + + @Override + public void onPackagerPackageStep(ExecutionEvent event, JReleaserContext context, Distribution distribution, Packager packager) { + + } + + @Override + public void onPackagerPublishStep(ExecutionEvent event, JReleaserContext context, Distribution distribution, Packager packager) { + + } + + @Override + public void onDistributionStart(JReleaserContext context, Distribution distribution) { + + } + + @Override + public void onDistributionEnd(JReleaserContext context, Distribution distribution) { + + } +} diff --git a/api/jreleaser-model-api/src/main/java/org/jreleaser/extensions/api/workflow/WorkflowListener.java b/api/jreleaser-model-api/src/main/java/org/jreleaser/extensions/api/workflow/WorkflowListener.java new file mode 100644 index 000000000..53ed92e30 --- /dev/null +++ b/api/jreleaser-model-api/src/main/java/org/jreleaser/extensions/api/workflow/WorkflowListener.java @@ -0,0 +1,165 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright 2020-2022 The JReleaser authors. + * + * Licensed 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 + * + * https://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. + */ +package org.jreleaser.extensions.api.workflow; + +import org.jreleaser.extensions.api.ExtensionPoint; +import org.jreleaser.model.api.JReleaserContext; +import org.jreleaser.model.api.announce.Announcer; +import org.jreleaser.model.api.assemble.Assembler; +import org.jreleaser.model.api.deploy.Deployer; +import org.jreleaser.model.api.distributions.Distribution; +import org.jreleaser.model.api.download.Downloader; +import org.jreleaser.model.api.hooks.ExecutionEvent; +import org.jreleaser.model.api.packagers.Packager; +import org.jreleaser.model.api.release.Releaser; +import org.jreleaser.model.api.upload.Uploader; + +/** + * @author Andres Almiray + * @since 1.3.0 + */ +public interface WorkflowListener extends ExtensionPoint { + /** + * Signals JReleaser to halt execution if this listener fails. + * + * @return {@code false} to halt execution on failure, {@code true} to continue. + */ + boolean isContinueOnError(); + + /** + * Triggered when the execution session starts. + * + * @param context the execution context. + */ + void onSessionStart(JReleaserContext context); + + /** + * Triggered when the execution session ends. + * + * @param context the execution context. + */ + void onSessionEnd(JReleaserContext context); + + /** + * Triggered when a workflow step starts/ends/fails. + * + * @param event event metadata. + * @param context the execution context. + */ + void onWorkflowStep(ExecutionEvent event, JReleaserContext context); + + /** + * Triggered when an announcer starts/ends/fails. + * + * @param event event metadata. + * @param context the execution context. + * @param announcer the executing announcer. + */ + void onAnnounceStep(ExecutionEvent event, JReleaserContext context, Announcer announcer); + + /** + * Triggered when an assembler starts/ends/fails. + * + * @param event event metadata. + * @param context the execution context. + * @param assembler the executing assembler. + */ + void onAssembleStep(ExecutionEvent event, JReleaserContext context, Assembler assembler); + + /** + * Triggered when a deployer starts/ends/fails. + * + * @param event event metadata. + * @param context the execution context. + * @param deployer the executing deployer. + */ + void onDeployStep(ExecutionEvent event, JReleaserContext context, Deployer deployer); + + /** + * Triggered when a downloader starts/ends/fails. + * + * @param event event metadata. + * @param context the execution context. + * @param downloader the executing downloader. + */ + void onDownloadStep(ExecutionEvent event, JReleaserContext context, Downloader downloader); + + /** + * Triggered when an uploader starts/ends/fails. + * + * @param event event metadata. + * @param context the execution context. + * @param uploader the executing uploader. + */ + void onUploadStep(ExecutionEvent event, JReleaserContext context, Uploader uploader); + + /** + * Triggered when a releaser starts/ends/fails. + * + * @param event event metadata. + * @param context the execution context. + * @param releaser the executing releaser. + */ + void onReleaseStep(ExecutionEvent event, JReleaserContext context, Releaser releaser); + + /** + * Triggered when a distribution is about to be processed. + * + * @param context the execution context. + * @param distribution the distribution to be processed. + */ + void onDistributionStart(JReleaserContext context, Distribution distribution); + + /** + * Triggered when a distribution has been processed. + * + * @param context the execution context. + * @param distribution the processed distribution. + */ + void onDistributionEnd(JReleaserContext context, Distribution distribution); + + /** + * Triggered when a packager starts/ends/fails the preparing step. + * + * @param event event metadata. + * @param context the execution context. + * @param distribution the distribution to be processed. + * @param packager the executing packager. + */ + void onPackagerPrepareStep(ExecutionEvent event, JReleaserContext context, Distribution distribution, Packager packager); + + /** + * Triggered when a packager starts/ends/fails the packaging step. + * + * @param event event metadata. + * @param context the execution context. + * @param distribution the distribution to be processed. + * @param packager the executing packager. + */ + void onPackagerPackageStep(ExecutionEvent event, JReleaserContext context, Distribution distribution, Packager packager); + + /** + * Triggered when a packager starts/ends/fails the publishing step. + * + * @param event event metadata. + * @param context the execution context. + * @param distribution the distribution to be processed. + * @param packager the executing packager. + */ + void onPackagerPublishStep(ExecutionEvent event, JReleaserContext context, Distribution distribution, Packager packager); +} diff --git a/api/jreleaser-model-api/src/main/java/org/jreleaser/extensions/api/workflow/WorkflowListenerException.java b/api/jreleaser-model-api/src/main/java/org/jreleaser/extensions/api/workflow/WorkflowListenerException.java new file mode 100644 index 000000000..3f272b55e --- /dev/null +++ b/api/jreleaser-model-api/src/main/java/org/jreleaser/extensions/api/workflow/WorkflowListenerException.java @@ -0,0 +1,35 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright 2020-2022 The JReleaser authors. + * + * Licensed 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 + * + * https://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. + */ +package org.jreleaser.extensions.api.workflow; + +/** + * @author Andres Almiray + * @since 1.3.0 + */ +public class WorkflowListenerException extends Exception { + private final WorkflowListener listener; + + public WorkflowListenerException(WorkflowListener listener, RuntimeException cause) { + super(cause); + this.listener = listener; + } + + public WorkflowListener getListener() { + return listener; + } +} diff --git a/api/jreleaser-model-api/src/main/java/org/jreleaser/model/api/announce/Announcer.java b/api/jreleaser-model-api/src/main/java/org/jreleaser/model/api/announce/Announcer.java index c931b8f9e..dcf01227b 100644 --- a/api/jreleaser-model-api/src/main/java/org/jreleaser/model/api/announce/Announcer.java +++ b/api/jreleaser-model-api/src/main/java/org/jreleaser/model/api/announce/Announcer.java @@ -27,6 +27,8 @@ * @since 0.1.0 */ public interface Announcer extends Domain, Activatable, TimeoutAware, ExtraProperties { + String getType(); + String getName(); boolean isSnapshotSupported(); diff --git a/api/jreleaser-model-api/src/main/java/org/jreleaser/model/api/deploy/Deployer.java b/api/jreleaser-model-api/src/main/java/org/jreleaser/model/api/deploy/Deployer.java index 3af1ebc6f..2a98c7f64 100644 --- a/api/jreleaser-model-api/src/main/java/org/jreleaser/model/api/deploy/Deployer.java +++ b/api/jreleaser-model-api/src/main/java/org/jreleaser/model/api/deploy/Deployer.java @@ -26,6 +26,8 @@ * @since 1.3.0 */ public interface Deployer extends Domain, Activatable, ExtraProperties { + String getGroup(); + String getType(); String getName(); diff --git a/api/jreleaser-model-api/src/main/java/org/jreleaser/model/api/deploy/maven/MavenDeployer.java b/api/jreleaser-model-api/src/main/java/org/jreleaser/model/api/deploy/maven/MavenDeployer.java index 3fabbd828..7e5e3f8a0 100644 --- a/api/jreleaser-model-api/src/main/java/org/jreleaser/model/api/deploy/maven/MavenDeployer.java +++ b/api/jreleaser-model-api/src/main/java/org/jreleaser/model/api/deploy/maven/MavenDeployer.java @@ -28,6 +28,8 @@ * @since 1.3.0 */ public interface MavenDeployer extends Deployer, TimeoutAware { + String GROUP = "maven"; + String getUrl(); String getUsername(); diff --git a/api/jreleaser-model-api/src/main/java/org/jreleaser/model/api/hooks/ExecutionEvent.java b/api/jreleaser-model-api/src/main/java/org/jreleaser/model/api/hooks/ExecutionEvent.java index 95278a688..59af7f3cb 100644 --- a/api/jreleaser-model-api/src/main/java/org/jreleaser/model/api/hooks/ExecutionEvent.java +++ b/api/jreleaser-model-api/src/main/java/org/jreleaser/model/api/hooks/ExecutionEvent.java @@ -30,10 +30,16 @@ public class ExecutionEvent { private final Type type; private final String name; + private final Throwable failure; private ExecutionEvent(Type type, String name) { + this(type, name, null); + } + + private ExecutionEvent(Type type, String name, Throwable failure) { this.type = requireNonNull(type, "'type' must not be null"); this.name = requireNonBlank(name, "'name' must not be blank"); + this.failure = failure; } public Type getType() { @@ -44,6 +50,10 @@ public String getName() { return name; } + public Throwable getFailure() { + return failure; + } + public static ExecutionEvent before(String name) { return new ExecutionEvent(Type.BEFORE, name); } @@ -52,8 +62,8 @@ public static ExecutionEvent success(String name) { return new ExecutionEvent(Type.SUCCESS, name); } - public static ExecutionEvent failure(String name) { - return new ExecutionEvent(Type.FAILURE, name); + public static ExecutionEvent failure(String name, Throwable failure) { + return new ExecutionEvent(Type.FAILURE, name, failure); } public enum Type { diff --git a/api/jreleaser-resource-bundle/src/main/resources/org/jreleaser/bundle/Messages.properties b/api/jreleaser-resource-bundle/src/main/resources/org/jreleaser/bundle/Messages.properties index 0205510dd..72baa6602 100644 --- a/api/jreleaser-resource-bundle/src/main/resources/org/jreleaser/bundle/Messages.properties +++ b/api/jreleaser-resource-bundle/src/main/resources/org/jreleaser/bundle/Messages.properties @@ -480,6 +480,7 @@ files.copy = copying files from {} to {} ERROR_unexpected_release_announce = Unexpected error when announcing release ERROR_unexpected_release_create = Unexpected error when creating release ERROR_unexpected_release_sign = Unexpected error when signing release +listener.failure = {} failed workflow.dryrun = dry-run set to {} workflow.success = JReleaser succeeded after {} workflow.failure = JReleaser failed after {} diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/announcers/ArticleAnnouncer.java b/core/jreleaser-engine/src/main/java/org/jreleaser/announcers/ArticleAnnouncer.java index 6e45cd432..c536be460 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/announcers/ArticleAnnouncer.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/announcers/ArticleAnnouncer.java @@ -50,12 +50,19 @@ * @author Andres Almiray * @since 0.6.0 */ -public class ArticleAnnouncer implements Announcer { +@org.jreleaser.infra.nativeimage.annotations.NativeImage +public class ArticleAnnouncer implements Announcer { private final JReleaserContext context; - private org.jreleaser.model.internal.announce.ArticleAnnouncer article; + private final org.jreleaser.model.internal.announce.ArticleAnnouncer article; - ArticleAnnouncer(JReleaserContext context) { + public ArticleAnnouncer(JReleaserContext context) { this.context = context; + this.article = context.getModel().getAnnounce().getArticle(); + } + + @Override + public org.jreleaser.model.api.announce.ArticleAnnouncer getAnnouncer() { + return article.asImmutable(); } @Override @@ -65,13 +72,11 @@ public String getName() { @Override public boolean isEnabled() { - return context.getModel().getAnnounce().getArticle().isEnabled(); + return article.isEnabled(); } @Override public void announce() throws AnnounceException { - article = context.getModel().getAnnounce().getArticle(); - Path prepareDirectory = context.getPrepareDirectory().resolve("article"); prepareFiles(prepareDirectory); publishToRepository(prepareDirectory); @@ -125,7 +130,7 @@ private void publishToRepository(Path prepareDirectory) throws AnnounceException return; } - BaseReleaser releaser = context.getModel().getRelease().getReleaser(); + BaseReleaser releaser = context.getModel().getRelease().getReleaser(); try { // get the repository @@ -195,12 +200,12 @@ private void copyFiles(Path source, Path destination) throws IOException { } } - private String resolveGitUsername(BaseReleaser releaser) { + private String resolveGitUsername(BaseReleaser releaser) { String username = article.getRepository().getResolvedUsername(releaser); return isNotBlank(username) ? username : releaser.getResolvedUsername(); } - private String resolveGitToken(BaseReleaser releaser) { + private String resolveGitToken(BaseReleaser releaser) { String token = article.getRepository().getResolvedToken(releaser); return isNotBlank(token) ? token : releaser.getResolvedToken(); } diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/AbstractAssemblerProcessor.java b/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/AbstractAssemblerProcessor.java index 8668b0800..6a590e224 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/AbstractAssemblerProcessor.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/AbstractAssemblerProcessor.java @@ -51,21 +51,21 @@ * @author Andres Almiray * @since 0.2.0 */ -abstract class AbstractAssemblerProcessor implements AssemblerProcessor { +abstract class AbstractAssemblerProcessor> implements AssemblerProcessor { protected final JReleaserContext context; - protected A assembler; + protected S assembler; protected AbstractAssemblerProcessor(JReleaserContext context) { this.context = context; } @Override - public A getAssembler() { + public S getAssembler() { return assembler; } @Override - public void setAssembler(A assembler) { + public void setAssembler(S assembler) { this.assembler = assembler; } diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/AbstractJavaAssemblerProcessor.java b/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/AbstractJavaAssemblerProcessor.java index 6150678a6..d99c2939e 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/AbstractJavaAssemblerProcessor.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/AbstractJavaAssemblerProcessor.java @@ -42,18 +42,18 @@ * @author Andres Almiray * @since 0.8.0 */ -abstract class AbstractJavaAssemblerProcessor extends AbstractAssemblerProcessor { +abstract class AbstractJavaAssemblerProcessor> extends AbstractAssemblerProcessor { protected AbstractJavaAssemblerProcessor(JReleaserContext context) { super(context); } @Override - public A getAssembler() { + public S getAssembler() { return assembler; } @Override - public void setAssembler(A assembler) { + public void setAssembler(S assembler) { this.assembler = assembler; } diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/ArchiveAssemblerProcessor.java b/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/ArchiveAssemblerProcessor.java index e9bc91aad..ff2ae275c 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/ArchiveAssemblerProcessor.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/ArchiveAssemblerProcessor.java @@ -34,7 +34,7 @@ * @author Andres Almiray * @since 0.8.0 */ -public class ArchiveAssemblerProcessor extends AbstractAssemblerProcessor { +public class ArchiveAssemblerProcessor extends AbstractAssemblerProcessor { public ArchiveAssemblerProcessor(JReleaserContext context) { super(context); } diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/ArchiveAssemblerProcessorFactory.java b/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/ArchiveAssemblerProcessorFactory.java index a30d5e5fe..4075dbf3b 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/ArchiveAssemblerProcessorFactory.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/ArchiveAssemblerProcessorFactory.java @@ -27,7 +27,7 @@ * @since 0.8.0 */ @ServiceProviderFor(AssemblerProcessorFactory.class) -public class ArchiveAssemblerProcessorFactory implements AssemblerProcessorFactory { +public class ArchiveAssemblerProcessorFactory implements AssemblerProcessorFactory { @Override public String getName() { return org.jreleaser.model.api.assemble.ArchiveAssembler.TYPE; diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/AssemblerUtils.java b/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/AssemblerUtils.java index e2f83d8d7..494bb60e9 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/AssemblerUtils.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/AssemblerUtils.java @@ -71,7 +71,7 @@ public static String readJavaVersion(Path path) throws AssemblerProcessingExcept } } - public static Set copyJars(JReleaserContext context, JavaAssembler assembler, Path jarsDirectory, String platform) throws AssemblerProcessingException { + public static Set copyJars(JReleaserContext context, JavaAssembler assembler, Path jarsDirectory, String platform) throws AssemblerProcessingException { Set paths = new LinkedHashSet<>(); // resolve all first diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/JlinkAssemblerProcessor.java b/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/JlinkAssemblerProcessor.java index f9551cbdd..d40afe547 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/JlinkAssemblerProcessor.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/JlinkAssemblerProcessor.java @@ -57,7 +57,7 @@ * @author Andres Almiray * @since 0.2.0 */ -public class JlinkAssemblerProcessor extends AbstractJavaAssemblerProcessor { +public class JlinkAssemblerProcessor extends AbstractJavaAssemblerProcessor { public JlinkAssemblerProcessor(JReleaserContext context) { super(context); } diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/JlinkAssemblerProcessorFactory.java b/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/JlinkAssemblerProcessorFactory.java index 351073746..e751b8a39 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/JlinkAssemblerProcessorFactory.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/JlinkAssemblerProcessorFactory.java @@ -27,7 +27,7 @@ * @since 0.2.0 */ @ServiceProviderFor(AssemblerProcessorFactory.class) -public class JlinkAssemblerProcessorFactory implements AssemblerProcessorFactory { +public class JlinkAssemblerProcessorFactory implements AssemblerProcessorFactory { @Override public String getName() { return org.jreleaser.model.api.assemble.JlinkAssembler.TYPE; diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/JpackageAssemblerProcessor.java b/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/JpackageAssemblerProcessor.java index 09d28f25c..13fac5002 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/JpackageAssemblerProcessor.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/JpackageAssemblerProcessor.java @@ -53,7 +53,7 @@ * @author Andres Almiray * @since 0.10.0 */ -public class JpackageAssemblerProcessor extends AbstractJavaAssemblerProcessor { +public class JpackageAssemblerProcessor extends AbstractJavaAssemblerProcessor { public JpackageAssemblerProcessor(JReleaserContext context) { super(context); } diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/JpackageAssemblerProcessorFactory.java b/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/JpackageAssemblerProcessorFactory.java index 1c9c45ab0..d05eb8639 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/JpackageAssemblerProcessorFactory.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/JpackageAssemblerProcessorFactory.java @@ -27,7 +27,7 @@ * @since 0.10.0 */ @ServiceProviderFor(AssemblerProcessorFactory.class) -public class JpackageAssemblerProcessorFactory implements AssemblerProcessorFactory { +public class JpackageAssemblerProcessorFactory implements AssemblerProcessorFactory { @Override public String getName() { return org.jreleaser.model.api.assemble.JpackageAssembler.TYPE; diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/NativeImageAssemblerProcessor.java b/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/NativeImageAssemblerProcessor.java index 52fe8d262..26c143eb3 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/NativeImageAssemblerProcessor.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/NativeImageAssemblerProcessor.java @@ -51,7 +51,7 @@ * @author Andres Almiray * @since 0.2.0 */ -public class NativeImageAssemblerProcessor extends AbstractJavaAssemblerProcessor { +public class NativeImageAssemblerProcessor extends AbstractJavaAssemblerProcessor { private static final String KEY_GRAALVM_VERSION = "GRAALVM_VERSION"; public NativeImageAssemblerProcessor(JReleaserContext context) { diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/NativeImageAssemblerProcessorFactory.java b/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/NativeImageAssemblerProcessorFactory.java index e330cf1a7..9aa5c2169 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/NativeImageAssemblerProcessorFactory.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/NativeImageAssemblerProcessorFactory.java @@ -27,7 +27,7 @@ * @since 0.2.0 */ @ServiceProviderFor(AssemblerProcessorFactory.class) -public class NativeImageAssemblerProcessorFactory implements AssemblerProcessorFactory { +public class NativeImageAssemblerProcessorFactory implements AssemblerProcessorFactory { @Override public String getName() { return org.jreleaser.model.api.assemble.NativeImageAssembler.TYPE; diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/announce/Announcers.java b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/announce/Announcers.java index b427492a0..9d9545d6e 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/announce/Announcers.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/announce/Announcers.java @@ -18,6 +18,9 @@ package org.jreleaser.engine.announce; import org.jreleaser.bundle.RB; +import org.jreleaser.extensions.api.workflow.WorkflowListenerException; +import org.jreleaser.model.api.JReleaserCommand; +import org.jreleaser.model.api.hooks.ExecutionEvent; import org.jreleaser.model.internal.JReleaserContext; import org.jreleaser.model.internal.JReleaserModel; import org.jreleaser.model.spi.announce.AnnounceException; @@ -45,7 +48,7 @@ public static void announce(JReleaserContext context) throws AnnounceException { return; } - Map announcers = Announcers.findAnnouncers(context); + Map> announcers = Announcers.findAnnouncers(context); if (announcers.isEmpty()) { context.getLogger().info(RB.$("announcers.not.configured")); return; @@ -59,7 +62,7 @@ public static void announce(JReleaserContext context) throws AnnounceException { continue; } - Announcer announcer = announcers.get(announcerName); + Announcer announcer = announcers.get(announcerName); if (null == announcer) { context.getLogger().warn(RB.$("announcers.announcer.not.found"), announcerName); @@ -76,8 +79,8 @@ public static void announce(JReleaserContext context) throws AnnounceException { return; } - for (Map.Entry entry : announcers.entrySet()) { - Announcer announcer = entry.getValue(); + for (Map.Entry> entry : announcers.entrySet()) { + Announcer announcer = entry.getValue(); if (context.getExcludedAnnouncers().contains(announcer.getName())) { context.getLogger().info(RB.$("announcers.announcer.excluded"), announcer.getName()); @@ -88,32 +91,47 @@ public static void announce(JReleaserContext context) throws AnnounceException { } } - private static void announce(JReleaserContext context, Announcer announcer) { - context.getLogger().increaseIndent(); - context.getLogger().setPrefix(announcer.getName()); + private static void announce(JReleaserContext context, Announcer announcer) { + try { + context.getLogger().increaseIndent(); + context.getLogger().setPrefix(announcer.getName()); - if (announcer.isEnabled()) { - try { - announcer.announce(); - } catch (AnnounceException e) { - context.getLogger().warn(e.getMessage().trim()); + if (announcer.isEnabled()) { + fireAnnounceEvent(ExecutionEvent.before(JReleaserCommand.ANNOUNCE.toStep()), context, announcer); + + try { + announcer.announce(); + fireAnnounceEvent(ExecutionEvent.success(JReleaserCommand.ANNOUNCE.toStep()), context, announcer); + } catch (AnnounceException e) { + fireAnnounceEvent(ExecutionEvent.failure(JReleaserCommand.ANNOUNCE.toStep(), e), context, announcer); + context.getLogger().warn(e.getMessage().trim()); + } + } else { + context.getLogger().debug(RB.$("announcers.announcer.disabled")); } - } else { - context.getLogger().debug(RB.$("announcers.announcer.disabled")); + } finally { + context.getLogger().restorePrefix(); + context.getLogger().decreaseIndent(); } + } - context.getLogger().restorePrefix(); - context.getLogger().decreaseIndent(); + private static void fireAnnounceEvent(ExecutionEvent event, JReleaserContext context, Announcer announcer) { + try { + context.fireAnnounceStepEvent(event, announcer.getAnnouncer()); + } catch (WorkflowListenerException e) { + context.getLogger().error(RB.$("listener.failure", e.getListener().getClass().getName())); + context.getLogger().trace(e); + } } - private static Map findAnnouncers(JReleaserContext context) { + private static Map> findAnnouncers(JReleaserContext context) { JReleaserModel model = context.getModel(); - Map builders = StreamSupport.stream(ServiceLoader.load(AnnouncerBuilderFactory.class, + Map> builders = StreamSupport.stream(ServiceLoader.load(AnnouncerBuilderFactory.class, Announcers.class.getClassLoader()).spliterator(), false) .collect(Collectors.toMap(AnnouncerBuilderFactory::getName, AnnouncerBuilderFactory::getBuilder)); - Map announcers = new TreeMap<>(); + Map> announcers = new TreeMap<>(); builders.forEach((name, builder) -> { if (null != model.getAnnounce().findAnnouncer(name) && !context.getExcludedAnnouncers().contains(name)) { diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/assemble/AssemblerProcessors.java b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/assemble/AssemblerProcessors.java index a5ac4b24d..4dc46cebf 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/assemble/AssemblerProcessors.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/assemble/AssemblerProcessors.java @@ -34,13 +34,13 @@ * @since 0.2.0 */ public class AssemblerProcessors { - public static AssemblerProcessor findProcessor(JReleaserContext context, A assembler) { - Map processors = StreamSupport.stream(ServiceLoader.load(AssemblerProcessorFactory.class, + public static > AssemblerProcessor findProcessor(JReleaserContext context, S assembler) { + Map> processors = StreamSupport.stream(ServiceLoader.load(AssemblerProcessorFactory.class, AssemblerProcessors.class.getClassLoader()).spliterator(), false) .collect(Collectors.toMap(AssemblerProcessorFactory::getName, factory -> factory.getAssemblerProcessor(context))); if (processors.containsKey(assembler.getType())) { - AssemblerProcessor assemblerProcessor = processors.get(assembler.getType()); + AssemblerProcessor assemblerProcessor = processors.get(assembler.getType()); assemblerProcessor.setAssembler(assembler); return assemblerProcessor; } diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/assemble/Assemblers.java b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/assemble/Assemblers.java index 707998484..50b526213 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/assemble/Assemblers.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/assemble/Assemblers.java @@ -18,7 +18,10 @@ package org.jreleaser.engine.assemble; import org.jreleaser.bundle.RB; +import org.jreleaser.extensions.api.workflow.WorkflowListenerException; import org.jreleaser.model.JReleaserException; +import org.jreleaser.model.api.JReleaserCommand; +import org.jreleaser.model.api.hooks.ExecutionEvent; import org.jreleaser.model.internal.JReleaserContext; import org.jreleaser.model.internal.assemble.Assemble; import org.jreleaser.model.internal.assemble.Assembler; @@ -48,7 +51,7 @@ public static void assemble(JReleaserContext context) { continue; } - Map assemblers = assemble.findAssemblersByType(assemblerType); + Map> assemblers = assemble.findAssemblersByType(assemblerType); if (assemblers.isEmpty()) { context.getLogger().debug(RB.$("assemblers.no.match"), assemblerType); @@ -82,7 +85,7 @@ public static void assemble(JReleaserContext context) { } } else { context.getLogger().info(RB.$("assemblers.assemble.all.distributions")); - for (Assembler assembler : assemble.findAllAssemblers()) { + for (Assembler assembler : assemble.findAllAssemblers()) { String assemblerType = assembler.getType(); String distributionName = assembler.getName(); if (context.getExcludedAssemblers().contains(assemblerType) || @@ -96,24 +99,49 @@ public static void assemble(JReleaserContext context) { } } - private static void assemble(JReleaserContext context, Assembler assembler) { + private static void assemble(JReleaserContext context, Assembler assembler) { try { context.getLogger().increaseIndent(); context.getLogger().setPrefix(assembler.getType()); + + fireAssembleEvent(ExecutionEvent.before(JReleaserCommand.ASSEMBLE.toStep()), context, assembler); + DistributionAssembler processor = createDistributionAssembler(context, assembler); processor.assemble(); - context.getLogger().restorePrefix(); - context.getLogger().decreaseIndent(); + + fireAssembleEvent(ExecutionEvent.success(JReleaserCommand.ASSEMBLE.toStep()), context, assembler); } catch (AssemblerProcessingException e) { + fireAssembleEvent(ExecutionEvent.failure(JReleaserCommand.ASSEMBLE.toStep(), e), context, assembler); throw new JReleaserException(e.getMessage(), e); + } finally { + context.getLogger().restorePrefix(); + context.getLogger().decreaseIndent(); } } private static DistributionAssembler createDistributionAssembler(JReleaserContext context, - Assembler assembler) { + Assembler assembler) { return DistributionAssembler.builder() .context(context) .assembler(assembler) .build(); } + + private static void fireAssembleEvent(ExecutionEvent event, JReleaserContext context, Assembler assembler) { + if (!assembler.isEnabled()) return; + + try { + context.fireAssembleStepEvent(event, assembler.asImmutable()); + } catch (WorkflowListenerException e) { + context.getLogger().error(RB.$("listener.failure", e.getListener().getClass().getName())); + context.getLogger().trace(e); + if (event.getType() != ExecutionEvent.Type.FAILURE && !e.getListener().isContinueOnError()) { + if (e.getCause() instanceof RuntimeException) { + throw (RuntimeException) e.getCause(); + } else { + throw new JReleaserException(RB.$("ERROR_unexpected_error"), e.getCause()); + } + } + } + } } diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/assemble/DistributionAssembler.java b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/assemble/DistributionAssembler.java index a42c50518..69740919c 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/assemble/DistributionAssembler.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/assemble/DistributionAssembler.java @@ -35,17 +35,17 @@ */ public class DistributionAssembler { private final JReleaserContext context; - private final Assembler assembler; + private final Assembler assembler; private final Path outputDirectory; private DistributionAssembler(JReleaserContext context, - Assembler assembler) { + Assembler assembler) { this.context = context; this.assembler = assembler; this.outputDirectory = context.getOutputDirectory(); } - public Assembler getAssembler() { + public Assembler getAssembler() { return assembler; } @@ -55,7 +55,7 @@ public void assemble() throws AssemblerProcessingException { return; } - AssemblerProcessor assemblerProcessor = AssemblerProcessors.findProcessor(context, assembler); + AssemblerProcessor assemblerProcessor = AssemblerProcessors.findProcessor(context, assembler); context.getLogger().info(RB.$("assemblers.distribution.assemble"), assembler.getName()); diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/context/ModelValidator.java b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/context/ModelValidator.java index 39132005c..af7cb446e 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/context/ModelValidator.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/context/ModelValidator.java @@ -119,6 +119,6 @@ private static void loadExtensions(JReleaserContext context) { builder.build(); } - extensionManager.load(context.asImmutable()); + extensionManager.load(context); } } diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/deploy/maven/ArtifactDeployers.java b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/deploy/maven/ArtifactDeployers.java index 531287ae0..5fdcb97a0 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/deploy/maven/ArtifactDeployers.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/deploy/maven/ArtifactDeployers.java @@ -33,13 +33,13 @@ * @since 1.3.0 */ public class ArtifactDeployers { - public static MavenDeployer findMavenDeployer(JReleaserContext context, D deployer) { - Map deployers = StreamSupport.stream(ServiceLoader.load(MavenDeployerFactory.class, + public static > MavenDeployer findMavenDeployer(JReleaserContext context, D deployer) { + Map> deployers = StreamSupport.stream(ServiceLoader.load(MavenDeployerFactory.class, ArtifactDeployers.class.getClassLoader()).spliterator(), false) .collect(Collectors.toMap(MavenDeployerFactory::getName, factory -> factory.getMavenDeployer(context))); if (deployers.containsKey(deployer.getType())) { - MavenDeployer artifactMavenDeployer = deployers.get(deployer.getType()); + MavenDeployer artifactMavenDeployer = deployers.get(deployer.getType()); artifactMavenDeployer.setDeployer(deployer); return artifactMavenDeployer; } diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/deploy/maven/MavenDeployers.java b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/deploy/maven/MavenDeployers.java index cb004e02b..396aa4a3f 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/deploy/maven/MavenDeployers.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/deploy/maven/MavenDeployers.java @@ -18,7 +18,10 @@ package org.jreleaser.engine.deploy.maven; import org.jreleaser.bundle.RB; +import org.jreleaser.extensions.api.workflow.WorkflowListenerException; import org.jreleaser.model.JReleaserException; +import org.jreleaser.model.api.JReleaserCommand; +import org.jreleaser.model.api.hooks.ExecutionEvent; import org.jreleaser.model.internal.JReleaserContext; import org.jreleaser.model.internal.deploy.maven.Maven; import org.jreleaser.model.internal.deploy.maven.MavenDeployer; @@ -50,7 +53,7 @@ public static void deploy(JReleaserContext context) { continue; } - Map deployers = maven.findMavenDeployersByType(deployerType); + Map> deployers = maven.findMavenDeployersByType(deployerType); if (deployers.isEmpty()) { context.getLogger().debug(RB.$("deployers.no.match"), deployerType); @@ -64,7 +67,7 @@ public static void deploy(JReleaserContext context) { continue; } - MavenDeployer deployer = deployers.get(deployerName); + MavenDeployer deployer = deployers.get(deployerName); if (!deployer.isEnabled()) { context.getLogger().info(RB.$("deployers.deployer.disabled"), deployerType, deployerName); continue; @@ -82,7 +85,7 @@ public static void deploy(JReleaserContext context) { } } else if (!context.getIncludedDeployerNames().isEmpty()) { for (String deployerName : context.getIncludedDeployerNames()) { - List filteredDeployers = maven.findAllActiveMavenDeployers().stream() + List> filteredDeployers = maven.findAllActiveMavenDeployers().stream() .filter(a -> deployerName.equals(a.getName())) .collect(toList()); @@ -95,7 +98,7 @@ public static void deploy(JReleaserContext context) { } } else { context.getLogger().info(RB.$("deployers.deploy.all.artifacts")); - for (MavenDeployer deployer : maven.findAllActiveMavenDeployers()) { + for (MavenDeployer deployer : maven.findAllActiveMavenDeployers()) { String deployerType = deployer.getType(); String deployerName = deployer.getName(); @@ -110,24 +113,48 @@ public static void deploy(JReleaserContext context) { } } - private static void deploy(JReleaserContext context, MavenDeployer deployer) { + private static void deploy(JReleaserContext context, MavenDeployer deployer) { try { context.getLogger().increaseIndent(); context.getLogger().setPrefix(deployer.getType()); + + fireDeployEvent(ExecutionEvent.before(JReleaserCommand.DEPLOY.toStep()), context, deployer); + ProjectMavenDeployer projectDeployer = createProjectDeployer(context, deployer); projectDeployer.deploy(); - context.getLogger().restorePrefix(); - context.getLogger().decreaseIndent(); + fireDeployEvent(ExecutionEvent.success(JReleaserCommand.DEPLOY.toStep()), context, deployer); } catch (DeployException e) { + fireDeployEvent(ExecutionEvent.failure(JReleaserCommand.DEPLOY.toStep(), e), context, deployer); throw new JReleaserException(RB.$("ERROR_unexpected_error"), e); + } finally { + context.getLogger().restorePrefix(); + context.getLogger().decreaseIndent(); } } private static ProjectMavenDeployer createProjectDeployer(JReleaserContext context, - MavenDeployer deployer) { + MavenDeployer deployer) { return ProjectMavenDeployer.builder() .context(context) .deployer(deployer) .build(); } + + private static void fireDeployEvent(ExecutionEvent event, JReleaserContext context, MavenDeployer deployer) { + if (!deployer.isEnabled()) return; + + try { + context.fireDeployStepEvent(event, deployer.asImmutable()); + } catch (WorkflowListenerException e) { + context.getLogger().error(RB.$("listener.failure", e.getListener().getClass().getName())); + context.getLogger().trace(e); + if (event.getType() != ExecutionEvent.Type.FAILURE && !e.getListener().isContinueOnError()) { + if (e.getCause() instanceof RuntimeException) { + throw (RuntimeException) e.getCause(); + } else { + throw new JReleaserException(RB.$("ERROR_unexpected_error"), e.getCause()); + } + } + } + } } diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/distribution/DistributionProcessor.java b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/distribution/DistributionProcessor.java index 53abf630e..f9fbcd734 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/distribution/DistributionProcessor.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/distribution/DistributionProcessor.java @@ -57,13 +57,13 @@ public String getPackagerName() { public void prepareDistribution() throws PackagerProcessingException { Distribution distribution = context.getModel().findDistribution(distributionName); - Packager packager = distribution.getPackager(packagerName); + Packager packager = distribution.getPackager(packagerName); if (!packager.isEnabled()) { context.getLogger().debug(RB.$("distributions.skip.distribution"), distributionName); return; } - PackagerProcessor packagerProcessor = PackagerProcessors.findProcessor(context, packager); + PackagerProcessor> packagerProcessor = PackagerProcessors.findProcessor(context, packager); if (!packagerProcessor.supportsDistribution(distribution)) { context.getLogger().info(RB.$("distributions.not.supported.distribution"), distributionName, distribution.getType()); return; @@ -86,7 +86,7 @@ public void prepareDistribution() throws PackagerProcessingException { public void packageDistribution() throws PackagerProcessingException { Distribution distribution = context.getModel().findDistribution(distributionName); - Packager packager = distribution.getPackager(packagerName); + Packager packager = distribution.getPackager(packagerName); if (!packager.isEnabled()) { context.getLogger().debug(RB.$("distributions.skip.distribution"), distributionName); return; @@ -96,7 +96,7 @@ public void packageDistribution() throws PackagerProcessingException { return; } - PackagerProcessor packagerProcessor = PackagerProcessors.findProcessor(context, packager); + PackagerProcessor> packagerProcessor = PackagerProcessors.findProcessor(context, packager); if (!packagerProcessor.supportsDistribution(distribution)) { context.getLogger().info(RB.$("distributions.not.supported.distribution"), distributionName, distribution.getType()); return; @@ -119,7 +119,7 @@ public void packageDistribution() throws PackagerProcessingException { public void publishDistribution() throws PackagerProcessingException { Distribution distribution = context.getModel().findDistribution(distributionName); - Packager packager = distribution.getPackager(packagerName); + Packager packager = distribution.getPackager(packagerName); if (!packager.isEnabled()) { context.getLogger().debug(RB.$("distributions.skip.distribution"), distributionName); return; @@ -129,7 +129,7 @@ public void publishDistribution() throws PackagerProcessingException { return; } - PackagerProcessor packagerProcessor = PackagerProcessors.findProcessor(context, packager); + PackagerProcessor> packagerProcessor = PackagerProcessors.findProcessor(context, packager); if (!packagerProcessor.supportsDistribution(distribution)) { context.getLogger().info(RB.$("distributions.not.supported.distribution"), distributionName, distribution.getType()); return; @@ -167,6 +167,40 @@ public static DistributionProcessorBuilder builder() { return new DistributionProcessorBuilder(); } + public static class PackagingAction { + private final String text; + private final Type type; + private final PackagerProcessingFunction function; + + public static PackagingAction of(String text, Type type, PackagerProcessingFunction function) { + return new PackagingAction(text, type, function); + } + + private PackagingAction(String text, Type type, PackagerProcessingFunction function) { + this.text = text; + this.type = type; + this.function = function; + } + + public String getText() { + return text; + } + + public Type getType() { + return type; + } + + public PackagerProcessingFunction getFunction() { + return function; + } + + public enum Type { + PREPARE, + PACKAGE, + PUBLISH + } + } + public static class DistributionProcessorBuilder { private JReleaserContext context; private String distributionName; diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/distribution/Distributions.java b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/distribution/Distributions.java index 04519b0c8..63df5e6d6 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/distribution/Distributions.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/distribution/Distributions.java @@ -18,9 +18,13 @@ package org.jreleaser.engine.distribution; import org.jreleaser.bundle.RB; +import org.jreleaser.extensions.api.workflow.WorkflowListenerException; import org.jreleaser.model.JReleaserException; +import org.jreleaser.model.api.JReleaserCommand; +import org.jreleaser.model.api.hooks.ExecutionEvent; import org.jreleaser.model.internal.JReleaserContext; import org.jreleaser.model.internal.distributions.Distribution; +import org.jreleaser.model.internal.packagers.Packager; import org.jreleaser.model.spi.packagers.PackagerProcessingException; import java.util.List; @@ -33,11 +37,11 @@ * @since 0.1.0 */ public class Distributions { - public static void process(JReleaserContext context, String action, PackagerProcessingFunction function) { + public static void process(JReleaserContext context, DistributionProcessor.PackagingAction action) { List activeDistributions = context.getModel().getActiveDistributions(); if (activeDistributions.isEmpty()) { - context.getLogger().debug(RB.$("distributions.not.enabled"), action.toLowerCase(Locale.ENGLISH)); + context.getLogger().debug(RB.$("distributions.not.enabled"), action.getText().toLowerCase(Locale.ENGLISH)); return; } @@ -59,12 +63,12 @@ public static void process(JReleaserContext context, String action, PackagerProc continue; } - context.getLogger().info(RB.$("distributions.apply.action"), action); + context.getLogger().info(RB.$("distributions.apply.action"), action.getText()); - processDistribution(context, action, distribution, packagerName, function); + processDistribution(context, distribution, packagerName, action); } } else { - processDistribution(context, action, distribution, function); + processDistribution(context, distribution, action); } } } else if (!context.getIncludedPackagers().isEmpty()) { @@ -74,63 +78,85 @@ public static void process(JReleaserContext context, String action, PackagerProc continue; } - context.getLogger().info(RB.$("distributions.apply.action"), action); + context.getLogger().info(RB.$("distributions.apply.action"), action.getText()); for (Distribution distribution : activeDistributions) { - processDistribution(context, action, distribution, packagerName, function); + processDistribution(context, distribution, packagerName, action); } } } else { // process all - context.getLogger().info(RB.$("distributions.apply.action"), action); + context.getLogger().info(RB.$("distributions.apply.action"), action.getText()); for (Distribution distribution : activeDistributions) { if (context.getExcludedDistributions().contains(distribution.getName())) { context.getLogger().info(RB.$("distributions.distribution.excluded"), distribution.getName()); continue; } - processDistribution(context, action, distribution, function); + processDistribution(context, distribution, action); } } } - private static void processDistribution(JReleaserContext context, String action, Distribution distribution, PackagerProcessingFunction function) { + private static void processDistribution(JReleaserContext context, Distribution distribution, DistributionProcessor.PackagingAction action) { context.getLogger().increaseIndent(); - context.getLogger().info(RB.$("distributions.apply.action.to"), action, distribution.getName()); + context.getLogger().info(RB.$("distributions.apply.action.to"), action.getText(), distribution.getName()); + + fireDistributionStartEvent(context, distribution); for (String packagerName : supportedPackagers()) { if (context.getExcludedPackagers().contains(packagerName)) { context.getLogger().info(RB.$("packagers.packager.excluded"), packagerName); continue; } - processPackager(context, distribution, packagerName, function); + processPackager(context, distribution, packagerName, action); } + fireDistributionEndEvent(context, distribution); + context.getLogger().decreaseIndent(); } - private static void processDistribution(JReleaserContext context, String action, Distribution distribution, String packagerName, PackagerProcessingFunction function) { + private static void processDistribution(JReleaserContext context, Distribution distribution, String packagerName, DistributionProcessor.PackagingAction action) { context.getLogger().increaseIndent(); - context.getLogger().info(RB.$("distributions.apply.action.to"), action, distribution.getName()); + context.getLogger().info(RB.$("distributions.apply.action.to"), action.getText(), distribution.getName()); - processPackager(context, distribution, packagerName, function); + processPackager(context, distribution, packagerName, action); context.getLogger().decreaseIndent(); } - private static void processPackager(JReleaserContext context, Distribution distribution, String packagerName, PackagerProcessingFunction function) { - context.getLogger().increaseIndent(); - context.getLogger().setPrefix(packagerName); + private static void processPackager(JReleaserContext context, Distribution distribution, String packagerName, DistributionProcessor.PackagingAction action) { + Packager packager = distribution.getPackager(packagerName); + try { + context.getLogger().increaseIndent(); + context.getLogger().setPrefix(packagerName); + firePackagerEvent(ExecutionEvent.before(actionToStep(action.getType())), context, distribution, action.getType(), packager); + DistributionProcessor processor = createDistributionProcessor(context, distribution, packagerName); - function.consume(processor); + action.getFunction().consume(processor); + + firePackagerEvent(ExecutionEvent.success(actionToStep(action.getType())), context, distribution, action.getType(), packager); } catch (PackagerProcessingException e) { + firePackagerEvent(ExecutionEvent.failure(actionToStep(action.getType()), e), context, distribution, action.getType(), packager); throw new JReleaserException(RB.$("ERROR_unexpected_error"), e); + } finally { + context.getLogger().restorePrefix(); + context.getLogger().decreaseIndent(); } - context.getLogger().restorePrefix(); - context.getLogger().decreaseIndent(); + } + + private static String actionToStep(DistributionProcessor.PackagingAction.Type type) { + switch (type) { + case PACKAGE: + return JReleaserCommand.PACKAGE.toStep(); + case PUBLISH: + return JReleaserCommand.PUBLISH.toStep(); + } + return JReleaserCommand.PREPARE.toStep(); } private static DistributionProcessor createDistributionProcessor(JReleaserContext context, @@ -142,4 +168,66 @@ private static DistributionProcessor createDistributionProcessor(JReleaserContex .packagerName(packagerName) .build(); } + + private static void fireDistributionStartEvent(JReleaserContext context, Distribution distribution) { + try { + context.fireDistributionStartEvent(distribution.asImmutable()); + } catch (WorkflowListenerException e) { + context.getLogger().error(RB.$("listener.failure", e.getListener().getClass().getName())); + context.getLogger().trace(e); + if (!e.getListener().isContinueOnError()) { + if (e.getCause() instanceof RuntimeException) { + throw (RuntimeException) e.getCause(); + } else { + throw new JReleaserException(RB.$("ERROR_unexpected_error"), e.getCause()); + } + } + } + } + + private static void fireDistributionEndEvent(JReleaserContext context, Distribution distribution) { + if (!distribution.isEnabled()) return; + + try { + context.fireDistributionEndEvent(distribution.asImmutable()); + } catch (WorkflowListenerException e) { + context.getLogger().error(RB.$("listener.failure", e.getListener().getClass().getName())); + context.getLogger().trace(e); + if (!e.getListener().isContinueOnError()) { + if (e.getCause() instanceof RuntimeException) { + throw (RuntimeException) e.getCause(); + } else { + throw new JReleaserException(RB.$("ERROR_unexpected_error"), e.getCause()); + } + } + } + } + + private static void firePackagerEvent(ExecutionEvent event, JReleaserContext context, Distribution distribution, DistributionProcessor.PackagingAction.Type type, Packager packager) { + if (!packager.isEnabled()) return; + + try { + switch (type) { + case PREPARE: + context.firePackagerPrepareEvent(event, distribution.asImmutable(), packager.asImmutable()); + break; + case PACKAGE: + context.firePackagerPackageEvent(event, distribution.asImmutable(), packager.asImmutable()); + break; + case PUBLISH: + context.firePackagerPublishEvent(event, distribution.asImmutable(), packager.asImmutable()); + break; + } + } catch (WorkflowListenerException e) { + context.getLogger().error(RB.$("listener.failure", e.getListener().getClass().getName())); + context.getLogger().trace(e); + if (event.getType() != ExecutionEvent.Type.FAILURE && !e.getListener().isContinueOnError()) { + if (e.getCause() instanceof RuntimeException) { + throw (RuntimeException) e.getCause(); + } else { + throw new JReleaserException(RB.$("ERROR_unexpected_error"), e.getCause()); + } + } + } + } } diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/download/ArtifactDownloaders.java b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/download/ArtifactDownloaders.java index 5fa709b36..3da182f3b 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/download/ArtifactDownloaders.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/download/ArtifactDownloaders.java @@ -34,13 +34,13 @@ * @since 1.1.0 */ public class ArtifactDownloaders { - public static ArtifactDownloader findDownloader(JReleaserContext context, D downloader) { - Map downloaders = StreamSupport.stream(ServiceLoader.load(ArtifactDownloaderFactory.class, + public static > ArtifactDownloader findDownloader(JReleaserContext context, D downloader) { + Map> downloaders = StreamSupport.stream(ServiceLoader.load(ArtifactDownloaderFactory.class, ArtifactDownloaders.class.getClassLoader()).spliterator(), false) .collect(Collectors.toMap(ArtifactDownloaderFactory::getName, factory -> factory.getArtifactDownloader(context))); if (downloaders.containsKey(downloader.getType())) { - ArtifactDownloader artifactDownloader = downloaders.get(downloader.getType()); + ArtifactDownloader artifactDownloader = downloaders.get(downloader.getType()); artifactDownloader.setDownloader(downloader); return artifactDownloader; } diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/download/Downloaders.java b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/download/Downloaders.java index 32a26b55a..d510afa73 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/download/Downloaders.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/download/Downloaders.java @@ -18,7 +18,10 @@ package org.jreleaser.engine.download; import org.jreleaser.bundle.RB; +import org.jreleaser.extensions.api.workflow.WorkflowListenerException; import org.jreleaser.model.JReleaserException; +import org.jreleaser.model.api.JReleaserCommand; +import org.jreleaser.model.api.hooks.ExecutionEvent; import org.jreleaser.model.internal.JReleaserContext; import org.jreleaser.model.internal.download.Download; import org.jreleaser.model.internal.download.Downloader; @@ -50,7 +53,7 @@ public static void download(JReleaserContext context) { continue; } - Map downloaders = download.findDownloadersByType(downloaderType); + Map> downloaders = download.findDownloadersByType(downloaderType); if (downloaders.isEmpty()) { context.getLogger().debug(RB.$("downloaders.no.match"), downloaderType); @@ -64,7 +67,7 @@ public static void download(JReleaserContext context) { continue; } - Downloader downloader = downloaders.get(downloaderName); + Downloader downloader = downloaders.get(downloaderName); if (!downloader.isEnabled()) { context.getLogger().info(RB.$("downloaders.downloader.disabled"), downloaderType, downloaderName); continue; @@ -82,7 +85,7 @@ public static void download(JReleaserContext context) { } } else if (!context.getIncludedDownloaderNames().isEmpty()) { for (String downloaderName : context.getIncludedDownloaderNames()) { - List filteredDownloaders = download.findAllActiveDownloaders().stream() + List> filteredDownloaders = download.findAllActiveDownloaders().stream() .filter(a -> downloaderName.equals(a.getName())) .collect(toList()); @@ -95,7 +98,7 @@ public static void download(JReleaserContext context) { } } else { context.getLogger().info(RB.$("downloaders.download.all.artifacts")); - for (Downloader downloader : download.findAllActiveDownloaders()) { + for (Downloader downloader : download.findAllActiveDownloaders()) { String downloaderType = downloader.getType(); String downloaderName = downloader.getName(); @@ -110,24 +113,48 @@ public static void download(JReleaserContext context) { } } - private static void download(JReleaserContext context, Downloader downloader) { + private static void download(JReleaserContext context, Downloader downloader) { try { context.getLogger().increaseIndent(); context.getLogger().setPrefix(downloader.getType()); + fireDownloadEvent(ExecutionEvent.before(JReleaserCommand.DOWNLOAD.toStep()), context, downloader); + ProjectDownloader projectDownloader = createProjectDownloader(context, downloader); projectDownloader.download(); - context.getLogger().restorePrefix(); - context.getLogger().decreaseIndent(); + + fireDownloadEvent(ExecutionEvent.success(JReleaserCommand.DOWNLOAD.toStep()), context, downloader); } catch (DownloadException e) { + fireDownloadEvent(ExecutionEvent.failure(JReleaserCommand.DOWNLOAD.toStep(), e), context, downloader); throw new JReleaserException(RB.$("ERROR_unexpected_error"), e); + } finally { + context.getLogger().restorePrefix(); + context.getLogger().decreaseIndent(); } } private static ProjectDownloader createProjectDownloader(JReleaserContext context, - Downloader downloader) { + Downloader downloader) { return ProjectDownloader.builder() .context(context) .downloader(downloader) .build(); } + + private static void fireDownloadEvent(ExecutionEvent event, JReleaserContext context, Downloader downloader) { + if (!downloader.isEnabled()) return; + + try { + context.fireDownloadStepEvent(event, downloader.asImmutable()); + } catch (WorkflowListenerException e) { + context.getLogger().error(RB.$("listener.failure", e.getListener().getClass().getName())); + context.getLogger().trace(e); + if (event.getType() != ExecutionEvent.Type.FAILURE && !e.getListener().isContinueOnError()) { + if (e.getCause() instanceof RuntimeException) { + throw (RuntimeException) e.getCause(); + } else { + throw new JReleaserException(RB.$("ERROR_unexpected_error"), e.getCause()); + } + } + } + } } diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/download/ProjectDownloader.java b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/download/ProjectDownloader.java index 06da21cf0..36f6a7654 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/download/ProjectDownloader.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/download/ProjectDownloader.java @@ -31,15 +31,15 @@ */ public class ProjectDownloader { private final JReleaserContext context; - private final Downloader downloader; + private final Downloader downloader; private ProjectDownloader(JReleaserContext context, - Downloader downloader) { + Downloader downloader) { this.context = context; this.downloader = downloader; } - public Downloader getDownloader() { + public Downloader getDownloader() { return downloader; } @@ -49,7 +49,7 @@ public void download() throws DownloadException { return; } - ArtifactDownloader artifactDownloader = ArtifactDownloaders.findDownloader(context, downloader); + ArtifactDownloader artifactDownloader = ArtifactDownloaders.findDownloader(context, downloader); context.getLogger().info(RB.$("downloaders.download"), downloader.getName()); @@ -62,14 +62,14 @@ public static ProjectDownloaderBuilder builder() { public static class ProjectDownloaderBuilder { private JReleaserContext context; - private Downloader downloader; + private Downloader downloader; public ProjectDownloaderBuilder context(JReleaserContext context) { this.context = requireNonNull(context, "'context' must not be null"); return this; } - public ProjectDownloaderBuilder downloader(Downloader downloader) { + public ProjectDownloaderBuilder downloader(Downloader downloader) { this.downloader = requireNonNull(downloader, "'downloader' must not be null"); return this; } diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/hooks/CommandHookExecutor.java b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/hooks/CommandHookExecutor.java index 37d243a32..e509476a6 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/hooks/CommandHookExecutor.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/hooks/CommandHookExecutor.java @@ -51,7 +51,7 @@ public void execute(String step, Runnable runnable) { try { runnable.run(); } catch (RuntimeException e) { - executeHooks(ExecutionEvent.failure(step)); + executeHooks(ExecutionEvent.failure(step, e)); throw e; } executeHooks(ExecutionEvent.success(step)); diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/release/Releasers.java b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/release/Releasers.java index b26f5b084..63102a706 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/release/Releasers.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/release/Releasers.java @@ -18,7 +18,10 @@ package org.jreleaser.engine.release; import org.jreleaser.bundle.RB; +import org.jreleaser.extensions.api.workflow.WorkflowListenerException; import org.jreleaser.model.JReleaserException; +import org.jreleaser.model.api.JReleaserCommand; +import org.jreleaser.model.api.hooks.ExecutionEvent; import org.jreleaser.model.api.release.CodebergReleaser; import org.jreleaser.model.api.release.GenericGitReleaser; import org.jreleaser.model.api.release.GiteaReleaser; @@ -41,17 +44,30 @@ */ public class Releasers { public static void release(JReleaserContext context) throws ReleaseException { - releaserFor(context).release(); + org.jreleaser.model.api.release.Releaser releaser = context.getModel().getRelease().releaser(); + + boolean failure = false; + try { + fireAssembleEvent(ExecutionEvent.before(JReleaserCommand.RELEASE.toStep()), context, releaser); + releaserFor(context).release(); + } catch (RuntimeException e) { + failure = true; + fireAssembleEvent(ExecutionEvent.failure(JReleaserCommand.RELEASE.toStep(), e), context, releaser); + } + + if (!failure) { + fireAssembleEvent(ExecutionEvent.success(JReleaserCommand.RELEASE.toStep()), context, releaser); + } } - public static Releaser releaserFor(JReleaserContext context) { + public static Releaser releaserFor(JReleaserContext context) { return Releasers.findReleaser(context) .configureWith(context) .build(); } - private static T findReleaser(JReleaserContext context) { - Map builders = StreamSupport.stream(ServiceLoader.load(ReleaserBuilderFactory.class, + private static > T findReleaser(JReleaserContext context) { + Map> builders = StreamSupport.stream(ServiceLoader.load(ReleaserBuilderFactory.class, Releasers.class.getClassLoader()).spliterator(), false) .collect(Collectors.toMap(ReleaserBuilderFactory::getName, ReleaserBuilderFactory::getBuilder)); @@ -73,4 +89,20 @@ private static T findReleaser(JReleaserContext conte throw new JReleaserException(RB.$("ERROR_releaser_no_match")); } + + private static void fireAssembleEvent(ExecutionEvent event, JReleaserContext context, org.jreleaser.model.api.release.Releaser releaser) { + try { + context.fireReleaseStepEvent(event, releaser); + } catch (WorkflowListenerException e) { + context.getLogger().error(RB.$("listener.failure", e.getListener().getClass().getName())); + context.getLogger().trace(e); + if (event.getType() != ExecutionEvent.Type.FAILURE && !e.getListener().isContinueOnError()) { + if (e.getCause() instanceof RuntimeException) { + throw (RuntimeException) e.getCause(); + } else { + throw new JReleaserException(RB.$("ERROR_unexpected_error"), e.getCause()); + } + } + } + } } diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/upload/ArtifactUploaders.java b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/upload/ArtifactUploaders.java index 1f7e0d4cd..e63b23462 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/upload/ArtifactUploaders.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/upload/ArtifactUploaders.java @@ -34,13 +34,13 @@ * @since 0.3.0 */ public class ArtifactUploaders { - public static ArtifactUploader findUploader(JReleaserContext context, U uploader) { - Map uploaders = StreamSupport.stream(ServiceLoader.load(ArtifactUploaderFactory.class, + public static > ArtifactUploader findUploader(JReleaserContext context, U uploader) { + Map> uploaders = StreamSupport.stream(ServiceLoader.load(ArtifactUploaderFactory.class, ArtifactUploaders.class.getClassLoader()).spliterator(), false) .collect(Collectors.toMap(ArtifactUploaderFactory::getName, factory -> factory.getArtifactUploader(context))); if (uploaders.containsKey(uploader.getType())) { - ArtifactUploader artifactUploader = uploaders.get(uploader.getType()); + ArtifactUploader artifactUploader = uploaders.get(uploader.getType()); artifactUploader.setUploader(uploader); return artifactUploader; } diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/upload/ProjectUploader.java b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/upload/ProjectUploader.java index 7e8401c45..e78826a32 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/upload/ProjectUploader.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/upload/ProjectUploader.java @@ -31,15 +31,15 @@ */ public class ProjectUploader { private final JReleaserContext context; - private final Uploader uploader; + private final Uploader uploader; private ProjectUploader(JReleaserContext context, - Uploader uploader) { + Uploader uploader) { this.context = context; this.uploader = uploader; } - public Uploader getUploader() { + public Uploader getUploader() { return uploader; } @@ -49,7 +49,7 @@ public void upload() throws UploadException { return; } - ArtifactUploader artifactUploader = ArtifactUploaders.findUploader(context, uploader); + ArtifactUploader artifactUploader = ArtifactUploaders.findUploader(context, uploader); context.getLogger().info(RB.$("uploaders.upload.to"), uploader.getName()); @@ -62,14 +62,14 @@ public static ProjectUploaderBuilder builder() { public static class ProjectUploaderBuilder { private JReleaserContext context; - private Uploader uploader; + private Uploader uploader; public ProjectUploaderBuilder context(JReleaserContext context) { this.context = requireNonNull(context, "'context' must not be null"); return this; } - public ProjectUploaderBuilder uploader(Uploader uploader) { + public ProjectUploaderBuilder uploader(Uploader uploader) { this.uploader = requireNonNull(uploader, "'uploader' must not be null"); return this; } diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/upload/Uploaders.java b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/upload/Uploaders.java index 3a8c265cb..eb44160a1 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/engine/upload/Uploaders.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/engine/upload/Uploaders.java @@ -18,7 +18,10 @@ package org.jreleaser.engine.upload; import org.jreleaser.bundle.RB; +import org.jreleaser.extensions.api.workflow.WorkflowListenerException; import org.jreleaser.model.JReleaserException; +import org.jreleaser.model.api.JReleaserCommand; +import org.jreleaser.model.api.hooks.ExecutionEvent; import org.jreleaser.model.internal.JReleaserContext; import org.jreleaser.model.internal.upload.Upload; import org.jreleaser.model.internal.upload.Uploader; @@ -50,7 +53,7 @@ public static void upload(JReleaserContext context) { continue; } - Map uploaders = upload.findUploadersByType(uploaderType); + Map> uploaders = upload.findUploadersByType(uploaderType); if (uploaders.isEmpty()) { context.getLogger().debug(RB.$("uploaders.no.match"), uploaderType); @@ -64,7 +67,7 @@ public static void upload(JReleaserContext context) { continue; } - Uploader uploader = uploaders.get(uploaderName); + Uploader uploader = uploaders.get(uploaderName); if (!uploader.isEnabled()) { context.getLogger().info(RB.$("uploaders.uploader.disabled"), uploaderType, uploaderName); continue; @@ -82,7 +85,7 @@ public static void upload(JReleaserContext context) { } } else if (!context.getIncludedUploaderNames().isEmpty()) { for (String uploaderName : context.getIncludedUploaderNames()) { - List filteredUploaders = upload.findAllActiveUploaders().stream() + List> filteredUploaders = upload.findAllActiveUploaders().stream() .filter(a -> uploaderName.equals(a.getName())) .collect(toList()); @@ -95,7 +98,7 @@ public static void upload(JReleaserContext context) { } } else { context.getLogger().info(RB.$("uploaders.upload.all.artifacts")); - for (Uploader uploader : upload.findAllActiveUploaders()) { + for (Uploader uploader : upload.findAllActiveUploaders()) { String uploaderType = uploader.getType(); String uploaderName = uploader.getName(); @@ -110,24 +113,48 @@ public static void upload(JReleaserContext context) { } } - private static void upload(JReleaserContext context, Uploader uploader) { + private static void upload(JReleaserContext context, Uploader uploader) { try { context.getLogger().increaseIndent(); context.getLogger().setPrefix(uploader.getType()); + fireUploadEvent(ExecutionEvent.before(JReleaserCommand.UPLOAD.toStep()), context, uploader); + ProjectUploader projectUploader = createProjectUploader(context, uploader); projectUploader.upload(); - context.getLogger().restorePrefix(); - context.getLogger().decreaseIndent(); + + fireUploadEvent(ExecutionEvent.success(JReleaserCommand.UPLOAD.toStep()), context, uploader); } catch (UploadException e) { + fireUploadEvent(ExecutionEvent.failure(JReleaserCommand.UPLOAD.toStep(), e), context, uploader); throw new JReleaserException(RB.$("ERROR_unexpected_error"), e); + } finally { + context.getLogger().restorePrefix(); + context.getLogger().decreaseIndent(); } } private static ProjectUploader createProjectUploader(JReleaserContext context, - Uploader uploader) { + Uploader uploader) { return ProjectUploader.builder() .context(context) .uploader(uploader) .build(); } + + private static void fireUploadEvent(ExecutionEvent event, JReleaserContext context, Uploader uploader) { + if (!uploader.isEnabled()) return; + + try { + context.fireUploadStepEvent(event, uploader.asImmutable()); + } catch (WorkflowListenerException e) { + context.getLogger().error(RB.$("listener.failure", e.getListener().getClass().getName())); + context.getLogger().trace(e); + if (event.getType() != ExecutionEvent.Type.FAILURE && !e.getListener().isContinueOnError()) { + if (e.getCause() instanceof RuntimeException) { + throw (RuntimeException) e.getCause(); + } else { + throw new JReleaserException(RB.$("ERROR_unexpected_error"), e.getCause()); + } + } + } + } } diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/AbstractPackagerProcessor.java b/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/AbstractPackagerProcessor.java index f17d1f57a..2061119a5 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/AbstractPackagerProcessor.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/AbstractPackagerProcessor.java @@ -85,7 +85,7 @@ * @author Andres Almiray * @since 0.1.0 */ -abstract class AbstractPackagerProcessor implements PackagerProcessor { +abstract class AbstractPackagerProcessor> implements PackagerProcessor { private static final String ARTIFACT = "artifact"; private static final String DISTRIBUTION = "distribution"; private static final String NAME = "Name"; diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/AbstractRepositoryPackagerProcessor.java b/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/AbstractRepositoryPackagerProcessor.java index 444ea0539..f70e3b805 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/AbstractRepositoryPackagerProcessor.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/AbstractRepositoryPackagerProcessor.java @@ -44,7 +44,7 @@ * @author Andres Almiray * @since 0.1.0 */ -abstract class AbstractRepositoryPackagerProcessor extends AbstractTemplatePackagerProcessor { +abstract class AbstractRepositoryPackagerProcessor> extends AbstractTemplatePackagerProcessor { protected AbstractRepositoryPackagerProcessor(JReleaserContext context) { super(context); } @@ -61,7 +61,7 @@ protected void doPublishDistribution(Distribution distribution, Map releaser = context.getModel().getRelease().getReleaser(); try { // get the repository @@ -162,12 +162,12 @@ protected void prepareWorkingCopy(Path source, Path destination, Predicate } } - protected String resolveGitUsername(BaseReleaser releaser) { + protected String resolveGitUsername(BaseReleaser releaser) { String username = packager.getRepositoryTap().getResolvedUsername(releaser); return isNotBlank(username) ? username : releaser.getResolvedUsername(); } - protected String resolveGitToken(BaseReleaser releaser) { + protected String resolveGitToken(BaseReleaser releaser) { String token = packager.getRepositoryTap().getResolvedToken(releaser); return isNotBlank(token) ? token : releaser.getResolvedToken(); } diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/AbstractTemplatePackagerProcessor.java b/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/AbstractTemplatePackagerProcessor.java index 056f8ffa6..9bafadccf 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/AbstractTemplatePackagerProcessor.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/AbstractTemplatePackagerProcessor.java @@ -48,7 +48,7 @@ * @author Andres Almiray * @since 0.6.0 */ -abstract class AbstractTemplatePackagerProcessor extends AbstractPackagerProcessor { +abstract class AbstractTemplatePackagerProcessor> extends AbstractPackagerProcessor { protected AbstractTemplatePackagerProcessor(JReleaserContext context) { super(context); } diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/AppImagePackagerProcessor.java b/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/AppImagePackagerProcessor.java index 169e2c278..92965b020 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/AppImagePackagerProcessor.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/AppImagePackagerProcessor.java @@ -90,7 +90,7 @@ protected void doPackageDistribution(Distribution distribution, Map props) throws PackagerProcessingException { - BaseReleaser releaser = context.getModel().getRelease().getReleaser(); + BaseReleaser releaser = context.getModel().getRelease().getReleaser(); try { props.put(KEY_APPIMAGE_RELEASES, Releasers.releaserFor(context) @@ -145,7 +145,7 @@ protected void fillPackagerProperties(Map props, Distribution di props.put(KEY_APPIMAGE_REPO_OWNER, packager.getRepository().getOwner()); props.put(KEY_APPIMAGE_REPO_NAME, packager.getRepository().getName()); - BaseReleaser releaser = context.getModel().getRelease().getReleaser(); + BaseReleaser releaser = context.getModel().getRelease().getReleaser(); String str = (String) props.get(KEY_DISTRIBUTION_ARTIFACT_FILE); str = str.replace(context.getModel().getProject().getEffectiveVersion(), "${DISTRIBUTION_VERSION}"); props.put(KEY_APPIMAGE_DISTRIBUTION_ARTIFACT_FILE, str); diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/AsdfPackagerProcessor.java b/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/AsdfPackagerProcessor.java index d305310be..233ab35d4 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/AsdfPackagerProcessor.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/AsdfPackagerProcessor.java @@ -58,7 +58,7 @@ protected void doPackageDistribution(Distribution distribution, Map props, Distribution distribution) throws PackagerProcessingException { - BaseReleaser releaser = context.getModel().getRelease().getReleaser(); + BaseReleaser releaser = context.getModel().getRelease().getReleaser(); String repoUrl = releaser.getResolvedRepoUrl(context.getModel(), packager.getRepository().getOwner(), packager.getRepository().getResolvedName()); diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/BrewPackagerProcessor.java b/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/BrewPackagerProcessor.java index 834f2dd88..4356f47c1 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/BrewPackagerProcessor.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/BrewPackagerProcessor.java @@ -110,7 +110,7 @@ protected void doPackageDistribution(Distribution distribution, Map props, Distribution distribution) throws PackagerProcessingException { - BaseReleaser releaser = context.getModel().getRelease().getReleaser(); + BaseReleaser releaser = context.getModel().getRelease().getReleaser(); props.put(KEY_BREW_FORMULA_NAME, packager.getResolvedFormulaName(props)); diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/ChocolateyPackagerProcessor.java b/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/ChocolateyPackagerProcessor.java index bb0d67638..7d6410e39 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/ChocolateyPackagerProcessor.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/ChocolateyPackagerProcessor.java @@ -99,7 +99,7 @@ protected void doPublishDistribution(Distribution distribution, Map props, Distribution distribution) throws PackagerProcessingException { - BaseReleaser releaser = context.getModel().getRelease().getReleaser(); + BaseReleaser releaser = context.getModel().getRelease().getReleaser(); if (!props.containsKey(KEY_PROJECT_LICENSE_URL) || isBlank((String) props.get(KEY_PROJECT_LICENSE_URL))) { diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/FlatpakPackagerProcessor.java b/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/FlatpakPackagerProcessor.java index b5b7fbb41..5a70aac90 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/FlatpakPackagerProcessor.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/FlatpakPackagerProcessor.java @@ -147,7 +147,7 @@ private void setupPrepare(Distribution distribution, Map props) throw new PackagerProcessingException("ERROR", e); } - BaseReleaser releaser = context.getModel().getRelease().getReleaser(); + BaseReleaser releaser = context.getModel().getRelease().getReleaser(); try { props.put(KEY_FLATPAK_RELEASES, Releasers.releaserFor(context) diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/JbangPackagerProcessor.java b/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/JbangPackagerProcessor.java index 271690977..1272a27a8 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/JbangPackagerProcessor.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/JbangPackagerProcessor.java @@ -70,7 +70,7 @@ protected boolean verifyAndAddArtifacts(Map props, @Override protected void fillPackagerProperties(Map props, Distribution distribution) throws PackagerProcessingException { - BaseReleaser releaser = context.getModel().getRelease().getReleaser(); + BaseReleaser releaser = context.getModel().getRelease().getReleaser(); props.put(KEY_JBANG_CATALOG_REPO_URL, releaser.getResolvedRepoUrl(context.getModel(), packager.getCatalog().getOwner(), packager.getCatalog().getResolvedName())); diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/MacportsPackagerProcessor.java b/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/MacportsPackagerProcessor.java index c2d3d8759..5bcb6edf2 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/MacportsPackagerProcessor.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/MacportsPackagerProcessor.java @@ -69,7 +69,7 @@ protected void doPackageDistribution(Distribution distribution, Map props, Distribution distribution) throws PackagerProcessingException { - BaseReleaser releaser = context.getModel().getRelease().getReleaser(); + BaseReleaser releaser = context.getModel().getRelease().getReleaser(); props.put(KEY_MACPORTS_REPOSITORY_REPO_URL, releaser.getResolvedRepoUrl(context.getModel(), packager.getRepository().getOwner(), packager.getRepository().getResolvedName())); diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/ScoopPackagerProcessor.java b/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/ScoopPackagerProcessor.java index fd33eec52..4665e836d 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/ScoopPackagerProcessor.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/ScoopPackagerProcessor.java @@ -64,7 +64,7 @@ protected void doPackageDistribution(Distribution distribution, Map props, Distribution distribution) throws PackagerProcessingException { - BaseReleaser releaser = context.getModel().getRelease().getReleaser(); + BaseReleaser releaser = context.getModel().getRelease().getReleaser(); props.put(KEY_SCOOP_BUCKET_REPO_URL, releaser.getResolvedRepoUrl(context.getModel(), packager.getBucket().getOwner(), packager.getBucket().getResolvedName())); diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/SnapPackagerProcessor.java b/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/SnapPackagerProcessor.java index 128ceef96..8d8af2382 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/SnapPackagerProcessor.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/packagers/SnapPackagerProcessor.java @@ -103,7 +103,7 @@ protected void doPublishDistribution(Distribution distribution, Map props, Distribution distribution) throws PackagerProcessingException { - BaseReleaser releaser = context.getModel().getRelease().getReleaser(); + BaseReleaser releaser = context.getModel().getRelease().getReleaser(); String desc = context.getModel().getProject().getLongDescription(); desc = Arrays.stream(desc.split(System.lineSeparator())) diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/workflow/AbstractWorkflowItem.java b/core/jreleaser-engine/src/main/java/org/jreleaser/workflow/AbstractWorkflowItem.java index 62e461d3c..29291f2c6 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/workflow/AbstractWorkflowItem.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/workflow/AbstractWorkflowItem.java @@ -32,6 +32,11 @@ protected AbstractWorkflowItem(JReleaserCommand command) { this.command = command; } + @Override + public JReleaserCommand getCommand() { + return command; + } + @Override public void invoke(JReleaserContext context) { CommandHookExecutor executor = new CommandHookExecutor(context); diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/workflow/PackageWorkflowItem.java b/core/jreleaser-engine/src/main/java/org/jreleaser/workflow/PackageWorkflowItem.java index 084800959..d4e3642ff 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/workflow/PackageWorkflowItem.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/workflow/PackageWorkflowItem.java @@ -34,6 +34,9 @@ protected PackageWorkflowItem() { @Override protected void doInvoke(JReleaserContext context) { - Distributions.process(context, RB.$("distributions.action.packaging.capitalize"), DistributionProcessor::packageDistribution); + Distributions.process(context, DistributionProcessor.PackagingAction.of( + RB.$("distributions.action.packaging.capitalize"), + DistributionProcessor.PackagingAction.Type.PACKAGE, + DistributionProcessor::packageDistribution)); } } diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/workflow/PrepareWorkflowItem.java b/core/jreleaser-engine/src/main/java/org/jreleaser/workflow/PrepareWorkflowItem.java index 4c4b04748..1886bcba5 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/workflow/PrepareWorkflowItem.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/workflow/PrepareWorkflowItem.java @@ -34,6 +34,9 @@ protected PrepareWorkflowItem() { @Override protected void doInvoke(JReleaserContext context) { - Distributions.process(context, RB.$("distributions.action.preparing.capitalize"), DistributionProcessor::prepareDistribution); + Distributions.process(context, DistributionProcessor.PackagingAction.of( + RB.$("distributions.action.preparing.capitalize"), + DistributionProcessor.PackagingAction.Type.PREPARE, + DistributionProcessor::prepareDistribution)); } } diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/workflow/PublishWorkflowItem.java b/core/jreleaser-engine/src/main/java/org/jreleaser/workflow/PublishWorkflowItem.java index a362c5185..6c33e41c1 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/workflow/PublishWorkflowItem.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/workflow/PublishWorkflowItem.java @@ -34,6 +34,9 @@ protected PublishWorkflowItem() { @Override protected void doInvoke(JReleaserContext context) { - Distributions.process(context, RB.$("distributions.action.publishing.capitalize"), DistributionProcessor::publishDistribution); + Distributions.process(context, DistributionProcessor.PackagingAction.of( + RB.$("distributions.action.publishing.capitalize"), + DistributionProcessor.PackagingAction.Type.PUBLISH, + DistributionProcessor::publishDistribution)); } } diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/workflow/WorkflowImpl.java b/core/jreleaser-engine/src/main/java/org/jreleaser/workflow/WorkflowImpl.java index 898a8f7c8..cb995de93 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/workflow/WorkflowImpl.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/workflow/WorkflowImpl.java @@ -19,13 +19,15 @@ import org.jreleaser.bundle.RB; import org.jreleaser.engine.context.ModelValidator; +import org.jreleaser.extensions.api.workflow.WorkflowListenerException; +import org.jreleaser.model.JReleaserException; +import org.jreleaser.model.api.hooks.ExecutionEvent; import org.jreleaser.model.internal.JReleaserContext; import java.time.Duration; import java.time.Instant; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.atomic.AtomicReference; import static org.jreleaser.util.TimeUtils.formatDuration; @@ -44,7 +46,10 @@ public WorkflowImpl(JReleaserContext context, List items) { } public void execute() { - AtomicReference exception = new AtomicReference<>(); + RuntimeException stepException = null; + Throwable listenerException = null; + Throwable startSessionException = null; + Throwable endSessionException = null; Instant start = Instant.now(); context.getLogger().info(RB.$("workflow.dryrun"), context.isDryrun()); @@ -69,27 +74,113 @@ public void execute() { logFilters("workflow.included.announcers", context.getIncludedAnnouncers()); logFilters("workflow.excluded.announcers", context.getExcludedAnnouncers()); - for (WorkflowItem item : items) { - try { - item.invoke(context); - } catch (RuntimeException e) { - // terminate - exception.compareAndSet(null, e); - break; + try { + context.fireSessionStartEvent(); + } catch (WorkflowListenerException e) { + context.getLogger().error(RB.$("listener.failure", e.getListener().getClass().getName())); + context.getLogger().trace(e); + if (!e.getListener().isContinueOnError()) { + startSessionException = e.getCause(); } } + + if (null == startSessionException) { + boolean failure = false; + for (WorkflowItem item : items) { + try { + context.fireWorkflowEvent(ExecutionEvent.before(item.getCommand().toStep())); + } catch (WorkflowListenerException beforeException) { + context.getLogger().error(RB.$("listener.failure", beforeException.getListener().getClass().getName())); + context.getLogger().trace(beforeException); + if (!beforeException.getListener().isContinueOnError()) { + listenerException = beforeException.getCause(); + break; + } + } + + try { + item.invoke(context); + } catch (RuntimeException e) { + // terminate + failure = true; + stepException = e; + + try { + context.fireWorkflowEvent(ExecutionEvent.failure(item.getCommand().toStep(), e)); + } catch (WorkflowListenerException failureException) { + context.getLogger().error(RB.$("listener.failure", failureException.getListener().getClass().getName())); + context.getLogger().trace(failureException); + if (!failureException.getListener().isContinueOnError()) { + listenerException = failureException.getCause(); + break; + } + } + break; + } + + if (!failure) { + try { + context.fireWorkflowEvent(ExecutionEvent.success(item.getCommand().toStep())); + } catch (WorkflowListenerException afterException) { + context.getLogger().error(RB.$("listener.failure", afterException.getListener().getClass().getName())); + context.getLogger().trace(afterException); + if (!afterException.getListener().isContinueOnError()) { + listenerException = afterException.getCause(); + break; + } + } + } + } + } + + try { + context.fireSessionEndEvent(); + } catch (WorkflowListenerException e) { + context.getLogger().error(RB.$("listener.failure", e.getListener().getClass().getName())); + context.getLogger().trace(e); + if (!e.getListener().isContinueOnError()) { + endSessionException = e.getCause(); + } + } + Instant end = Instant.now(); double duration = Duration.between(start, end).toMillis() / 1000d; context.getLogger().reset(); context.report(); - if (null == exception.get()) { - context.getLogger().info(RB.$("workflow.success"), formatDuration(duration)); - } else { + + if (null != startSessionException) { + context.getLogger().error(RB.$("workflow.failure"), formatDuration(duration)); + context.getLogger().trace(startSessionException); + if (startSessionException instanceof RuntimeException) { + throw (RuntimeException) startSessionException; + } else { + throw new JReleaserException(RB.$("ERROR_unexpected_error"), startSessionException); + } + } else if (null != endSessionException) { context.getLogger().error(RB.$("workflow.failure"), formatDuration(duration)); - context.getLogger().trace(exception.get()); - throw exception.get(); + context.getLogger().trace(endSessionException); + if (endSessionException instanceof RuntimeException) { + throw (RuntimeException) endSessionException; + } else { + throw new JReleaserException(RB.$("ERROR_unexpected_error"), endSessionException); + } + } else { + if (null == stepException) { + if (null != listenerException) { + if (listenerException instanceof RuntimeException) { + throw (RuntimeException) listenerException; + } else { + throw new JReleaserException(RB.$("ERROR_unexpected_error"), listenerException); + } + } + context.getLogger().info(RB.$("workflow.success"), formatDuration(duration)); + } else { + context.getLogger().error(RB.$("workflow.failure"), formatDuration(duration)); + context.getLogger().trace(stepException); + throw stepException; + } } } diff --git a/core/jreleaser-engine/src/main/java/org/jreleaser/workflow/WorkflowItem.java b/core/jreleaser-engine/src/main/java/org/jreleaser/workflow/WorkflowItem.java index 5e2bf6bfd..79aa7e8fa 100644 --- a/core/jreleaser-engine/src/main/java/org/jreleaser/workflow/WorkflowItem.java +++ b/core/jreleaser-engine/src/main/java/org/jreleaser/workflow/WorkflowItem.java @@ -17,6 +17,7 @@ */ package org.jreleaser.workflow; +import org.jreleaser.model.api.JReleaserCommand; import org.jreleaser.model.internal.JReleaserContext; /** @@ -24,5 +25,7 @@ * @since 0.1.0 */ public interface WorkflowItem { + JReleaserCommand getCommand(); + void invoke(JReleaserContext context); } diff --git a/core/jreleaser-extensions-impl/src/main/java/org/jreleaser/extensions/impl/DefaultExtensionManager.java b/core/jreleaser-extensions-impl/src/main/java/org/jreleaser/extensions/impl/DefaultExtensionManager.java index b47631394..4d13b2b45 100644 --- a/core/jreleaser-extensions-impl/src/main/java/org/jreleaser/extensions/impl/DefaultExtensionManager.java +++ b/core/jreleaser-extensions-impl/src/main/java/org/jreleaser/extensions/impl/DefaultExtensionManager.java @@ -22,8 +22,9 @@ import org.jreleaser.extensions.api.Extension; import org.jreleaser.extensions.api.ExtensionManager; import org.jreleaser.extensions.api.ExtensionPoint; +import org.jreleaser.extensions.api.workflow.WorkflowListener; import org.jreleaser.model.JReleaserException; -import org.jreleaser.model.api.JReleaserContext; +import org.jreleaser.model.internal.JReleaserContext; import org.jreleaser.sdk.command.CommandException; import org.jreleaser.sdk.tool.Mvn; import org.jreleaser.sdk.tool.ToolException; @@ -97,6 +98,8 @@ public void load(JReleaserContext context) { } }); } + + context.setWorkflowListeners(findExtensionPoints(WorkflowListener.class)); } public Set findExtensionPoints(Class extensionPointType) { @@ -166,7 +169,7 @@ private String resolveJARs(JReleaserContext context, ExtensionDef extensionDef) .resolve(extensionDef.getName()) .toAbsolutePath(); - Mvn mvn = new Mvn(context, DefaultVersions.getInstance().getMvnVersion()); + Mvn mvn = new Mvn(context.asImmutable(), DefaultVersions.getInstance().getMvnVersion()); try { if (!mvn.setup()) { @@ -241,8 +244,10 @@ private void processExtension(JReleaserContext context, Extension extension, Set for (ExtensionPoint extensionPoint : extension.provides()) { String extensionPointTypeName = extensionPoint.getClass().getName(); if (null != extensionDef && extensionDef.getExtensionPoints().containsKey(extensionPointTypeName)) { - extensionPoint.init(extensionDef.getExtensionPoints().get(extensionPointTypeName) + extensionPoint.init(context.asImmutable(), extensionDef.getExtensionPoints().get(extensionPointTypeName) .getProperties()); + } else { + extensionPoint.init(context.asImmutable(), Collections.emptyMap()); } context.getLogger().debug(RB.$("extension.manager.add.extension.point", extensionPointTypeName, extensionName)); allExtensionPoints.add(extensionPoint); diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/JReleaserContext.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/JReleaserContext.java index d768a7f3d..d1af6de33 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/JReleaserContext.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/JReleaserContext.java @@ -19,21 +19,29 @@ import org.bouncycastle.openpgp.PGPException; import org.jreleaser.bundle.RB; +import org.jreleaser.extensions.api.workflow.WorkflowListener; +import org.jreleaser.extensions.api.workflow.WorkflowListenerException; import org.jreleaser.logging.JReleaserLogger; import org.jreleaser.model.Constants; import org.jreleaser.model.JReleaserException; import org.jreleaser.model.JReleaserVersion; import org.jreleaser.model.Signing; import org.jreleaser.model.api.JReleaserCommand; +import org.jreleaser.model.api.announce.Announcer; +import org.jreleaser.model.api.assemble.Assembler; +import org.jreleaser.model.api.deploy.Deployer; +import org.jreleaser.model.api.distributions.Distribution; +import org.jreleaser.model.api.download.Downloader; +import org.jreleaser.model.api.hooks.ExecutionEvent; +import org.jreleaser.model.api.packagers.Packager; +import org.jreleaser.model.api.release.Releaser; import org.jreleaser.model.api.signing.Keyring; import org.jreleaser.model.api.signing.SigningException; -import org.jreleaser.model.internal.assemble.Assembler; +import org.jreleaser.model.api.upload.Uploader; import org.jreleaser.model.internal.assemble.JavaAssembler; import org.jreleaser.model.internal.common.Artifact; -import org.jreleaser.model.internal.distributions.Distribution; import org.jreleaser.model.internal.project.Project; import org.jreleaser.model.internal.release.BaseReleaser; -import org.jreleaser.model.spi.release.Releaser; import org.jreleaser.sdk.signing.FilesKeyring; import org.jreleaser.sdk.signing.InMemoryKeyring; import org.jreleaser.util.Errors; @@ -45,6 +53,7 @@ import java.io.IOException; import java.nio.file.Path; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.Enumeration; import java.util.Iterator; @@ -124,9 +133,10 @@ public class JReleaserContext { private final List excludedDeployerNames = new ArrayList<>(); private final List excludedUploaderTypes = new ArrayList<>(); private final List excludedUploaderNames = new ArrayList<>(); + private final List workflowListeners = new ArrayList<>(); private String changelog; - private Releaser releaser; + private org.jreleaser.model.spi.release.Releaser releaser; private JReleaserCommand command; private final org.jreleaser.model.api.JReleaserContext immutable = new org.jreleaser.model.api.JReleaserContext() { @@ -445,12 +455,12 @@ private void adjustDistributions() { } // match distributions - for (Assembler assembler : model.getAssemble().findAllAssemblers()) { + for (org.jreleaser.model.internal.assemble.Assembler assembler : model.getAssemble().findAllAssemblers()) { if (!assembler.isExported()) continue; - Distribution distribution = model.getDistributions().get(assembler.getName()); + org.jreleaser.model.internal.distributions.Distribution distribution = model.getDistributions().get(assembler.getName()); if (null == distribution) { - distribution = new Distribution(); + distribution = new org.jreleaser.model.internal.distributions.Distribution(); distribution.setType(assembler.getDistributionType()); distribution.setStereotype(assembler.getStereotype()); distribution.setName(assembler.getName()); @@ -460,8 +470,8 @@ private void adjustDistributions() { distribution.setType(assembler.getDistributionType()); distribution.setActive(assembler.getActive()); if (assembler instanceof JavaAssembler) { - distribution.getExecutable().setName(((JavaAssembler) assembler).getExecutable()); - distribution.setJava(((JavaAssembler) assembler).getJava()); + distribution.getExecutable().setName(((JavaAssembler) assembler).getExecutable()); + distribution.setJava(((JavaAssembler) assembler).getJava()); } mergeArtifacts(assembler, distribution); @@ -471,7 +481,7 @@ private void adjustDistributions() { } } - private void mergeArtifacts(Assembler assembler, Distribution distribution) { + private void mergeArtifacts(org.jreleaser.model.internal.assemble.Assembler assembler, org.jreleaser.model.internal.distributions.Distribution distribution) { for (Artifact incoming : assembler.getOutputs()) { Optional artifact = distribution.getArtifacts().stream() .filter(a -> { @@ -571,11 +581,11 @@ public void setChangelog(String changelog) { this.changelog = changelog; } - public Releaser getReleaser() { + public org.jreleaser.model.spi.release.Releaser getReleaser() { return releaser; } - public void setReleaser(Releaser releaser) { + public void setReleaser(org.jreleaser.model.spi.release.Releaser releaser) { this.releaser = releaser; } @@ -594,6 +604,15 @@ private List normalize(List list) { return tmp; } + public List getWorkflowListeners() { + return workflowListeners; + } + + public void setWorkflowListeners(Collection workflowListeners) { + this.workflowListeners.clear(); + this.workflowListeners.addAll(workflowListeners); + } + public List getIncludedAnnouncers() { return includedAnnouncers; } @@ -888,7 +907,7 @@ public Keyring createKeyring() throws SigningException { } } - public boolean isDistributionIncluded(Distribution distribution) { + public boolean isDistributionIncluded(org.jreleaser.model.internal.distributions.Distribution distribution) { String distributionName = distribution.getName(); if (!includedDistributions.isEmpty()) { @@ -902,6 +921,146 @@ public boolean isDistributionIncluded(Distribution distribution) { return true; } + public void fireSessionStartEvent() throws WorkflowListenerException { + for (WorkflowListener workflowListener : workflowListeners) { + try { + workflowListener.onSessionStart(this.asImmutable()); + } catch (RuntimeException e) { + throw new WorkflowListenerException(workflowListener, e); + } + } + } + + public void fireSessionEndEvent() throws WorkflowListenerException { + for (WorkflowListener workflowListener : workflowListeners) { + try { + workflowListener.onSessionEnd(this.asImmutable()); + } catch (RuntimeException e) { + throw new WorkflowListenerException(workflowListener, e); + } + } + } + + public void fireWorkflowEvent(ExecutionEvent event) throws WorkflowListenerException { + for (WorkflowListener workflowListener : workflowListeners) { + try { + workflowListener.onWorkflowStep(event, this.asImmutable()); + } catch (RuntimeException e) { + throw new WorkflowListenerException(workflowListener, e); + } + } + } + + public void fireAnnounceStepEvent(ExecutionEvent event, Announcer announcer) throws WorkflowListenerException { + for (WorkflowListener workflowListener : workflowListeners) { + try { + workflowListener.onAnnounceStep(event, this.asImmutable(), announcer); + } catch (RuntimeException e) { + throw new WorkflowListenerException(workflowListener, e); + } + } + } + + public void fireAssembleStepEvent(ExecutionEvent event, Assembler assembler) throws WorkflowListenerException { + for (WorkflowListener workflowListener : workflowListeners) { + try { + workflowListener.onAssembleStep(event, this.asImmutable(), assembler); + } catch (RuntimeException e) { + throw new WorkflowListenerException(workflowListener, e); + } + } + } + + public void fireDeployStepEvent(ExecutionEvent event, Deployer deployer) throws WorkflowListenerException { + for (WorkflowListener workflowListener : workflowListeners) { + try { + workflowListener.onDeployStep(event, this.asImmutable(), deployer); + } catch (RuntimeException e) { + throw new WorkflowListenerException(workflowListener, e); + } + } + } + + public void fireDownloadStepEvent(ExecutionEvent event, Downloader downloader) throws WorkflowListenerException { + for (WorkflowListener workflowListener : workflowListeners) { + try { + workflowListener.onDownloadStep(event, this.asImmutable(), downloader); + } catch (RuntimeException e) { + throw new WorkflowListenerException(workflowListener, e); + } + } + } + + public void fireUploadStepEvent(ExecutionEvent event, Uploader uploader) throws WorkflowListenerException { + for (WorkflowListener workflowListener : workflowListeners) { + try { + workflowListener.onUploadStep(event, this.asImmutable(), uploader); + } catch (RuntimeException e) { + throw new WorkflowListenerException(workflowListener, e); + } + } + } + + public void fireReleaseStepEvent(ExecutionEvent event, Releaser releaser) throws WorkflowListenerException { + for (WorkflowListener workflowListener : workflowListeners) { + try { + workflowListener.onReleaseStep(event, this.asImmutable(), releaser); + } catch (RuntimeException e) { + throw new WorkflowListenerException(workflowListener, e); + } + } + } + + public void fireDistributionStartEvent(Distribution distribution) throws WorkflowListenerException { + for (WorkflowListener workflowListener : workflowListeners) { + try { + workflowListener.onDistributionStart(this.asImmutable(), distribution); + } catch (RuntimeException e) { + throw new WorkflowListenerException(workflowListener, e); + } + } + } + + public void fireDistributionEndEvent(Distribution distribution) throws WorkflowListenerException { + for (WorkflowListener workflowListener : workflowListeners) { + try { + workflowListener.onDistributionEnd(this.asImmutable(), distribution); + } catch (RuntimeException e) { + throw new WorkflowListenerException(workflowListener, e); + } + } + } + + public void firePackagerPackageEvent(ExecutionEvent event, Distribution distribution, Packager packager) throws WorkflowListenerException { + for (WorkflowListener workflowListener : workflowListeners) { + try { + workflowListener.onPackagerPackageStep(event, this.asImmutable(), distribution, packager); + } catch (RuntimeException e) { + throw new WorkflowListenerException(workflowListener, e); + } + } + } + + public void firePackagerPublishEvent(ExecutionEvent event, Distribution distribution, Packager packager) throws WorkflowListenerException { + for (WorkflowListener workflowListener : workflowListeners) { + try { + workflowListener.onPackagerPublishStep(event, this.asImmutable(), distribution, packager); + } catch (RuntimeException e) { + throw new WorkflowListenerException(workflowListener, e); + } + } + } + + public void firePackagerPrepareEvent(ExecutionEvent event, Distribution distribution, Packager packager) throws WorkflowListenerException { + for (WorkflowListener workflowListener : workflowListeners) { + try { + workflowListener.onPackagerPrepareStep(event, this.asImmutable(), distribution, packager); + } catch (RuntimeException e) { + throw new WorkflowListenerException(workflowListener, e); + } + } + } + public enum Configurer { CLI("CLI flags"), CLI_YAML("CLI yaml DSL"), diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/AbstractAnnouncer.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/AbstractAnnouncer.java index 652fad5d3..744966b7e 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/AbstractAnnouncer.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/AbstractAnnouncer.java @@ -30,7 +30,7 @@ * @author Andres Almiray * @since 0.1.0 */ -public abstract class AbstractAnnouncer> extends AbstractModelObject implements Announcer { +public abstract class AbstractAnnouncer, A extends org.jreleaser.model.api.announce.Announcer> extends AbstractModelObject implements Announcer { protected final Map extraProperties = new LinkedHashMap<>(); @JsonIgnore protected String name; diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/Announcer.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/Announcer.java index e86e5a911..9ccf6b627 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/Announcer.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/Announcer.java @@ -26,8 +26,10 @@ * @author Andres Almiray * @since 0.1.0 */ -public interface Announcer extends Domain, Activatable, TimeoutAware, ExtraProperties { +public interface Announcer extends Domain, Activatable, TimeoutAware, ExtraProperties { String getName(); boolean isSnapshotSupported(); + + A asImmutable(); } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/ArticleAnnouncer.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/ArticleAnnouncer.java index 7305e9a05..5757007fe 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/ArticleAnnouncer.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/ArticleAnnouncer.java @@ -36,7 +36,7 @@ * @author Andres Almiray * @since 0.6.0 */ -public final class ArticleAnnouncer extends AbstractAnnouncer implements Announcer, CommitAuthorAware { +public final class ArticleAnnouncer extends AbstractAnnouncer implements CommitAuthorAware { private final Set files = new LinkedHashSet<>(); private final CommitAuthor commitAuthor = new CommitAuthor(); private final Repository repository = new Repository(); @@ -46,6 +46,11 @@ public final class ArticleAnnouncer extends AbstractAnnouncer private final org.jreleaser.model.api.announce.ArticleAnnouncer immutable = new org.jreleaser.model.api.announce.ArticleAnnouncer() { private Set files; + @Override + public String getType() { + return org.jreleaser.model.api.announce.ArticleAnnouncer.TYPE; + } + @Override public Set getFiles() { if (null == files) { @@ -121,6 +126,7 @@ public ArticleAnnouncer() { super(TYPE); } + @Override public org.jreleaser.model.api.announce.ArticleAnnouncer asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/DiscordAnnouncer.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/DiscordAnnouncer.java index be4926d38..81f628eb1 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/DiscordAnnouncer.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/DiscordAnnouncer.java @@ -42,12 +42,17 @@ * @author Andres Almiray * @since 0.2.0 */ -public final class DiscordAnnouncer extends AbstractAnnouncer { +public final class DiscordAnnouncer extends AbstractAnnouncer { private String webhook; private String message; private String messageTemplate; private final org.jreleaser.model.api.announce.DiscordAnnouncer immutable = new org.jreleaser.model.api.announce.DiscordAnnouncer() { + @Override + public String getType() { + return org.jreleaser.model.api.announce.DiscordAnnouncer.TYPE; + } + @Override public String getWebhook() { return webhook; @@ -113,6 +118,7 @@ public DiscordAnnouncer() { super(TYPE); } + @Override public org.jreleaser.model.api.announce.DiscordAnnouncer asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/DiscussionsAnnouncer.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/DiscussionsAnnouncer.java index 12884b498..e59519bcf 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/DiscussionsAnnouncer.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/DiscussionsAnnouncer.java @@ -38,7 +38,7 @@ * @author Andres Almiray * @since 0.1.0 */ -public final class DiscussionsAnnouncer extends AbstractAnnouncer { +public final class DiscussionsAnnouncer extends AbstractAnnouncer { private String organization; private String team; private String title; @@ -46,6 +46,11 @@ public final class DiscussionsAnnouncer extends AbstractAnnouncer { +public final class GitterAnnouncer extends AbstractAnnouncer { private String webhook; private String message; private String messageTemplate; private final org.jreleaser.model.api.announce.GitterAnnouncer immutable = new org.jreleaser.model.api.announce.GitterAnnouncer() { + @Override + public String getType() { + return org.jreleaser.model.api.announce.GitterAnnouncer.TYPE; + } + @Override public String getWebhook() { return webhook; @@ -114,6 +119,7 @@ public GitterAnnouncer() { super(TYPE); } + @Override public org.jreleaser.model.api.announce.GitterAnnouncer asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/GoogleChatAnnouncer.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/GoogleChatAnnouncer.java index 95406629e..77462469d 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/GoogleChatAnnouncer.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/GoogleChatAnnouncer.java @@ -43,12 +43,17 @@ * @author Anyul Rivas * @since 0.5.0 */ -public final class GoogleChatAnnouncer extends AbstractAnnouncer { +public final class GoogleChatAnnouncer extends AbstractAnnouncer { private String webhook; private String message; private String messageTemplate; private final org.jreleaser.model.api.announce.GoogleChatAnnouncer immutable = new org.jreleaser.model.api.announce.GoogleChatAnnouncer() { + @Override + public String getType() { + return org.jreleaser.model.api.announce.GoogleChatAnnouncer.TYPE; + } + @Override public String getWebhook() { return webhook; @@ -114,6 +119,7 @@ public GoogleChatAnnouncer() { super(TYPE); } + @Override public org.jreleaser.model.api.announce.GoogleChatAnnouncer asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/HttpAnnouncer.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/HttpAnnouncer.java index 4c9c6f49b..285844d23 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/HttpAnnouncer.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/HttpAnnouncer.java @@ -43,7 +43,7 @@ * @author Andres Almiray * @since 1.3.0 */ -public final class HttpAnnouncer extends AbstractAnnouncer implements Http { +public final class HttpAnnouncer extends AbstractAnnouncer implements Http { private final Map headers = new LinkedHashMap<>(); private String url; private String username; @@ -55,6 +55,11 @@ public final class HttpAnnouncer extends AbstractAnnouncer implem private String bearerKeyword; private final org.jreleaser.model.api.announce.HttpAnnouncer immutable = new org.jreleaser.model.api.announce.HttpAnnouncer() { + @Override + public String getType() { + return org.jreleaser.model.api.announce.HttpAnnouncers.TYPE; + } + @Override public Method getMethod() { return null; @@ -150,6 +155,7 @@ public HttpAnnouncer() { super(""); } + @Override public org.jreleaser.model.api.announce.HttpAnnouncer asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/HttpAnnouncers.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/HttpAnnouncers.java index f27fad52e..2cbd037b9 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/HttpAnnouncers.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/HttpAnnouncers.java @@ -34,12 +34,17 @@ * @author Andres Almiray * @since 1.3.0 */ -public final class HttpAnnouncers extends AbstractAnnouncer { +public final class HttpAnnouncers extends AbstractAnnouncer { private final Map httpAnnouncers = new LinkedHashMap<>(); private final org.jreleaser.model.api.announce.HttpAnnouncers immutable = new org.jreleaser.model.api.announce.HttpAnnouncers() { private Map httpAnnouncers; + @Override + public String getType() { + return org.jreleaser.model.api.announce.HttpAnnouncers.TYPE; + } + @Override public Map getHttpAnnouncers() { if (null == httpAnnouncers) { @@ -100,6 +105,7 @@ public HttpAnnouncers() { super(TYPE); } + @Override public org.jreleaser.model.api.announce.HttpAnnouncers asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/MastodonAnnouncer.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/MastodonAnnouncer.java index 7ffd00d7e..e42610317 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/MastodonAnnouncer.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/MastodonAnnouncer.java @@ -36,12 +36,17 @@ * @author Andres Almiray * @since 0.4.0 */ -public final class MastodonAnnouncer extends AbstractAnnouncer { +public final class MastodonAnnouncer extends AbstractAnnouncer { private String host; private String accessToken; private String status; private final org.jreleaser.model.api.announce.MastodonAnnouncer immutable = new org.jreleaser.model.api.announce.MastodonAnnouncer() { + @Override + public String getType() { + return org.jreleaser.model.api.announce.MastodonAnnouncer.TYPE; + } + @Override public String getHost() { return host; @@ -107,6 +112,7 @@ public MastodonAnnouncer() { super(TYPE); } + @Override public org.jreleaser.model.api.announce.MastodonAnnouncer asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/MattermostAnnouncer.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/MattermostAnnouncer.java index e2a784b7e..2e98840c0 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/MattermostAnnouncer.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/MattermostAnnouncer.java @@ -43,12 +43,17 @@ * @author Andres Almiray * @since 0.4.0 */ -public final class MattermostAnnouncer extends AbstractAnnouncer { +public final class MattermostAnnouncer extends AbstractAnnouncer { private String webhook; private String message; private String messageTemplate; private final org.jreleaser.model.api.announce.MattermostAnnouncer immutable = new org.jreleaser.model.api.announce.MattermostAnnouncer() { + @Override + public String getType() { + return org.jreleaser.model.api.announce.MattermostAnnouncer.TYPE; + } + @Override public String getWebhook() { return webhook; @@ -114,6 +119,7 @@ public MattermostAnnouncer() { super(TYPE); } + @Override public org.jreleaser.model.api.announce.MattermostAnnouncer asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/SdkmanAnnouncer.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/SdkmanAnnouncer.java index 7248a5710..401e1ac48 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/SdkmanAnnouncer.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/SdkmanAnnouncer.java @@ -34,7 +34,7 @@ * @author Andres Almiray * @since 0.1.0 */ -public final class SdkmanAnnouncer extends AbstractAnnouncer { +public final class SdkmanAnnouncer extends AbstractAnnouncer { private String consumerKey; private String consumerToken; private String candidate; @@ -43,6 +43,11 @@ public final class SdkmanAnnouncer extends AbstractAnnouncer { private Sdkman.Command command; private final org.jreleaser.model.api.announce.SdkmanAnnouncer immutable = new org.jreleaser.model.api.announce.SdkmanAnnouncer() { + @Override + public String getType() { + return org.jreleaser.model.api.announce.SdkmanAnnouncer.TYPE; + } + @Override public String getConsumerKey() { return consumerKey; @@ -128,6 +133,7 @@ public SdkmanAnnouncer() { super(TYPE); } + @Override public org.jreleaser.model.api.announce.SdkmanAnnouncer asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/SlackAnnouncer.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/SlackAnnouncer.java index b6549a0df..98f432c25 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/SlackAnnouncer.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/SlackAnnouncer.java @@ -44,7 +44,7 @@ * @author Andres Almiray * @since 0.1.0 */ -public final class SlackAnnouncer extends AbstractAnnouncer { +public final class SlackAnnouncer extends AbstractAnnouncer { private String token; private String webhook; private String channel; @@ -52,6 +52,11 @@ public final class SlackAnnouncer extends AbstractAnnouncer { private String messageTemplate; private final org.jreleaser.model.api.announce.SlackAnnouncer immutable = new org.jreleaser.model.api.announce.SlackAnnouncer() { + @Override + public String getType() { + return org.jreleaser.model.api.announce.SlackAnnouncer.TYPE; + } + @Override public String getToken() { return token; @@ -127,6 +132,7 @@ public SlackAnnouncer() { super(TYPE); } + @Override public org.jreleaser.model.api.announce.SlackAnnouncer asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/SmtpAnnouncer.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/SmtpAnnouncer.java index 9d7519f31..6b4d7518d 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/SmtpAnnouncer.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/SmtpAnnouncer.java @@ -46,7 +46,7 @@ * @author Andres Almiray * @since 0.1.0 */ -public final class SmtpAnnouncer extends AbstractAnnouncer { +public final class SmtpAnnouncer extends AbstractAnnouncer { private final Map properties = new LinkedHashMap<>(); private Mail.Transport transport; @@ -65,6 +65,11 @@ public final class SmtpAnnouncer extends AbstractAnnouncer { private Mail.MimeType mimeType; private final org.jreleaser.model.api.announce.SmtpAnnouncer immutable = new org.jreleaser.model.api.announce.SmtpAnnouncer() { + @Override + public String getType() { + return org.jreleaser.model.api.announce.SmtpAnnouncer.TYPE; + } + @Override public Mail.Transport getTransport() { return transport; @@ -190,6 +195,7 @@ public SmtpAnnouncer() { super(TYPE); } + @Override public org.jreleaser.model.api.announce.SmtpAnnouncer asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/TeamsAnnouncer.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/TeamsAnnouncer.java index 9ae5d13c4..d7f5f0cd0 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/TeamsAnnouncer.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/TeamsAnnouncer.java @@ -42,11 +42,16 @@ * @author Andres Almiray * @since 0.2.0 */ -public final class TeamsAnnouncer extends AbstractAnnouncer { +public final class TeamsAnnouncer extends AbstractAnnouncer { private String webhook; private String messageTemplate; private final org.jreleaser.model.api.announce.TeamsAnnouncer immutable = new org.jreleaser.model.api.announce.TeamsAnnouncer() { + @Override + public String getType() { + return org.jreleaser.model.api.announce.TeamsAnnouncer.TYPE; + } + @Override public String getWebhook() { return webhook; @@ -107,6 +112,7 @@ public TeamsAnnouncer() { super(TYPE); } + @Override public org.jreleaser.model.api.announce.TeamsAnnouncer asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/TelegramAnnouncer.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/TelegramAnnouncer.java index 3104d14d3..f6ca2abbf 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/TelegramAnnouncer.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/TelegramAnnouncer.java @@ -44,13 +44,18 @@ * @author Andres Almiray * @since 0.8.0 */ -public final class TelegramAnnouncer extends AbstractAnnouncer { +public final class TelegramAnnouncer extends AbstractAnnouncer { private String token; private String chatId; private String message; private String messageTemplate; private final org.jreleaser.model.api.announce.TelegramAnnouncer immutable = new org.jreleaser.model.api.announce.TelegramAnnouncer() { + @Override + public String getType() { + return org.jreleaser.model.api.announce.TelegramAnnouncer.TYPE; + } + @Override public String getToken() { return token; @@ -121,6 +126,7 @@ public TelegramAnnouncer() { super(TYPE); } + @Override public org.jreleaser.model.api.announce.TelegramAnnouncer asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/TwitterAnnouncer.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/TwitterAnnouncer.java index 244ac057a..a245a2fc8 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/TwitterAnnouncer.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/TwitterAnnouncer.java @@ -49,7 +49,7 @@ * @author Andres Almiray * @since 0.1.0 */ -public final class TwitterAnnouncer extends AbstractAnnouncer { +public final class TwitterAnnouncer extends AbstractAnnouncer { private final List statuses = new ArrayList<>(); private String consumerKey; private String consumerSecret; @@ -59,6 +59,11 @@ public final class TwitterAnnouncer extends AbstractAnnouncer private String statusTemplate; private final org.jreleaser.model.api.announce.TwitterAnnouncer immutable = new org.jreleaser.model.api.announce.TwitterAnnouncer() { + @Override + public String getType() { + return org.jreleaser.model.api.announce.TwitterAnnouncer.TYPE; + } + @Override public String getConsumerKey() { return consumerKey; @@ -144,6 +149,7 @@ public TwitterAnnouncer() { super(TYPE); } + @Override public org.jreleaser.model.api.announce.TwitterAnnouncer asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/WebhookAnnouncer.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/WebhookAnnouncer.java index 3a149877b..e0a020de1 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/WebhookAnnouncer.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/WebhookAnnouncer.java @@ -41,13 +41,18 @@ * @author Andres Almiray * @since 0.5.0 */ -public final class WebhookAnnouncer extends AbstractAnnouncer { +public final class WebhookAnnouncer extends AbstractAnnouncer { private String webhook; private String message; private String messageProperty; private String messageTemplate; private final org.jreleaser.model.api.announce.WebhookAnnouncer immutable = new org.jreleaser.model.api.announce.WebhookAnnouncer() { + @Override + public String getType() { + return org.jreleaser.model.api.announce.WebhooksAnnouncer.TYPE; + } + @Override public String getWebhook() { return webhook; @@ -118,6 +123,7 @@ public WebhookAnnouncer() { super(""); } + @Override public org.jreleaser.model.api.announce.WebhookAnnouncer asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/WebhooksAnnouncer.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/WebhooksAnnouncer.java index a0ca83288..cf18b6eb7 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/WebhooksAnnouncer.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/WebhooksAnnouncer.java @@ -34,12 +34,17 @@ * @author Andres Almiray * @since 0.5.0 */ -public final class WebhooksAnnouncer extends AbstractAnnouncer { +public final class WebhooksAnnouncer extends AbstractAnnouncer { private final Map webhooks = new LinkedHashMap<>(); private final org.jreleaser.model.api.announce.WebhooksAnnouncer immutable = new org.jreleaser.model.api.announce.WebhooksAnnouncer() { private Map webhooks; + @Override + public String getType() { + return org.jreleaser.model.api.announce.WebhooksAnnouncer.TYPE; + } + @Override public Map getWebhooks() { if (null == webhooks) { @@ -100,6 +105,7 @@ public WebhooksAnnouncer() { super(TYPE); } + @Override public org.jreleaser.model.api.announce.WebhooksAnnouncer asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/ZulipAnnouncer.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/ZulipAnnouncer.java index a84cc8c45..e6e376f51 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/ZulipAnnouncer.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/announce/ZulipAnnouncer.java @@ -43,7 +43,7 @@ * @author Andres Almiray * @since 0.1.0 */ -public final class ZulipAnnouncer extends AbstractAnnouncer { +public final class ZulipAnnouncer extends AbstractAnnouncer { private String account; private String apiKey; private String apiHost; @@ -53,6 +53,11 @@ public final class ZulipAnnouncer extends AbstractAnnouncer { private String messageTemplate; private final org.jreleaser.model.api.announce.ZulipAnnouncer immutable = new org.jreleaser.model.api.announce.ZulipAnnouncer() { + @Override + public String getType() { + return org.jreleaser.model.api.announce.ZulipAnnouncer.TYPE; + } + @Override public String getAccount() { return account; @@ -138,6 +143,7 @@ public ZulipAnnouncer() { super(TYPE); } + @Override public org.jreleaser.model.api.announce.ZulipAnnouncer asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/assemble/AbstractAssembler.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/assemble/AbstractAssembler.java index 651d618f3..d6a5fa8f7 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/assemble/AbstractAssembler.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/assemble/AbstractAssembler.java @@ -42,7 +42,7 @@ * @author Andres Almiray * @since 0.2.0 */ -public abstract class AbstractAssembler> extends AbstractModelObject implements Assembler { +public abstract class AbstractAssembler, A extends org.jreleaser.model.api.assemble.Assembler> extends AbstractModelObject implements Assembler { @JsonIgnore protected final Set outputs = new LinkedHashSet<>(); protected final Map extraProperties = new LinkedHashMap<>(); diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/assemble/AbstractJavaAssembler.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/assemble/AbstractJavaAssembler.java index f41e934f5..25ed4d667 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/assemble/AbstractJavaAssembler.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/assemble/AbstractJavaAssembler.java @@ -35,7 +35,7 @@ * @author Andres Almiray * @since 0.8.0 */ -public abstract class AbstractJavaAssembler> extends AbstractAssembler implements JavaAssembler { +public abstract class AbstractJavaAssembler, A extends org.jreleaser.model.api.assemble.Assembler> extends AbstractAssembler implements JavaAssembler { protected final Artifact mainJar = new Artifact(); protected final List jars = new ArrayList<>(); protected final List files = new ArrayList<>(); diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/assemble/ArchiveAssembler.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/assemble/ArchiveAssembler.java index 4474c1c85..6b23c763a 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/assemble/ArchiveAssembler.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/assemble/ArchiveAssembler.java @@ -42,7 +42,7 @@ * @author Andres Almiray * @since 0.8.0 */ -public final class ArchiveAssembler extends AbstractAssembler { +public final class ArchiveAssembler extends AbstractAssembler { private final Set formats = new LinkedHashSet<>(); private String archiveName; @@ -148,6 +148,7 @@ public ArchiveAssembler() { super(TYPE); } + @Override public org.jreleaser.model.api.assemble.ArchiveAssembler asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/assemble/Assembler.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/assemble/Assembler.java index f2cda13b1..d7a5fbf60 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/assemble/Assembler.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/assemble/Assembler.java @@ -34,7 +34,7 @@ * @author Andres Almiray * @since 0.2.0 */ -public interface Assembler extends Domain, Activatable, ExtraProperties { +public interface Assembler extends Domain, Activatable, ExtraProperties { Platform getPlatform(); void setPlatform(Platform platform); @@ -72,4 +72,6 @@ public interface Assembler extends Domain, Activatable, ExtraProperties { void addFileSets(List files); void addFileSet(FileSet file); + + A asImmutable(); } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/assemble/JavaAssembler.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/assemble/JavaAssembler.java index 8691f5132..336638561 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/assemble/JavaAssembler.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/assemble/JavaAssembler.java @@ -27,7 +27,7 @@ * @author Andres Almiray * @since 0.8.0 */ -public interface JavaAssembler extends Assembler { +public interface JavaAssembler extends Assembler { String getExecutable(); void setExecutable(String executable); diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/assemble/JlinkAssembler.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/assemble/JlinkAssembler.java index e0d546966..b91605fa5 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/assemble/JlinkAssembler.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/assemble/JlinkAssembler.java @@ -48,7 +48,7 @@ * @author Andres Almiray * @since 0.2.0 */ -public final class JlinkAssembler extends AbstractJavaAssembler { +public final class JlinkAssembler extends AbstractJavaAssembler { private final Set targetJdks = new LinkedHashSet<>(); private final Set moduleNames = new LinkedHashSet<>(); private final Set additionalModuleNames = new LinkedHashSet<>(); @@ -232,6 +232,7 @@ public JlinkAssembler() { super(TYPE); } + @Override public org.jreleaser.model.api.assemble.JlinkAssembler asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/assemble/JpackageAssembler.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/assemble/JpackageAssembler.java index 0bbecee6e..f825961b8 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/assemble/JpackageAssembler.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/assemble/JpackageAssembler.java @@ -52,7 +52,7 @@ * @author Andres Almiray * @since 0.10.0 */ -public final class JpackageAssembler extends AbstractJavaAssembler { +public final class JpackageAssembler extends AbstractJavaAssembler { private final Set runtimeImages = new LinkedHashSet<>(); private final ApplicationPackage applicationPackage = new ApplicationPackage(); @@ -255,6 +255,7 @@ public JpackageAssembler() { super(TYPE); } + @Override public org.jreleaser.model.api.assemble.JpackageAssembler asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/assemble/NativeImageAssembler.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/assemble/NativeImageAssembler.java index 61e6eb712..00a01b634 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/assemble/NativeImageAssembler.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/assemble/NativeImageAssembler.java @@ -52,7 +52,7 @@ * @author Andres Almiray * @since 0.2.0 */ -public final class NativeImageAssembler extends AbstractJavaAssembler { +public final class NativeImageAssembler extends AbstractJavaAssembler { private final List args = new ArrayList<>(); private final Artifact graal = new Artifact(); private final Set graalJdks = new LinkedHashSet<>(); @@ -247,6 +247,7 @@ public NativeImageAssembler() { super(TYPE); } + @Override public org.jreleaser.model.api.assemble.NativeImageAssembler asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/Deployer.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/Deployer.java index 8e49d6ad6..e74428080 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/Deployer.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/Deployer.java @@ -26,7 +26,7 @@ * @author Andres Almiray * @since 1.3.0 */ -public interface Deployer extends Domain, Activatable, ExtraProperties { +public interface Deployer extends Domain, Activatable, ExtraProperties { String getType(); String getName(); @@ -34,4 +34,6 @@ public interface Deployer extends Domain, Activatable, ExtraProperties { void setName(String name); boolean resolveEnabled(Project project); + + A asImmutable(); } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/maven/AbstractMavenDeployer.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/maven/AbstractMavenDeployer.java index 87b1caa61..09d4caa7e 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/maven/AbstractMavenDeployer.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/maven/AbstractMavenDeployer.java @@ -41,7 +41,7 @@ * @author Andres Almiray * @since 1.3.0 */ -public abstract class AbstractMavenDeployer> extends AbstractModelObject implements MavenDeployer, ExtraProperties { +public abstract class AbstractMavenDeployer, A extends org.jreleaser.model.api.deploy.maven.MavenDeployer> extends AbstractModelObject implements MavenDeployer, ExtraProperties { @JsonIgnore protected final String type; protected final Map extraProperties = new LinkedHashMap<>(); diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/maven/ArtifactoryMavenDeployer.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/maven/ArtifactoryMavenDeployer.java index 1a189b552..f43d4da1c 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/maven/ArtifactoryMavenDeployer.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/maven/ArtifactoryMavenDeployer.java @@ -30,8 +30,13 @@ * @author Andres Almiray * @since 1.3.0 */ -public final class ArtifactoryMavenDeployer extends AbstractMavenDeployer { +public final class ArtifactoryMavenDeployer extends AbstractMavenDeployer { private final org.jreleaser.model.api.deploy.maven.ArtifactoryMavenDeployer immutable = new org.jreleaser.model.api.deploy.maven.ArtifactoryMavenDeployer() { + @Override + public String getGroup() { + return org.jreleaser.model.api.deploy.maven.MavenDeployer.GROUP; + } + @Override public String getUrl() { return url; @@ -122,6 +127,7 @@ public ArtifactoryMavenDeployer() { super(org.jreleaser.model.api.deploy.maven.ArtifactoryMavenDeployer.TYPE); } + @Override public org.jreleaser.model.api.deploy.maven.ArtifactoryMavenDeployer asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/maven/GiteaMavenDeployer.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/maven/GiteaMavenDeployer.java index f5183d6c0..bfc76a95c 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/maven/GiteaMavenDeployer.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/maven/GiteaMavenDeployer.java @@ -30,8 +30,13 @@ * @author Andres Almiray * @since 1.3.0 */ -public final class GiteaMavenDeployer extends AbstractMavenDeployer { +public final class GiteaMavenDeployer extends AbstractMavenDeployer { private final org.jreleaser.model.api.deploy.maven.GiteaMavenDeployer immutable = new org.jreleaser.model.api.deploy.maven.GiteaMavenDeployer() { + @Override + public String getGroup() { + return org.jreleaser.model.api.deploy.maven.MavenDeployer.GROUP; + } + @Override public String getUrl() { return url; @@ -122,6 +127,7 @@ public GiteaMavenDeployer() { super(org.jreleaser.model.api.deploy.maven.GiteaMavenDeployer.TYPE); } + @Override public org.jreleaser.model.api.deploy.maven.GiteaMavenDeployer asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/maven/GithubMavenDeployer.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/maven/GithubMavenDeployer.java index 251b1084f..82f80e832 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/maven/GithubMavenDeployer.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/maven/GithubMavenDeployer.java @@ -31,10 +31,15 @@ * @author Andres Almiray * @since 1.3.0 */ -public final class GithubMavenDeployer extends AbstractMavenDeployer { +public final class GithubMavenDeployer extends AbstractMavenDeployer { private String repository; private final org.jreleaser.model.api.deploy.maven.GithubMavenDeployer immutable = new org.jreleaser.model.api.deploy.maven.GithubMavenDeployer() { + @Override + public String getGroup() { + return org.jreleaser.model.api.deploy.maven.MavenDeployer.GROUP; + } + @Override public String getRepository() { return GithubMavenDeployer.this.getRepository(); @@ -130,6 +135,7 @@ public GithubMavenDeployer() { super(org.jreleaser.model.api.deploy.maven.GithubMavenDeployer.TYPE); } + @Override public org.jreleaser.model.api.deploy.maven.GithubMavenDeployer asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/maven/GitlabMavenDeployer.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/maven/GitlabMavenDeployer.java index 627950fcb..294d7a401 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/maven/GitlabMavenDeployer.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/maven/GitlabMavenDeployer.java @@ -31,10 +31,15 @@ * @author Andres Almiray * @since 1.3.0 */ -public final class GitlabMavenDeployer extends AbstractMavenDeployer { +public final class GitlabMavenDeployer extends AbstractMavenDeployer { private String projectIdentifier; private final org.jreleaser.model.api.deploy.maven.GitlabMavenDeployer immutable = new org.jreleaser.model.api.deploy.maven.GitlabMavenDeployer() { + @Override + public String getGroup() { + return org.jreleaser.model.api.deploy.maven.MavenDeployer.GROUP; + } + @Override public String getProjectIdentifier() { return GitlabMavenDeployer.this.getProjectIdentifier(); @@ -130,6 +135,7 @@ public GitlabMavenDeployer() { super(org.jreleaser.model.api.deploy.maven.GitlabMavenDeployer.TYPE); } + @Override public org.jreleaser.model.api.deploy.maven.GitlabMavenDeployer asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/maven/Maven.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/maven/Maven.java index 36bbc8de3..83d1d24e5 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/maven/Maven.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/maven/Maven.java @@ -394,7 +394,7 @@ public Map asMap(boolean full) { return map; } - public Map findMavenDeployersByType(String deployerType) { + public > Map findMavenDeployersByType(String deployerType) { switch (deployerType) { case org.jreleaser.model.api.deploy.maven.ArtifactoryMavenDeployer.TYPE: return (Map) artifactory; @@ -411,7 +411,7 @@ public Map findMavenDeployersByType(String return Collections.emptyMap(); } - public List findAllActiveMavenDeployers() { + public > List findAllActiveMavenDeployers() { List deployers = new ArrayList<>(); deployers.addAll((List) getActiveArtifactories()); deployers.addAll((List) getActiveGiteas()); diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/maven/MavenDeployer.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/maven/MavenDeployer.java index 2e1e29103..29ce76dcf 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/maven/MavenDeployer.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/maven/MavenDeployer.java @@ -27,7 +27,7 @@ * @author Andres Almiray * @since 1.3.0 */ -public interface MavenDeployer extends Deployer, TimeoutAware { +public interface MavenDeployer extends Deployer, TimeoutAware { String getUrl(); void setUrl(String url); diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/maven/Nexus2MavenDeployer.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/maven/Nexus2MavenDeployer.java index 586fa07f1..cf1fbd9f5 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/maven/Nexus2MavenDeployer.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/deploy/maven/Nexus2MavenDeployer.java @@ -30,11 +30,16 @@ * @author Andres Almiray * @since 1.3.0 */ -public final class Nexus2MavenDeployer extends AbstractMavenDeployer { +public final class Nexus2MavenDeployer extends AbstractMavenDeployer { private Boolean closeRepository; private Boolean releaseRepository; private final org.jreleaser.model.api.deploy.maven.Nexus2MavenDeployer immutable = new org.jreleaser.model.api.deploy.maven.Nexus2MavenDeployer() { + @Override + public String getGroup() { + return org.jreleaser.model.api.deploy.maven.MavenDeployer.GROUP; + } + @Override public String getUrl() { return url; @@ -135,6 +140,7 @@ public Nexus2MavenDeployer() { super(org.jreleaser.model.api.deploy.maven.Nexus2MavenDeployer.TYPE); } + @Override public org.jreleaser.model.api.deploy.maven.Nexus2MavenDeployer asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/distributions/Distribution.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/distributions/Distribution.java index 3f7f10996..67427feba 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/distributions/Distribution.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/distributions/Distribution.java @@ -448,7 +448,7 @@ public void mergeExtraProperties(Map extraProperties) { // --== PACKAGERS ==-- - public T findPackager(String name) { + public > T findPackager(String name) { if (isBlank(name)) { throw new JReleaserException(RB.$("ERROR_packager_name_not_blank")); } @@ -456,7 +456,7 @@ public T findPackager(String name) { return resolvePackager(name); } - public T getPackager(String name) { + public > T getPackager(String name) { T packager = findPackager(name); if (null != packager) { return packager; @@ -464,7 +464,7 @@ public T getPackager(String name) { throw new JReleaserException(RB.$("ERROR_packager_not_configured", name)); } - private T resolvePackager(String name) { + private > T resolvePackager(String name) { switch (name.toLowerCase(Locale.ENGLISH).trim()) { case org.jreleaser.model.api.packagers.AppImagePackager.TYPE: return (T) getAppImage(); diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/AbstractDownloader.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/AbstractDownloader.java index ba45844b5..a49f2d170 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/AbstractDownloader.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/AbstractDownloader.java @@ -32,7 +32,7 @@ * @author Andres Almiray * @since 1.1.0 */ -public abstract class AbstractDownloader> extends AbstractModelObject implements Downloader { +public abstract class AbstractDownloader> extends AbstractModelObject implements Downloader { @JsonIgnore protected final String type; protected final Map extraProperties = new LinkedHashMap<>(); diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/AbstractSshDownloader.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/AbstractSshDownloader.java index ac61f6c65..7fc761620 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/AbstractSshDownloader.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/AbstractSshDownloader.java @@ -31,7 +31,7 @@ * @author Andres Almiray * @since 1.1.0 */ -public abstract class AbstractSshDownloader> extends AbstractDownloader implements SshDownloader { +public abstract class AbstractSshDownloader> extends AbstractDownloader implements SshDownloader { protected String username; protected String password; protected String host; diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/Download.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/Download.java index 95e06fb9a..7ee2a5b38 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/Download.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/Download.java @@ -277,7 +277,7 @@ public Map asMap(boolean full) { return map; } - public Map findDownloadersByType(String downloaderType) { + public > Map findDownloadersByType(String downloaderType) { switch (downloaderType) { case org.jreleaser.model.api.download.FtpDownloader.TYPE: return (Map) ftp; @@ -292,7 +292,7 @@ public Map findDownloadersByType(String downlo return Collections.emptyMap(); } - public List findAllActiveDownloaders() { + public > List findAllActiveDownloaders() { List downloaders = new ArrayList<>(); downloaders.addAll((List) getActiveFtps()); downloaders.addAll((List) getActiveHttps()); diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/Downloader.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/Downloader.java index 07c4c10e4..28cd85e16 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/Downloader.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/Downloader.java @@ -40,7 +40,7 @@ * @author Andres Almiray * @since 1.1.0 */ -public interface Downloader extends Domain, Activatable, TimeoutAware, ExtraProperties { +public interface Downloader extends Domain, Activatable, TimeoutAware, ExtraProperties { String getType(); String getName(); @@ -53,6 +53,8 @@ public interface Downloader extends Domain, Activatable, TimeoutAware, ExtraProp void addAsset(Asset asset); + A asImmutable(); + class Unpack extends AbstractModelObject implements Domain, EnabledAware { private Boolean enabled; private Boolean skipRootEntry; diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/FtpDownloader.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/FtpDownloader.java index 9f44f4936..950c0efe7 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/FtpDownloader.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/FtpDownloader.java @@ -36,7 +36,7 @@ * @author Andres Almiray * @since 1.1.0 */ -public final class FtpDownloader extends AbstractDownloader implements Ftp { +public final class FtpDownloader extends AbstractDownloader implements Ftp { private String username; private String password; private String host; @@ -125,6 +125,7 @@ public FtpDownloader() { super(TYPE); } + @Override public org.jreleaser.model.api.download.FtpDownloader asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/HttpDownloader.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/HttpDownloader.java index fee1dd237..2b15d509d 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/HttpDownloader.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/HttpDownloader.java @@ -36,7 +36,7 @@ * @author Andres Almiray * @since 1.1.0 */ -public final class HttpDownloader extends AbstractDownloader implements Http { +public final class HttpDownloader extends AbstractDownloader implements Http { private final Map headers = new LinkedHashMap<>(); private String username; private String password; @@ -125,6 +125,7 @@ public HttpDownloader() { super(TYPE); } + @Override public org.jreleaser.model.api.download.HttpDownloader asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/ScpDownloader.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/ScpDownloader.java index 377885b52..f33c1ca07 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/ScpDownloader.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/ScpDownloader.java @@ -30,7 +30,7 @@ * @author Andres Almiray * @since 1.1.0 */ -public final class ScpDownloader extends AbstractSshDownloader { +public final class ScpDownloader extends AbstractSshDownloader { private final org.jreleaser.model.api.download.ScpDownloader immutable = new org.jreleaser.model.api.download.ScpDownloader() { private List assets; @@ -144,6 +144,7 @@ protected String getEnvPrefix() { return "SCTP"; } + @Override public org.jreleaser.model.api.download.ScpDownloader asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/SftpDownloader.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/SftpDownloader.java index b40f2661c..22ce25280 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/SftpDownloader.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/SftpDownloader.java @@ -30,7 +30,7 @@ * @author Andres Almiray * @since 1.1.0 */ -public final class SftpDownloader extends AbstractSshDownloader { +public final class SftpDownloader extends AbstractSshDownloader { private final org.jreleaser.model.api.download.SftpDownloader immutable = new org.jreleaser.model.api.download.SftpDownloader() { private List assets; @@ -144,6 +144,7 @@ protected String getEnvPrefix() { return "SFTP"; } + @Override public org.jreleaser.model.api.download.SftpDownloader asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/SshDownloader.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/SshDownloader.java index d02edcd7c..654193fd5 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/SshDownloader.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/download/SshDownloader.java @@ -23,5 +23,5 @@ * @author Andres Almiray * @since 1.1.0 */ -public interface SshDownloader extends Downloader, Ssh { +public interface SshDownloader extends Downloader, Ssh { } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/AbstractPackager.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/AbstractPackager.java index dd8aa9860..479f8ab5e 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/AbstractPackager.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/AbstractPackager.java @@ -42,7 +42,7 @@ * @author Andres Almiray * @since 0.1.0 */ -public abstract class AbstractPackager> extends AbstractModelObject implements Packager { +public abstract class AbstractPackager> extends AbstractModelObject implements Packager { @JsonIgnore protected final String type; protected final Map extraProperties = new LinkedHashMap<>(); diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/AbstractRepositoryPackager.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/AbstractRepositoryPackager.java index 30297ad13..1e6690184 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/AbstractRepositoryPackager.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/AbstractRepositoryPackager.java @@ -25,7 +25,7 @@ * @author Andres Almiray * @since 0.1.0 */ -public abstract class AbstractRepositoryPackager> extends AbstractTemplatePackager implements RepositoryPackager { +public abstract class AbstractRepositoryPackager> extends AbstractTemplatePackager implements RepositoryPackager { protected final CommitAuthor commitAuthor = new CommitAuthor(); protected AbstractRepositoryPackager(String type) { diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/AbstractTemplatePackager.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/AbstractTemplatePackager.java index 9dcad97e7..d32706901 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/AbstractTemplatePackager.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/AbstractTemplatePackager.java @@ -27,7 +27,7 @@ * @author Andres Almiray * @since 0.6.0 */ -public abstract class AbstractTemplatePackager> extends AbstractPackager implements TemplatePackager { +public abstract class AbstractTemplatePackager> extends AbstractPackager implements TemplatePackager { protected final List skipTemplates = new ArrayList<>(); protected String templateDirectory; diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/AppImagePackager.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/AppImagePackager.java index 23ac0de72..199742b7f 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/AppImagePackager.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/AppImagePackager.java @@ -57,7 +57,7 @@ * @author Andres Almiray * @since 1.2.0 */ -public final class AppImagePackager extends AbstractRepositoryPackager { +public final class AppImagePackager extends AbstractRepositoryPackager { private static final Map> SUPPORTED = new LinkedHashMap<>(); static { @@ -228,6 +228,7 @@ public AppImagePackager() { super(TYPE); } + @Override public org.jreleaser.model.api.packagers.AppImagePackager asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/AsdfPackager.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/AsdfPackager.java index d3a69e92c..f63a9420a 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/AsdfPackager.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/AsdfPackager.java @@ -52,7 +52,7 @@ * @author Andres Almiray * @since 1.2.0 */ -public final class AsdfPackager extends AbstractRepositoryPackager { +public final class AsdfPackager extends AbstractRepositoryPackager { private static final Map> SUPPORTED = new LinkedHashMap<>(); static { @@ -175,6 +175,7 @@ public AsdfPackager() { super(TYPE); } + @Override public org.jreleaser.model.api.packagers.AsdfPackager asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/BrewPackager.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/BrewPackager.java index 66fcbdb08..2227bb7b5 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/BrewPackager.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/BrewPackager.java @@ -64,7 +64,7 @@ * @author Andres Almiray * @since 0.1.0 */ -public final class BrewPackager extends AbstractRepositoryPackager { +public final class BrewPackager extends AbstractRepositoryPackager { private static final Map> SUPPORTED = new LinkedHashMap<>(); static { @@ -202,6 +202,7 @@ public BrewPackager() { super(TYPE); } + @Override public org.jreleaser.model.api.packagers.BrewPackager asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/ChocolateyPackager.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/ChocolateyPackager.java index 59fbf5e96..f41106df3 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/ChocolateyPackager.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/ChocolateyPackager.java @@ -55,7 +55,7 @@ * @author Andres Almiray * @since 0.1.0 */ -public final class ChocolateyPackager extends AbstractRepositoryPackager { +public final class ChocolateyPackager extends AbstractRepositoryPackager { private static final Map> SUPPORTED = new LinkedHashMap<>(); static { @@ -213,6 +213,7 @@ public ChocolateyPackager() { super(TYPE); } + @Override public org.jreleaser.model.api.packagers.ChocolateyPackager asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/DockerPackager.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/DockerPackager.java index d3f12e162..e3ce7f0a5 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/DockerPackager.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/DockerPackager.java @@ -63,7 +63,7 @@ * @author Andres Almiray * @since 0.1.0 */ -public final class DockerPackager extends AbstractDockerConfiguration implements RepositoryPackager, CommitAuthorAware { +public final class DockerPackager extends AbstractDockerConfiguration implements RepositoryPackager, CommitAuthorAware { private static final Map> SUPPORTED = new LinkedHashMap<>(); static { @@ -234,6 +234,7 @@ public Map getExtraProperties() { @JsonIgnore private boolean failed; + @Override public org.jreleaser.model.api.packagers.DockerPackager asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/FlatpakPackager.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/FlatpakPackager.java index e204b0371..8eed14afe 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/FlatpakPackager.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/FlatpakPackager.java @@ -58,7 +58,7 @@ * @author Andres Almiray * @since 1.2.0 */ -public final class FlatpakPackager extends AbstractRepositoryPackager { +public final class FlatpakPackager extends AbstractRepositoryPackager { private static final Map> SUPPORTED = new LinkedHashMap<>(); static { @@ -247,6 +247,7 @@ public FlatpakPackager() { super(TYPE); } + @Override public org.jreleaser.model.api.packagers.FlatpakPackager asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/GofishPackager.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/GofishPackager.java index 4a4551776..36558f08b 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/GofishPackager.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/GofishPackager.java @@ -52,7 +52,7 @@ * @author Andres Almiray * @since 0.10.0 */ -public final class GofishPackager extends AbstractRepositoryPackager { +public final class GofishPackager extends AbstractRepositoryPackager { private static final Map> SUPPORTED = new LinkedHashMap<>(); static { @@ -168,6 +168,7 @@ public GofishPackager() { super(TYPE); } + @Override public org.jreleaser.model.api.packagers.GofishPackager asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/JbangPackager.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/JbangPackager.java index 38372f3d6..97ed949fc 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/JbangPackager.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/JbangPackager.java @@ -40,7 +40,7 @@ * @author Andres Almiray * @since 0.1.0 */ -public final class JbangPackager extends AbstractRepositoryPackager { +public final class JbangPackager extends AbstractRepositoryPackager { private static final Map> SUPPORTED = new LinkedHashMap<>(); static { @@ -153,6 +153,7 @@ public JbangPackager() { super(TYPE); } + @Override public org.jreleaser.model.api.packagers.JbangPackager asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/MacportsPackager.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/MacportsPackager.java index 3f2fc8c42..0ea4fdf46 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/MacportsPackager.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/MacportsPackager.java @@ -53,7 +53,7 @@ * @author Andres Almiray * @since 0.9.0 */ -public final class MacportsPackager extends AbstractRepositoryPackager { +public final class MacportsPackager extends AbstractRepositoryPackager { private static final Map> SUPPORTED = new LinkedHashMap<>(); static { @@ -188,6 +188,7 @@ public MacportsPackager() { super(TYPE); } + @Override public org.jreleaser.model.api.packagers.MacportsPackager asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/Packager.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/Packager.java index ce0ea7873..945f9c1cf 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/Packager.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/Packager.java @@ -32,7 +32,7 @@ * @author Andres Almiray * @since 0.1.0 */ -public interface Packager extends Domain, ExtraProperties, Activatable { +public interface Packager extends Domain, ExtraProperties, Activatable { String getType(); String getDownloadUrl(); @@ -60,4 +60,6 @@ public interface Packager extends Domain, ExtraProperties, Activatable { boolean isFailed(); void fail(); + + A asImmutable(); } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/RepositoryPackager.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/RepositoryPackager.java index 97f2a2acc..eaf2906f9 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/RepositoryPackager.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/RepositoryPackager.java @@ -23,6 +23,6 @@ * @author Andres Almiray * @since 0.1.0 */ -public interface RepositoryPackager extends TemplatePackager, CommitAuthorAware { +public interface RepositoryPackager extends TemplatePackager, CommitAuthorAware { RepositoryTap getRepositoryTap(); } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/ScoopPackager.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/ScoopPackager.java index 6c2536023..05faf5aa9 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/ScoopPackager.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/ScoopPackager.java @@ -51,7 +51,7 @@ * @author Andres Almiray * @since 0.1.0 */ -public final class ScoopPackager extends AbstractRepositoryPackager { +public final class ScoopPackager extends AbstractRepositoryPackager { private static final Map> SUPPORTED = new LinkedHashMap<>(); static { @@ -180,6 +180,7 @@ public ScoopPackager() { super(TYPE); } + @Override public org.jreleaser.model.api.packagers.ScoopPackager asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/SdkmanPackager.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/SdkmanPackager.java index e5588fd3c..e5299e09d 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/SdkmanPackager.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/SdkmanPackager.java @@ -51,7 +51,7 @@ * @author Andres Almiray * @since 0.6.0 */ -public final class SdkmanPackager extends AbstractPackager implements TimeoutAware { +public final class SdkmanPackager extends AbstractPackager implements TimeoutAware { private static final Map> SUPPORTED = new LinkedHashMap<>(); static { @@ -182,6 +182,7 @@ public SdkmanPackager() { super(TYPE); } + @Override public org.jreleaser.model.api.packagers.SdkmanPackager asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/SnapPackager.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/SnapPackager.java index 41f5e898b..fd1b0f823 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/SnapPackager.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/SnapPackager.java @@ -64,7 +64,7 @@ * @author Andres Almiray * @since 0.1.0 */ -public final class SnapPackager extends AbstractRepositoryPackager { +public final class SnapPackager extends AbstractRepositoryPackager { private static final Map> SUPPORTED = new LinkedHashMap<>(); static { @@ -269,6 +269,7 @@ public SnapPackager() { super(TYPE); } + @Override public org.jreleaser.model.api.packagers.SnapPackager asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/SpecPackager.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/SpecPackager.java index d0c424087..d18f2cce1 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/SpecPackager.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/SpecPackager.java @@ -55,7 +55,7 @@ * @author Andres Almiray * @since 0.9.1 */ -public final class SpecPackager extends AbstractRepositoryPackager { +public final class SpecPackager extends AbstractRepositoryPackager { private static final Map> SUPPORTED = new LinkedHashMap<>(); static { @@ -192,6 +192,7 @@ public SpecPackager() { super(TYPE); } + @Override public org.jreleaser.model.api.packagers.SpecPackager asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/TemplatePackager.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/TemplatePackager.java index e191107a3..bb7e140f4 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/TemplatePackager.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/packagers/TemplatePackager.java @@ -23,7 +23,7 @@ * @author Andres Almiray * @since 0.6.0 */ -public interface TemplatePackager extends Packager { +public interface TemplatePackager extends Packager { String getTemplateDirectory(); void setTemplateDirectory(String templateDirectory); diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/release/BaseReleaser.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/release/BaseReleaser.java index bb0a155db..55fb1254b 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/release/BaseReleaser.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/release/BaseReleaser.java @@ -50,7 +50,7 @@ * @author Andres Almiray * @since 0.1.0 */ -public abstract class BaseReleaser> extends AbstractModelObject implements Releaser { +public abstract class BaseReleaser> extends AbstractModelObject implements Releaser { @JsonIgnore protected final String serviceName; protected final Changelog changelog = new Changelog(); diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/release/CodebergReleaser.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/release/CodebergReleaser.java index 6caec8beb..ba707820c 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/release/CodebergReleaser.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/release/CodebergReleaser.java @@ -27,7 +27,9 @@ * @author Andres Almiray * @since 0.4.0 */ -public final class CodebergReleaser extends GiteaReleaser implements Releaser { +public class CodebergReleaser extends BaseReleaser { + private Boolean draft; + private final org.jreleaser.model.api.release.CodebergReleaser immutable = new org.jreleaser.model.api.release.CodebergReleaser() { @Override public boolean isPrerelease() { @@ -251,12 +253,55 @@ public Integer getReadTimeout() { }; public CodebergReleaser() { - super(org.jreleaser.model.api.release.CodebergReleaser.TYPE); + this(org.jreleaser.model.api.release.CodebergReleaser.TYPE); + } + + CodebergReleaser(String name) { + super(name, true); setHost("codeberg.org"); setApiEndpoint("https://codeberg.org"); + setRepoUrl("https://{{repoHost}}/{{repoOwner}}/{{repoName}}"); + setRepoCloneUrl("https://{{repoHost}}/{{repoOwner}}/{{repoName}}.git"); + setCommitUrl("https://{{repoHost}}/{{repoOwner}}/{{repoName}}/commits"); + setSrcUrl("https://{{repoHost}}/{{repoOwner}}/{{repoName}}/src/{{repoBranch}}"); + setDownloadUrl("https://{{repoHost}}/{{repoOwner}}/{{repoName}}/releases/download/{{tagName}}/{{artifactFile}}"); + setReleaseNotesUrl("https://{{repoHost}}/{{repoOwner}}/{{repoName}}/releases/tag/{{tagName}}"); + setLatestReleaseUrl("https://{{repoHost}}/{{repoOwner}}/{{repoName}}/releases/latest"); + setIssueTrackerUrl("https://{{repoHost}}/{{repoOwner}}/{{repoName}}/issues"); } + @Override public org.jreleaser.model.api.release.CodebergReleaser asImmutable() { return immutable; } + + @Override + public void merge(CodebergReleaser source) { + super.merge(source); + this.draft = merge(this.draft, source.draft); + } + + public boolean isDraft() { + return draft != null && draft; + } + + public void setDraft(Boolean draft) { + this.draft = draft; + } + + public boolean isDraftSet() { + return draft != null; + } + + @Override + public String getReverseRepoHost() { + return null; + } + + @Override + public Map asMap(boolean full) { + Map map = super.asMap(full); + map.put("draft", isDraft()); + return map; + } } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/release/GenericGitReleaser.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/release/GenericGitReleaser.java index 4c5e88a2c..4e8706005 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/release/GenericGitReleaser.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/release/GenericGitReleaser.java @@ -27,7 +27,7 @@ * @author Andres Almiray * @since 0.4.0 */ -public final class GenericGitReleaser extends BaseReleaser { +public final class GenericGitReleaser extends BaseReleaser { private final org.jreleaser.model.api.release.GenericGitReleaser immutable = new org.jreleaser.model.api.release.GenericGitReleaser() { @Override public boolean isPrerelease() { @@ -249,6 +249,7 @@ public GenericGitReleaser() { super(org.jreleaser.model.api.release.GenericGitReleaser.TYPE, false); } + @Override public org.jreleaser.model.api.release.GenericGitReleaser asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/release/GiteaReleaser.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/release/GiteaReleaser.java index f1f0edbb8..6ace0dad8 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/release/GiteaReleaser.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/release/GiteaReleaser.java @@ -27,7 +27,7 @@ * @author Andres Almiray * @since 0.1.0 */ -public class GiteaReleaser extends BaseReleaser { +public class GiteaReleaser extends BaseReleaser { private Boolean draft; private final org.jreleaser.model.api.release.GiteaReleaser immutable = new org.jreleaser.model.api.release.GiteaReleaser() { @@ -268,6 +268,7 @@ public GiteaReleaser() { setIssueTrackerUrl("https://{{repoHost}}/{{repoOwner}}/{{repoName}}/issues"); } + @Override public org.jreleaser.model.api.release.GiteaReleaser asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/release/GithubReleaser.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/release/GithubReleaser.java index 9ce9f838f..d4bc4003c 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/release/GithubReleaser.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/release/GithubReleaser.java @@ -31,7 +31,7 @@ * @author Andres Almiray * @since 0.1.0 */ -public final class GithubReleaser extends BaseReleaser { +public final class GithubReleaser extends BaseReleaser { private final ReleaseNotes releaseNotes = new ReleaseNotes(); private Boolean draft; @@ -283,6 +283,7 @@ public GithubReleaser() { setIssueTrackerUrl("https://{{repoHost}}/{{repoOwner}}/{{repoName}}/issues"); } + @Override public org.jreleaser.model.api.release.GithubReleaser asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/release/GitlabReleaser.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/release/GitlabReleaser.java index be12e4b3b..2588a04c5 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/release/GitlabReleaser.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/release/GitlabReleaser.java @@ -32,7 +32,7 @@ * @author Andres Almiray * @since 0.1.0 */ -public final class GitlabReleaser extends BaseReleaser { +public final class GitlabReleaser extends BaseReleaser { private final Map uploadLinks = new LinkedHashMap<>(); private String projectIdentifier; @@ -281,6 +281,7 @@ public GitlabReleaser() { setIssueTrackerUrl("https://{{repoHost}}/{{repoOwner}}/{{repoName}}/-/issues"); } + @Override public org.jreleaser.model.api.release.GitlabReleaser asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/release/Release.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/release/Release.java index 6bf306508..4a1377a6a 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/release/Release.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/release/Release.java @@ -126,7 +126,7 @@ public void setGeneric(GenericGitReleaser generic) { this.generic = generic; } - public BaseReleaser getReleaser() { + public BaseReleaser getReleaser() { if (null != github) return github; if (null != gitlab) return gitlab; if (null != gitea) return gitea; diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/release/Releaser.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/release/Releaser.java index 47d564cb6..aaad4b76b 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/release/Releaser.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/release/Releaser.java @@ -28,8 +28,10 @@ * @author Andres Almiray * @since 0.1.0 */ -public interface Releaser extends Domain, EnabledAware, CommitAuthorAware, OwnerAware, TimeoutAware, Active.Prereleaseable { +public interface Releaser extends Domain, EnabledAware, CommitAuthorAware, OwnerAware, TimeoutAware, Active.Prereleaseable { boolean isReleaseSupported(); String getServiceName(); + + A asImmutable(); } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/AbstractSshUploader.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/AbstractSshUploader.java index 7d4011fbd..29c5579d8 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/AbstractSshUploader.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/AbstractSshUploader.java @@ -35,7 +35,7 @@ * @author Andres Almiray * @since 1.1.0 */ -public abstract class AbstractSshUploader> extends AbstractUploader implements SshUploader { +public abstract class AbstractSshUploader> extends AbstractUploader implements SshUploader { protected String username; protected String password; protected String host; diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/AbstractUploader.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/AbstractUploader.java index f0de69a82..e0f475ce3 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/AbstractUploader.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/AbstractUploader.java @@ -42,7 +42,7 @@ * @author Andres Almiray * @since 0.3.0 */ -public abstract class AbstractUploader> extends AbstractModelObject implements Uploader, ExtraProperties { +public abstract class AbstractUploader> extends AbstractModelObject implements Uploader, ExtraProperties { @JsonIgnore protected final String type; protected final Map extraProperties = new LinkedHashMap<>(); diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/AbstractWebUploader.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/AbstractWebUploader.java index b69847e5a..9a9dd38ec 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/AbstractWebUploader.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/AbstractWebUploader.java @@ -29,7 +29,7 @@ * @author Andres Almiray * @since 0.8.0 */ -public abstract class AbstractWebUploader> extends AbstractUploader implements WebUploader { +public abstract class AbstractWebUploader> extends AbstractUploader implements WebUploader { protected String uploadUrl; protected String downloadUrl; diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/ArtifactoryUploader.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/ArtifactoryUploader.java index 8fe429a48..24fe17921 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/ArtifactoryUploader.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/ArtifactoryUploader.java @@ -49,7 +49,7 @@ * @author Andres Almiray * @since 0.3.0 */ -public final class ArtifactoryUploader extends AbstractUploader { +public final class ArtifactoryUploader extends AbstractUploader { private final List repositories = new ArrayList<>(); private String host; private String username; @@ -164,6 +164,7 @@ public ArtifactoryUploader() { super(org.jreleaser.model.api.upload.ArtifactoryUploader.TYPE); } + @Override public org.jreleaser.model.api.upload.ArtifactoryUploader asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/FtpUploader.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/FtpUploader.java index 1a627b8dd..40be9d80a 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/FtpUploader.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/FtpUploader.java @@ -38,7 +38,7 @@ * @author Andres Almiray * @since 1.1.0 */ -public final class FtpUploader extends AbstractUploader implements Ftp { +public final class FtpUploader extends AbstractUploader implements Ftp { private String username; private String password; private String host; @@ -152,6 +152,7 @@ public FtpUploader() { super(TYPE); } + @Override public org.jreleaser.model.api.upload.FtpUploader asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/GiteaUploader.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/GiteaUploader.java index 5c60bd776..5e4441a56 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/GiteaUploader.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/GiteaUploader.java @@ -37,13 +37,14 @@ * @author Andres Almiray * @since 1.2.0 */ -public final class GiteaUploader extends AbstractUploader { +public final class GiteaUploader extends AbstractUploader { private static final String DOWNLOAD_URL = "https://{{host}}/api/packages/{{owner}}/generic/{{packageName}}/{{packageVersion}}/{{artifactFile}}"; private String host; private String owner; private String token; private String packageName; private String packageVersion; + private final org.jreleaser.model.api.upload.GiteaUploader immutable = new org.jreleaser.model.api.upload.GiteaUploader() { @Override public String getHost() { @@ -145,6 +146,7 @@ public GiteaUploader() { super(TYPE); } + @Override public org.jreleaser.model.api.upload.GiteaUploader asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/GitlabUploader.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/GitlabUploader.java index 32c0047df..d83907429 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/GitlabUploader.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/GitlabUploader.java @@ -37,7 +37,7 @@ * @author Andres Almiray * @since 1.2.0 */ -public final class GitlabUploader extends AbstractUploader { +public final class GitlabUploader extends AbstractUploader { private static final String DOWNLOAD_URL = "https://{{host}}/api/v4/projects/{{projectIdentifier}}/packages/generic/{{packageName}}/{{packageVersion}}/{{artifactFile}}"; private String host; @@ -148,6 +148,7 @@ public GitlabUploader() { setHost("gitlab.com"); } + @Override public org.jreleaser.model.api.upload.GitlabUploader asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/HttpUploader.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/HttpUploader.java index 6e7ca12cf..8d2a94ce8 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/HttpUploader.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/HttpUploader.java @@ -33,7 +33,7 @@ * @author Andres Almiray * @since 0.4.0 */ -public final class HttpUploader extends AbstractWebUploader { +public final class HttpUploader extends AbstractWebUploader { private final Map headers = new LinkedHashMap<>(); private String username; private String password; @@ -151,6 +151,7 @@ public HttpUploader() { super(TYPE); } + @Override public org.jreleaser.model.api.upload.HttpUploader asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/S3Uploader.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/S3Uploader.java index f84fdb82e..9543ded42 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/S3Uploader.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/S3Uploader.java @@ -38,7 +38,7 @@ * @author Andres Almiray * @since 0.8.0 */ -public final class S3Uploader extends AbstractUploader { +public final class S3Uploader extends AbstractUploader { private final Map headers = new LinkedHashMap<>(); private String region; @@ -171,6 +171,7 @@ public S3Uploader() { super(TYPE); } + @Override public org.jreleaser.model.api.upload.S3Uploader asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/ScpUploader.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/ScpUploader.java index 8b8255229..b30439f6b 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/ScpUploader.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/ScpUploader.java @@ -28,7 +28,7 @@ * @author Andres Almiray * @since 1.1.0 */ -public final class ScpUploader extends AbstractSshUploader { +public final class ScpUploader extends AbstractSshUploader { private final org.jreleaser.model.api.upload.ScpUploader immutable = new org.jreleaser.model.api.upload.ScpUploader() { @Override public String getPath() { @@ -160,6 +160,7 @@ public ScpUploader() { super(TYPE); } + @Override public org.jreleaser.model.api.upload.ScpUploader asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/SftpUploader.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/SftpUploader.java index 11da82feb..cc2f245c3 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/SftpUploader.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/SftpUploader.java @@ -28,7 +28,7 @@ * @author Andres Almiray * @since 1.1.0 */ -public final class SftpUploader extends AbstractSshUploader { +public final class SftpUploader extends AbstractSshUploader { private final org.jreleaser.model.api.upload.SftpUploader immutable = new org.jreleaser.model.api.upload.SftpUploader() { @Override public String getPath() { @@ -160,6 +160,7 @@ public SftpUploader() { super(TYPE); } + @Override public org.jreleaser.model.api.upload.SftpUploader asImmutable() { return immutable; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/SshUploader.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/SshUploader.java index 43705fa4f..0dcb0b628 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/SshUploader.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/SshUploader.java @@ -25,7 +25,7 @@ * @author Andres Almiray * @since 1.1.0 */ -public interface SshUploader extends Uploader, Ssh { +public interface SshUploader extends Uploader, Ssh { String getPath(); void setPath(String path); diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/Upload.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/Upload.java index 693d0a293..a5665af07 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/Upload.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/Upload.java @@ -551,7 +551,7 @@ public Map asMap(boolean full) { return map; } - public Map findUploadersByType(String uploaderType) { + public > Map findUploadersByType(String uploaderType) { switch (uploaderType) { case org.jreleaser.model.api.upload.ArtifactoryUploader.TYPE: return (Map) artifactory; @@ -574,7 +574,7 @@ public Map findUploadersByType(String uploaderTy return Collections.emptyMap(); } - public List findAllActiveUploaders() { + public > List findAllActiveUploaders() { List uploaders = new ArrayList<>(); uploaders.addAll((List) getActiveArtifactories()); uploaders.addAll((List) getActiveFtps()); @@ -590,8 +590,8 @@ public List findAllActiveUploaders() { public Map resolveDownloadUrls(JReleaserContext context, Distribution distribution, Artifact artifact, String prefix) { Map urls = new LinkedHashMap<>(); - List uploaders = findAllActiveUploaders(); - for (Uploader uploader : uploaders) { + List> uploaders = findAllActiveUploaders(); + for (Uploader uploader : uploaders) { List keys = uploader.resolveSkipKeys(); if (isSkip(distribution, keys) || isSkip(artifact, keys)) continue; @@ -615,7 +615,7 @@ public Map resolveDownloadUrls(JReleaserContext context, Distrib } if (uploaders.size() == 1) { - Uploader uploader = uploaders.get(0); + Uploader uploader = uploaders.get(0); List keys = uploader.resolveSkipKeys(); if (!isSkip(distribution, keys) && !isSkip(artifact, keys)) { diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/Uploader.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/Uploader.java index 7fdad8983..e8caafd50 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/Uploader.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/Uploader.java @@ -31,7 +31,7 @@ * @author Andres Almiray * @since 0.3.0 */ -public interface Uploader extends Domain, Activatable, TimeoutAware, ExtraProperties { +public interface Uploader extends Domain, Activatable, TimeoutAware, ExtraProperties { String getType(); String getName(); @@ -66,6 +66,8 @@ public interface Uploader extends Domain, Activatable, TimeoutAware, ExtraProper List resolveSkipKeys(); + A asImmutable(); + Map artifactProps(JReleaserContext context, Artifact artifact); Map artifactProps(Map props, Artifact artifact); diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/WebUploader.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/WebUploader.java index 0b28e04c5..cad6cdd0e 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/WebUploader.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/upload/WebUploader.java @@ -25,7 +25,7 @@ * @author Andres Almiray * @since 0.8.0 */ -public interface WebUploader extends Uploader, Http { +public interface WebUploader extends Uploader, Http { String getUploadUrl(); void setUploadUrl(String uploadUrl); diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/announce/Announcer.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/announce/Announcer.java index ad78a6929..ef4fea0fe 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/announce/Announcer.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/announce/Announcer.java @@ -21,10 +21,12 @@ * @author Andres Almiray * @since 0.1.0 */ -public interface Announcer { +public interface Announcer { String getName(); boolean isEnabled(); void announce() throws AnnounceException; + + A getAnnouncer(); } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/assemble/AssemblerProcessor.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/assemble/AssemblerProcessor.java index 1d7b681e2..bd127a76b 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/assemble/AssemblerProcessor.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/assemble/AssemblerProcessor.java @@ -25,10 +25,10 @@ * @author Andres Almiray * @since 0.2.0 */ -public interface AssemblerProcessor { - A getAssembler(); +public interface AssemblerProcessor> { + S getAssembler(); - void setAssembler(A assembler); + void setAssembler(S assembler); void assemble(Map props) throws AssemblerProcessingException; } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/assemble/AssemblerProcessorFactory.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/assemble/AssemblerProcessorFactory.java index 204f13853..b777277a9 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/assemble/AssemblerProcessorFactory.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/assemble/AssemblerProcessorFactory.java @@ -24,7 +24,7 @@ * @author Andres Almiray * @since 0.2.0 */ -public interface AssemblerProcessorFactory> { +public interface AssemblerProcessorFactory, AP extends AssemblerProcessor> { String getName(); AP getAssemblerProcessor(JReleaserContext context); diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/deploy/maven/MavenDeployer.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/deploy/maven/MavenDeployer.java index b1b70f2e5..6211b25fc 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/deploy/maven/MavenDeployer.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/deploy/maven/MavenDeployer.java @@ -23,7 +23,8 @@ * @author Andres Almiray * @since 1.3.0 */ -public interface MavenDeployer { +public interface MavenDeployer> { D getDeployer(); void setDeployer(D deployer); diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/deploy/maven/MavenDeployerFactory.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/deploy/maven/MavenDeployerFactory.java index 009f190fd..e9d80c89b 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/deploy/maven/MavenDeployerFactory.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/deploy/maven/MavenDeployerFactory.java @@ -23,7 +23,9 @@ * @author Andres Almiray * @since 1.3.0 */ -public interface MavenDeployerFactory> { +public interface MavenDeployerFactory, + MD extends MavenDeployer> { String getName(); MD getMavenDeployer(JReleaserContext context); diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/download/ArtifactDownloader.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/download/ArtifactDownloader.java index 2331ebcee..d43d074e7 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/download/ArtifactDownloader.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/download/ArtifactDownloader.java @@ -23,7 +23,7 @@ * @author Andres Almiray * @since 1.1.0 */ -public interface ArtifactDownloader { +public interface ArtifactDownloader> { D getDownloader(); void setDownloader(D downloader); diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/download/ArtifactDownloaderFactory.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/download/ArtifactDownloaderFactory.java index 2959087d5..d2cf44a5c 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/download/ArtifactDownloaderFactory.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/download/ArtifactDownloaderFactory.java @@ -24,7 +24,8 @@ * @author Andres Almiray * @since 1.1.0 */ -public interface ArtifactDownloaderFactory> { +public interface ArtifactDownloaderFactory, AD extends ArtifactDownloader> { String getName(); AD getArtifactDownloader(JReleaserContext context); diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/release/AbstractReleaser.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/release/AbstractReleaser.java index 5642aa372..5cd38a64d 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/release/AbstractReleaser.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/release/AbstractReleaser.java @@ -28,7 +28,7 @@ * @author Andres Almiray * @since 0.7.0 */ -public abstract class AbstractReleaser implements Releaser { +public abstract class AbstractReleaser implements Releaser { protected final JReleaserContext context; protected final List assets = new ArrayList<>(); @@ -39,7 +39,7 @@ protected AbstractReleaser(JReleaserContext context, List assets) { @Override public final void release() throws ReleaseException { - BaseReleaser service = context.getModel().getRelease().getReleaser(); + BaseReleaser service = context.getModel().getRelease().getReleaser(); if (service.isSkipRelease()) { if (service.isSkipTag()) { diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/release/Releaser.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/release/Releaser.java index 3232981d6..fc78a1aa0 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/release/Releaser.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/release/Releaser.java @@ -25,7 +25,7 @@ * @author Andres Almiray * @since 0.1.0 */ -public interface Releaser { +public interface Releaser { void release() throws ReleaseException; Repository maybeCreateRepository(String owner, String repo, String password) throws IOException; @@ -35,4 +35,6 @@ public interface Releaser { String generateReleaseNotes() throws IOException; List listReleases(String owner, String repo) throws IOException; + + A getReleaser(); } diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/upload/ArtifactUploader.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/upload/ArtifactUploader.java index 14f4da75a..433e09e2d 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/upload/ArtifactUploader.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/upload/ArtifactUploader.java @@ -23,7 +23,7 @@ * @author Andres Almiray * @since 0.3.0 */ -public interface ArtifactUploader { +public interface ArtifactUploader> { U getUploader(); void setUploader(U uploader); diff --git a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/upload/ArtifactUploaderFactory.java b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/upload/ArtifactUploaderFactory.java index 23a6ea671..861547a56 100644 --- a/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/upload/ArtifactUploaderFactory.java +++ b/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/spi/upload/ArtifactUploaderFactory.java @@ -24,7 +24,7 @@ * @author Andres Almiray * @since 0.3.0 */ -public interface ArtifactUploaderFactory> { +public interface ArtifactUploaderFactory, AU extends ArtifactUploader> { String getName(); AU getArtifactUploader(JReleaserContext context); diff --git a/sdks/jreleaser-artifactory-java-sdk/src/main/java/org/jreleaser/sdk/artifactory/ArtifactoryArtifactUploader.java b/sdks/jreleaser-artifactory-java-sdk/src/main/java/org/jreleaser/sdk/artifactory/ArtifactoryArtifactUploader.java index 64f7e7448..e417bb468 100644 --- a/sdks/jreleaser-artifactory-java-sdk/src/main/java/org/jreleaser/sdk/artifactory/ArtifactoryArtifactUploader.java +++ b/sdks/jreleaser-artifactory-java-sdk/src/main/java/org/jreleaser/sdk/artifactory/ArtifactoryArtifactUploader.java @@ -40,7 +40,7 @@ * @since 0.3.0 */ @org.jreleaser.infra.nativeimage.annotations.NativeImage -public class ArtifactoryArtifactUploader extends AbstractArtifactUploader { +public class ArtifactoryArtifactUploader extends AbstractArtifactUploader { private ArtifactoryUploader uploader; public ArtifactoryArtifactUploader(JReleaserContext context) { diff --git a/sdks/jreleaser-artifactory-java-sdk/src/main/java/org/jreleaser/sdk/artifactory/ArtifactoryArtifactUploaderFactory.java b/sdks/jreleaser-artifactory-java-sdk/src/main/java/org/jreleaser/sdk/artifactory/ArtifactoryArtifactUploaderFactory.java index a7e8700b1..2933091be 100644 --- a/sdks/jreleaser-artifactory-java-sdk/src/main/java/org/jreleaser/sdk/artifactory/ArtifactoryArtifactUploaderFactory.java +++ b/sdks/jreleaser-artifactory-java-sdk/src/main/java/org/jreleaser/sdk/artifactory/ArtifactoryArtifactUploaderFactory.java @@ -27,7 +27,8 @@ * @since 0.3.0 */ @ServiceProviderFor(ArtifactUploaderFactory.class) -public class ArtifactoryArtifactUploaderFactory implements ArtifactUploaderFactory { +public class ArtifactoryArtifactUploaderFactory implements ArtifactUploaderFactory { @Override public String getName() { return org.jreleaser.model.api.upload.ArtifactoryUploader.TYPE; diff --git a/sdks/jreleaser-artifactory-java-sdk/src/main/java/org/jreleaser/sdk/artifactory/ArtifactoryMavenDeployer.java b/sdks/jreleaser-artifactory-java-sdk/src/main/java/org/jreleaser/sdk/artifactory/ArtifactoryMavenDeployer.java index 485f7266d..d0ee3f159 100644 --- a/sdks/jreleaser-artifactory-java-sdk/src/main/java/org/jreleaser/sdk/artifactory/ArtifactoryMavenDeployer.java +++ b/sdks/jreleaser-artifactory-java-sdk/src/main/java/org/jreleaser/sdk/artifactory/ArtifactoryMavenDeployer.java @@ -39,7 +39,7 @@ * @author Andres Almiray * @since 1.3.0 */ -public class ArtifactoryMavenDeployer extends AbstractMavenDeployer { +public class ArtifactoryMavenDeployer extends AbstractMavenDeployer { private org.jreleaser.model.internal.deploy.maven.ArtifactoryMavenDeployer deployer; public ArtifactoryMavenDeployer(JReleaserContext context) { diff --git a/sdks/jreleaser-artifactory-java-sdk/src/main/java/org/jreleaser/sdk/artifactory/ArtifactoryMavenDeployerFactory.java b/sdks/jreleaser-artifactory-java-sdk/src/main/java/org/jreleaser/sdk/artifactory/ArtifactoryMavenDeployerFactory.java index 85943c95b..c5ae0647f 100644 --- a/sdks/jreleaser-artifactory-java-sdk/src/main/java/org/jreleaser/sdk/artifactory/ArtifactoryMavenDeployerFactory.java +++ b/sdks/jreleaser-artifactory-java-sdk/src/main/java/org/jreleaser/sdk/artifactory/ArtifactoryMavenDeployerFactory.java @@ -26,7 +26,8 @@ * @since 1.3.0 */ @ServiceProviderFor(MavenDeployerFactory.class) -public class ArtifactoryMavenDeployerFactory implements MavenDeployerFactory { +public class ArtifactoryMavenDeployerFactory implements MavenDeployerFactory { @Override public String getName() { return org.jreleaser.model.api.deploy.maven.ArtifactoryMavenDeployer.TYPE; diff --git a/sdks/jreleaser-codeberg-java-sdk/src/main/java/org/jreleaser/sdk/codeberg/CodebergReleaser.java b/sdks/jreleaser-codeberg-java-sdk/src/main/java/org/jreleaser/sdk/codeberg/CodebergReleaser.java index 6dcfce596..849d15186 100644 --- a/sdks/jreleaser-codeberg-java-sdk/src/main/java/org/jreleaser/sdk/codeberg/CodebergReleaser.java +++ b/sdks/jreleaser-codeberg-java-sdk/src/main/java/org/jreleaser/sdk/codeberg/CodebergReleaser.java @@ -17,30 +17,402 @@ */ package org.jreleaser.sdk.codeberg; +import org.jreleaser.bundle.RB; +import org.jreleaser.model.JReleaserException; +import org.jreleaser.model.UpdateSection; +import org.jreleaser.model.api.common.Apply; import org.jreleaser.model.internal.JReleaserContext; +import org.jreleaser.model.internal.util.VersionUtils; +import org.jreleaser.model.spi.release.AbstractReleaser; import org.jreleaser.model.spi.release.Asset; +import org.jreleaser.model.spi.release.Release; +import org.jreleaser.model.spi.release.ReleaseException; import org.jreleaser.model.spi.release.Repository; -import org.jreleaser.sdk.gitea.GiteaReleaser; +import org.jreleaser.model.spi.release.User; +import org.jreleaser.sdk.commons.RestAPIException; +import org.jreleaser.sdk.git.ChangelogProvider; +import org.jreleaser.sdk.git.GitSdk; +import org.jreleaser.sdk.git.ReleaseUtils; +import org.jreleaser.sdk.gitea.Gitea; +import org.jreleaser.sdk.gitea.api.GtAsset; +import org.jreleaser.sdk.gitea.api.GtIssue; +import org.jreleaser.sdk.gitea.api.GtLabel; +import org.jreleaser.sdk.gitea.api.GtMilestone; +import org.jreleaser.sdk.gitea.api.GtRelease; +import org.jreleaser.sdk.gitea.api.GtRepository; +import java.io.IOException; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.regex.Pattern; + +import static org.jreleaser.mustache.Templates.resolveTemplate; +import static org.jreleaser.util.StringUtils.capitalize; +import static org.jreleaser.util.StringUtils.uncapitalize; /** * @author Andres Almiray * @since 0.4.0 */ @org.jreleaser.infra.nativeimage.annotations.NativeImage -public class CodebergReleaser extends GiteaReleaser { +public class CodebergReleaser extends AbstractReleaser { + private final org.jreleaser.model.internal.release.CodebergReleaser codeberg; + public CodebergReleaser(JReleaserContext context, List assets) { super(context, assets); + codeberg = context.getModel().getRelease().getCodeberg(); + } + + @Override + public org.jreleaser.model.api.release.CodebergReleaser getReleaser() { + return codeberg.asImmutable(); } @Override - protected org.jreleaser.model.internal.release.GiteaReleaser resolveGiteaFromModel() { - return context.getModel().getRelease().getCodeberg(); + public String generateReleaseNotes() throws IOException { + try { + return ChangelogProvider.getChangelog(context).trim(); + } catch (IOException e) { + throw new JReleaserException(RB.$("ERROR_unexpected_error_changelog"), e); + } } @Override + protected void createTag() throws ReleaseException { + ReleaseUtils.createTag(context); + } + + @Override + protected void createRelease() throws ReleaseException { + context.getLogger().info(RB.$("git.releaser.releasing"), codeberg.getResolvedRepoUrl(context.getModel())); + String tagName = codeberg.getEffectiveTagName(context.getModel()); + + try { + Gitea api = new Gitea(context.getLogger(), + codeberg.getApiEndpoint(), + codeberg.getResolvedToken(), + codeberg.getConnectTimeout(), + codeberg.getReadTimeout()); + + String branch = codeberg.getBranch(); + + List branchNames = api.listBranches(codeberg.getOwner(), codeberg.getName()); + if (!branchNames.contains(branch)) { + throw new ReleaseException(RB.$("ERROR_git_release_branch_not_exists", branch, branchNames)); + } + + String changelog = context.getChangelog(); + + context.getLogger().debug(RB.$("git.releaser.release.lookup"), tagName, codeberg.getCanonicalRepoName()); + GtRelease release = api.findReleaseByTag(codeberg.getOwner(), codeberg.getName(), tagName); + boolean snapshot = context.getModel().getProject().isSnapshot(); + if (null != release) { + context.getLogger().debug(RB.$("git.releaser.release.exists"), tagName); + if (codeberg.isOverwrite() || snapshot) { + context.getLogger().debug(RB.$("git.releaser.release.delete"), tagName); + if (!context.isDryrun()) { + api.deleteRelease(codeberg.getOwner(), codeberg.getName(), tagName, release.getId()); + } + context.getLogger().debug(RB.$("git.releaser.release.create"), tagName); + createRelease(api, tagName, changelog, codeberg.isMatch()); + } else if (codeberg.getUpdate().isEnabled()) { + context.getLogger().debug(RB.$("git.releaser.release.update"), tagName); + if (!context.isDryrun()) { + GtRelease updater = new GtRelease(); + updater.setPrerelease(codeberg.getPrerelease().isEnabled()); + updater.setDraft(codeberg.isDraft()); + if (codeberg.getUpdate().getSections().contains(UpdateSection.TITLE)) { + context.getLogger().info(RB.$("git.releaser.release.update.title"), codeberg.getEffectiveReleaseName()); + updater.setName(codeberg.getEffectiveReleaseName()); + } + if (codeberg.getUpdate().getSections().contains(UpdateSection.BODY)) { + context.getLogger().info(RB.$("git.releaser.release.update.body")); + updater.setBody(changelog); + } + api.updateRelease(codeberg.getOwner(), codeberg.getName(), release.getId(), updater); + + if (codeberg.getUpdate().getSections().contains(UpdateSection.ASSETS)) { + updateAssets(api, release); + } + updateIssues(codeberg, api); + } + } else { + if (context.isDryrun()) { + context.getLogger().debug(RB.$("git.releaser.release.create"), tagName); + createRelease(api, tagName, changelog, false); + return; + } + + throw new IllegalStateException(RB.$("ERROR_git_releaser_cannot_release", + capitalize(codeberg.getServiceName()), tagName)); + } + } else { + context.getLogger().debug(RB.$("git.releaser.release.not.found"), tagName); + context.getLogger().debug(RB.$("git.releaser.release.create"), tagName); + createRelease(api, tagName, changelog, snapshot && codeberg.isMatch()); + } + } catch (RestAPIException e) { + context.getLogger().trace(e.getStatus() + " " + e.getReason()); + context.getLogger().trace(e); + throw new ReleaseException(e); + } catch (IOException | IllegalStateException e) { + context.getLogger().trace(e); + throw new ReleaseException(e); + } + } + protected Repository.Kind resolveRepositoryKind() { - return Repository.Kind.CODEBERG; + return Repository.Kind.OTHER; + } + + @Override + public Repository maybeCreateRepository(String owner, String repo, String password) throws IOException { + context.getLogger().debug(RB.$("git.repository.lookup"), owner, repo); + + Gitea api = new Gitea(context.getLogger(), + codeberg.getApiEndpoint(), + password, + codeberg.getConnectTimeout(), + codeberg.getReadTimeout()); + GtRepository repository = api.findRepository(owner, repo); + if (null == repository) { + repository = api.createRepository(owner, repo); + } + + return new Repository( + resolveRepositoryKind(), + owner, + repo, + repository.getHtmlUrl(), + repository.getCloneUrl()); + } + + @Override + public Optional findUser(String email, String name) { + try { + String host = codeberg.getHost(); + String endpoint = codeberg.getApiEndpoint(); + if (endpoint.startsWith("https")) { + host = "https://" + host; + } else { + host = "http://" + host; + } + if (!host.endsWith("/")) { + host += "/"; + } + + return new Gitea(context.getLogger(), + codeberg.getApiEndpoint(), + codeberg.getResolvedToken(), + codeberg.getConnectTimeout(), + codeberg.getReadTimeout()) + .findUser(email, name, host); + } catch (RestAPIException | IOException e) { + context.getLogger().trace(e); + context.getLogger().debug(RB.$("git.releaser.user.not.found"), email); + } + + return Optional.empty(); + } + + @Override + public List listReleases(String owner, String repo) throws IOException { + Gitea api = new Gitea(context.getLogger(), + codeberg.getApiEndpoint(), + codeberg.getResolvedToken(), + codeberg.getConnectTimeout(), + codeberg.getReadTimeout()); + + List releases = api.listReleases(owner, repo); + + VersionUtils.clearUnparseableTags(); + Pattern versionPattern = VersionUtils.resolveVersionPattern(context); + for (Release release : releases) { + release.setVersion(VersionUtils.version(context, release.getTagName(), versionPattern)); + } + + releases.sort((r1, r2) -> r2.getVersion().compareTo(r1.getVersion())); + + return releases; + } + + private void createRelease(Gitea api, String tagName, String changelog, boolean deleteTags) throws IOException { + if (context.isDryrun()) { + for (Asset asset : assets) { + if (0 == Files.size(asset.getPath()) || !Files.exists(asset.getPath())) { + // do not upload empty or non existent files + continue; + } + + context.getLogger().info(" " + RB.$("git.upload.asset"), asset.getFilename()); + } + updateIssues(codeberg, api); + return; + } + + if (deleteTags) { + deleteTags(api, codeberg.getOwner(), codeberg.getName(), tagName); + } + + // local tag + if (deleteTags || !codeberg.isSkipTag()) { + context.getLogger().debug(RB.$("git.releaser.repository.tag"), tagName); + GitSdk.of(context).tag(tagName, true, context); + } + + // remote tag/release + GtRelease release = new GtRelease(); + release.setName(codeberg.getEffectiveReleaseName()); + release.setTagName(tagName); + release.setTargetCommitish(codeberg.getBranch()); + release.setBody(changelog); + + release = api.createRelease(codeberg.getOwner(), codeberg.getName(), release); + api.uploadAssets(codeberg.getOwner(), codeberg.getName(), release, assets); + + if (codeberg.getMilestone().isClose() && !context.getModel().getProject().isSnapshot()) { + Optional milestone = api.findMilestoneByName( + codeberg.getOwner(), + codeberg.getName(), + codeberg.getMilestone().getEffectiveName()); + if (milestone.isPresent()) { + api.closeMilestone(codeberg.getOwner(), + codeberg.getName(), + milestone.get()); + } + } + + updateIssues(codeberg, api); + } + + private void updateIssues(org.jreleaser.model.internal.release.CodebergReleaser codeberg, Gitea api) throws IOException { + if (!codeberg.getIssues().isEnabled()) return; + + List issueNumbers = ChangelogProvider.getIssues(context); + + if (!issueNumbers.isEmpty()) { + context.getLogger().info(RB.$("git.issue.release.mark", issueNumbers.size())); + } + + if (context.isDryrun()) { + for (String issueNumber : issueNumbers) { + context.getLogger().debug(RB.$("git.issue.release", issueNumber)); + } + return; + } + + String tagName = codeberg.getEffectiveTagName(context.getModel()); + String labelName = codeberg.getIssues().getLabel().getName(); + String labelColor = codeberg.getIssues().getLabel().getColor(); + Map props = codeberg.props(context.getModel()); + codeberg.fillProps(props, context.getModel()); + String comment = resolveTemplate(codeberg.getIssues().getComment(), props); + + if (labelColor.startsWith("#")) { + labelColor = labelColor.substring(1); + } + + GtLabel gtLabel = null; + + try { + gtLabel = api.getOrCreateLabel( + codeberg.getOwner(), + codeberg.getName(), + labelName, + labelColor, + codeberg.getIssues().getLabel().getDescription()); + } catch (IOException e) { + throw new IllegalStateException(RB.$("ERROR_git_releaser_fetch_label", tagName, labelName), e); + } + + Optional milestone = Optional.empty(); + Apply applyMilestone = codeberg.getIssues().getApplyMilestone(); + if (codeberg.getMilestone().isClose() && !context.getModel().getProject().isSnapshot()) { + milestone = api.findMilestoneByName( + codeberg.getOwner(), + codeberg.getName(), + codeberg.getMilestone().getEffectiveName()); + + if (!milestone.isPresent()) { + milestone = api.findClosedMilestoneByName( + codeberg.getOwner(), + codeberg.getName(), + codeberg.getMilestone().getEffectiveName()); + } + } + + for (String issueNumber : issueNumbers) { + Optional op = api.findIssue(codeberg.getOwner(), codeberg.getName(), Integer.parseInt(issueNumber)); + if (!op.isPresent()) continue; + + GtIssue gtIssue = op.get(); + if (gtIssue.getState().equals("closed") && gtIssue.getLabels().stream().noneMatch(l -> l.getName().equals(labelName))) { + context.getLogger().debug(RB.$("git.issue.release", issueNumber)); + api.addLabelToIssue(codeberg.getOwner(), codeberg.getName(), gtIssue, gtLabel); + api.commentOnIssue(codeberg.getOwner(), codeberg.getName(), gtIssue, comment); + + milestone.ifPresent(gtMilestone -> applyMilestone(codeberg, api, issueNumber, gtIssue, applyMilestone, gtMilestone)); + } + } + } + + private void applyMilestone(org.jreleaser.model.internal.release.CodebergReleaser codeberg, Gitea api, String issueNumber, GtIssue gtIssue, Apply applyMilestone, GtMilestone targetMilestone) { + GtMilestone issueMilestone = gtIssue.getMilestone(); + String targetMilestoneTitle = targetMilestone.getTitle(); + + if (null == issueMilestone) { + context.getLogger().debug(RB.$("git.issue.milestone.apply", targetMilestoneTitle, issueNumber)); + api.setMilestoneOnIssue(codeberg.getOwner(), codeberg.getName(), gtIssue, targetMilestone); + } else { + String milestoneTitle = issueMilestone.getTitle(); + + if (applyMilestone == Apply.ALWAYS) { + context.getLogger().debug(uncapitalize(RB.$("git.issue.milestone.warn", issueNumber, milestoneTitle))); + } else if (applyMilestone == Apply.WARN) { + if (!milestoneTitle.equals(targetMilestoneTitle)) { + context.getLogger().warn(RB.$("git.issue.milestone.warn", issueNumber, milestoneTitle)); + } + } else if (applyMilestone == Apply.FORCE) { + if (!milestoneTitle.equals(targetMilestoneTitle)) { + context.getLogger().warn(RB.$("git.issue.milestone.force", targetMilestoneTitle, issueNumber, milestoneTitle)); + api.setMilestoneOnIssue(codeberg.getOwner(), codeberg.getName(), gtIssue, targetMilestone); + } else { + context.getLogger().debug(uncapitalize(RB.$("git.issue.milestone.warn", issueNumber, milestoneTitle))); + } + } + } + } + + private void updateAssets(Gitea api, GtRelease release) throws IOException { + List assetsToBeUpdated = new ArrayList<>(); + List assetsToBeUploaded = new ArrayList<>(); + + Map existingAssets = api.listAssets(codeberg.getOwner(), codeberg.getName(), release); + Map assetsToBePublished = new LinkedHashMap<>(); + assets.forEach(asset -> assetsToBePublished.put(asset.getFilename(), asset)); + + assetsToBePublished.keySet().forEach(name -> { + if (existingAssets.containsKey(name)) { + assetsToBeUpdated.add(assetsToBePublished.get(name)); + } else { + assetsToBeUploaded.add(assetsToBePublished.get(name)); + } + }); + + api.updateAssets(codeberg.getOwner(), codeberg.getName(), release, assetsToBeUpdated, existingAssets); + api.uploadAssets(codeberg.getOwner(), codeberg.getName(), release, assetsToBeUploaded); + } + + private void deleteTags(Gitea api, String owner, String repo, String tagName) { + // delete remote tag + try { + api.deleteTag(owner, repo, tagName); + } catch (RestAPIException ignored) { + //noop + } } } diff --git a/sdks/jreleaser-discord-java-sdk/src/main/java/org/jreleaser/sdk/discord/DiscordAnnouncer.java b/sdks/jreleaser-discord-java-sdk/src/main/java/org/jreleaser/sdk/discord/DiscordAnnouncer.java index fe6b3e75f..3f3f01f1b 100644 --- a/sdks/jreleaser-discord-java-sdk/src/main/java/org/jreleaser/sdk/discord/DiscordAnnouncer.java +++ b/sdks/jreleaser-discord-java-sdk/src/main/java/org/jreleaser/sdk/discord/DiscordAnnouncer.java @@ -34,11 +34,18 @@ * @since 0.2.0 */ @org.jreleaser.infra.nativeimage.annotations.NativeImage -public class DiscordAnnouncer implements Announcer { +public class DiscordAnnouncer implements Announcer { private final JReleaserContext context; + private final org.jreleaser.model.internal.announce.DiscordAnnouncer discord; - DiscordAnnouncer(JReleaserContext context) { + public DiscordAnnouncer(JReleaserContext context) { this.context = context; + this.discord = context.getModel().getAnnounce().getDiscord(); + } + + @Override + public org.jreleaser.model.api.announce.DiscordAnnouncer getAnnouncer() { + return discord.asImmutable(); } @Override @@ -48,13 +55,11 @@ public String getName() { @Override public boolean isEnabled() { - return context.getModel().getAnnounce().getDiscord().isEnabled(); + return discord.isEnabled(); } @Override public void announce() throws AnnounceException { - org.jreleaser.model.internal.announce.DiscordAnnouncer discord = context.getModel().getAnnounce().getDiscord(); - String message = ""; if (isNotBlank(discord.getMessage())) { message = discord.getResolvedMessage(context); diff --git a/sdks/jreleaser-ftp-java-sdk/src/main/java/org/jreleaser/sdk/ftp/FtpArtifactDownloader.java b/sdks/jreleaser-ftp-java-sdk/src/main/java/org/jreleaser/sdk/ftp/FtpArtifactDownloader.java index 6907bc0e8..2ef0fbd66 100644 --- a/sdks/jreleaser-ftp-java-sdk/src/main/java/org/jreleaser/sdk/ftp/FtpArtifactDownloader.java +++ b/sdks/jreleaser-ftp-java-sdk/src/main/java/org/jreleaser/sdk/ftp/FtpArtifactDownloader.java @@ -40,7 +40,7 @@ * @author Andres Almiray * @since 1.1.0 */ -public class FtpArtifactDownloader extends AbstractArtifactDownloader { +public class FtpArtifactDownloader extends AbstractArtifactDownloader { private FtpDownloader downloader; public FtpArtifactDownloader(JReleaserContext context) { diff --git a/sdks/jreleaser-ftp-java-sdk/src/main/java/org/jreleaser/sdk/ftp/FtpArtifactDownloaderFactory.java b/sdks/jreleaser-ftp-java-sdk/src/main/java/org/jreleaser/sdk/ftp/FtpArtifactDownloaderFactory.java index 009656a0a..e5492be87 100644 --- a/sdks/jreleaser-ftp-java-sdk/src/main/java/org/jreleaser/sdk/ftp/FtpArtifactDownloaderFactory.java +++ b/sdks/jreleaser-ftp-java-sdk/src/main/java/org/jreleaser/sdk/ftp/FtpArtifactDownloaderFactory.java @@ -27,7 +27,8 @@ * @since 1.1.0 */ @ServiceProviderFor(ArtifactDownloaderFactory.class) -public class FtpArtifactDownloaderFactory implements ArtifactDownloaderFactory { +public class FtpArtifactDownloaderFactory implements ArtifactDownloaderFactory { @Override public String getName() { return org.jreleaser.model.api.download.FtpDownloader.TYPE; diff --git a/sdks/jreleaser-ftp-java-sdk/src/main/java/org/jreleaser/sdk/ftp/FtpArtifactUploader.java b/sdks/jreleaser-ftp-java-sdk/src/main/java/org/jreleaser/sdk/ftp/FtpArtifactUploader.java index 9a7534ac5..8530a66b7 100644 --- a/sdks/jreleaser-ftp-java-sdk/src/main/java/org/jreleaser/sdk/ftp/FtpArtifactUploader.java +++ b/sdks/jreleaser-ftp-java-sdk/src/main/java/org/jreleaser/sdk/ftp/FtpArtifactUploader.java @@ -36,7 +36,7 @@ * @since 1.1.0 */ @org.jreleaser.infra.nativeimage.annotations.NativeImage -public class FtpArtifactUploader extends AbstractArtifactUploader { +public class FtpArtifactUploader extends AbstractArtifactUploader { private FtpUploader uploader; public FtpArtifactUploader(JReleaserContext context) { diff --git a/sdks/jreleaser-ftp-java-sdk/src/main/java/org/jreleaser/sdk/ftp/FtpArtifactUploaderFactory.java b/sdks/jreleaser-ftp-java-sdk/src/main/java/org/jreleaser/sdk/ftp/FtpArtifactUploaderFactory.java index 6d538496d..13b784e4a 100644 --- a/sdks/jreleaser-ftp-java-sdk/src/main/java/org/jreleaser/sdk/ftp/FtpArtifactUploaderFactory.java +++ b/sdks/jreleaser-ftp-java-sdk/src/main/java/org/jreleaser/sdk/ftp/FtpArtifactUploaderFactory.java @@ -27,7 +27,8 @@ * @since 1.1.0 */ @ServiceProviderFor(ArtifactUploaderFactory.class) -public class FtpArtifactUploaderFactory implements ArtifactUploaderFactory { +public class FtpArtifactUploaderFactory implements ArtifactUploaderFactory { @Override public String getName() { return org.jreleaser.model.api.upload.FtpUploader.TYPE; diff --git a/sdks/jreleaser-genericgit-java-sdk/src/main/java/org/jreleaser/sdk/generic/git/GenericGitReleaser.java b/sdks/jreleaser-genericgit-java-sdk/src/main/java/org/jreleaser/sdk/generic/git/GenericGitReleaser.java index ab4e2e989..1a2facc9f 100644 --- a/sdks/jreleaser-genericgit-java-sdk/src/main/java/org/jreleaser/sdk/generic/git/GenericGitReleaser.java +++ b/sdks/jreleaser-genericgit-java-sdk/src/main/java/org/jreleaser/sdk/generic/git/GenericGitReleaser.java @@ -39,11 +39,16 @@ * @since 0.4.0 */ @org.jreleaser.infra.nativeimage.annotations.NativeImage -public class GenericGitReleaser extends AbstractReleaser { +public class GenericGitReleaser extends AbstractReleaser { public GenericGitReleaser(JReleaserContext context, List assets) { super(context, assets); } + @Override + public org.jreleaser.model.api.release.GenericGitReleaser getReleaser() { + return context.getModel().getRelease().getGeneric().asImmutable(); + } + @Override public String generateReleaseNotes() throws IOException { try { diff --git a/sdks/jreleaser-gitea-java-sdk/src/main/java/org/jreleaser/sdk/gitea/Gitea.java b/sdks/jreleaser-gitea-java-sdk/src/main/java/org/jreleaser/sdk/gitea/Gitea.java index 00a24b782..c3c4e93f7 100644 --- a/sdks/jreleaser-gitea-java-sdk/src/main/java/org/jreleaser/sdk/gitea/Gitea.java +++ b/sdks/jreleaser-gitea-java-sdk/src/main/java/org/jreleaser/sdk/gitea/Gitea.java @@ -68,14 +68,14 @@ * @author Andres Almiray * @since 0.1.0 */ -class Gitea { +public class Gitea { private static final String API_V1 = "/api/v1"; private final Tika tika = new Tika(); private final JReleaserLogger logger; private final GiteaAPI api; - Gitea(JReleaserLogger logger, + public Gitea(JReleaserLogger logger, String endpoint, String token, int connectTimeout, @@ -106,7 +106,7 @@ class Gitea { .target(GiteaAPI.class, endpoint); } - GtRepository findRepository(String owner, String repo) { + public GtRepository findRepository(String owner, String repo) { logger.debug(RB.$("git.repository.lookup"), owner, repo); try { return api.getRepository(owner, repo); @@ -119,7 +119,7 @@ GtRepository findRepository(String owner, String repo) { } } - List listReleases(String owner, String repoName) throws IOException { + public List listReleases(String owner, String repoName) throws IOException { logger.debug(RB.$("git.list.releases"), owner, repoName); List releases = new ArrayList<>(); @@ -152,7 +152,7 @@ List listReleases(String owner, String repoName) throws IOException { return releases; } - List listBranches(String owner, String repoName) throws IOException { + public List listBranches(String owner, String repoName) throws IOException { logger.debug(RB.$("git.list.branches"), owner, repoName); List branches = new ArrayList<>(); @@ -178,7 +178,7 @@ List listBranches(String owner, String repoName) throws IOException { return branches; } - Map listAssets(String owner, String repo, GtRelease release) throws IOException { + public Map listAssets(String owner, String repo, GtRelease release) throws IOException { logger.debug(RB.$("git.list.assets.github"), owner, repo, release.getId()); Map assets = new LinkedHashMap<>(); @@ -189,7 +189,7 @@ Map listAssets(String owner, String repo, GtRelease release) th return assets; } - Optional findMilestoneByName(String owner, String repo, String milestoneName) { + public Optional findMilestoneByName(String owner, String repo, String milestoneName) { logger.debug(RB.$("git.milestone.lookup"), milestoneName, owner, repo); try { @@ -209,7 +209,7 @@ Optional findMilestoneByName(String owner, String repo, String mile } } - Optional findClosedMilestoneByName(String owner, String repo, String milestoneName) { + public Optional findClosedMilestoneByName(String owner, String repo, String milestoneName) { logger.debug(RB.$("git.milestone.lookup.closed"), milestoneName, owner, repo); try { @@ -229,14 +229,14 @@ Optional findClosedMilestoneByName(String owner, String repo, Strin } } - void closeMilestone(String owner, String repo, GtMilestone milestone) throws IOException { + public void closeMilestone(String owner, String repo, GtMilestone milestone) throws IOException { logger.debug(RB.$("git.milestone.close"), milestone.getTitle(), owner, repo); api.updateMilestone(CollectionUtils.map() .e("state", "closed"), owner, repo, milestone.getId()); } - GtRepository createRepository(String owner, String repo) { + public GtRepository createRepository(String owner, String repo) { logger.debug(RB.$("git.repository.create"), owner, repo); Map params = CollectionUtils.map() @@ -263,7 +263,7 @@ private GtOrganization resolveOrganization(String name) { } } - GtRelease findReleaseByTag(String owner, String repo, String tagName) { + public GtRelease findReleaseByTag(String owner, String repo, String tagName) { logger.debug(RB.$("git.fetch.release.by.tag"), owner, repo, tagName); try { @@ -277,7 +277,7 @@ GtRelease findReleaseByTag(String owner, String repo, String tagName) { } } - void deleteRelease(String owner, String repo, String tagName, Integer id) throws RestAPIException { + public void deleteRelease(String owner, String repo, String tagName, Integer id) throws RestAPIException { logger.debug(RB.$("git.delete.release.from.id"), tagName, owner, repo, id); try { @@ -292,31 +292,31 @@ void deleteRelease(String owner, String repo, String tagName, Integer id) throws } } - void deleteTag(String owner, String repo, String tagName) throws RestAPIException { + public void deleteTag(String owner, String repo, String tagName) throws RestAPIException { logger.debug(RB.$("git.delete.tag.from"), tagName, owner, repo); api.deleteTag(owner, repo, tagName); } - void deletePackage(String owner, String type, String name, String version) throws RestAPIException { + public void deletePackage(String owner, String type, String name, String version) throws RestAPIException { logger.debug(RB.$("gitea.delete.package"), owner, type, name, version); api.deletePackage(owner, type, name, version); } - GtRelease createRelease(String owner, String repo, GtRelease release) throws RestAPIException { + public GtRelease createRelease(String owner, String repo, GtRelease release) throws RestAPIException { logger.debug(RB.$("git.create.release"), owner, repo, release.getTagName()); return api.createRelease(release, owner, repo); } - void updateRelease(String owner, String repo, Integer id, GtRelease release) throws RestAPIException { + public void updateRelease(String owner, String repo, Integer id, GtRelease release) throws RestAPIException { logger.debug(RB.$("git.update.release"), owner, repo, release.getTagName()); api.updateRelease(release, owner, repo, id); } - void uploadAssets(String owner, String repo, GtRelease release, List assets) throws IOException { + public void uploadAssets(String owner, String repo, GtRelease release, List assets) throws IOException { for (Asset asset : assets) { if (0 == Files.size(asset.getPath()) || !Files.exists(asset.getPath())) { // do not upload empty or non existent files @@ -333,7 +333,7 @@ void uploadAssets(String owner, String repo, GtRelease release, List asse } } - void updateAssets(String owner, String repo, GtRelease release, List assets, Map existingAssets) throws IOException { + public void updateAssets(String owner, String repo, GtRelease release, List assets, Map existingAssets) throws IOException { for (Asset asset : assets) { if (0 == Files.size(asset.getPath()) || !Files.exists(asset.getPath())) { // do not upload empty or non existent files @@ -358,7 +358,7 @@ void updateAssets(String owner, String repo, GtRelease release, List asse } } - Optional findUser(String email, String name, String host) throws RestAPIException { + public Optional findUser(String email, String name, String host) throws RestAPIException { logger.debug(RB.$("git.user.lookup"), name, email); GtSearchUser search = api.searchUser(CollectionUtils.mapOf("q", email)); @@ -370,7 +370,7 @@ Optional findUser(String email, String name, String host) throws RestAPIEx return Optional.empty(); } - GtLabel getOrCreateLabel(String owner, String name, String labelName, String labelColor, String description) throws IOException { + public GtLabel getOrCreateLabel(String owner, String name, String labelName, String labelColor, String description) throws IOException { logger.debug(RB.$("git.label.fetch", labelName)); List labels = listLabels(owner, name); @@ -386,7 +386,7 @@ GtLabel getOrCreateLabel(String owner, String name, String labelName, String lab return api.createLabel(owner, name, labelName, labelColor, description); } - Optional findIssue(String owner, String name, int issueNumber) throws IOException { + public Optional findIssue(String owner, String name, int issueNumber) throws IOException { logger.debug(RB.$("git.issue.fetch", issueNumber)); try { return Optional.of(api.findIssue(owner, name, issueNumber)); @@ -398,7 +398,7 @@ Optional findIssue(String owner, String name, int issueNumber) throws I } } - void addLabelToIssue(String owner, String name, GtIssue issue, GtLabel label) { + public void addLabelToIssue(String owner, String name, GtIssue issue, GtLabel label) { logger.debug(RB.$("git.issue.label", label.getName(), issue.getNumber())); Map> labels = new LinkedHashMap<>(); @@ -409,7 +409,7 @@ void addLabelToIssue(String owner, String name, GtIssue issue, GtLabel label) { api.labelIssue(labels, owner, name, issue.getNumber()); } - void commentOnIssue(String owner, String name, GtIssue issue, String comment) { + public void commentOnIssue(String owner, String name, GtIssue issue, String comment) { logger.debug(RB.$("git.issue.comment", issue.getNumber())); Map params = new LinkedHashMap<>(); @@ -418,7 +418,7 @@ void commentOnIssue(String owner, String name, GtIssue issue, String comment) { api.commentIssue(params, owner, name, issue.getNumber()); } - void setMilestoneOnIssue(String owner, String name, GtIssue issue, GtMilestone milestone) { + public void setMilestoneOnIssue(String owner, String name, GtIssue issue, GtMilestone milestone) { Map params = new LinkedHashMap<>(); params.put("milestone", milestone.getId()); diff --git a/sdks/jreleaser-gitea-java-sdk/src/main/java/org/jreleaser/sdk/gitea/GiteaArtifactUploader.java b/sdks/jreleaser-gitea-java-sdk/src/main/java/org/jreleaser/sdk/gitea/GiteaArtifactUploader.java index 968385e74..c9bef5c22 100644 --- a/sdks/jreleaser-gitea-java-sdk/src/main/java/org/jreleaser/sdk/gitea/GiteaArtifactUploader.java +++ b/sdks/jreleaser-gitea-java-sdk/src/main/java/org/jreleaser/sdk/gitea/GiteaArtifactUploader.java @@ -36,7 +36,7 @@ * @author Andres Almiray * @since 1.2.0 */ -public class GiteaArtifactUploader extends AbstractArtifactUploader { +public class GiteaArtifactUploader extends AbstractArtifactUploader { private GiteaUploader uploader; public GiteaArtifactUploader(JReleaserContext context) { diff --git a/sdks/jreleaser-gitea-java-sdk/src/main/java/org/jreleaser/sdk/gitea/GiteaArtifactUploaderFactory.java b/sdks/jreleaser-gitea-java-sdk/src/main/java/org/jreleaser/sdk/gitea/GiteaArtifactUploaderFactory.java index b41069daf..8e465b9cb 100644 --- a/sdks/jreleaser-gitea-java-sdk/src/main/java/org/jreleaser/sdk/gitea/GiteaArtifactUploaderFactory.java +++ b/sdks/jreleaser-gitea-java-sdk/src/main/java/org/jreleaser/sdk/gitea/GiteaArtifactUploaderFactory.java @@ -27,7 +27,8 @@ * @since 1.2.0 */ @ServiceProviderFor(ArtifactUploaderFactory.class) -public class GiteaArtifactUploaderFactory implements ArtifactUploaderFactory { +public class GiteaArtifactUploaderFactory implements ArtifactUploaderFactory { @Override public String getName() { return org.jreleaser.model.api.upload.GiteaUploader.TYPE; diff --git a/sdks/jreleaser-gitea-java-sdk/src/main/java/org/jreleaser/sdk/gitea/GiteaMavenDeployer.java b/sdks/jreleaser-gitea-java-sdk/src/main/java/org/jreleaser/sdk/gitea/GiteaMavenDeployer.java index 6b5770206..973b05398 100644 --- a/sdks/jreleaser-gitea-java-sdk/src/main/java/org/jreleaser/sdk/gitea/GiteaMavenDeployer.java +++ b/sdks/jreleaser-gitea-java-sdk/src/main/java/org/jreleaser/sdk/gitea/GiteaMavenDeployer.java @@ -38,7 +38,8 @@ * @author Andres Almiray * @since 1.3.0 */ -public class GiteaMavenDeployer extends AbstractMavenDeployer { +public class GiteaMavenDeployer extends AbstractMavenDeployer { private org.jreleaser.model.internal.deploy.maven.GiteaMavenDeployer deployer; public GiteaMavenDeployer(JReleaserContext context) { diff --git a/sdks/jreleaser-gitea-java-sdk/src/main/java/org/jreleaser/sdk/gitea/GiteaMavenDeployerFactory.java b/sdks/jreleaser-gitea-java-sdk/src/main/java/org/jreleaser/sdk/gitea/GiteaMavenDeployerFactory.java index 81c47970a..5ed19323f 100644 --- a/sdks/jreleaser-gitea-java-sdk/src/main/java/org/jreleaser/sdk/gitea/GiteaMavenDeployerFactory.java +++ b/sdks/jreleaser-gitea-java-sdk/src/main/java/org/jreleaser/sdk/gitea/GiteaMavenDeployerFactory.java @@ -26,7 +26,8 @@ * @since 1.3.0 */ @ServiceProviderFor(MavenDeployerFactory.class) -public class GiteaMavenDeployerFactory implements MavenDeployerFactory { +public class GiteaMavenDeployerFactory implements MavenDeployerFactory { @Override public String getName() { return org.jreleaser.model.api.deploy.maven.GiteaMavenDeployer.TYPE; diff --git a/sdks/jreleaser-gitea-java-sdk/src/main/java/org/jreleaser/sdk/gitea/GiteaReleaser.java b/sdks/jreleaser-gitea-java-sdk/src/main/java/org/jreleaser/sdk/gitea/GiteaReleaser.java index 74486a567..0a7779023 100644 --- a/sdks/jreleaser-gitea-java-sdk/src/main/java/org/jreleaser/sdk/gitea/GiteaReleaser.java +++ b/sdks/jreleaser-gitea-java-sdk/src/main/java/org/jreleaser/sdk/gitea/GiteaReleaser.java @@ -58,9 +58,17 @@ * @since 0.1.0 */ @org.jreleaser.infra.nativeimage.annotations.NativeImage -public class GiteaReleaser extends AbstractReleaser { +public class GiteaReleaser extends AbstractReleaser { + private final org.jreleaser.model.internal.release.GiteaReleaser gitea; + public GiteaReleaser(JReleaserContext context, List assets) { super(context, assets); + gitea = context.getModel().getRelease().getGitea(); + } + + @Override + public org.jreleaser.model.api.release.GiteaReleaser getReleaser() { + return gitea.asImmutable(); } @Override @@ -79,7 +87,6 @@ protected void createTag() throws ReleaseException { @Override protected void createRelease() throws ReleaseException { - org.jreleaser.model.internal.release.GiteaReleaser gitea = resolveGiteaFromModel(); context.getLogger().info(RB.$("git.releaser.releasing"), gitea.getResolvedRepoUrl(context.getModel())); String tagName = gitea.getEffectiveTagName(context.getModel()); @@ -157,17 +164,12 @@ protected void createRelease() throws ReleaseException { } } - protected org.jreleaser.model.internal.release.GiteaReleaser resolveGiteaFromModel() { - return context.getModel().getRelease().getGitea(); - } - protected Repository.Kind resolveRepositoryKind() { return Repository.Kind.OTHER; } @Override public Repository maybeCreateRepository(String owner, String repo, String password) throws IOException { - org.jreleaser.model.internal.release.GiteaReleaser gitea = resolveGiteaFromModel(); context.getLogger().debug(RB.$("git.repository.lookup"), owner, repo); Gitea api = new Gitea(context.getLogger(), @@ -190,8 +192,6 @@ public Repository maybeCreateRepository(String owner, String repo, String passwo @Override public Optional findUser(String email, String name) { - org.jreleaser.model.internal.release.GiteaReleaser gitea = resolveGiteaFromModel(); - try { String host = gitea.getHost(); String endpoint = gitea.getApiEndpoint(); @@ -220,8 +220,6 @@ public Optional findUser(String email, String name) { @Override public List listReleases(String owner, String repo) throws IOException { - org.jreleaser.model.internal.release.GiteaReleaser gitea = resolveGiteaFromModel(); - Gitea api = new Gitea(context.getLogger(), gitea.getApiEndpoint(), gitea.getResolvedToken(), @@ -242,8 +240,6 @@ public List listReleases(String owner, String repo) throws IOException } private void createRelease(Gitea api, String tagName, String changelog, boolean deleteTags) throws IOException { - org.jreleaser.model.internal.release.GiteaReleaser gitea = resolveGiteaFromModel(); - if (context.isDryrun()) { for (Asset asset : assets) { if (0 == Files.size(asset.getPath()) || !Files.exists(asset.getPath())) { @@ -391,8 +387,6 @@ private void applyMilestone(org.jreleaser.model.internal.release.GiteaReleaser g } private void updateAssets(Gitea api, GtRelease release) throws IOException { - org.jreleaser.model.internal.release.GiteaReleaser gitea = resolveGiteaFromModel(); - List assetsToBeUpdated = new ArrayList<>(); List assetsToBeUploaded = new ArrayList<>(); diff --git a/sdks/jreleaser-github-java-sdk/src/main/java/org/jreleaser/sdk/github/DiscussionsAnnouncer.java b/sdks/jreleaser-github-java-sdk/src/main/java/org/jreleaser/sdk/github/DiscussionsAnnouncer.java index 3866971c7..74a875988 100644 --- a/sdks/jreleaser-github-java-sdk/src/main/java/org/jreleaser/sdk/github/DiscussionsAnnouncer.java +++ b/sdks/jreleaser-github-java-sdk/src/main/java/org/jreleaser/sdk/github/DiscussionsAnnouncer.java @@ -35,11 +35,19 @@ * @author Andres Almiray * @since 0.1.0 */ -public class DiscussionsAnnouncer implements Announcer { +@org.jreleaser.infra.nativeimage.annotations.NativeImage +public class DiscussionsAnnouncer implements Announcer { private final JReleaserContext context; + private final org.jreleaser.model.internal.announce.DiscussionsAnnouncer discussions; - DiscussionsAnnouncer(JReleaserContext context) { + public DiscussionsAnnouncer(JReleaserContext context) { this.context = context; + this.discussions = context.getModel().getAnnounce().getDiscussions(); + } + + @Override + public org.jreleaser.model.api.announce.DiscussionsAnnouncer getAnnouncer() { + return discussions.asImmutable(); } @Override @@ -49,13 +57,12 @@ public String getName() { @Override public boolean isEnabled() { - return context.getModel().getAnnounce().getDiscussions().isEnabled(); + return discussions.isEnabled(); } @Override public void announce() throws AnnounceException { GithubReleaser github = context.getModel().getRelease().getGithub(); - org.jreleaser.model.internal.announce.DiscussionsAnnouncer discussions = context.getModel().getAnnounce().getDiscussions(); String message = ""; if (isNotBlank(discussions.getMessage())) { diff --git a/sdks/jreleaser-github-java-sdk/src/main/java/org/jreleaser/sdk/github/GithubMavenDeployer.java b/sdks/jreleaser-github-java-sdk/src/main/java/org/jreleaser/sdk/github/GithubMavenDeployer.java index b7be480d7..4ed1c6700 100644 --- a/sdks/jreleaser-github-java-sdk/src/main/java/org/jreleaser/sdk/github/GithubMavenDeployer.java +++ b/sdks/jreleaser-github-java-sdk/src/main/java/org/jreleaser/sdk/github/GithubMavenDeployer.java @@ -39,7 +39,8 @@ * @author Andres Almiray * @since 1.3.0 */ -public class GithubMavenDeployer extends AbstractMavenDeployer { +public class GithubMavenDeployer extends AbstractMavenDeployer { private org.jreleaser.model.internal.deploy.maven.GithubMavenDeployer deployer; public GithubMavenDeployer(JReleaserContext context) { diff --git a/sdks/jreleaser-github-java-sdk/src/main/java/org/jreleaser/sdk/github/GithubMavenDeployerFactory.java b/sdks/jreleaser-github-java-sdk/src/main/java/org/jreleaser/sdk/github/GithubMavenDeployerFactory.java index 307d92768..b338c6666 100644 --- a/sdks/jreleaser-github-java-sdk/src/main/java/org/jreleaser/sdk/github/GithubMavenDeployerFactory.java +++ b/sdks/jreleaser-github-java-sdk/src/main/java/org/jreleaser/sdk/github/GithubMavenDeployerFactory.java @@ -26,7 +26,8 @@ * @since 1.3.0 */ @ServiceProviderFor(MavenDeployerFactory.class) -public class GithubMavenDeployerFactory implements MavenDeployerFactory { +public class GithubMavenDeployerFactory implements MavenDeployerFactory { @Override public String getName() { return org.jreleaser.model.api.deploy.maven.GithubMavenDeployer.TYPE; diff --git a/sdks/jreleaser-github-java-sdk/src/main/java/org/jreleaser/sdk/github/GithubReleaser.java b/sdks/jreleaser-github-java-sdk/src/main/java/org/jreleaser/sdk/github/GithubReleaser.java index ecdce529e..277e09166 100644 --- a/sdks/jreleaser-github-java-sdk/src/main/java/org/jreleaser/sdk/github/GithubReleaser.java +++ b/sdks/jreleaser-github-java-sdk/src/main/java/org/jreleaser/sdk/github/GithubReleaser.java @@ -71,15 +71,22 @@ * @author Andres Almiray * @since 0.1.0 */ -@org.jreleaser.infra.nativeimage.annotations.NativeImage -public class GithubReleaser extends AbstractReleaser { +public class GithubReleaser extends AbstractReleaser { + + private final org.jreleaser.model.internal.release.GithubReleaser github; + public GithubReleaser(JReleaserContext context, List assets) { super(context, assets); + github = context.getModel().getRelease().getGithub(); + } + + @Override + public org.jreleaser.model.api.release.GithubReleaser getReleaser() { + return github.asImmutable(); } @Override public String generateReleaseNotes() throws IOException { - org.jreleaser.model.internal.release.GithubReleaser github = context.getModel().getRelease().getGithub(); if (github.getReleaseNotes().isEnabled()) { String content = generateReleaseNotesByAPI(); diff --git a/sdks/jreleaser-gitlab-java-sdk/src/main/java/org/jreleaser/sdk/gitlab/GitlabArtifactUploader.java b/sdks/jreleaser-gitlab-java-sdk/src/main/java/org/jreleaser/sdk/gitlab/GitlabArtifactUploader.java index 14fe7cab8..31b7a772a 100644 --- a/sdks/jreleaser-gitlab-java-sdk/src/main/java/org/jreleaser/sdk/gitlab/GitlabArtifactUploader.java +++ b/sdks/jreleaser-gitlab-java-sdk/src/main/java/org/jreleaser/sdk/gitlab/GitlabArtifactUploader.java @@ -36,7 +36,7 @@ * @author Andres Almiray * @since 1.2.0 */ -public class GitlabArtifactUploader extends AbstractArtifactUploader { +public class GitlabArtifactUploader extends AbstractArtifactUploader { private GitlabUploader uploader; public GitlabArtifactUploader(JReleaserContext context) { diff --git a/sdks/jreleaser-gitlab-java-sdk/src/main/java/org/jreleaser/sdk/gitlab/GitlabArtifactUploaderFactory.java b/sdks/jreleaser-gitlab-java-sdk/src/main/java/org/jreleaser/sdk/gitlab/GitlabArtifactUploaderFactory.java index 1fdda0d4a..27bf55110 100644 --- a/sdks/jreleaser-gitlab-java-sdk/src/main/java/org/jreleaser/sdk/gitlab/GitlabArtifactUploaderFactory.java +++ b/sdks/jreleaser-gitlab-java-sdk/src/main/java/org/jreleaser/sdk/gitlab/GitlabArtifactUploaderFactory.java @@ -27,7 +27,8 @@ * @since 1.2.0 */ @ServiceProviderFor(ArtifactUploaderFactory.class) -public class GitlabArtifactUploaderFactory implements ArtifactUploaderFactory { +public class GitlabArtifactUploaderFactory implements ArtifactUploaderFactory { @Override public String getName() { return org.jreleaser.model.api.upload.GitlabUploader.TYPE; diff --git a/sdks/jreleaser-gitlab-java-sdk/src/main/java/org/jreleaser/sdk/gitlab/GitlabMavenDeployer.java b/sdks/jreleaser-gitlab-java-sdk/src/main/java/org/jreleaser/sdk/gitlab/GitlabMavenDeployer.java index f9bf5d221..e6a2a0f14 100644 --- a/sdks/jreleaser-gitlab-java-sdk/src/main/java/org/jreleaser/sdk/gitlab/GitlabMavenDeployer.java +++ b/sdks/jreleaser-gitlab-java-sdk/src/main/java/org/jreleaser/sdk/gitlab/GitlabMavenDeployer.java @@ -42,7 +42,8 @@ * @author Andres Almiray * @since 1.3.0 */ -public class GitlabMavenDeployer extends AbstractMavenDeployer { +public class GitlabMavenDeployer extends AbstractMavenDeployer { private org.jreleaser.model.internal.deploy.maven.GitlabMavenDeployer deployer; public GitlabMavenDeployer(JReleaserContext context) { diff --git a/sdks/jreleaser-gitlab-java-sdk/src/main/java/org/jreleaser/sdk/gitlab/GitlabMavenDeployerFactory.java b/sdks/jreleaser-gitlab-java-sdk/src/main/java/org/jreleaser/sdk/gitlab/GitlabMavenDeployerFactory.java index 24d156d4d..8127c18fe 100644 --- a/sdks/jreleaser-gitlab-java-sdk/src/main/java/org/jreleaser/sdk/gitlab/GitlabMavenDeployerFactory.java +++ b/sdks/jreleaser-gitlab-java-sdk/src/main/java/org/jreleaser/sdk/gitlab/GitlabMavenDeployerFactory.java @@ -26,7 +26,8 @@ * @since 1.3.0 */ @ServiceProviderFor(MavenDeployerFactory.class) -public class GitlabMavenDeployerFactory implements MavenDeployerFactory { +public class GitlabMavenDeployerFactory implements MavenDeployerFactory { @Override public String getName() { return org.jreleaser.model.api.deploy.maven.GitlabMavenDeployer.TYPE; diff --git a/sdks/jreleaser-gitlab-java-sdk/src/main/java/org/jreleaser/sdk/gitlab/GitlabReleaser.java b/sdks/jreleaser-gitlab-java-sdk/src/main/java/org/jreleaser/sdk/gitlab/GitlabReleaser.java index 1d8b5cd5e..adaec7877 100644 --- a/sdks/jreleaser-gitlab-java-sdk/src/main/java/org/jreleaser/sdk/gitlab/GitlabReleaser.java +++ b/sdks/jreleaser-gitlab-java-sdk/src/main/java/org/jreleaser/sdk/gitlab/GitlabReleaser.java @@ -67,9 +67,17 @@ * @since 0.1.0 */ @org.jreleaser.infra.nativeimage.annotations.NativeImage -public class GitlabReleaser extends AbstractReleaser { +public class GitlabReleaser extends AbstractReleaser { + private final org.jreleaser.model.internal.release.GitlabReleaser gitlab; + public GitlabReleaser(JReleaserContext context, List assets) { super(context, assets); + gitlab = context.getModel().getRelease().getGitlab(); + } + + @Override + public org.jreleaser.model.api.release.GitlabReleaser getReleaser() { + return gitlab.asImmutable(); } @Override @@ -88,7 +96,6 @@ protected void createTag() throws ReleaseException { @Override protected void createRelease() throws ReleaseException { - org.jreleaser.model.internal.release.GitlabReleaser gitlab = context.getModel().getRelease().getGitlab(); context.getLogger().info(RB.$("git.releaser.releasing"), gitlab.getResolvedRepoUrl(context.getModel())); String tagName = gitlab.getEffectiveTagName(context.getModel()); @@ -441,7 +448,7 @@ private Collection collectUploadLinks(org.jreleaser.model.interna return links; } - private void collectUploadLinks(Uploader uploader, List links) { + private void collectUploadLinks(Uploader uploader, List links) { List keys = uploader.resolveSkipKeys(); keys.add(org.jreleaser.model.api.release.GitlabReleaser.SKIP_GITLAB_LINKS); diff --git a/sdks/jreleaser-gitter-java-sdk/src/main/java/org/jreleaser/sdk/gitter/GitterAnnouncer.java b/sdks/jreleaser-gitter-java-sdk/src/main/java/org/jreleaser/sdk/gitter/GitterAnnouncer.java index c7739e69f..7cec0d929 100644 --- a/sdks/jreleaser-gitter-java-sdk/src/main/java/org/jreleaser/sdk/gitter/GitterAnnouncer.java +++ b/sdks/jreleaser-gitter-java-sdk/src/main/java/org/jreleaser/sdk/gitter/GitterAnnouncer.java @@ -34,11 +34,18 @@ * @since 0.2.0 */ @org.jreleaser.infra.nativeimage.annotations.NativeImage -public class GitterAnnouncer implements Announcer { +public class GitterAnnouncer implements Announcer { private final JReleaserContext context; + private final org.jreleaser.model.internal.announce.GitterAnnouncer gitter; - GitterAnnouncer(JReleaserContext context) { + public GitterAnnouncer(JReleaserContext context) { this.context = context; + this.gitter = context.getModel().getAnnounce().getGitter(); + } + + @Override + public org.jreleaser.model.api.announce.GitterAnnouncer getAnnouncer() { + return gitter.asImmutable(); } @Override @@ -48,13 +55,11 @@ public String getName() { @Override public boolean isEnabled() { - return context.getModel().getAnnounce().getGitter().isEnabled(); + return gitter.isEnabled(); } @Override public void announce() throws AnnounceException { - org.jreleaser.model.internal.announce.GitterAnnouncer gitter = context.getModel().getAnnounce().getGitter(); - String message = ""; if (isNotBlank(gitter.getMessage())) { message = gitter.getResolvedMessage(context); diff --git a/sdks/jreleaser-google-chat-java-sdk/src/main/java/org/jreleaser/sdk/googlechat/GoogleChatAnnouncer.java b/sdks/jreleaser-google-chat-java-sdk/src/main/java/org/jreleaser/sdk/googlechat/GoogleChatAnnouncer.java index df757ec84..ab4231d6d 100644 --- a/sdks/jreleaser-google-chat-java-sdk/src/main/java/org/jreleaser/sdk/googlechat/GoogleChatAnnouncer.java +++ b/sdks/jreleaser-google-chat-java-sdk/src/main/java/org/jreleaser/sdk/googlechat/GoogleChatAnnouncer.java @@ -34,11 +34,18 @@ * @since 0.5.0 */ @org.jreleaser.infra.nativeimage.annotations.NativeImage -public class GoogleChatAnnouncer implements Announcer { +public class GoogleChatAnnouncer implements Announcer { private final JReleaserContext context; + private final org.jreleaser.model.internal.announce.GoogleChatAnnouncer googleChat; GoogleChatAnnouncer(JReleaserContext context) { this.context = context; + this.googleChat = context.getModel().getAnnounce().getGoogleChat(); + } + + @Override + public org.jreleaser.model.api.announce.GoogleChatAnnouncer getAnnouncer() { + return googleChat.asImmutable(); } @Override @@ -48,13 +55,11 @@ public String getName() { @Override public boolean isEnabled() { - return context.getModel().getAnnounce().getGoogleChat().isEnabled(); + return googleChat.isEnabled(); } @Override public void announce() throws AnnounceException { - org.jreleaser.model.internal.announce.GoogleChatAnnouncer googleChat = context.getModel().getAnnounce().getGoogleChat(); - String message; if (isNotBlank(googleChat.getMessage())) { message = googleChat.getResolvedMessage(context); diff --git a/sdks/jreleaser-http-java-sdk/src/main/java/org/jreleaser/sdk/http/HttpAnnouncer.java b/sdks/jreleaser-http-java-sdk/src/main/java/org/jreleaser/sdk/http/HttpAnnouncer.java index db08a3357..83ed0df25 100644 --- a/sdks/jreleaser-http-java-sdk/src/main/java/org/jreleaser/sdk/http/HttpAnnouncer.java +++ b/sdks/jreleaser-http-java-sdk/src/main/java/org/jreleaser/sdk/http/HttpAnnouncer.java @@ -18,8 +18,13 @@ package org.jreleaser.sdk.http; import feign.form.FormData; +import org.jreleaser.bundle.RB; +import org.jreleaser.extensions.api.workflow.WorkflowListenerException; import org.jreleaser.model.Constants; import org.jreleaser.model.Http; +import org.jreleaser.model.api.JReleaserCommand; +import org.jreleaser.model.api.announce.HttpAnnouncers; +import org.jreleaser.model.api.hooks.ExecutionEvent; import org.jreleaser.model.internal.JReleaserContext; import org.jreleaser.model.spi.announce.AnnounceException; import org.jreleaser.model.spi.announce.Announcer; @@ -39,11 +44,19 @@ * @author Andres Almiray * @since 1.3.0 */ -public class HttpAnnouncer implements Announcer { +@org.jreleaser.infra.nativeimage.annotations.NativeImage +public class HttpAnnouncer implements Announcer { private final JReleaserContext context; + private final org.jreleaser.model.internal.announce.HttpAnnouncers https; - HttpAnnouncer(JReleaserContext context) { + public HttpAnnouncer(JReleaserContext context) { this.context = context; + this.https = context.getModel().getAnnounce().getConfiguredHttp(); + } + + @Override + public HttpAnnouncers getAnnouncer() { + return https.asImmutable(); } @Override @@ -53,12 +66,12 @@ public String getName() { @Override public boolean isEnabled() { - return context.getModel().getAnnounce().getConfiguredHttp().isEnabled(); + return https.isEnabled(); } @Override public void announce() throws AnnounceException { - Map http = context.getModel().getAnnounce().getHttp(); + Map http = https.getHttpAnnouncers(); for (Map.Entry e : http.entrySet()) { if (e.getValue().isEnabled()) { @@ -91,52 +104,56 @@ public void announce(org.jreleaser.model.internal.announce.HttpAnnouncer announc if (context.isDryrun()) return; + fireAnnouncerEvent(ExecutionEvent.before(JReleaserCommand.ANNOUNCE.toStep()), announcer); + String username = announcer.getResolvedUsername(); String password = announcer.getResolvedPassword(); - if (!context.isDryrun()) { - try { - Map headers = new LinkedHashMap<>(); - switch (announcer.resolveAuthorization()) { - case NONE: - break; - case BASIC: - String auth = username + ":" + password; - byte[] encodedAuth = Base64.getEncoder().encode(auth.getBytes()); - auth = new String(encodedAuth); - headers.put("Authorization", "Basic " + auth); - break; - case BEARER: - headers.put("Authorization", announcer.getBearerKeyword() + " " + password); - break; - } + try { + Map headers = new LinkedHashMap<>(); + switch (announcer.resolveAuthorization()) { + case NONE: + break; + case BASIC: + String auth = username + ":" + password; + byte[] encodedAuth = Base64.getEncoder().encode(auth.getBytes()); + auth = new String(encodedAuth); + headers.put("Authorization", "Basic " + auth); + break; + case BEARER: + headers.put("Authorization", announcer.getBearerKeyword() + " " + password); + break; + } - resolveHeaders(announcer, headers); - - FormData data = ClientUtils.toFormData( - "payload", - headers.computeIfAbsent("Content-Type", k -> "text/plain"), - payload); - - if (announcer.getMethod() == Http.Method.POST) { - ClientUtils.postFile(context.getLogger(), - resolvedUrl, - announcer.getConnectTimeout(), - announcer.getReadTimeout(), - data, - headers); - } else { - ClientUtils.putFile(context.getLogger(), - resolvedUrl, - announcer.getConnectTimeout(), - announcer.getReadTimeout(), - data, - headers); - } - } catch (IOException | UploadException e) { - context.getLogger().trace(e); - throw new AnnounceException(e.getMessage(), e); + resolveHeaders(announcer, headers); + + FormData data = ClientUtils.toFormData( + "payload", + headers.computeIfAbsent("Content-Type", k -> "text/plain"), + payload); + + if (announcer.getMethod() == Http.Method.POST) { + ClientUtils.postFile(context.getLogger(), + resolvedUrl, + announcer.getConnectTimeout(), + announcer.getReadTimeout(), + data, + headers); + } else { + ClientUtils.putFile(context.getLogger(), + resolvedUrl, + announcer.getConnectTimeout(), + announcer.getReadTimeout(), + data, + headers); } + + fireAnnouncerEvent(ExecutionEvent.success(JReleaserCommand.ANNOUNCE.toStep()), announcer); + } catch (IOException | UploadException e) { + fireAnnouncerEvent(ExecutionEvent.failure(JReleaserCommand.ANNOUNCE.toStep(), e), announcer); + + context.getLogger().trace(e); + throw new AnnounceException(e.getMessage(), e); } } @@ -147,4 +164,13 @@ private void resolveHeaders(org.jreleaser.model.internal.announce.HttpAnnouncer if (isNotBlank(value)) headers.put(k, value); }); } + + private void fireAnnouncerEvent(ExecutionEvent event, org.jreleaser.model.internal.announce.HttpAnnouncer http) { + try { + context.fireAnnounceStepEvent(event, http.asImmutable()); + } catch (WorkflowListenerException e) { + context.getLogger().error(RB.$("listener.failure", e.getListener().getClass().getName())); + context.getLogger().trace(e); + } + } } diff --git a/sdks/jreleaser-http-java-sdk/src/main/java/org/jreleaser/sdk/http/HttpArtifactDownloader.java b/sdks/jreleaser-http-java-sdk/src/main/java/org/jreleaser/sdk/http/HttpArtifactDownloader.java index c7afe7a75..c031b6e9b 100644 --- a/sdks/jreleaser-http-java-sdk/src/main/java/org/jreleaser/sdk/http/HttpArtifactDownloader.java +++ b/sdks/jreleaser-http-java-sdk/src/main/java/org/jreleaser/sdk/http/HttpArtifactDownloader.java @@ -35,7 +35,7 @@ * @author Andres Almiray * @since 1.1.0 */ -public class HttpArtifactDownloader extends AbstractArtifactDownloader { +public class HttpArtifactDownloader extends AbstractArtifactDownloader { private HttpDownloader downloader; public HttpArtifactDownloader(JReleaserContext context) { diff --git a/sdks/jreleaser-http-java-sdk/src/main/java/org/jreleaser/sdk/http/HttpArtifactDownloaderFactory.java b/sdks/jreleaser-http-java-sdk/src/main/java/org/jreleaser/sdk/http/HttpArtifactDownloaderFactory.java index fe079fd14..327bfc9e3 100644 --- a/sdks/jreleaser-http-java-sdk/src/main/java/org/jreleaser/sdk/http/HttpArtifactDownloaderFactory.java +++ b/sdks/jreleaser-http-java-sdk/src/main/java/org/jreleaser/sdk/http/HttpArtifactDownloaderFactory.java @@ -27,7 +27,8 @@ * @since 1.1.0 */ @ServiceProviderFor(ArtifactDownloaderFactory.class) -public class HttpArtifactDownloaderFactory implements ArtifactDownloaderFactory { +public class HttpArtifactDownloaderFactory implements ArtifactDownloaderFactory { @Override public String getName() { return org.jreleaser.model.api.download.HttpDownloader.TYPE; diff --git a/sdks/jreleaser-http-java-sdk/src/main/java/org/jreleaser/sdk/http/HttpArtifactUploader.java b/sdks/jreleaser-http-java-sdk/src/main/java/org/jreleaser/sdk/http/HttpArtifactUploader.java index abeba87a0..e317312d1 100644 --- a/sdks/jreleaser-http-java-sdk/src/main/java/org/jreleaser/sdk/http/HttpArtifactUploader.java +++ b/sdks/jreleaser-http-java-sdk/src/main/java/org/jreleaser/sdk/http/HttpArtifactUploader.java @@ -41,8 +41,7 @@ * @author Andres Almiray * @since 0.4.0 */ -@org.jreleaser.infra.nativeimage.annotations.NativeImage -public class HttpArtifactUploader extends AbstractArtifactUploader { +public class HttpArtifactUploader extends AbstractArtifactUploader { private HttpUploader uploader; public HttpArtifactUploader(JReleaserContext context) { diff --git a/sdks/jreleaser-http-java-sdk/src/main/java/org/jreleaser/sdk/http/HttpArtifactUploaderFactory.java b/sdks/jreleaser-http-java-sdk/src/main/java/org/jreleaser/sdk/http/HttpArtifactUploaderFactory.java index 249a6d3fd..fb82bc9c6 100644 --- a/sdks/jreleaser-http-java-sdk/src/main/java/org/jreleaser/sdk/http/HttpArtifactUploaderFactory.java +++ b/sdks/jreleaser-http-java-sdk/src/main/java/org/jreleaser/sdk/http/HttpArtifactUploaderFactory.java @@ -27,7 +27,8 @@ * @since 0.4.0 */ @ServiceProviderFor(ArtifactUploaderFactory.class) -public class HttpArtifactUploaderFactory implements ArtifactUploaderFactory { +public class HttpArtifactUploaderFactory implements ArtifactUploaderFactory { @Override public String getName() { return org.jreleaser.model.api.upload.HttpUploader.TYPE; diff --git a/sdks/jreleaser-java-sdk-commons/src/main/java/org/jreleaser/sdk/commons/AbstractArtifactDownloader.java b/sdks/jreleaser-java-sdk-commons/src/main/java/org/jreleaser/sdk/commons/AbstractArtifactDownloader.java index d0a290ae1..77d81df54 100644 --- a/sdks/jreleaser-java-sdk-commons/src/main/java/org/jreleaser/sdk/commons/AbstractArtifactDownloader.java +++ b/sdks/jreleaser-java-sdk-commons/src/main/java/org/jreleaser/sdk/commons/AbstractArtifactDownloader.java @@ -33,7 +33,7 @@ * @author Andres Almiray * @since 1.1.0 */ -public abstract class AbstractArtifactDownloader implements ArtifactDownloader { +public abstract class AbstractArtifactDownloader> implements ArtifactDownloader { protected final JReleaserContext context; protected AbstractArtifactDownloader(JReleaserContext context) { diff --git a/sdks/jreleaser-java-sdk-commons/src/main/java/org/jreleaser/sdk/commons/AbstractArtifactUploader.java b/sdks/jreleaser-java-sdk-commons/src/main/java/org/jreleaser/sdk/commons/AbstractArtifactUploader.java index e5d65982e..f729bbb5e 100644 --- a/sdks/jreleaser-java-sdk-commons/src/main/java/org/jreleaser/sdk/commons/AbstractArtifactUploader.java +++ b/sdks/jreleaser-java-sdk-commons/src/main/java/org/jreleaser/sdk/commons/AbstractArtifactUploader.java @@ -45,7 +45,7 @@ * @author Andres Almiray * @since 0.4.0 */ -public abstract class AbstractArtifactUploader implements ArtifactUploader { +public abstract class AbstractArtifactUploader> implements ArtifactUploader { protected final JReleaserContext context; protected AbstractArtifactUploader(JReleaserContext context) { diff --git a/sdks/jreleaser-java-sdk-commons/src/main/java/org/jreleaser/sdk/commons/AbstractMavenDeployer.java b/sdks/jreleaser-java-sdk-commons/src/main/java/org/jreleaser/sdk/commons/AbstractMavenDeployer.java index 2210a4530..2a902c282 100644 --- a/sdks/jreleaser-java-sdk-commons/src/main/java/org/jreleaser/sdk/commons/AbstractMavenDeployer.java +++ b/sdks/jreleaser-java-sdk-commons/src/main/java/org/jreleaser/sdk/commons/AbstractMavenDeployer.java @@ -59,7 +59,8 @@ * @author Andres Almiray * @since 1.4.0 */ -public abstract class AbstractMavenDeployer implements MavenDeployer { +public abstract class AbstractMavenDeployer> implements MavenDeployer { private static final Algorithm[] ALGORITHMS = { Algorithm.MD5, Algorithm.SHA_1, diff --git a/sdks/jreleaser-mastodon-java-sdk/src/main/java/org/jreleaser/sdk/mastodon/MastodonAnnouncer.java b/sdks/jreleaser-mastodon-java-sdk/src/main/java/org/jreleaser/sdk/mastodon/MastodonAnnouncer.java index e93294d47..f1acb3b99 100644 --- a/sdks/jreleaser-mastodon-java-sdk/src/main/java/org/jreleaser/sdk/mastodon/MastodonAnnouncer.java +++ b/sdks/jreleaser-mastodon-java-sdk/src/main/java/org/jreleaser/sdk/mastodon/MastodonAnnouncer.java @@ -26,11 +26,18 @@ * @since 0.4.0 */ @org.jreleaser.infra.nativeimage.annotations.NativeImage -public class MastodonAnnouncer implements Announcer { +public class MastodonAnnouncer implements Announcer { private final JReleaserContext context; + private final org.jreleaser.model.internal.announce.MastodonAnnouncer mastodon; - MastodonAnnouncer(JReleaserContext context) { + public MastodonAnnouncer(JReleaserContext context) { this.context = context; + this.mastodon = context.getModel().getAnnounce().getMastodon(); + } + + @Override + public org.jreleaser.model.api.announce.MastodonAnnouncer getAnnouncer() { + return mastodon.asImmutable(); } @Override @@ -40,13 +47,11 @@ public String getName() { @Override public boolean isEnabled() { - return context.getModel().getAnnounce().getMastodon().isEnabled(); + return mastodon.isEnabled(); } @Override public void announce() throws AnnounceException { - org.jreleaser.model.internal.announce.MastodonAnnouncer mastodon = context.getModel().getAnnounce().getMastodon(); - String status = mastodon.getResolvedStatus(context); context.getLogger().debug("status: {}", status); diff --git a/sdks/jreleaser-mattermost-java-sdk/src/main/java/org/jreleaser/sdk/mattermost/MattermostAnnouncer.java b/sdks/jreleaser-mattermost-java-sdk/src/main/java/org/jreleaser/sdk/mattermost/MattermostAnnouncer.java index 2cef6a689..049156804 100644 --- a/sdks/jreleaser-mattermost-java-sdk/src/main/java/org/jreleaser/sdk/mattermost/MattermostAnnouncer.java +++ b/sdks/jreleaser-mattermost-java-sdk/src/main/java/org/jreleaser/sdk/mattermost/MattermostAnnouncer.java @@ -34,11 +34,18 @@ * @since 0.4.0 */ @org.jreleaser.infra.nativeimage.annotations.NativeImage -public class MattermostAnnouncer implements Announcer { +public class MattermostAnnouncer implements Announcer { private final JReleaserContext context; + private final org.jreleaser.model.internal.announce.MattermostAnnouncer mattermost; - MattermostAnnouncer(JReleaserContext context) { + public MattermostAnnouncer(JReleaserContext context) { this.context = context; + this.mattermost = context.getModel().getAnnounce().getMattermost(); + } + + @Override + public org.jreleaser.model.api.announce.MattermostAnnouncer getAnnouncer() { + return mattermost.asImmutable(); } @Override @@ -48,13 +55,11 @@ public String getName() { @Override public boolean isEnabled() { - return context.getModel().getAnnounce().getMattermost().isEnabled(); + return mattermost.isEnabled(); } @Override public void announce() throws AnnounceException { - org.jreleaser.model.internal.announce.MattermostAnnouncer mattermost = context.getModel().getAnnounce().getMattermost(); - String message = ""; if (isNotBlank(mattermost.getMessage())) { message = mattermost.getResolvedMessage(context); diff --git a/sdks/jreleaser-nexus2-java-sdk/src/main/java/org/jreleaser/sdk/nexus2/Nexus2MavenDeployer.java b/sdks/jreleaser-nexus2-java-sdk/src/main/java/org/jreleaser/sdk/nexus2/Nexus2MavenDeployer.java index 45551c18c..5f8b29c53 100644 --- a/sdks/jreleaser-nexus2-java-sdk/src/main/java/org/jreleaser/sdk/nexus2/Nexus2MavenDeployer.java +++ b/sdks/jreleaser-nexus2-java-sdk/src/main/java/org/jreleaser/sdk/nexus2/Nexus2MavenDeployer.java @@ -28,7 +28,8 @@ * @author Andres Almiray * @since 1.3.0 */ -public class Nexus2MavenDeployer extends AbstractMavenDeployer { +public class Nexus2MavenDeployer extends AbstractMavenDeployer { private org.jreleaser.model.internal.deploy.maven.Nexus2MavenDeployer deployer; public Nexus2MavenDeployer(JReleaserContext context) { diff --git a/sdks/jreleaser-nexus2-java-sdk/src/main/java/org/jreleaser/sdk/nexus2/Nexus2MavenDeployerFactory.java b/sdks/jreleaser-nexus2-java-sdk/src/main/java/org/jreleaser/sdk/nexus2/Nexus2MavenDeployerFactory.java index 081158930..7caae04e3 100644 --- a/sdks/jreleaser-nexus2-java-sdk/src/main/java/org/jreleaser/sdk/nexus2/Nexus2MavenDeployerFactory.java +++ b/sdks/jreleaser-nexus2-java-sdk/src/main/java/org/jreleaser/sdk/nexus2/Nexus2MavenDeployerFactory.java @@ -26,7 +26,8 @@ * @since 1.3.0 */ @ServiceProviderFor(MavenDeployerFactory.class) -public class Nexus2MavenDeployerFactory implements MavenDeployerFactory { +public class Nexus2MavenDeployerFactory implements MavenDeployerFactory { @Override public String getName() { return org.jreleaser.model.api.deploy.maven.Nexus2MavenDeployer.TYPE; diff --git a/sdks/jreleaser-s3-java-sdk/src/main/java/org/jreleaser/sdk/s3/S3ArtifactUploader.java b/sdks/jreleaser-s3-java-sdk/src/main/java/org/jreleaser/sdk/s3/S3ArtifactUploader.java index f533e0d7b..ce560d08e 100644 --- a/sdks/jreleaser-s3-java-sdk/src/main/java/org/jreleaser/sdk/s3/S3ArtifactUploader.java +++ b/sdks/jreleaser-s3-java-sdk/src/main/java/org/jreleaser/sdk/s3/S3ArtifactUploader.java @@ -55,7 +55,7 @@ * @since 0.8.0 */ @org.jreleaser.infra.nativeimage.annotations.NativeImage -public class S3ArtifactUploader extends AbstractArtifactUploader { +public class S3ArtifactUploader extends AbstractArtifactUploader { private static final Tika TIKA = new Tika(); private S3Uploader uploader; diff --git a/sdks/jreleaser-s3-java-sdk/src/main/java/org/jreleaser/sdk/s3/S3ArtifactUploaderFactory.java b/sdks/jreleaser-s3-java-sdk/src/main/java/org/jreleaser/sdk/s3/S3ArtifactUploaderFactory.java index c5f0d00e4..cdc2aadef 100644 --- a/sdks/jreleaser-s3-java-sdk/src/main/java/org/jreleaser/sdk/s3/S3ArtifactUploaderFactory.java +++ b/sdks/jreleaser-s3-java-sdk/src/main/java/org/jreleaser/sdk/s3/S3ArtifactUploaderFactory.java @@ -27,7 +27,8 @@ * @since 0.8.0 */ @ServiceProviderFor(ArtifactUploaderFactory.class) -public class S3ArtifactUploaderFactory implements ArtifactUploaderFactory { +public class S3ArtifactUploaderFactory implements ArtifactUploaderFactory { @Override public String getName() { return org.jreleaser.model.api.upload.S3Uploader.TYPE; diff --git a/sdks/jreleaser-sdkman-java-sdk/src/main/java/org/jreleaser/sdk/sdkman/SdkmanAnnouncer.java b/sdks/jreleaser-sdkman-java-sdk/src/main/java/org/jreleaser/sdk/sdkman/SdkmanAnnouncer.java index f8ef1b6a6..45e2f9497 100644 --- a/sdks/jreleaser-sdkman-java-sdk/src/main/java/org/jreleaser/sdk/sdkman/SdkmanAnnouncer.java +++ b/sdks/jreleaser-sdkman-java-sdk/src/main/java/org/jreleaser/sdk/sdkman/SdkmanAnnouncer.java @@ -41,11 +41,18 @@ * @since 0.1.0 */ @org.jreleaser.infra.nativeimage.annotations.NativeImage -public class SdkmanAnnouncer implements Announcer { +public class SdkmanAnnouncer implements Announcer { private final JReleaserContext context; + private final org.jreleaser.model.internal.announce.SdkmanAnnouncer sdkman; - SdkmanAnnouncer(JReleaserContext context) { + public SdkmanAnnouncer(JReleaserContext context) { this.context = context; + this.sdkman = context.getModel().getAnnounce().getSdkman(); + } + + @Override + public org.jreleaser.model.api.announce.SdkmanAnnouncer getAnnouncer() { + return sdkman.asImmutable(); } @Override @@ -55,7 +62,7 @@ public String getName() { @Override public boolean isEnabled() { - return context.getModel().getAnnounce().getSdkman().isEnabled(); + return sdkman.isEnabled(); } @Override @@ -68,8 +75,8 @@ public void announce() throws AnnounceException { return isNotBlank(sdkman.getCandidate()) ? sdkman.getCandidate().trim() : context.getModel().getProject().getName(); }, distribution -> distribution)); - Boolean set = (Boolean) context.getModel().getAnnounce().getSdkman().getExtraProperties().get(MAGIC_SET); - context.getModel().getAnnounce().getSdkman().getExtraProperties().remove(MAGIC_SET); + Boolean set = (Boolean) sdkman.getExtraProperties().get(MAGIC_SET); + sdkman.getExtraProperties().remove(MAGIC_SET); if (distributions.isEmpty()) { if (set == null || !set) { @@ -116,8 +123,6 @@ public void announce() throws AnnounceException { } private void announceProject() throws AnnounceException { - org.jreleaser.model.internal.announce.SdkmanAnnouncer sdkman = context.getModel().getAnnounce().getSdkman(); - Map platforms = new LinkedHashMap<>(); // collect artifacts by supported SDKMAN! platform for (Distribution distribution : context.getModel().getActiveDistributions()) { diff --git a/sdks/jreleaser-slack-java-sdk/src/main/java/org/jreleaser/sdk/slack/SlackAnnouncer.java b/sdks/jreleaser-slack-java-sdk/src/main/java/org/jreleaser/sdk/slack/SlackAnnouncer.java index 4cd4082c6..4412763ff 100644 --- a/sdks/jreleaser-slack-java-sdk/src/main/java/org/jreleaser/sdk/slack/SlackAnnouncer.java +++ b/sdks/jreleaser-slack-java-sdk/src/main/java/org/jreleaser/sdk/slack/SlackAnnouncer.java @@ -37,11 +37,18 @@ * @since 0.1.0 */ @org.jreleaser.infra.nativeimage.annotations.NativeImage -public class SlackAnnouncer implements Announcer { +public class SlackAnnouncer implements Announcer { private final JReleaserContext context; + private final org.jreleaser.model.internal.announce.SlackAnnouncer slack; - SlackAnnouncer(JReleaserContext context) { + public SlackAnnouncer(JReleaserContext context) { this.context = context; + this.slack = context.getModel().getAnnounce().getSlack(); + } + + @Override + public org.jreleaser.model.api.announce.SlackAnnouncer getAnnouncer() { + return slack.asImmutable(); } @Override @@ -51,13 +58,11 @@ public String getName() { @Override public boolean isEnabled() { - return context.getModel().getAnnounce().getSlack().isEnabled(); + return slack.isEnabled(); } @Override public void announce() throws AnnounceException { - org.jreleaser.model.internal.announce.SlackAnnouncer slack = context.getModel().getAnnounce().getSlack(); - String message = ""; if (isNotBlank(slack.getMessage())) { message = slack.getResolvedMessage(context); diff --git a/sdks/jreleaser-smtp-java-sdk/src/main/java/org/jreleaser/sdk/smtp/SmtpAnnouncer.java b/sdks/jreleaser-smtp-java-sdk/src/main/java/org/jreleaser/sdk/smtp/SmtpAnnouncer.java index d0ced6221..8545c8b38 100644 --- a/sdks/jreleaser-smtp-java-sdk/src/main/java/org/jreleaser/sdk/smtp/SmtpAnnouncer.java +++ b/sdks/jreleaser-smtp-java-sdk/src/main/java/org/jreleaser/sdk/smtp/SmtpAnnouncer.java @@ -33,11 +33,18 @@ * @since 0.1.0 */ @org.jreleaser.infra.nativeimage.annotations.NativeImage -public class SmtpAnnouncer implements Announcer { +public class SmtpAnnouncer implements Announcer { private final JReleaserContext context; + private final org.jreleaser.model.internal.announce.SmtpAnnouncer smtp; - SmtpAnnouncer(JReleaserContext context) { + public SmtpAnnouncer(JReleaserContext context) { this.context = context; + this.smtp = context.getModel().getAnnounce().getMail(); + } + + @Override + public org.jreleaser.model.api.announce.SmtpAnnouncer getAnnouncer() { + return smtp.asImmutable(); } @Override @@ -47,13 +54,11 @@ public String getName() { @Override public boolean isEnabled() { - return context.getModel().getAnnounce().getMail().isEnabled(); + return smtp.isEnabled(); } @Override public void announce() throws AnnounceException { - org.jreleaser.model.internal.announce.SmtpAnnouncer smtp = context.getModel().getAnnounce().getMail(); - String message = ""; if (isNotBlank(smtp.getMessage())) { message = smtp.getResolvedMessage(context); diff --git a/sdks/jreleaser-ssh-java-sdk/src/main/java/org/jreleaser/sdk/ssh/ScpArtifactDownloader.java b/sdks/jreleaser-ssh-java-sdk/src/main/java/org/jreleaser/sdk/ssh/ScpArtifactDownloader.java index e520d6aab..7e5946599 100644 --- a/sdks/jreleaser-ssh-java-sdk/src/main/java/org/jreleaser/sdk/ssh/ScpArtifactDownloader.java +++ b/sdks/jreleaser-ssh-java-sdk/src/main/java/org/jreleaser/sdk/ssh/ScpArtifactDownloader.java @@ -38,7 +38,7 @@ * @author Andres Almiray * @since 1.1.0 */ -public class ScpArtifactDownloader extends AbstractArtifactDownloader { +public class ScpArtifactDownloader extends AbstractArtifactDownloader { private ScpDownloader downloader; public ScpArtifactDownloader(JReleaserContext context) { diff --git a/sdks/jreleaser-ssh-java-sdk/src/main/java/org/jreleaser/sdk/ssh/ScpArtifactDownloaderFactory.java b/sdks/jreleaser-ssh-java-sdk/src/main/java/org/jreleaser/sdk/ssh/ScpArtifactDownloaderFactory.java index ce3f18440..b0b7e711a 100644 --- a/sdks/jreleaser-ssh-java-sdk/src/main/java/org/jreleaser/sdk/ssh/ScpArtifactDownloaderFactory.java +++ b/sdks/jreleaser-ssh-java-sdk/src/main/java/org/jreleaser/sdk/ssh/ScpArtifactDownloaderFactory.java @@ -27,7 +27,8 @@ * @since 1.1.0 */ @ServiceProviderFor(ArtifactDownloaderFactory.class) -public class ScpArtifactDownloaderFactory implements ArtifactDownloaderFactory { +public class ScpArtifactDownloaderFactory implements ArtifactDownloaderFactory { @Override public String getName() { return org.jreleaser.model.api.download.ScpDownloader.TYPE; diff --git a/sdks/jreleaser-ssh-java-sdk/src/main/java/org/jreleaser/sdk/ssh/ScpArtifactUploader.java b/sdks/jreleaser-ssh-java-sdk/src/main/java/org/jreleaser/sdk/ssh/ScpArtifactUploader.java index f924a00bb..4c3a29f38 100644 --- a/sdks/jreleaser-ssh-java-sdk/src/main/java/org/jreleaser/sdk/ssh/ScpArtifactUploader.java +++ b/sdks/jreleaser-ssh-java-sdk/src/main/java/org/jreleaser/sdk/ssh/ScpArtifactUploader.java @@ -39,7 +39,7 @@ * @since 1.1.0 */ @org.jreleaser.infra.nativeimage.annotations.NativeImage -public class ScpArtifactUploader extends AbstractArtifactUploader { +public class ScpArtifactUploader extends AbstractArtifactUploader { private ScpUploader uploader; public ScpArtifactUploader(JReleaserContext context) { diff --git a/sdks/jreleaser-ssh-java-sdk/src/main/java/org/jreleaser/sdk/ssh/ScpArtifactUploaderFactory.java b/sdks/jreleaser-ssh-java-sdk/src/main/java/org/jreleaser/sdk/ssh/ScpArtifactUploaderFactory.java index 3e4c9b216..42cb5b709 100644 --- a/sdks/jreleaser-ssh-java-sdk/src/main/java/org/jreleaser/sdk/ssh/ScpArtifactUploaderFactory.java +++ b/sdks/jreleaser-ssh-java-sdk/src/main/java/org/jreleaser/sdk/ssh/ScpArtifactUploaderFactory.java @@ -27,7 +27,8 @@ * @since 1.1.0 */ @ServiceProviderFor(ArtifactUploaderFactory.class) -public class ScpArtifactUploaderFactory implements ArtifactUploaderFactory { +public class ScpArtifactUploaderFactory implements ArtifactUploaderFactory { @Override public String getName() { return org.jreleaser.model.api.upload.ScpUploader.TYPE; diff --git a/sdks/jreleaser-ssh-java-sdk/src/main/java/org/jreleaser/sdk/ssh/SftpArtifactDownloader.java b/sdks/jreleaser-ssh-java-sdk/src/main/java/org/jreleaser/sdk/ssh/SftpArtifactDownloader.java index e36cca994..2374c236e 100644 --- a/sdks/jreleaser-ssh-java-sdk/src/main/java/org/jreleaser/sdk/ssh/SftpArtifactDownloader.java +++ b/sdks/jreleaser-ssh-java-sdk/src/main/java/org/jreleaser/sdk/ssh/SftpArtifactDownloader.java @@ -41,7 +41,7 @@ * @author Andres Almiray * @since 1.1.0 */ -public class SftpArtifactDownloader extends AbstractArtifactDownloader { +public class SftpArtifactDownloader extends AbstractArtifactDownloader { private SftpDownloader downloader; public SftpArtifactDownloader(JReleaserContext context) { diff --git a/sdks/jreleaser-ssh-java-sdk/src/main/java/org/jreleaser/sdk/ssh/SftpArtifactDownloaderFactory.java b/sdks/jreleaser-ssh-java-sdk/src/main/java/org/jreleaser/sdk/ssh/SftpArtifactDownloaderFactory.java index 3b161b196..c018b1588 100644 --- a/sdks/jreleaser-ssh-java-sdk/src/main/java/org/jreleaser/sdk/ssh/SftpArtifactDownloaderFactory.java +++ b/sdks/jreleaser-ssh-java-sdk/src/main/java/org/jreleaser/sdk/ssh/SftpArtifactDownloaderFactory.java @@ -27,7 +27,8 @@ * @since 1.1.0 */ @ServiceProviderFor(ArtifactDownloaderFactory.class) -public class SftpArtifactDownloaderFactory implements ArtifactDownloaderFactory { +public class SftpArtifactDownloaderFactory implements ArtifactDownloaderFactory { @Override public String getName() { return org.jreleaser.model.api.download.SftpDownloader.TYPE; diff --git a/sdks/jreleaser-ssh-java-sdk/src/main/java/org/jreleaser/sdk/ssh/SftpArtifactUploader.java b/sdks/jreleaser-ssh-java-sdk/src/main/java/org/jreleaser/sdk/ssh/SftpArtifactUploader.java index fecb69e90..5c3059791 100644 --- a/sdks/jreleaser-ssh-java-sdk/src/main/java/org/jreleaser/sdk/ssh/SftpArtifactUploader.java +++ b/sdks/jreleaser-ssh-java-sdk/src/main/java/org/jreleaser/sdk/ssh/SftpArtifactUploader.java @@ -41,7 +41,7 @@ * @author Andres Almiray * @since 1.1.0 */ -public class SftpArtifactUploader extends AbstractArtifactUploader { +public class SftpArtifactUploader extends AbstractArtifactUploader { private SftpUploader uploader; public SftpArtifactUploader(JReleaserContext context) { diff --git a/sdks/jreleaser-ssh-java-sdk/src/main/java/org/jreleaser/sdk/ssh/SftpArtifactUploaderFactory.java b/sdks/jreleaser-ssh-java-sdk/src/main/java/org/jreleaser/sdk/ssh/SftpArtifactUploaderFactory.java index 6fc26bb2e..ac41f03e5 100644 --- a/sdks/jreleaser-ssh-java-sdk/src/main/java/org/jreleaser/sdk/ssh/SftpArtifactUploaderFactory.java +++ b/sdks/jreleaser-ssh-java-sdk/src/main/java/org/jreleaser/sdk/ssh/SftpArtifactUploaderFactory.java @@ -27,7 +27,8 @@ * @since 1.1.0 */ @ServiceProviderFor(ArtifactUploaderFactory.class) -public class SftpArtifactUploaderFactory implements ArtifactUploaderFactory { +public class SftpArtifactUploaderFactory implements ArtifactUploaderFactory { @Override public String getName() { return org.jreleaser.model.api.upload.SftpUploader.TYPE; diff --git a/sdks/jreleaser-teams-java-sdk/src/main/java/org/jreleaser/sdk/teams/TeamsAnnouncer.java b/sdks/jreleaser-teams-java-sdk/src/main/java/org/jreleaser/sdk/teams/TeamsAnnouncer.java index 9e57dcdc8..bc3b9f795 100644 --- a/sdks/jreleaser-teams-java-sdk/src/main/java/org/jreleaser/sdk/teams/TeamsAnnouncer.java +++ b/sdks/jreleaser-teams-java-sdk/src/main/java/org/jreleaser/sdk/teams/TeamsAnnouncer.java @@ -34,11 +34,18 @@ * @since 0.2.0 */ @org.jreleaser.infra.nativeimage.annotations.NativeImage -public class TeamsAnnouncer implements Announcer { +public class TeamsAnnouncer implements Announcer { private final JReleaserContext context; + private final org.jreleaser.model.internal.announce.TeamsAnnouncer teams; - TeamsAnnouncer(JReleaserContext context) { + public TeamsAnnouncer(JReleaserContext context) { this.context = context; + this.teams = context.getModel().getAnnounce().getTeams(); + } + + @Override + public org.jreleaser.model.api.announce.TeamsAnnouncer getAnnouncer() { + return teams.asImmutable(); } @Override @@ -48,13 +55,11 @@ public String getName() { @Override public boolean isEnabled() { - return context.getModel().getAnnounce().getTeams().isEnabled(); + return teams.isEnabled(); } @Override public void announce() throws AnnounceException { - org.jreleaser.model.internal.announce.TeamsAnnouncer teams = context.getModel().getAnnounce().getTeams(); - Map props = new LinkedHashMap<>(); props.put(Constants.KEY_CHANGELOG, passThrough(convertLineEndings(context.getChangelog()))); context.getModel().getRelease().getReleaser().fillProps(props, context.getModel()); diff --git a/sdks/jreleaser-telegram-java-sdk/src/main/java/org/jreleaser/sdk/telegram/TelegramAnnouncer.java b/sdks/jreleaser-telegram-java-sdk/src/main/java/org/jreleaser/sdk/telegram/TelegramAnnouncer.java index 1e6312ec2..14c2efe8e 100644 --- a/sdks/jreleaser-telegram-java-sdk/src/main/java/org/jreleaser/sdk/telegram/TelegramAnnouncer.java +++ b/sdks/jreleaser-telegram-java-sdk/src/main/java/org/jreleaser/sdk/telegram/TelegramAnnouncer.java @@ -33,11 +33,18 @@ * @since 0.8.0 */ @org.jreleaser.infra.nativeimage.annotations.NativeImage -public class TelegramAnnouncer implements Announcer { +public class TelegramAnnouncer implements Announcer { private final JReleaserContext context; + private final org.jreleaser.model.internal.announce.TelegramAnnouncer telegram; - TelegramAnnouncer(JReleaserContext context) { + public TelegramAnnouncer(JReleaserContext context) { this.context = context; + this.telegram = context.getModel().getAnnounce().getTelegram(); + } + + @Override + public org.jreleaser.model.api.announce.TelegramAnnouncer getAnnouncer() { + return telegram.asImmutable(); } @Override @@ -47,13 +54,11 @@ public String getName() { @Override public boolean isEnabled() { - return context.getModel().getAnnounce().getTelegram().isEnabled(); + return telegram.isEnabled(); } @Override public void announce() throws AnnounceException { - org.jreleaser.model.internal.announce.TelegramAnnouncer telegram = context.getModel().getAnnounce().getTelegram(); - String message = ""; if (isNotBlank(telegram.getMessage())) { message = telegram.getResolvedMessage(context); diff --git a/sdks/jreleaser-twitter-java-sdk/src/main/java/org/jreleaser/sdk/twitter/TwitterAnnouncer.java b/sdks/jreleaser-twitter-java-sdk/src/main/java/org/jreleaser/sdk/twitter/TwitterAnnouncer.java index ede174cde..d57fc4652 100644 --- a/sdks/jreleaser-twitter-java-sdk/src/main/java/org/jreleaser/sdk/twitter/TwitterAnnouncer.java +++ b/sdks/jreleaser-twitter-java-sdk/src/main/java/org/jreleaser/sdk/twitter/TwitterAnnouncer.java @@ -41,11 +41,18 @@ * @since 0.1.0 */ @org.jreleaser.infra.nativeimage.annotations.NativeImage -public class TwitterAnnouncer implements Announcer { +public class TwitterAnnouncer implements Announcer { private final JReleaserContext context; + private final org.jreleaser.model.internal.announce.TwitterAnnouncer twitter; - TwitterAnnouncer(JReleaserContext context) { + public TwitterAnnouncer(JReleaserContext context) { this.context = context; + this.twitter = context.getModel().getAnnounce().getTwitter(); + } + + @Override + public org.jreleaser.model.api.announce.TwitterAnnouncer getAnnouncer() { + return twitter.asImmutable(); } @Override @@ -55,12 +62,11 @@ public String getName() { @Override public boolean isEnabled() { - return context.getModel().getAnnounce().getTwitter().isEnabled(); + return twitter.isEnabled(); } @Override public void announce() throws AnnounceException { - org.jreleaser.model.internal.announce.TwitterAnnouncer twitter = context.getModel().getAnnounce().getTwitter(); List statuses = new ArrayList<>(); diff --git a/sdks/jreleaser-webhooks-java-sdk/src/main/java/org/jreleaser/sdk/webhooks/WebhooksAnnouncer.java b/sdks/jreleaser-webhooks-java-sdk/src/main/java/org/jreleaser/sdk/webhooks/WebhooksAnnouncer.java index 9ba69a0c0..8fb6ca1b3 100644 --- a/sdks/jreleaser-webhooks-java-sdk/src/main/java/org/jreleaser/sdk/webhooks/WebhooksAnnouncer.java +++ b/sdks/jreleaser-webhooks-java-sdk/src/main/java/org/jreleaser/sdk/webhooks/WebhooksAnnouncer.java @@ -20,7 +20,10 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.jreleaser.bundle.RB; +import org.jreleaser.extensions.api.workflow.WorkflowListenerException; import org.jreleaser.model.Constants; +import org.jreleaser.model.api.JReleaserCommand; +import org.jreleaser.model.api.hooks.ExecutionEvent; import org.jreleaser.model.internal.JReleaserContext; import org.jreleaser.model.internal.announce.WebhookAnnouncer; import org.jreleaser.model.spi.announce.AnnounceException; @@ -39,11 +42,18 @@ * @since 0.5.0 */ @org.jreleaser.infra.nativeimage.annotations.NativeImage -public class WebhooksAnnouncer implements Announcer { +public class WebhooksAnnouncer implements Announcer { private final JReleaserContext context; + private final org.jreleaser.model.internal.announce.WebhooksAnnouncer webhooks; - WebhooksAnnouncer(JReleaserContext context) { + public WebhooksAnnouncer(JReleaserContext context) { this.context = context; + this.webhooks = context.getModel().getAnnounce().getConfiguredWebhooks(); + } + + @Override + public org.jreleaser.model.api.announce.WebhooksAnnouncer getAnnouncer() { + return webhooks.asImmutable(); } @Override @@ -53,12 +63,12 @@ public String getName() { @Override public boolean isEnabled() { - return context.getModel().getAnnounce().getConfiguredWebhooks().isEnabled(); + return webhooks.isEnabled(); } @Override public void announce() throws AnnounceException { - Map webhooks = context.getModel().getAnnounce().getWebhooks(); + Map webhooks = this.webhooks.getWebhooks(); for (Map.Entry e : webhooks.entrySet()) { if (e.getValue().isEnabled()) { @@ -95,11 +105,30 @@ public void announce(WebhookAnnouncer webhook) throws AnnounceException { context.getLogger().info("message: {}", message); if (!context.isDryrun()) { - ClientUtils.webhook(context.getLogger(), - webhook.getResolvedWebhook(), - webhook.getConnectTimeout(), - webhook.getReadTimeout(), - message); + fireAnnouncerEvent(ExecutionEvent.before(JReleaserCommand.ANNOUNCE.toStep()), webhook); + + try { + ClientUtils.webhook(context.getLogger(), + webhook.getResolvedWebhook(), + webhook.getConnectTimeout(), + webhook.getReadTimeout(), + message); + + fireAnnouncerEvent(ExecutionEvent.success(JReleaserCommand.ANNOUNCE.toStep()), webhook); + } catch (RuntimeException e) { + fireAnnouncerEvent(ExecutionEvent.failure(JReleaserCommand.ANNOUNCE.toStep(), e), webhook); + + throw e; + } + } + } + + private void fireAnnouncerEvent(ExecutionEvent event, WebhookAnnouncer webhook) { + try { + context.fireAnnounceStepEvent(event, webhook.asImmutable()); + } catch (WorkflowListenerException e) { + context.getLogger().error(RB.$("listener.failure", e.getListener().getClass().getName())); + context.getLogger().trace(e); } } } diff --git a/sdks/jreleaser-zulip-java-sdk/src/main/java/org/jreleaser/sdk/zulip/ZulipAnnouncer.java b/sdks/jreleaser-zulip-java-sdk/src/main/java/org/jreleaser/sdk/zulip/ZulipAnnouncer.java index 81e816712..6ada6be1a 100644 --- a/sdks/jreleaser-zulip-java-sdk/src/main/java/org/jreleaser/sdk/zulip/ZulipAnnouncer.java +++ b/sdks/jreleaser-zulip-java-sdk/src/main/java/org/jreleaser/sdk/zulip/ZulipAnnouncer.java @@ -33,11 +33,18 @@ * @since 0.1.0 */ @org.jreleaser.infra.nativeimage.annotations.NativeImage -public class ZulipAnnouncer implements Announcer { +public class ZulipAnnouncer implements Announcer { private final JReleaserContext context; + private final org.jreleaser.model.internal.announce.ZulipAnnouncer zulip; - ZulipAnnouncer(JReleaserContext context) { + public ZulipAnnouncer(JReleaserContext context) { this.context = context; + this.zulip = context.getModel().getAnnounce().getZulip(); + } + + @Override + public org.jreleaser.model.api.announce.ZulipAnnouncer getAnnouncer() { + return zulip.asImmutable(); } @Override @@ -47,13 +54,11 @@ public String getName() { @Override public boolean isEnabled() { - return context.getModel().getAnnounce().getZulip().isEnabled(); + return zulip.isEnabled(); } @Override public void announce() throws AnnounceException { - org.jreleaser.model.internal.announce.ZulipAnnouncer zulip = context.getModel().getAnnounce().getZulip(); - String message = ""; if (isNotBlank(zulip.getMessage())) { message = zulip.getResolvedMessage(context);