diff --git a/Benchmarks/Package.swift b/Benchmarks/Package.swift new file mode 100644 index 00000000..d442286b --- /dev/null +++ b/Benchmarks/Package.swift @@ -0,0 +1,76 @@ +// swift-tools-version: 6.0 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import CompilerPluginSupport +import PackageDescription + +import class Foundation.FileManager +import class Foundation.ProcessInfo + +// Note: the JAVA_HOME environment variable must be set to point to where +// Java is installed, e.g., +// Library/Java/JavaVirtualMachines/openjdk-21.jdk/Contents/Home. +func findJavaHome() -> String { + if let home = ProcessInfo.processInfo.environment["JAVA_HOME"] { + return home + } + + // This is a workaround for envs (some IDEs) which have trouble with + // picking up env variables during the build process + let path = "\(FileManager.default.homeDirectoryForCurrentUser.path()).java_home" + if let home = try? String(contentsOfFile: path, encoding: .utf8) { + if let lastChar = home.last, lastChar.isNewline { + return String(home.dropLast()) + } + + return home + } + + fatalError("Please set the JAVA_HOME environment variable to point to where Java is installed.") +} +let javaHome = findJavaHome() + +let javaIncludePath = "\(javaHome)/include" +#if os(Linux) +let javaPlatformIncludePath = "\(javaIncludePath)/linux" +#elseif os(macOS) +let javaPlatformIncludePath = "\(javaIncludePath)/darwin" +#else +// TODO: Handle windows as well +#error("Currently only macOS and Linux platforms are supported, this may change in the future.") +#endif + +let package = Package( + name: "swift-java-benchmarks", + + platforms: [ + .macOS(.v14) + ], + + dependencies: [ + .package(name: "swift-java", path: "../"), + + // plugins + .package(url: "https://github.com/ordo-one/package-benchmark", .upToNextMajor(from: "1.4.0")), + ], + + targets: [ + .executableTarget( + name: "JavaApiCallBenchmarks", + dependencies: [ + .product(name: "Benchmark", package: "package-benchmark"), + .product(name: "JavaRuntime", package: "swift-java"), + .product(name: "JavaKit", package: "swift-java"), + .product(name: "JavaKitNetwork", package: "swift-java"), + ], + path: "Benchmarks/JavaApiCallBenchmarks", + swiftSettings: [ + .unsafeFlags(["-I\(javaIncludePath)", "-I\(javaPlatformIncludePath)"]), + .swiftLanguageMode(.v5), + ], + plugins: [ + .plugin(name: "BenchmarkPlugin", package: "package-benchmark"), + ] + ), + ] +) diff --git a/JavaKit/build.gradle b/JavaKit/build.gradle new file mode 100644 index 00000000..81e1d03b --- /dev/null +++ b/JavaKit/build.gradle @@ -0,0 +1,44 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2024 Apple Inc. and the Swift.org project authors +// Licensed under Apache License v2.0 +// +// See LICENSE.txt for license information +// See CONTRIBUTORS.txt for the list of Swift.org project authors +// +// SPDX-License-Identifier: Apache-2.0 +// +//===----------------------------------------------------------------------===// + +plugins { + id("build-logic.java-application-conventions") +} + +group = "org.swift.javakit" +version = "1.0-SNAPSHOT" + +repositories { + mavenCentral() +} + +java { + toolchain { + languageVersion.set(JavaLanguageVersion.of(22)) + } +} + +dependencies { + implementation("dev.gradleplugins:gradle-api:8.10.1") + + testImplementation(platform("org.junit:junit-bom:5.10.0")) + testImplementation("org.junit.jupiter:junit-jupiter") +} + +tasks.test { + useJUnitPlatform() + testLogging { + events("passed", "skipped", "failed") + } +} diff --git a/JavaKit/src/main/java/org/swift/javakit/dependencies/DependencyResolver.java b/JavaKit/src/main/java/org/swift/javakit/dependencies/DependencyResolver.java new file mode 100644 index 00000000..b99359e2 --- /dev/null +++ b/JavaKit/src/main/java/org/swift/javakit/dependencies/DependencyResolver.java @@ -0,0 +1,75 @@ +package org.swift.javakit.dependencies; + +import org.gradle.tooling.GradleConnector; + +import java.io.*; +import java.nio.file.Files; +import java.util.Arrays; + +public class DependencyResolver { + /** + * May throw runtime exceptions including {@link org.gradle.api.internal.artifacts.ivyservice.TypedResolveException} + * if unable to resolve a dependency. + */ + public static String getClasspathWithDependency(String[] dependencies) throws IOException { + File projectDir = Files.createTempDirectory("java-swift-dependencies").toFile(); + projectDir.mkdirs(); + + File buildFile = new File(projectDir, "build.gradle"); + try (PrintWriter writer = new PrintWriter(buildFile)) { + writer.println("plugins { id 'java-library' }"); + writer.println("repositories { mavenCentral() }"); + + writer.println("dependencies {"); + for (String dependency : dependencies) { + writer.println("implementation(\"" + dependency + "\")"); + } + writer.println("}"); + + writer.println(""" + task printRuntimeClasspath { + def runtimeClasspath = sourceSets.main.runtimeClasspath + inputs.files(runtimeClasspath) + doLast { + println("CLASSPATH:${runtimeClasspath.asPath}") + } + } + """); + } + + File settingsFile = new File(projectDir, "settings.gradle.kts"); + try (PrintWriter writer = new PrintWriter(settingsFile)) { + writer.println(""" + rootProject.name = "swift-java-resolve-dependencies-temp-project" + """); + } + + var connection = GradleConnector.newConnector() + .forProjectDirectory(projectDir) + .connect(); + + try (connection) { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + PrintStream printStream = new PrintStream(outputStream); + + connection.newBuild().forTasks(":printRuntimeClasspath") + .setStandardError(new NoopOutputStream()) + .setStandardOutput(printStream) + .run(); + + var all = outputStream.toString(); + var classpath = Arrays.stream(all.split("\n")) + .filter(s -> s.startsWith("CLASSPATH:")) + .map(s -> s.substring("CLASSPATH:".length())) + .findFirst().orElseThrow(() -> new RuntimeException("Could not find classpath output from ':printRuntimeClasspath' task.")); + return classpath; + } + } + + private static class NoopOutputStream extends OutputStream { + @Override + public void write(int b) throws IOException { + // ignore + } + } +} diff --git a/Package.swift b/Package.swift index 006562b2..3fff44c1 100644 --- a/Package.swift +++ b/Package.swift @@ -41,9 +41,9 @@ let javaIncludePath = "\(javaHome)/include" #endif let package = Package( - name: "JavaKit", + name: "swift-java", platforms: [ - .macOS(.v10_15) + .macOS(.v13) ], products: [ // ==== JavaKit (i.e. calling Java directly Swift utilities) @@ -281,6 +281,22 @@ let package = Package( ] ), + .target( + name: "JavaKitDependencyResolver", + dependencies: [ + "JavaKitReflection", + ], + exclude: [ + "Java2Swift.config", + "org/javakit/deps/DependencyResolver.java", + ], + swiftSettings: [ + .swiftLanguageMode(.v5), + .enableUpcomingFeature("BareSlashRegexLiterals"), + .unsafeFlags(["-I\(javaIncludePath)", "-I\(javaPlatformIncludePath)"]), + ] + ), + .executableTarget( name: "Java2Swift", dependencies: [ @@ -292,6 +308,7 @@ let package = Package( "JavaKitJar", "JavaKitNetwork", "Java2SwiftLib", + "JavaKitDependencyResolver", ], swiftSettings: [ diff --git a/Plugins/Java2SwiftPlugin/Configuration.swift b/Plugins/Java2SwiftPlugin/Configuration.swift index 6b9b4076..d569dba5 100644 --- a/Plugins/Java2SwiftPlugin/Configuration.swift +++ b/Plugins/Java2SwiftPlugin/Configuration.swift @@ -25,4 +25,33 @@ struct Configuration: Codable { /// canonical Java class names (e.g., java.util.Vector) and the values are /// the corresponding Swift names (e.g., JavaVector). var classes: [String: String] = [:] + + var dependencies: [JavaDependencyDescriptor] = [] } + +struct JavaDependencyDescriptor: Codable { + var groupID: String + var artifactID: String + var version: String + + init(from decoder: any Decoder) throws { + var container = try decoder.singleValueContainer() + let string = try container.decode(String.self) + let parts = string.split(separator: ":") + guard parts.count == 3 else { + throw JavaDependencyDescriptorError(message: "Illegal dependency, did not match: `groupID:artifactID:version") + } + self.groupID = String(parts[0]) + self.artifactID = String(parts[1]) + self.version = String(parts[2]) + } + + func encode(to encoder: any Encoder) throws { + var container = encoder.singleValueContainer() + try container.encode("\(self.groupID):\(self.artifactID):\(self.version)") + } + + struct JavaDependencyDescriptorError: Error { + let message: String + } +} \ No newline at end of file diff --git a/Plugins/JavaCompilerPlugin/JavaCompilerPlugin.swift b/Plugins/JavaCompilerPlugin/JavaCompilerPlugin.swift index 64e1d2a7..9db8eb7b 100644 --- a/Plugins/JavaCompilerPlugin/JavaCompilerPlugin.swift +++ b/Plugins/JavaCompilerPlugin/JavaCompilerPlugin.swift @@ -24,10 +24,12 @@ struct JavaCompilerBuildToolPlugin: BuildToolPlugin { let javaFiles = sourceModule.sourceFiles.map { $0.url }.filter { $0.pathExtension == "java" } + print("JAVA FILES IN \(sourceModule.sourceFiles) .... \(javaFiles)") if javaFiles.isEmpty { return [] } + // Note: Target doesn't have a directoryURL counterpart to directory, // so we cannot eliminate this deprecation warning. let sourceDir = target.directory.string diff --git a/Samples/JavaDependenciesApp/.gitignore b/Samples/JavaDependenciesApp/.gitignore new file mode 100644 index 00000000..0023a534 --- /dev/null +++ b/Samples/JavaDependenciesApp/.gitignore @@ -0,0 +1,8 @@ +.DS_Store +/.build +/Packages +xcuserdata/ +DerivedData/ +.swiftpm/configuration/registries.json +.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +.netrc diff --git a/Samples/JavaDependenciesApp/Package.swift b/Samples/JavaDependenciesApp/Package.swift new file mode 100644 index 00000000..19fed326 --- /dev/null +++ b/Samples/JavaDependenciesApp/Package.swift @@ -0,0 +1,63 @@ +// swift-tools-version: 6.0 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +import class Foundation.FileManager +import class Foundation.ProcessInfo + +// Note: the JAVA_HOME environment variable must be set to point to where +// Java is installed, e.g., +// Library/Java/JavaVirtualMachines/openjdk-21.jdk/Contents/Home. +func findJavaHome() -> String { + if let home = ProcessInfo.processInfo.environment["JAVA_HOME"] { + return home + } + + // This is a workaround for envs (some IDEs) which have trouble with + // picking up env variables during the build process + let path = "\(FileManager.default.homeDirectoryForCurrentUser.path()).java_home" + if let home = try? String(contentsOfFile: path, encoding: .utf8) { + if let lastChar = home.last, lastChar.isNewline { + return String(home.dropLast()) + } + + return home + } + + fatalError("Please set the JAVA_HOME environment variable to point to where Java is installed.") +} +let javaHome = findJavaHome() + +let javaIncludePath = "\(javaHome)/include" +#if os(Linux) + let javaPlatformIncludePath = "\(javaIncludePath)/linux" +#elseif os(macOS) + let javaPlatformIncludePath = "\(javaIncludePath)/darwin" +#else + // TODO: Handle windows as well + #error("Currently only macOS and Linux platforms are supported, this may change in the future.") +#endif + +let package = Package( + name: "JavaDependenciesExample", + platforms: [ + .macOS(.v10_15), + ], + dependencies: [ + .package(name: "swift-java", path: "../../"), + ], + targets: [ + .executableTarget( + name: "JavaJacksonDatabind", + dependencies: [ + ], + swiftSettings: [ + .unsafeFlags(["-I\(javaIncludePath)", "-I\(javaPlatformIncludePath)"]) + ], + plugins: [ + .plugin(name: "Java2SwiftPlugin", package: "swift-java"), + ] + ), + ] +) diff --git a/Samples/JavaDependenciesApp/Sources/JavaJacksonDatabind/Java2Swift.config b/Samples/JavaDependenciesApp/Sources/JavaJacksonDatabind/Java2Swift.config new file mode 100644 index 00000000..4bd98f52 --- /dev/null +++ b/Samples/JavaDependenciesApp/Sources/JavaJacksonDatabind/Java2Swift.config @@ -0,0 +1,6 @@ +{ + "dependencies": [ + "dev.gradleplugins:gradle-api:8.10.1" + ], + "classes": {} +} \ No newline at end of file diff --git a/Samples/JavaDependenciesApp/Sources/JavaJacksonDatabind/main.swift b/Samples/JavaDependenciesApp/Sources/JavaJacksonDatabind/main.swift new file mode 100644 index 00000000..c075a8a1 --- /dev/null +++ b/Samples/JavaDependenciesApp/Sources/JavaJacksonDatabind/main.swift @@ -0,0 +1,25 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2024 Apple Inc. and the Swift.org project authors +// Licensed under Apache License v2.0 +// +// See LICENSE.txt for license information +// See CONTRIBUTORS.txt for the list of Swift.org project authors +// +// SPDX-License-Identifier: Apache-2.0 +// +//===----------------------------------------------------------------------===// + +import JavaKit + +let jvm = try JavaVirtualMachine.shared(classPath: ["QuadraticSieve-1.0.jar"]) +do { + let sieveClass = try JavaClass(environment: jvm.environment()) + for prime in sieveClass.findPrimes(100)! { + print("Found prime: \(prime.intValue())") + } +} catch { + print("Failure: \(error)") +} diff --git a/Sources/Java2Swift/JavaToSwift+FetchDependencies.swift b/Sources/Java2Swift/JavaToSwift+FetchDependencies.swift new file mode 100644 index 00000000..55592da9 --- /dev/null +++ b/Sources/Java2Swift/JavaToSwift+FetchDependencies.swift @@ -0,0 +1,48 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2024 Apple Inc. and the Swift.org project authors +// Licensed under Apache License v2.0 +// +// See LICENSE.txt for license information +// See CONTRIBUTORS.txt for the list of Swift.org project authors +// +// SPDX-License-Identifier: Apache-2.0 +// +//===----------------------------------------------------------------------===// + +import ArgumentParser +import Java2SwiftLib +import JavaKit +import JavaKitJar +import JavaKitReflection +import SwiftSyntax +import Java2SwiftLib +import JavaKitDependencyResolver + +extension JavaToSwift { + func fetchDependencies( + config: Configuration, + environment: JNIEnvironment) throws -> JavaClasspath { + print("FETCH DEPENDENCIES FOR: \(config.dependencies)") + let resolverClass = try JavaClass(environment: environment) + let deps = config.dependencies.map { "\($0)" } + let classpath = try resolverClass.getClasspathWithDependency(dependencies: deps) + print("RESOLVED CLASSPATH: \(classpath)") + + return .init(classpath) + } +} + +struct JavaClasspath: CustomStringConvertible { + let value: String + + init(_ value: String) { + self.value = value + } + + var description: String { + "JavaClasspath(value: \(value))" + } +} \ No newline at end of file diff --git a/Sources/Java2Swift/JavaToSwift.swift b/Sources/Java2Swift/JavaToSwift.swift index 15e346ae..2b424e7f 100644 --- a/Sources/Java2Swift/JavaToSwift.swift +++ b/Sources/Java2Swift/JavaToSwift.swift @@ -42,6 +42,12 @@ struct JavaToSwift: ParsableCommand { ) var jar: Bool = false + @Flag( + help: + "Fetch dependencies from given file" + ) + var fetch: Bool = false + @Option( name: [.customLong("cp"), .customLong("classpath")], help: "Class search path of directories and zip/jar files from which Java classes can be loaded." @@ -100,6 +106,8 @@ struct JavaToSwift: ParsableCommand { /// Describes what kind of generation action is being performed by /// Java2Swift. enum GenerationMode { + case fetchDependencies(Configuration) + /// Generate a configuration file given a Jar file. case configuration(jarFile: String) @@ -115,7 +123,11 @@ struct JavaToSwift: ParsableCommand { generationMode = .configuration(jarFile: input) } else { let config = try JavaTranslator.readConfiguration(from: URL(fileURLWithPath: input)) - generationMode = .classWrappers(config) + if fetch { + generationMode = .fetchDependencies(config) + } else { + generationMode = .classWrappers(config) + } } // Load all of the dependent configurations and associate them with Swift @@ -141,7 +153,8 @@ struct JavaToSwift: ParsableCommand { case .configuration(jarFile: let jarFile): // * Jar file (in `-jar` mode) classPathPieces.append(jarFile) - case .classWrappers(let config): + case .classWrappers(let config), + .fetchDependencies(let config): // * Class path specified in the configuration file (if any) config.classPath.map { classPathPieces.append($0) } } @@ -165,12 +178,19 @@ struct JavaToSwift: ParsableCommand { ) case .classWrappers(let config): + print("classPath = \(classPath)") try generateWrappers( config: config, classPath: classPath, dependentConfigs: dependentConfigs, environment: jvm.environment() ) + + case .fetchDependencies(let config): + try fetchDependencies( + config: config, + environment: jvm.environment() + ) } } diff --git a/Sources/Java2SwiftLib/Configuration.swift b/Sources/Java2SwiftLib/Configuration.swift index 6617b4d0..2ceea2db 100644 --- a/Sources/Java2SwiftLib/Configuration.swift +++ b/Sources/Java2SwiftLib/Configuration.swift @@ -19,15 +19,49 @@ /// must be kept in sync. package struct Configuration: Codable { /// The Java class path that should be passed along to the Java2Swift tool. - package var classPath: String? = nil + package var classPath: String? /// The Java classes that should be translated to Swift. The keys are /// canonical Java class names (e.g., java.util.Vector) and the values are /// the corresponding Swift names (e.g., JavaVector). - package var classes: [String: String] = [:] + package var classes: [String: String] - package init(classPath: String? = nil, classes: [String : String] = [:]) { + package var dependencies: [JavaDependencyDescriptor] + + package init(classPath: String? = nil, classes: [String : String] = [:], dependencies: [JavaDependencyDescriptor] = []) { self.classPath = classPath self.classes = classes + self.dependencies = dependencies + } +} + +package struct JavaDependencyDescriptor: Codable, CustomStringConvertible { + package var groupID: String + package var artifactID: String + package var version: String + + package init(from decoder: any Decoder) throws { + let container = try decoder.singleValueContainer() + let string = try container.decode(String.self) + let parts = string.split(separator: ":") + guard parts.count == 3 else { + throw JavaDependencyDescriptorError(message: "Illegal dependency, did not match: `groupID:artifactID:version") + } + self.groupID = String(parts[0]) + self.artifactID = String(parts[1]) + self.version = String(parts[2]) + } + + package func encode(to encoder: any Encoder) throws { + var container = encoder.singleValueContainer() + try container.encode("\(self.groupID):\(self.artifactID):\(self.version)") + } + + package var description: String { + "\(groupID):\(artifactID):\(version)" + } + + struct JavaDependencyDescriptorError: Error { + let message: String } } diff --git a/Sources/Java2SwiftLib/JavaTranslator+Configuration.swift b/Sources/Java2SwiftLib/JavaTranslator+Configuration.swift index b84d7a1e..544f3a69 100644 --- a/Sources/Java2SwiftLib/JavaTranslator+Configuration.swift +++ b/Sources/Java2SwiftLib/JavaTranslator+Configuration.swift @@ -17,8 +17,13 @@ import Foundation extension JavaTranslator { /// Read a configuration file from the given URL. package static func readConfiguration(from url: URL) throws -> Configuration { - let contents = try Data(contentsOf: url) - return try JSONDecoder().decode(Configuration.self, from: contents) + do { + let contents = try Data(contentsOf: url) + return try JSONDecoder().decode(Configuration.self, from: contents) + } catch { + // Make the error message useful by including which file we failed to decode + throw ConfigurationError(message: "Failed to decode configuration: \(url)", error: error) + } } /// Load the configuration file with the given name to populate the known set of @@ -32,3 +37,8 @@ extension JavaTranslator { } } } + +struct ConfigurationError: Error { + let message: String + let error: any Error +} \ No newline at end of file diff --git a/Sources/JavaKitDependencyResolver/Java2Swift.config b/Sources/JavaKitDependencyResolver/Java2Swift.config new file mode 100644 index 00000000..8943f7b3 --- /dev/null +++ b/Sources/JavaKitDependencyResolver/Java2Swift.config @@ -0,0 +1,15 @@ +{ + "dependencies": [ + "dev.gradleplugins:gradle-api:8.10.1" + ], + "_comment:": "TODO: We need to generate those classpaths so we can bootstrap the dependency fetcher. Probably via having a gradle target depending on this and we just invoke it via CLI.", + "classPath": "/Users/ktoso/.gradle/caches/modules-2/files-2.1/dev.gradleplugins/gradle-api/8.10.1/a236c4ed58ea4234cef8217bf8dc0793a02d80be/gradle-api-8.10.1.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.codehaus.groovy/groovy-all/3.0.22/eef9a93f08c895cba735c6aed28e9ce32b762229/groovy-all-3.0.22.pom:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.9.24/9928532f12c66ad816a625b3f9984f8368ca6d2b/kotlin-stdlib-1.9.24.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.codehaus.groovy/groovy-ant/3.0.22/b90ebe5f97170162105fa87b3e69f8a51f2ef6ea/groovy-ant-3.0.22.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.codehaus.groovy/groovy-astbuilder/3.0.22/ad926cd4b93271af8181899c360d93b380d5a9e/groovy-astbuilder-3.0.22.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.codehaus.groovy/groovy-cli-picocli/3.0.22/94f33323a1779cb89b1faea54beea4670bd42c40/groovy-cli-picocli-3.0.22.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.codehaus.groovy/groovy-groovysh/3.0.22/70f050713a499e0ecd79b3c49b80b9d4d35041f1/groovy-groovysh-3.0.22.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.codehaus.groovy/groovy-console/3.0.22/14875d49eb557088303c04b7c91ce66589608c44/groovy-console-3.0.22.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.codehaus.groovy/groovy-datetime/3.0.22/bae704f1f7a2b80b9b9b00071e0cedb480688149/groovy-datetime-3.0.22.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.codehaus.groovy/groovy-groovydoc/3.0.22/6cebde157f06db0629b67545f87775232462ced1/groovy-groovydoc-3.0.22.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.codehaus.groovy/groovy-docgenerator/3.0.22/e52b0f06a811ba503c19cb0c6a269498baf6830f/groovy-docgenerator-3.0.22.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.codehaus.groovy/groovy-jmx/3.0.22/caa285ee1a15b08a5f113ca3183fc91622072fda/groovy-jmx-3.0.22.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.codehaus.groovy/groovy-json/3.0.22/28e337f52b31cc890ad4eb51e738a2bce47a3f1c/groovy-json-3.0.22.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.codehaus.groovy/groovy-jsr223/3.0.22/60ea08d95ac160f06d7065cbd37d6548ca665eb/groovy-jsr223-3.0.22.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.codehaus.groovy/groovy-macro/3.0.22/a66f5cf47799eceae07ab7431ad0aaf3e1b7ed3f/groovy-macro-3.0.22.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.codehaus.groovy/groovy-nio/3.0.22/7b3f5ac7421efec8efd1b0c7064bcb4b68379e4c/groovy-nio-3.0.22.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.codehaus.groovy/groovy-servlet/3.0.22/71bb16ddcc8155de17bc343174f2b5348dda101c/groovy-servlet-3.0.22.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.codehaus.groovy/groovy-sql/3.0.22/8a208e8eb1156f4f27aa5dfa102f25420560ce83/groovy-sql-3.0.22.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.codehaus.groovy/groovy-swing/3.0.22/a96b8203c71923c1b6343d4bbdc36ba973307d74/groovy-swing-3.0.22.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.codehaus.groovy/groovy-templates/3.0.22/c8cf8e0bb82d7e112e87c6492b17f62da267b8ec/groovy-templates-3.0.22.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.codehaus.groovy/groovy-test/3.0.22/cc61e98fe6eba4f29aed40a1ed1fda601a0e84eb/groovy-test-3.0.22.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.codehaus.groovy/groovy-test-junit5/3.0.22/663cbadeb7c42bf1e11d7f9a01e3d8ddb0d5eb77/groovy-test-junit5-3.0.22.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.codehaus.groovy/groovy-testng/3.0.22/2964eb7933377694db6cfa321ca7a2d16f29fc81/groovy-testng-3.0.22.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.codehaus.groovy/groovy-xml/3.0.22/de0dd2f84c3befb280132866d0a6bf3ae031f55a/groovy-xml-3.0.22.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.codehaus.groovy/groovy/3.0.22/8403cbf38ed86f9fde3abbf0d2548642ddfebd00/groovy-3.0.22.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.apache.ant/ant-junit/1.10.14/e5f7b5a367cb03a73879018331c7065a2a479954/ant-junit-1.10.14.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.apache.ant/ant/1.10.14/1edce9bbfa60dfd51f010879c78f4421dafae7a7/ant-1.10.14.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.apache.ant/ant-launcher/1.10.14/8d2268288496b0541a2640f2ee07fe3de1a02301/ant-launcher-1.10.14.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.apache.ant/ant-antlr/1.10.14/1f19602f622fa9fa04f9aa8807f935b571ca05ca/ant-antlr-1.10.14.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/info.picocli/picocli/4.6.3/18177f4c3d65cc94e6d4039775ec5aed8089f8d0/picocli-4.6.3.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/com.thoughtworks.qdox/qdox/1.12.1/f7122f6ab1f64bdf9f5970b0e89bfb355e036897/qdox-1.12.1.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/com.github.javaparser/javaparser-core/3.25.6/5e058bea33f92e5dd6f41f86066009cd56250452/javaparser-core-3.25.6.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/jline/jline/2.14.6/c3aeac59c022bdc497c8c48ed86fa50450e4896a/jline-2.14.6.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/junit/junit/4.13.2/8ac9e16d933b6fb43bc7f576336b8f4d7eb5ba12/junit-4.13.2.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.junit.platform/junit-platform-launcher/1.9.2/38e0bfad8c57d4cd1a8f27926c25ffe9543068d6/junit-platform-launcher-1.9.2.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.junit.platform/junit-platform-engine/1.9.2/40aeef2be7b04f96bb91e8b054affc28b7c7c935/junit-platform-engine-1.9.2.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.junit.platform/junit-platform-commons/1.9.2/6f9f8621d8230cd38aa42e58ccbc0c00569131ce/junit-platform-commons-1.9.2.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.junit.jupiter/junit-jupiter-engine/5.9.2/572f7a553b53f83ee59cc045ce1c3772864ab76c/junit-jupiter-engine-5.9.2.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.junit.jupiter/junit-jupiter-api/5.9.2/fed843581520eac594bc36bb4b0f55e7b947dda9/junit-jupiter-api-5.9.2.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.testng/testng/7.5/1416a607fae667c14e390b484e8d02b5824c0674/testng-7.5.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest-core/1.3/42a25dc3219429f0e5d060061f71acb49bf010a0/hamcrest-core-1.3.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.opentest4j/opentest4j/1.2.0/28c11eb91f9b6d8e200631d46e20a7f407f2a046/opentest4j-1.2.0.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.7.32/cdcff33940d9f2de763bc41ea05a0be5941176c3/slf4j-api-1.7.32.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/com.beust/jcommander/1.78/a3927de9bd6f351429bcf763712c9890629d8f51/jcommander-1.78.jar:/Users/ktoso/.gradle/caches/modules-2/files-2.1/org.webjars/jquery/3.5.1/2392938e374f561c27c53872bdc9b6b351b6ba34/jquery-3.5.1.jar", + "classes": { + "org.gradle.tooling.GradleConnector": "GradleConnector", + "org.gradle.tooling.ProjectConnection": "ProjectConnection", + "org.gradle.tooling.BuildAction": "BuildAction", + "org.gradle.tooling.TestLauncher": "TestLauncher", + "org.gradle.tooling.BuildLauncher": "BuildLauncher", + "org.javakit.deps.DependencyResolver": "DependencyResolver" + } +} \ No newline at end of file diff --git a/Sources/JavaKitDependencyResolver/generated/BuildAction.swift b/Sources/JavaKitDependencyResolver/generated/BuildAction.swift new file mode 100644 index 00000000..77d62bfc --- /dev/null +++ b/Sources/JavaKitDependencyResolver/generated/BuildAction.swift @@ -0,0 +1,8 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaRuntime + +@JavaInterface("org.gradle.tooling.BuildAction") +public struct BuildAction { + +} diff --git a/Sources/JavaKitDependencyResolver/generated/BuildLauncher.swift b/Sources/JavaKitDependencyResolver/generated/BuildLauncher.swift new file mode 100644 index 00000000..79492402 --- /dev/null +++ b/Sources/JavaKitDependencyResolver/generated/BuildLauncher.swift @@ -0,0 +1,12 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaRuntime + +@JavaInterface("org.gradle.tooling.BuildLauncher") +public struct BuildLauncher { + @JavaMethod + public func run() throws + + @JavaMethod + public func forTasks(_ arg0: [String]) -> BuildLauncher! +} diff --git a/Sources/JavaKitDependencyResolver/generated/GradleConnector.swift b/Sources/JavaKitDependencyResolver/generated/GradleConnector.swift new file mode 100644 index 00000000..f56fc180 --- /dev/null +++ b/Sources/JavaKitDependencyResolver/generated/GradleConnector.swift @@ -0,0 +1,46 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaRuntime + +@JavaClass("org.gradle.tooling.GradleConnector") +public struct GradleConnector { + @JavaMethod + public init(environment: JNIEnvironment? = nil) + + @JavaMethod + public func connect() throws -> ProjectConnection! + + @JavaMethod + public func useGradleVersion(_ arg0: String) -> GradleConnector! + + @JavaMethod + public func useBuildDistribution() -> GradleConnector! + + @JavaMethod + public func disconnect() + + @JavaMethod + public func toString() -> String + + @JavaMethod + public func hashCode() -> Int32 + + @JavaMethod + public func notify() + + @JavaMethod + public func notifyAll() + + @JavaMethod + public func wait(_ arg0: Int64) throws + + @JavaMethod + public func wait(_ arg0: Int64, _ arg1: Int32) throws + + @JavaMethod + public func wait() throws +} +extension JavaClass { + @JavaStaticMethod + public func newConnector() -> GradleConnector! +} diff --git a/Sources/JavaKitDependencyResolver/generated/ProjectConnection.swift b/Sources/JavaKitDependencyResolver/generated/ProjectConnection.swift new file mode 100644 index 00000000..70d60d9d --- /dev/null +++ b/Sources/JavaKitDependencyResolver/generated/ProjectConnection.swift @@ -0,0 +1,16 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaRuntime + +@JavaInterface("org.gradle.tooling.ProjectConnection") +public struct ProjectConnection { + + @JavaMethod + public func close() + + @JavaMethod + public func newTestLauncher() -> TestLauncher! + + @JavaMethod + public func newBuild() -> BuildLauncher! +} diff --git a/Sources/JavaKitDependencyResolver/generated/TestLauncher.swift b/Sources/JavaKitDependencyResolver/generated/TestLauncher.swift new file mode 100644 index 00000000..b78922e9 --- /dev/null +++ b/Sources/JavaKitDependencyResolver/generated/TestLauncher.swift @@ -0,0 +1,21 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaRuntime + +@JavaInterface("org.gradle.tooling.TestLauncher") +public struct TestLauncher { + @JavaMethod + public func run() throws + + @JavaMethod + public func withJvmTestClasses(_ arg0: [String]) -> TestLauncher! + + @JavaMethod + public func withJvmTestMethods(_ arg0: String, _ arg1: [String]) -> TestLauncher! + + @JavaMethod + public func debugTestsOn(_ arg0: Int32) -> TestLauncher! + + @JavaMethod + public func forTasks(_ arg0: [String]) -> TestLauncher! +} diff --git a/Sources/JavaKitDependencyResolver/org.swift.javakit.dependencies/DependencyResolver.swift b/Sources/JavaKitDependencyResolver/org.swift.javakit.dependencies/DependencyResolver.swift new file mode 100644 index 00000000..79fa8b49 --- /dev/null +++ b/Sources/JavaKitDependencyResolver/org.swift.javakit.dependencies/DependencyResolver.swift @@ -0,0 +1,12 @@ +// Auto-generated by Java-to-Swift wrapper generator. +import JavaKit +import JavaRuntime + +@JavaInterface("org.swift.javakit.dependencies.DependencyResolver") +public struct DependencyResolver { +} + +extension JavaClass { + @JavaStaticMethod + public func getClasspathWithDependency(dependencies: [String]) throws -> String +} diff --git a/settings.gradle b/settings.gradle index 3a0bd106..06c630d4 100644 --- a/settings.gradle +++ b/settings.gradle @@ -19,6 +19,7 @@ pluginManagement { rootProject.name = "swift-java" include "SwiftKit" +include "JavaKit" // Include sample apps -- you can run them via `gradle Name:run` new File(rootDir, "Samples").listFiles().each {