diff --git a/plugin-development/src/main/java/org/spongepowered/gradle/plugin/config/PluginLinksConfiguration.java b/plugin-development/src/main/java/org/spongepowered/gradle/plugin/config/PluginLinksConfiguration.java index 74bacb1..374e48b 100644 --- a/plugin-development/src/main/java/org/spongepowered/gradle/plugin/config/PluginLinksConfiguration.java +++ b/plugin-development/src/main/java/org/spongepowered/gradle/plugin/config/PluginLinksConfiguration.java @@ -24,56 +24,96 @@ */ package org.spongepowered.gradle.plugin.config; +import org.gradle.api.GradleException; import org.gradle.api.model.ObjectFactory; import org.gradle.api.provider.Property; +import org.gradle.api.provider.Provider; import org.gradle.api.tasks.Input; +import org.gradle.api.tasks.Internal; import org.gradle.api.tasks.Optional; -import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; import java.net.URL; import javax.inject.Inject; public class PluginLinksConfiguration { - private final Property homepage; - private final Property source; - private final Property issues; + private final Property homepage; + private final Property source; + private final Property issues; + + private final Property legacyHomepage; + private final Property legacySource; + private final Property legacyIssues; @Inject public PluginLinksConfiguration(final ObjectFactory factory) { - this.homepage = factory.property(URL.class); - this.source = factory.property(URL.class); - this.issues = factory.property(URL.class); + this.legacyHomepage = factory.property(URL.class); + this.legacySource = factory.property(URL.class); + this.legacyIssues = factory.property(URL.class); + + this.homepage = factory.property(URI.class).convention(urlToUri(this.legacyHomepage)); + this.source = factory.property(URI.class).convention(urlToUri(this.legacySource)); + this.issues = factory.property(URI.class).convention(urlToUri(this.legacyIssues)); + } + + private Provider urlToUri(final Property url) { + return url.map(old -> { + try { + return old.toURI(); + } catch (final URISyntaxException ex) { + throw new GradleException("Failed to convert the provided URL to a URI, please set the URI directly", ex); + } + }); } @Input @Optional - public Property getHomepage() { + public Property getHomepageLink() { return this.homepage; } - public void homepage(final String homepage) throws MalformedURLException { - this.homepage.set(new URL(homepage)); + @Deprecated + @Internal + public Property getHomepage() { + return this.legacyHomepage; + } + + public void homepage(final String homepage) throws URISyntaxException { + this.homepage.set(new URI(homepage)); } @Input @Optional - public Property getSource() { + public Property getSourceLink() { return this.source; } - public void source(final String source) throws MalformedURLException { - this.source.set(new URL(source)); + @Internal + @Deprecated + public Property getSource() { + return this.legacySource; + } + + public void source(final String source) throws URISyntaxException { + this.source.set(new URI(source)); } @Input @Optional - public Property getIssues() { + public Property getIssuesLink() { return this.issues; } - public void issues(final String issues) throws MalformedURLException { - this.issues.set(new URL(issues)); + @Deprecated + @Internal + public Property getIssues() { + return this.legacyIssues; + } + + public void issues(final String issues) throws URISyntaxException { + this.issues.set(new URI(issues)); } } diff --git a/plugin-development/src/main/java/org/spongepowered/gradle/plugin/task/WritePluginMetadataTask.java b/plugin-development/src/main/java/org/spongepowered/gradle/plugin/task/WritePluginMetadataTask.java index ba4cba2..7e1277f 100644 --- a/plugin-development/src/main/java/org/spongepowered/gradle/plugin/task/WritePluginMetadataTask.java +++ b/plugin-development/src/main/java/org/spongepowered/gradle/plugin/task/WritePluginMetadataTask.java @@ -27,6 +27,7 @@ import com.google.gson.Gson; import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException; import org.gradle.api.DefaultTask; +import org.gradle.api.GradleException; import org.gradle.api.InvalidUserDataException; import org.gradle.api.file.DirectoryProperty; import org.gradle.api.provider.Property; @@ -54,6 +55,7 @@ import org.spongepowered.plugin.metadata.builtin.model.StandardPluginLinks; import java.io.IOException; +import java.net.MalformedURLException; import java.nio.file.Files; import java.nio.file.Path; @@ -122,16 +124,20 @@ private > T populateBuilder( final StandardPluginLinks.Builder linksBuilder = StandardPluginLinks.builder(); final PluginLinksConfiguration linksConfiguration = src.getLinks(); - if (linksConfiguration.getHomepage().isPresent()) { - linksBuilder.homepage(linksConfiguration.getHomepage().get()); - } - if (linksConfiguration.getSource().isPresent()) { - linksBuilder.source(linksConfiguration.getSource().get()); - } - if (linksConfiguration.getIssues().isPresent()) { - linksBuilder.issues(linksConfiguration.getIssues().get()); + try { + if (linksConfiguration.getHomepageLink().isPresent()) { + linksBuilder.homepage(linksConfiguration.getHomepageLink().get().toURL()); + } + if (linksConfiguration.getSourceLink().isPresent()) { + linksBuilder.source(linksConfiguration.getSourceLink().get().toURL()); + } + if (linksConfiguration.getIssuesLink().isPresent()) { + linksBuilder.issues(linksConfiguration.getIssuesLink().get().toURL()); + } + builder.links(linksBuilder.build()); + } catch (final MalformedURLException ex) { + throw new GradleException("Failed to convert URIs back to URLs for writing to plugin meta file"); } - builder.links(linksBuilder.build()); // TODO: validate paths here? final StandardPluginBranding.Builder brandingBuilder = StandardPluginBranding.builder();