diff --git a/build-extensions/src/main/kotlin/eu/cloudnetservice/cloudnet/gradle/plugins/CloudNetModulesPlugin.kt b/build-extensions/src/main/kotlin/eu/cloudnetservice/cloudnet/gradle/plugins/CloudNetModulesPlugin.kt index 2c772d4228..7480870fd9 100644 --- a/build-extensions/src/main/kotlin/eu/cloudnetservice/cloudnet/gradle/plugins/CloudNetModulesPlugin.kt +++ b/build-extensions/src/main/kotlin/eu/cloudnetservice/cloudnet/gradle/plugins/CloudNetModulesPlugin.kt @@ -19,10 +19,12 @@ package eu.cloudnetservice.cloudnet.gradle.plugins import com.github.jengelman.gradle.plugins.shadow.ShadowJavaPlugin import eu.cloudnetservice.cloudnet.gradle.tasks.PrepareUpdaterDataTask import eu.cloudnetservice.cloudnet.gradle.util.UpdaterMeta +import eu.cloudnetservice.cloudnet.gradle.util.sourceSets import eu.cloudnetservice.gradle.juppiter.GenerateModuleJson import eu.cloudnetservice.gradle.juppiter.JuppiterPlugin import org.gradle.api.Plugin import org.gradle.api.Project +import org.gradle.api.tasks.compile.JavaCompile import org.gradle.jvm.tasks.Jar import org.gradle.kotlin.dsl.apply import org.gradle.kotlin.dsl.invoke @@ -42,9 +44,12 @@ class CloudNetModulesPlugin : Plugin { } } - val generateModuleJson = tasks.named("genModuleJson") - val archiveFileName = project.objects.property() + tasks.named("compileJava") { + options.sourcepath = files(sourceSets().named("main").map { it.resources.sourceDirectories }) + } + val archiveFileName = project.objects.property() + val generateModuleJson = tasks.named("genModuleJson") val prepareUpdaterData = tasks.named("prepareUpdaterData") { dependsOn(generateModuleJson) from(generateModuleJson.flatMap { it.outputDirectory.file(it.fileName) }) diff --git a/build-extensions/src/main/kotlin/eu/cloudnetservice/cloudnet/gradle/plugins/CloudNetPluginsPlugin.kt b/build-extensions/src/main/kotlin/eu/cloudnetservice/cloudnet/gradle/plugins/CloudNetPluginsPlugin.kt index 98c8c70c86..20a2a2217f 100644 --- a/build-extensions/src/main/kotlin/eu/cloudnetservice/cloudnet/gradle/plugins/CloudNetPluginsPlugin.kt +++ b/build-extensions/src/main/kotlin/eu/cloudnetservice/cloudnet/gradle/plugins/CloudNetPluginsPlugin.kt @@ -16,15 +16,21 @@ package eu.cloudnetservice.cloudnet.gradle.plugins +import eu.cloudnetservice.cloudnet.gradle.util.sourceSets import org.gradle.api.Plugin import org.gradle.api.Project +import org.gradle.api.tasks.compile.JavaCompile import org.gradle.kotlin.dsl.apply +import org.gradle.kotlin.dsl.named class CloudNetPluginsPlugin : Plugin { override fun apply(project: Project) { project.run { apply() registerProcessSources() + tasks.named("compileJava") { + options.sourcepath = files(sourceSets().named("main").map { it.resources.sourceDirectories }) + } } } } diff --git a/ext/platform-inject-support/processor/src/main/java/eu/cloudnetservice/ext/platforminject/processor/infogen/NightConfigInfoGenerator.java b/ext/platform-inject-support/processor/src/main/java/eu/cloudnetservice/ext/platforminject/processor/infogen/NightConfigInfoGenerator.java index a08c329ea2..7f13e0b6aa 100644 --- a/ext/platform-inject-support/processor/src/main/java/eu/cloudnetservice/ext/platforminject/processor/infogen/NightConfigInfoGenerator.java +++ b/ext/platform-inject-support/processor/src/main/java/eu/cloudnetservice/ext/platforminject/processor/infogen/NightConfigInfoGenerator.java @@ -22,10 +22,7 @@ import com.electronwill.nightconfig.core.io.ConfigWriter; import eu.cloudnetservice.ext.platforminject.api.data.ParsedPluginData; import eu.cloudnetservice.ext.platforminject.api.generator.PluginInfoGenerator; -import eu.cloudnetservice.ext.platforminject.processor.util.ResourceUtil; import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; import java.util.Objects; import java.util.Set; import javax.annotation.processing.Filer; @@ -82,20 +79,16 @@ protected abstract void applyPlatformInfo( protected @NonNull Config loadFileTemplateOrNewConfig(@NonNull Filer filer) { for (var fileNameCandidate : this.platformFileNames) { - // find the expected template file in the resources directory - var templateFileName = String.format(TEMPLATE_FILE_NAME_FORMAT, fileNameCandidate); - var templateFile = ResourceUtil.resolveResource(filer, templateFileName); - - // check if the template file exists & load it if it does - if (templateFile != null) { - try (var reader = Files.newBufferedReader(templateFile, StandardCharsets.UTF_8)) { - return this.parser.parse(reader); - } catch (IOException ignored) { + try { + var templateFileName = String.format(TEMPLATE_FILE_NAME_FORMAT, fileNameCandidate); + var templateFileResource = filer.getResource(StandardLocation.SOURCE_PATH, "", templateFileName); + try (var templateFileReader = templateFileResource.openReader(true)) { + return this.parser.parse(templateFileReader); } + } catch (IOException _) { } } - // create a new empty file, the template file doesn't exist return this.configFormat.createConfig(); } } diff --git a/ext/platform-inject-support/processor/src/main/java/eu/cloudnetservice/ext/platforminject/processor/util/ResourceUtil.java b/ext/platform-inject-support/processor/src/main/java/eu/cloudnetservice/ext/platforminject/processor/util/ResourceUtil.java deleted file mode 100644 index 203941570b..0000000000 --- a/ext/platform-inject-support/processor/src/main/java/eu/cloudnetservice/ext/platforminject/processor/util/ResourceUtil.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright 2019-present CloudNetService team & contributors - * - * 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 - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package eu.cloudnetservice.ext.platforminject.processor.util; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Objects; -import java.util.UUID; -import javax.annotation.processing.Filer; -import javax.annotation.processing.FilerException; -import javax.tools.FileObject; -import javax.tools.StandardLocation; -import lombok.NonNull; -import org.jetbrains.annotations.Nullable; - -public final class ResourceUtil { - - private static Path resourcesDirectory; - - private ResourceUtil() { - throw new UnsupportedOperationException(); - } - - public static @Nullable Path resolveResource(@NonNull Filer filer, @NonNull String expectedName) { - // get or resolve the resources directory - var resourcesDirectory = resolveResourcesDirectory(filer); - if (resourcesDirectory == null) { - return null; - } - - // resolve the file in the resources directory - return resolveResource(resourcesDirectory, expectedName); - } - - private static @Nullable Path resolveResource(@NonNull Path resourcesDirectory, @NonNull String expectedName) { - try (var stream = Files.newDirectoryStream(resourcesDirectory)) { - for (var candidate : stream) { - // if the file is a directory try to resolve in the given directory - if (Files.isDirectory(candidate)) { - var foundPath = resolveResource(candidate, expectedName); - if (foundPath != null) { - return foundPath; - } - // don't check the filename - continue; - } - - // check if the filename matches the expected name - var fileName = Objects.toString(candidate.getFileName(), null); - if (fileName != null && fileName.equals(expectedName)) { - return candidate; - } - } - } catch (IOException ignored) { - } - // unable to resolve - return null; - } - - private static @Nullable Path resolveResourcesDirectory(@NonNull Filer filer) { - // only resolve the directory once - if (resourcesDirectory != null) { - return resourcesDirectory; - } - - var attempts = 0; - while (attempts++ <= 5) { - // dummy file which will be deleted when the method execution finishes - FileObject dummyFile = null; - - try { - // create a dummy resource to get the target directory of source files - var dummyFileName = UUID.randomUUID().toString().replace("-", "") + ".dummy"; - dummyFile = filer.createResource(StandardLocation.CLASS_OUTPUT, "", dummyFileName); - - // walk up the tree until we find the first resources directory - var candidate = Path.of(dummyFile.toUri()); - do { - // check if the current directory has a resources subdirectory - var resourcesDirectory = candidate.resolve("resources"); - if (Files.exists(resourcesDirectory) && Files.isDirectory(resourcesDirectory)) { - // cache & return - ResourceUtil.resourcesDirectory = candidate; - return candidate; - } - } while ((candidate = candidate.getParent()) != null); - - // unable to resolve the directory - return null; - } catch (FilerException ignored) { - // some filer guarantee was violated by the file creation, just try again - } catch (IOException exception) { - // unable to create the dummy file? - throw new IllegalStateException("Creation of dummy file to resolve resources directory failed", exception); - } finally { - // remove the dummy file, if created - if (dummyFile != null) { - dummyFile.delete(); - } - } - } - - // unable to resolve the directory - return null; - } -}