diff --git a/core/jreleaser-model/src/main/java/org/jreleaser/model/AbstractTool.java b/core/jreleaser-model/src/main/java/org/jreleaser/model/AbstractTool.java index d01d1231b..35bf93ba1 100644 --- a/core/jreleaser-model/src/main/java/org/jreleaser/model/AbstractTool.java +++ b/core/jreleaser-model/src/main/java/org/jreleaser/model/AbstractTool.java @@ -17,6 +17,8 @@ */ package org.jreleaser.model; +import org.jreleaser.util.FileType; + import java.util.Collections; import java.util.LinkedHashMap; import java.util.LinkedHashSet; @@ -60,7 +62,7 @@ public boolean isFailed() { @Override public Set getSupportedExtensions() { Set set = new LinkedHashSet<>(); - set.add(".zip"); + set.add(FileType.ZIP.extension()); return set; } diff --git a/core/jreleaser-model/src/main/java/org/jreleaser/model/AbstractUploader.java b/core/jreleaser-model/src/main/java/org/jreleaser/model/AbstractUploader.java index 55f583f7d..a473ef394 100644 --- a/core/jreleaser-model/src/main/java/org/jreleaser/model/AbstractUploader.java +++ b/core/jreleaser-model/src/main/java/org/jreleaser/model/AbstractUploader.java @@ -17,13 +17,13 @@ */ package org.jreleaser.model; +import org.jreleaser.util.FileType; + import java.util.Arrays; import java.util.Collections; import java.util.LinkedHashMap; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; -import java.util.Set; import static org.jreleaser.util.Constants.KEY_ARTIFACT_ARCHIVE_FORMAT; import static org.jreleaser.util.Constants.KEY_ARTIFACT_FILE_NAME; @@ -255,27 +255,11 @@ public Map artifactProps(JReleaserContext context, Artifact arti .filter(k -> !k.startsWith("artifactSkip")) .forEach(k -> props.put(k, artifactProps.get(k))); String artifactFileName = artifact.getEffectivePath(context).getFileName().toString(); - String filename = getFilename(artifactFileName, getSupportedExtensions()); + String filename = getFilename(artifactFileName, FileType.getSupportedExtensions()); props.put(KEY_ARTIFACT_PLATFORM, platform); props.put(KEY_ARTIFACT_FILE_NAME, artifactFileName); props.put(KEY_ARTIFACT_NAME, filename); props.put(KEY_ARTIFACT_ARCHIVE_FORMAT, artifactFileName.substring(filename.length()) + 1); return props; } - - private Set getSupportedExtensions() { - Set set = new LinkedHashSet<>(); - set.add(".tar.bz2"); - set.add(".tar.gz"); - set.add(".tgz"); - set.add(".tar"); - set.add(".zip"); - set.add(".rpm"); - set.add(".dep"); - set.add(".pkg"); - set.add(".dmg"); - set.add(".exe"); - set.add(".msi"); - return set; - } } diff --git a/core/jreleaser-model/src/main/java/org/jreleaser/model/Artifactory.java b/core/jreleaser-model/src/main/java/org/jreleaser/model/Artifactory.java index 148f58af9..001e3b43e 100644 --- a/core/jreleaser-model/src/main/java/org/jreleaser/model/Artifactory.java +++ b/core/jreleaser-model/src/main/java/org/jreleaser/model/Artifactory.java @@ -17,10 +17,16 @@ */ package org.jreleaser.model; +import org.jreleaser.model.util.Templates; import org.jreleaser.util.Env; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; +import java.util.Optional; +import static java.util.stream.Collectors.toList; import static org.jreleaser.util.Constants.HIDE; import static org.jreleaser.util.Constants.UNSET; import static org.jreleaser.util.StringUtils.isNotBlank; @@ -29,9 +35,12 @@ * @author Andres Almiray * @since 0.3.0 */ -public class Artifactory extends AbstractHttpUploader { +public class Artifactory extends AbstractUploader { public static final String TYPE = "artifactory"; + private final List repositories = new ArrayList<>(); + + private String host; private String username; private String password; private HttpUploader.Authorization authorization; @@ -42,19 +51,25 @@ public Artifactory() { void setAll(Artifactory artifactory) { super.setAll(artifactory); + this.host = artifactory.host; this.username = artifactory.username; this.password = artifactory.password; this.authorization = artifactory.authorization; + setRepositories(artifactory.repositories); } - public Authorization resolveAuthorization() { + public HttpUploader.Authorization resolveAuthorization() { if (null == authorization) { - authorization = Authorization.BEARER; + authorization = HttpUploader.Authorization.BEARER; } return authorization; } + public String getResolvedHost() { + return Env.resolve("ARTIFACTORY_" + Env.toVar(name) + "_HOST", host); + } + public String getResolvedUsername() { return Env.resolve("ARTIFACTORY_" + Env.toVar(name) + "_USERNAME", username); } @@ -63,6 +78,14 @@ public String getResolvedPassword() { return Env.resolve("ARTIFACTORY_" + Env.toVar(name) + "_PASSWORD", password); } + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } + public String getUsername() { return username; } @@ -79,34 +102,69 @@ public void setPassword(String password) { this.password = password; } - @Deprecated - public String getTarget() { - System.out.println("artifactory.target has been deprecated since 0.6.0 and will be removed in the future. Use artifactory.uploadUrl instead"); - return getUploadUrl(); + public HttpUploader.Authorization getAuthorization() { + return authorization; } - @Deprecated - public void setTarget(String target) { - System.out.println("artifactory.target has been deprecated since 0.6.0 and will be removed in the future. Use artifactory.uploadUrl instead"); - setUploadUrl(target); + public void setAuthorization(HttpUploader.Authorization authorization) { + this.authorization = authorization; } - public Authorization getAuthorization() { - return authorization; + public void setAuthorization(String authorization) { + this.authorization = HttpUploader.Authorization.of(authorization); } - public void setAuthorization(Authorization authorization) { - this.authorization = authorization; + public List getRepositories() { + return repositories; } - public void setAuthorization(String authorization) { - this.authorization = Authorization.of(authorization); + public void setRepositories(List repositories) { + this.repositories.clear(); + this.repositories.addAll(repositories); + } + + public void addRepository(ArtifactoryRepository repository) { + if (null != repository) { + this.repositories.add(repository); + } } @Override protected void asMap(Map props, boolean full) { props.put("authorization", authorization); + props.put("host", getResolvedHost()); props.put("username", isNotBlank(getResolvedUsername()) ? HIDE : UNSET); props.put("password", isNotBlank(getResolvedPassword()) ? HIDE : UNSET); + List> repositories = this.repositories.stream() + .filter(d -> full || d.isEnabled()) + .map(d -> d.asMap(full)) + .collect(toList()); + if (!repositories.isEmpty()) props.put("repositories", repositories); + } + + @Override + public String getResolvedDownloadUrl(JReleaserContext context, Artifact artifact) { + return resolveUrl(context, artifact); + } + + public String getResolvedUploadUrl(JReleaserContext context, Artifact artifact) { + return resolveUrl(context, artifact); + } + + private String resolveUrl(JReleaserContext context, Artifact artifact) { + Map p = new LinkedHashMap<>(artifactProps(context, artifact)); + p.put("artifactoryHost", host); + + Optional repository = repositories.stream() + .filter(r -> r.handles(artifact)) + .findFirst(); + + if (repository.isPresent()) { + p.put("repositoryPath", repository.get().getPath()); + String url = "{{artifactoryHost}}/{{repositoryPath}}"; + return Templates.resolve(url, p); + } + + return ""; } } diff --git a/core/jreleaser-model/src/main/java/org/jreleaser/model/ArtifactoryRepository.java b/core/jreleaser-model/src/main/java/org/jreleaser/model/ArtifactoryRepository.java new file mode 100644 index 000000000..c06337b57 --- /dev/null +++ b/core/jreleaser-model/src/main/java/org/jreleaser/model/ArtifactoryRepository.java @@ -0,0 +1,128 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright 2020-2021 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.model; + +import org.jreleaser.util.FileType; + +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Set; + +import static org.jreleaser.util.StringUtils.getFilename; + +/** + * @author Andres Almiray + * @since 0.10.0 + */ +public class ArtifactoryRepository implements Domain, Activatable { + private final Set fileTypes = new LinkedHashSet<>(); + + private Active active; + private boolean enabled; + private String path; + + void setAll(ArtifactoryRepository repository) { + this.active = repository.active; + this.enabled = repository.enabled; + this.path = repository.path; + setFileTypes(repository.fileTypes); + } + + @Override + public boolean isEnabled() { + return enabled; + } + + @Override + public void disable() { + active = Active.NEVER; + enabled = false; + } + + public boolean resolveEnabled(Project project) { + if (null == active) { + active = Active.RELEASE; + } + enabled = active.check(project); + return enabled; + } + + @Override + public Active getActive() { + return active; + } + + @Override + public void setActive(Active active) { + this.active = active; + } + + @Override + public void setActive(String str) { + this.active = Active.of(str); + } + + @Override + public boolean isActiveSet() { + return active != null; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public Set getFileTypes() { + return fileTypes; + } + + public void setFileTypes(Set fileTypes) { + this.fileTypes.clear(); + this.fileTypes.addAll(fileTypes); + } + + public void addFileType(FileType fileType) { + this.fileTypes.add(fileType); + } + + @Override + public Map asMap(boolean full) { + Map map = new LinkedHashMap<>(); + map.put("enabled", isEnabled()); + map.put("active", active); + map.put("path", path); + map.put("fileTypes", fileTypes); + return map; + } + + public boolean handles(Artifact artifact) { + if (!enabled) return false; + if (fileTypes.isEmpty()) return true; + + String artifactFileName = artifact.getResolvedPath().getFileName().toString(); + String artifactName = getFilename(artifactFileName, FileType.getSupportedExtensions()); + String archiveFormat = artifactFileName.substring(artifactName.length() + 1); + FileType fileType = FileType.of(archiveFormat); + + return fileTypes.contains(fileType); + } +} diff --git a/core/jreleaser-model/src/main/java/org/jreleaser/model/Brew.java b/core/jreleaser-model/src/main/java/org/jreleaser/model/Brew.java index 46f4c2e6b..65137247e 100644 --- a/core/jreleaser-model/src/main/java/org/jreleaser/model/Brew.java +++ b/core/jreleaser-model/src/main/java/org/jreleaser/model/Brew.java @@ -17,6 +17,7 @@ */ package org.jreleaser.model; +import org.jreleaser.util.FileType; import org.jreleaser.util.PlatformUtils; import java.util.ArrayList; @@ -198,12 +199,12 @@ public boolean supportsPlatform(String platform) { @Override public Set getSupportedExtensions() { - Set extensions = new LinkedHashSet<>(); - extensions.add(".dmg"); - extensions.add(".pkg"); - extensions.add(".zip"); - extensions.add(".jar"); - return extensions; + Set set = new LinkedHashSet<>(); + set.add(FileType.DMG.extension()); + set.add(FileType.PKG.extension()); + set.add(FileType.ZIP.extension()); + set.add(FileType.JAR.extension()); + return set; } public static class Dependency { diff --git a/core/jreleaser-model/src/main/java/org/jreleaser/model/Docker.java b/core/jreleaser-model/src/main/java/org/jreleaser/model/Docker.java index dc3eb246a..4d882f69d 100644 --- a/core/jreleaser-model/src/main/java/org/jreleaser/model/Docker.java +++ b/core/jreleaser-model/src/main/java/org/jreleaser/model/Docker.java @@ -17,6 +17,7 @@ */ package org.jreleaser.model; +import org.jreleaser.util.FileType; import org.jreleaser.util.PlatformUtils; import java.util.Collections; @@ -107,10 +108,10 @@ public void setCommitAuthor(CommitAuthor commitAuthor) { @Override public Set getSupportedExtensions() { - Set extensions = new LinkedHashSet<>(); - extensions.add(".zip"); - extensions.add(".jar"); - return extensions; + Set set = new LinkedHashSet<>(); + set.add(FileType.JAR.extension()); + set.add(FileType.ZIP.extension()); + return set; } public List getActiveSpecs() { diff --git a/core/jreleaser-model/src/main/java/org/jreleaser/model/JReleaserContext.java b/core/jreleaser-model/src/main/java/org/jreleaser/model/JReleaserContext.java index df0e680d7..41e4a6286 100644 --- a/core/jreleaser-model/src/main/java/org/jreleaser/model/JReleaserContext.java +++ b/core/jreleaser-model/src/main/java/org/jreleaser/model/JReleaserContext.java @@ -185,6 +185,10 @@ public Errors validateModel() { errors.configuration(e.toString()); } + if (errors.hasWarnings()) { + logger.warn("== JReleaser =="); + errors.logWarnings(logger); + } if (errors.hasErrors()) { logger.error("== JReleaser =="); errors.logErrors(logger); diff --git a/core/jreleaser-model/src/main/java/org/jreleaser/model/Scoop.java b/core/jreleaser-model/src/main/java/org/jreleaser/model/Scoop.java index 5a7a2ed6f..7a00efe3d 100644 --- a/core/jreleaser-model/src/main/java/org/jreleaser/model/Scoop.java +++ b/core/jreleaser-model/src/main/java/org/jreleaser/model/Scoop.java @@ -17,6 +17,7 @@ */ package org.jreleaser.model; +import org.jreleaser.util.FileType; import org.jreleaser.util.PlatformUtils; import java.util.Map; @@ -89,8 +90,8 @@ public boolean supportsPlatform(String platform) { @Override public Set getSupportedExtensions() { - Set extensions = super.getSupportedExtensions(); - extensions.add(".jar"); - return extensions; + Set set = super.getSupportedExtensions(); + set.add(FileType.JAR.extension()); + return set; } } diff --git a/core/jreleaser-model/src/main/java/org/jreleaser/model/Sdkman.java b/core/jreleaser-model/src/main/java/org/jreleaser/model/Sdkman.java index b0eab9434..4bf0ecb9a 100644 --- a/core/jreleaser-model/src/main/java/org/jreleaser/model/Sdkman.java +++ b/core/jreleaser-model/src/main/java/org/jreleaser/model/Sdkman.java @@ -18,6 +18,7 @@ package org.jreleaser.model; import org.jreleaser.util.Env; +import org.jreleaser.util.FileType; import java.util.LinkedHashSet; import java.util.Map; @@ -159,7 +160,7 @@ protected void asMap(boolean full, Map props) { @Override public Set getSupportedExtensions() { Set set = new LinkedHashSet<>(); - set.add(".zip"); + set.add(FileType.ZIP.extension()); return set; } diff --git a/core/jreleaser-model/src/main/java/org/jreleaser/model/Snap.java b/core/jreleaser-model/src/main/java/org/jreleaser/model/Snap.java index 5afcd0108..3189328b9 100644 --- a/core/jreleaser-model/src/main/java/org/jreleaser/model/Snap.java +++ b/core/jreleaser-model/src/main/java/org/jreleaser/model/Snap.java @@ -17,6 +17,7 @@ */ package org.jreleaser.model; +import org.jreleaser.util.FileType; import org.jreleaser.util.PlatformUtils; import java.util.ArrayList; @@ -54,10 +55,10 @@ public Snap() { @Override public Set getSupportedExtensions() { Set set = new LinkedHashSet<>(); - set.add(".tar.bz2"); - set.add(".tar.gz"); - set.add(".tgz"); - set.add(".tar"); + set.add(FileType.TAR_BZ2.extension()); + set.add(FileType.TAR_GZ.extension()); + set.add(FileType.TGZ.extension()); + set.add(FileType.TAR.extension()); return set; } diff --git a/core/jreleaser-model/src/main/java/org/jreleaser/model/Spec.java b/core/jreleaser-model/src/main/java/org/jreleaser/model/Spec.java index f167ad660..bdc9a5f17 100644 --- a/core/jreleaser-model/src/main/java/org/jreleaser/model/Spec.java +++ b/core/jreleaser-model/src/main/java/org/jreleaser/model/Spec.java @@ -17,6 +17,8 @@ */ package org.jreleaser.model; +import org.jreleaser.util.FileType; + import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; @@ -100,10 +102,10 @@ public boolean supportsDistribution(Distribution distribution) { @Override public Set getSupportedExtensions() { Set set = new LinkedHashSet<>(); - set.add(".tar.bz2"); - set.add(".tar.gz"); - set.add(".tgz"); - set.add(".tar"); + set.add(FileType.TAR_BZ2.extension()); + set.add(FileType.TAR_GZ.extension()); + set.add(FileType.TGZ.extension()); + set.add(FileType.TAR.extension()); return set; } } diff --git a/core/jreleaser-model/src/main/java/org/jreleaser/model/validation/ArtifactoryValidator.java b/core/jreleaser-model/src/main/java/org/jreleaser/model/validation/ArtifactoryValidator.java index 5772dffc8..ec799f457 100644 --- a/core/jreleaser-model/src/main/java/org/jreleaser/model/validation/ArtifactoryValidator.java +++ b/core/jreleaser-model/src/main/java/org/jreleaser/model/validation/ArtifactoryValidator.java @@ -20,14 +20,13 @@ import org.jreleaser.bundle.RB; import org.jreleaser.model.Active; import org.jreleaser.model.Artifactory; +import org.jreleaser.model.ArtifactoryRepository; import org.jreleaser.model.JReleaserContext; import org.jreleaser.util.Env; import org.jreleaser.util.Errors; import java.util.Map; -import static org.jreleaser.util.StringUtils.isBlank; - /** * @author Andres Almiray * @since 0.3.0 @@ -58,13 +57,18 @@ private static void validateArtifactory(JReleaserContext context, JReleaserConte return; } - if (isBlank(artifactory.getUploadUrl())) { - errors.configuration(RB.$("validation_must_not_be_blank", "artifactory." + artifactory.getName() + ".uploadUrl")); - } - if (isBlank(artifactory.getDownloadUrl())) { - artifactory.setDownloadUrl(artifactory.getUploadUrl()); + if (artifactory.getRepositories().isEmpty()) { + errors.configuration(RB.$("validation_artifactory_no_repositories", "artifactory." + artifactory.getName())); + return; } + artifactory.setHost( + checkProperty(context, + "ARTIFACTORY_" + Env.toVar(artifactory.getName()) + "_HOST", + "artifactory.host", + artifactory.getHost(), + errors)); + switch (artifactory.resolveAuthorization()) { case BEARER: artifactory.setPassword( @@ -98,5 +102,17 @@ private static void validateArtifactory(JReleaserContext context, JReleaserConte } validateTimeout(artifactory); + + for (ArtifactoryRepository repository : artifactory.getRepositories()) { + if (!repository.isActiveSet()) { + repository.setActive(artifactory.getActive()); + } + repository.resolveEnabled(context.getModel().getProject()); + } + + if (artifactory.getRepositories().stream().noneMatch(ArtifactoryRepository::isEnabled)) { + errors.warning(RB.$("validation_artifactory_disabled_repositories", "artifactory." + artifactory.getName())); + artifactory.disable(); + } } } diff --git a/core/jreleaser-utils/src/main/java/org/jreleaser/util/Errors.java b/core/jreleaser-utils/src/main/java/org/jreleaser/util/Errors.java index a2760691e..39f0b8bea 100644 --- a/core/jreleaser-utils/src/main/java/org/jreleaser/util/Errors.java +++ b/core/jreleaser-utils/src/main/java/org/jreleaser/util/Errors.java @@ -30,6 +30,7 @@ public class Errors { private final Set assemblyErrors = new LinkedHashSet<>(); private final Set configurationErrors = new LinkedHashSet<>(); + private final Set warnings = new LinkedHashSet<>(); public boolean hasErrors() { return !assemblyErrors.isEmpty() || !configurationErrors.isEmpty(); @@ -43,6 +44,10 @@ public boolean hasConfigurationErrors() { return !configurationErrors.isEmpty(); } + public boolean hasWarnings() { + return !warnings.isEmpty(); + } + public void assembly(String message) { assemblyErrors.add(new Error(Kind.ASSEMBLY, message)); } @@ -51,6 +56,18 @@ public void configuration(String message) { configurationErrors.add(new Error(Kind.CONFIGURATION, message)); } + public void warning(String message) { + warnings.add(new Error(Kind.CONFIGURATION, message)); + } + + public void logWarnings(JReleaserLogger logger) { + warnings.forEach(e -> logger.warn(e.message)); + } + + public void logWarnings(PrintWriter writer) { + warnings.forEach(e -> writer.println(e.message)); + } + public void logErrors(JReleaserLogger logger) { assemblyErrors.forEach(e -> logger.error(e.message)); configurationErrors.forEach(e -> logger.error(e.message)); @@ -69,7 +86,8 @@ public String asString() { public enum Kind { ASSEMBLY, - CONFIGURATION + CONFIGURATION, + WARNING } public static class Error { diff --git a/core/jreleaser-utils/src/main/java/org/jreleaser/util/FileType.java b/core/jreleaser-utils/src/main/java/org/jreleaser/util/FileType.java new file mode 100644 index 000000000..d83166c8c --- /dev/null +++ b/core/jreleaser-utils/src/main/java/org/jreleaser/util/FileType.java @@ -0,0 +1,84 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright 2020-2021 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.util; + +import java.util.LinkedHashSet; +import java.util.Set; + +import static org.jreleaser.util.StringUtils.isBlank; + +/** + * @author Andres Almiray + * @since 0.10.0 + */ +public enum FileType { + DEB("deb"), + DMG("dmg"), + EXE("exe"), + JAR("jar"), + MSI("msi"), + NUGET("nuget"), + PKG("pkg"), + RPM("rpm"), + TAR("tar"), + TAR_BZ2("tar.bz2"), + TAR_GZ("tar.gz"), + TGZ("tgz"), + ZIP("zip"); + + private final String type; + + FileType(String type) { + this.type = type; + } + + public String type() { + return this.type; + } + + public String extension() { + return "." + this.type; + } + + @Override + public String toString() { + return type(); + } + + public static FileType of(String str) { + if (isBlank(str)) return null; + return FileType.valueOf(str.toUpperCase().trim() + .replace(".", "_")); + } + + public static Set getSupportedTypes() { + Set set = new LinkedHashSet<>(); + for (FileType value : values()) { + set.add(value.type()); + } + return set; + } + + public static Set getSupportedExtensions() { + Set set = new LinkedHashSet<>(); + for (FileType value : values()) { + set.add(value.extension()); + } + return set; + } +} \ No newline at end of file diff --git a/core/jreleaser-utils/src/main/resources/org/jreleaser/bundle/Messages.properties b/core/jreleaser-utils/src/main/resources/org/jreleaser/bundle/Messages.properties index fb5ea376e..396b3e0c1 100644 --- a/core/jreleaser-utils/src/main/resources/org/jreleaser/bundle/Messages.properties +++ b/core/jreleaser-utils/src/main/resources/org/jreleaser/bundle/Messages.properties @@ -216,6 +216,8 @@ ERROR_artifacts_glob_resolution = Some globs failed to be resolved ERROR_artifacts_unexpected_error_globs = Unexpected error when resolving globs ERROR_artifacts_unexpected_error_path = Unexpected error visiting path {} +validation_artifactory_disabled_repositories = {} has no active repositories +validation_artifactory_no_repositories = {} has not defined any repositories validation_must_define_pattern = {} must define a pattern validation_version_format_missing = {} must define a format such as {}: validation_must_not_be_blank = {} must not be blank diff --git a/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/dsl/Artifactory.groovy b/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/dsl/Artifactory.groovy index b425711f9..f693e95ba 100644 --- a/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/dsl/Artifactory.groovy +++ b/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/dsl/Artifactory.groovy @@ -18,6 +18,7 @@ package org.jreleaser.gradle.plugin.dsl import groovy.transform.CompileStatic +import org.gradle.api.Action import org.gradle.api.provider.Property /** @@ -27,7 +28,7 @@ import org.gradle.api.provider.Property */ @CompileStatic interface Artifactory extends HttpUploader { - Property getTarget() + Property getHost() Property getUsername() @@ -36,4 +37,8 @@ interface Artifactory extends HttpUploader { Property getAuthorization() void setAuthorization(String authorization) + + void repository(Action action) + + void repository(@DelegatesTo(strategy = Closure.DELEGATE_FIRST, value = ArtifactoryRepository) Closure action) } \ No newline at end of file diff --git a/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/dsl/ArtifactoryRepository.groovy b/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/dsl/ArtifactoryRepository.groovy new file mode 100644 index 000000000..e695691d7 --- /dev/null +++ b/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/dsl/ArtifactoryRepository.groovy @@ -0,0 +1,37 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright 2020-2021 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.gradle.plugin.dsl + +import groovy.transform.CompileStatic +import org.gradle.api.provider.Property +import org.gradle.api.provider.SetProperty +import org.jreleaser.util.FileType + +/** + * + * @author Andres Almiray + * @since 0.10.0 + */ +@CompileStatic +interface ArtifactoryRepository extends Activatable { + Property getPath() + + SetProperty getFileTypes() + + void setFileType(String str) +} \ No newline at end of file diff --git a/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/internal/dsl/ArtifactoryImpl.groovy b/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/internal/dsl/ArtifactoryImpl.groovy index 2a544c139..1d8888d49 100644 --- a/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/internal/dsl/ArtifactoryImpl.groovy +++ b/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/internal/dsl/ArtifactoryImpl.groovy @@ -18,12 +18,17 @@ package org.jreleaser.gradle.plugin.internal.dsl import groovy.transform.CompileStatic +import org.gradle.api.Action +import org.gradle.api.NamedDomainObjectContainer +import org.gradle.api.NamedDomainObjectFactory import org.gradle.api.internal.provider.Providers import org.gradle.api.model.ObjectFactory import org.gradle.api.provider.Property import org.gradle.api.tasks.Internal import org.jreleaser.gradle.plugin.dsl.Artifactory +import org.jreleaser.gradle.plugin.dsl.ArtifactoryRepository import org.jreleaser.model.HttpUploader +import org.kordamp.gradle.util.ConfigureUtil import javax.inject.Inject @@ -35,25 +40,36 @@ import javax.inject.Inject @CompileStatic class ArtifactoryImpl extends AbstractHttpUploader implements Artifactory { String name - final Property target + final Property host final Property username final Property password final Property authorization + final NamedDomainObjectContainer repositories + @Inject ArtifactoryImpl(ObjectFactory objects) { super(objects) - target = objects.property(String).convention(Providers.notDefined()) + host = objects.property(String).convention(Providers.notDefined()) username = objects.property(String).convention(Providers.notDefined()) password = objects.property(String).convention(Providers.notDefined()) authorization = objects.property(HttpUploader.Authorization).convention(Providers.notDefined()) + + repositories = objects.domainObjectContainer(ArtifactoryRepositoryImpl, new NamedDomainObjectFactory() { + @Override + ArtifactoryRepositoryImpl create(String name) { + ArtifactoryRepositoryImpl repository = objects.newInstance(ArtifactoryRepositoryImpl, objects) + repository.name = name + repository + } + }) } @Override @Internal boolean isSet() { super.isSet() || - target.present || + host.present || username.present || password.present || authorization.present @@ -64,14 +80,27 @@ class ArtifactoryImpl extends AbstractHttpUploader implements Artifactory { this.authorization.set(HttpUploader.Authorization.of(authorization)) } + @Override + void repository(Action action) { + action.execute(repositories.maybeCreate("repository-${repositories.size()}".toString())) + } + + @Override + void repository(@DelegatesTo(strategy = Closure.DELEGATE_FIRST, value = ArtifactoryRepository) Closure action) { + ConfigureUtil.configure(action, repositories.maybeCreate("repository-${repositories.size()}".toString())) + } + org.jreleaser.model.Artifactory toModel() { org.jreleaser.model.Artifactory artifactory = new org.jreleaser.model.Artifactory() artifactory.name = name - if (target.present) artifactory.target = target.get() fillProperties(artifactory) + if (host.present) artifactory.host = host.get() if (username.present) artifactory.username = username.get() if (password.present) artifactory.password = password.get() if (authorization.present) artifactory.authorization = authorization.get() + for (ArtifactoryRepositoryImpl repository : repositories) { + artifactory.addRepository(repository.toModel()) + } artifactory } } diff --git a/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/internal/dsl/ArtifactoryRepositoryImpl.groovy b/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/internal/dsl/ArtifactoryRepositoryImpl.groovy new file mode 100644 index 000000000..4d6c7de2e --- /dev/null +++ b/plugins/jreleaser-gradle-plugin/src/main/groovy/org/jreleaser/gradle/plugin/internal/dsl/ArtifactoryRepositoryImpl.groovy @@ -0,0 +1,73 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright 2020-2021 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.gradle.plugin.internal.dsl + +import groovy.transform.CompileStatic +import org.gradle.api.internal.provider.Providers +import org.gradle.api.model.ObjectFactory +import org.gradle.api.provider.Property +import org.gradle.api.provider.SetProperty +import org.jreleaser.gradle.plugin.dsl.ArtifactoryRepository +import org.jreleaser.model.Active +import org.jreleaser.util.FileType + +import javax.inject.Inject + +import static org.jreleaser.util.StringUtils.isNotBlank + +/** + * + * @author Andres Almiray + * @since 0.10.0 + */ +@CompileStatic +class ArtifactoryRepositoryImpl implements ArtifactoryRepository { + String name + final Property active + final Property path + final SetProperty fileTypes + + @Inject + ArtifactoryRepositoryImpl(ObjectFactory objects) { + active = objects.property(Active).convention(Providers.notDefined()) + path = objects.property(String).convention(Providers.notDefined()) + fileTypes = objects.setProperty(FileType).convention(Providers.notDefined()) + } + + @Override + void setActive(String str) { + if (isNotBlank(str)) { + active.set(Active.of(str.trim())) + } + } + + @Override + void setFileType(String str) { + if (isNotBlank(str)) { + fileTypes.add(FileType.of(str.trim())) + } + } + + org.jreleaser.model.ArtifactoryRepository toModel() { + org.jreleaser.model.ArtifactoryRepository repository = new org.jreleaser.model.ArtifactoryRepository() + if (active.present) repository.active = active.get() + if (path.present) repository.path = path.get() + repository.fileTypes = (Set) fileTypes.getOrElse([] as Set) + repository + } +} diff --git a/plugins/jreleaser-maven-plugin/src/main/java/org/jreleaser/maven/plugin/Artifactory.java b/plugins/jreleaser-maven-plugin/src/main/java/org/jreleaser/maven/plugin/Artifactory.java index fe4b0ba8a..81fada538 100644 --- a/plugins/jreleaser-maven-plugin/src/main/java/org/jreleaser/maven/plugin/Artifactory.java +++ b/plugins/jreleaser-maven-plugin/src/main/java/org/jreleaser/maven/plugin/Artifactory.java @@ -17,17 +17,22 @@ */ package org.jreleaser.maven.plugin; +import java.util.ArrayList; +import java.util.List; + /** * @author Andres Almiray * @since 0.3.0 */ -public class Artifactory extends AbstractHttpUploader { +public class Artifactory extends AbstractUploader { public static final String NAME = "artifactory"; - private String target; + private final List repositories = new ArrayList<>(); + + private String host; private String username; private String password; - private Authorization authorization; + private HttpUploader.Authorization authorization; public Artifactory() { super(NAME); @@ -35,26 +40,27 @@ public Artifactory() { void setAll(Artifactory artifactory) { super.setAll(artifactory); - this.target = artifactory.target; + this.host = artifactory.host; this.username = artifactory.username; this.password = artifactory.password; this.authorization = artifactory.authorization; + setRepositories(artifactory.repositories); } - public Authorization resolveAuthorization() { + public HttpUploader.Authorization resolveAuthorization() { if (null == authorization) { - authorization = Authorization.NONE; + authorization = HttpUploader.Authorization.NONE; } return authorization; } - public String getTarget() { - return target; + public String getHost() { + return host; } - public void setTarget(String target) { - this.target = target; + public void setHost(String host) { + this.host = host; } public String getUsername() { @@ -73,11 +79,20 @@ public void setPassword(String password) { this.password = password; } - public Authorization getAuthorization() { + public HttpUploader.Authorization getAuthorization() { return authorization; } - public void setAuthorization(Authorization authorization) { + public void setAuthorization(HttpUploader.Authorization authorization) { this.authorization = authorization; } + + public List getRepositories() { + return repositories; + } + + public void setRepositories(List repositories) { + this.repositories.clear(); + this.repositories.addAll(repositories); + } } diff --git a/plugins/jreleaser-maven-plugin/src/main/java/org/jreleaser/maven/plugin/ArtifactoryRepository.java b/plugins/jreleaser-maven-plugin/src/main/java/org/jreleaser/maven/plugin/ArtifactoryRepository.java new file mode 100644 index 000000000..39061a844 --- /dev/null +++ b/plugins/jreleaser-maven-plugin/src/main/java/org/jreleaser/maven/plugin/ArtifactoryRepository.java @@ -0,0 +1,78 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright 2020-2021 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.maven.plugin; + +import java.util.LinkedHashSet; +import java.util.Set; + +import static org.jreleaser.util.StringUtils.isNotBlank; + +/** + * @author Andres Almiray + * @since 0.10.0 + */ +public class ArtifactoryRepository implements Activatable { + private final Set fileTypes = new LinkedHashSet<>(); + + private Active active; + private String path; + + void setAll(ArtifactoryRepository repository) { + this.active = repository.active; + this.path = repository.path; + setFileTypes(repository.fileTypes); + } + + @Override + public Active getActive() { + return active; + } + + @Override + public void setActive(Active active) { + this.active = active; + } + + @Override + public String resolveActive() { + return active != null ? active.name() : null; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public Set getFileTypes() { + return fileTypes; + } + + public void setFileTypes(Set fileTypes) { + this.fileTypes.clear(); + this.fileTypes.addAll(fileTypes); + } + + public boolean isSet() { + return active != null || + isNotBlank(path) || + !fileTypes.isEmpty(); + } +} diff --git a/plugins/jreleaser-maven-plugin/src/main/java/org/jreleaser/maven/plugin/FileType.java b/plugins/jreleaser-maven-plugin/src/main/java/org/jreleaser/maven/plugin/FileType.java new file mode 100644 index 000000000..950968297 --- /dev/null +++ b/plugins/jreleaser-maven-plugin/src/main/java/org/jreleaser/maven/plugin/FileType.java @@ -0,0 +1,46 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright 2020-2021 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.maven.plugin; + +import static org.jreleaser.util.StringUtils.isBlank; + +/** + * @author Andres Almiray + * @since 0.10.0 + */ +public enum FileType { + DEB, + DMG, + EXE, + JAR, + MSI, + NUGET, + PKG, + RPM, + TAR, + TAR_BZ2, + TAR_GZ, + TGZ, + ZIP; + + public static FileType of(String str) { + if (isBlank(str)) return null; + return FileType.valueOf(str.toUpperCase().trim() + .replace(".", "_")); + } +} \ No newline at end of file diff --git a/plugins/jreleaser-maven-plugin/src/main/java/org/jreleaser/maven/plugin/internal/JReleaserModelConverter.java b/plugins/jreleaser-maven-plugin/src/main/java/org/jreleaser/maven/plugin/internal/JReleaserModelConverter.java index c6517a311..92507ae5c 100644 --- a/plugins/jreleaser-maven-plugin/src/main/java/org/jreleaser/maven/plugin/internal/JReleaserModelConverter.java +++ b/plugins/jreleaser-maven-plugin/src/main/java/org/jreleaser/maven/plugin/internal/JReleaserModelConverter.java @@ -23,6 +23,7 @@ import org.jreleaser.maven.plugin.Article; import org.jreleaser.maven.plugin.Artifact; import org.jreleaser.maven.plugin.Artifactory; +import org.jreleaser.maven.plugin.ArtifactoryRepository; import org.jreleaser.maven.plugin.Assemble; import org.jreleaser.maven.plugin.Brew; import org.jreleaser.maven.plugin.Bucket; @@ -42,6 +43,7 @@ import org.jreleaser.maven.plugin.DockerSpec; import org.jreleaser.maven.plugin.Environment; import org.jreleaser.maven.plugin.FileSet; +import org.jreleaser.maven.plugin.FileType; import org.jreleaser.maven.plugin.Files; import org.jreleaser.maven.plugin.GenericGit; import org.jreleaser.maven.plugin.GitService; @@ -435,13 +437,34 @@ private static Map convertArtifactory(M private static org.jreleaser.model.Artifactory convertArtifactory(Artifactory artifactory) { org.jreleaser.model.Artifactory a = new org.jreleaser.model.Artifactory(); convertUploader(artifactory, a); - if (isNotBlank(artifactory.getTarget())) a.setTarget(artifactory.getTarget()); + a.setHost(tr(artifactory.getHost())); a.setUsername(tr(artifactory.getUsername())); a.setPassword(tr(artifactory.getPassword())); a.setAuthorization(tr(artifactory.resolveAuthorization().name())); + a.setRepositories(convertRepositories(artifactory.getRepositories())); return a; } + private static List convertRepositories(List repositories) { + List list = new ArrayList<>(); + for (ArtifactoryRepository repository : repositories) { + if (repository.isSet()) { + list.add(convertRepository(repository)); + } + } + return list; + } + + private static org.jreleaser.model.ArtifactoryRepository convertRepository(ArtifactoryRepository repository) { + org.jreleaser.model.ArtifactoryRepository r = new org.jreleaser.model.ArtifactoryRepository(); + r.setActive(repository.resolveActive()); + r.setPath(tr(repository.getPath())); + for (FileType fileType : repository.getFileTypes()) { + r.addFileType(org.jreleaser.util.FileType.of(fileType.name())); + } + return r; + } + private static void convertUploader(Uploader from, org.jreleaser.model.Uploader into) { into.setName(tr(from.getName())); into.setActive(from.resolveActive());