Skip to content

Commit 4d0b38f

Browse files
committed
first time JavaDependencySample showing a fetched dependency working!
1 parent c9d815c commit 4d0b38f

File tree

9 files changed

+64
-25
lines changed

9 files changed

+64
-25
lines changed

Package.swift

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,12 @@ let package = Package(
188188

189189
.target(
190190
name: "JavaKit",
191-
dependencies: ["JavaRuntime", "JavaKitMacros", "JavaTypes"],
191+
dependencies: [
192+
"JavaRuntime",
193+
"JavaKitMacros",
194+
"JavaTypes",
195+
"JavaKitConfigurationShared", // for Configuration reading at runtime
196+
],
192197
exclude: ["swift-java.config"],
193198
swiftSettings: [
194199
.swiftLanguageMode(.v5),
@@ -198,10 +203,8 @@ let package = Package(
198203
.unsafeFlags(
199204
[
200205
"-L\(javaHome)/lib/server",
201-
"-Xlinker",
202-
"-rpath",
203-
"-Xlinker",
204-
"\(javaHome)/lib/server",
206+
"-Xlinker", "-rpath",
207+
"-Xlinker", "\(javaHome)/lib/server",
205208
],
206209
.when(platforms: [.linux, .macOS])
207210
),

Plugins/Java2SwiftPlugin/Java2SwiftPlugin.swift

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ struct Java2SwiftBuildToolPlugin: SwiftJavaPluginProtocol, BuildToolPlugin {
2424
var verbose: Bool = getEnvironmentBool("SWIFT_JAVA_VERBOSE")
2525

2626
func createBuildCommands(context: PluginContext, target: Target) throws -> [Command] {
27+
log("Create build commands for: \(target.name)")
2728
guard let sourceModule = target.sourceModule else { return [] }
2829

2930
// Note: Target doesn't have a directoryURL counterpart to directory,
@@ -41,6 +42,7 @@ struct Java2SwiftBuildToolPlugin: SwiftJavaPluginProtocol, BuildToolPlugin {
4142
/// this target depends on.
4243
var dependentConfigFiles: [(String, URL)] = []
4344
func searchForConfigFiles(in target: any Target) {
45+
log("Search for config files in target: \(target.name)")
4446
let dependencyURL = URL(filePath: target.directory.string)
4547

4648
// Look for a config file within this target.
@@ -58,10 +60,13 @@ struct Java2SwiftBuildToolPlugin: SwiftJavaPluginProtocol, BuildToolPlugin {
5860
for dependency in target.dependencies {
5961
switch dependency {
6062
case .target(let target):
63+
log("Dependency target: \(target.name)")
6164
searchForConfigFiles(in: target)
6265

6366
case .product(let product):
67+
log("Dependency product: \(product.name)")
6468
for target in product.targets {
69+
log("Dependency product: \(product.name), target: \(target.name)")
6570
searchForConfigFiles(in: target)
6671
}
6772

@@ -72,6 +77,7 @@ struct Java2SwiftBuildToolPlugin: SwiftJavaPluginProtocol, BuildToolPlugin {
7277

7378
// Process indirect target dependencies.
7479
for dependency in target.recursiveTargetDependencies {
80+
log("Recursive dependency target: \(dependency.name)")
7581
searchForConfigFiles(in: dependency)
7682
}
7783

@@ -115,7 +121,7 @@ struct Java2SwiftBuildToolPlugin: SwiftJavaPluginProtocol, BuildToolPlugin {
115121
while classpath.lastPathComponent != "Java" {
116122
classpath.deleteLastPathComponent()
117123
}
118-
arguments += [ "--classpath", classpath.path() ]
124+
arguments += ["--classpath", classpath.path()]
119125

120126
// For each of the class files, note that it can have Swift-native
121127
// implementations. We figure this out based on the path.
@@ -131,7 +137,7 @@ struct Java2SwiftBuildToolPlugin: SwiftJavaPluginProtocol, BuildToolPlugin {
131137
let className = classNameComponents
132138
.reversed()
133139
.joined(separator: ".")
134-
arguments += [ "--swift-native-implementation", className]
140+
arguments += ["--swift-native-implementation", className]
135141
}
136142
}
137143

@@ -141,7 +147,6 @@ struct Java2SwiftBuildToolPlugin: SwiftJavaPluginProtocol, BuildToolPlugin {
141147
}
142148

143149
let executable = try context.tool(named: "Java2Swift").url
144-
log("Prepared build command: \(executable) \(arguments)")
145150

146151
return [
147152
.buildCommand(

Samples/JavaDependencySampleApp/Package.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ let package = Package(
8484
name: "JavaCommonsCSV",
8585
dependencies: [
8686
.product(name: "JavaKit", package: "swift-java"),
87+
.product(name: "JavaKitFunction", package: "swift-java"),
8788
.product(name: "JavaRuntime", package: "swift-java"),
8889
],
8990
swiftSettings: [

Samples/JavaDependencySampleApp/Sources/JavaCommonsCSV/dummy.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,3 @@
1111
// SPDX-License-Identifier: Apache-2.0
1212
//
1313
//===----------------------------------------------------------------------===//
14-

Samples/JavaDependencySampleApp/Sources/JavaCommonsCSV/swift-java.config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"classes" : {
33
"org.apache.commons.io.FilenameUtils" : "FilenameUtils"
44
},
5-
"classpath" : "\/Users\/ktoso\/.gradle\/caches\/modules-2\/files-2.1\/org.apache.commons\/commons-csv\/1.12.0\/c77e053d7189bc0857f8d323ab61cb949965fbd1\/commons-csv-1.12.0.jar:\/Users\/ktoso\/.gradle\/caches\/modules-2\/files-2.1\/commons-io\/commons-io\/2.17.0\/ddcc8433eb019fb48fe25207c0278143f3e1d7e2\/commons-io-2.17.0.jar:\/Users\/ktoso\/.gradle\/caches\/modules-2\/files-2.1\/commons-codec\/commons-codec\/1.17.1\/973638b7149d333563584137ebf13a691bb60579\/commons-codec-1.17.1.jar:\/Users\/ktoso\/.gradle\/caches\/modules-2\/files-2.1\/org.apache.commons\/commons-csv\/1.12.0\/c77e053d7189bc0857f8d323ab61cb949965fbd1\/commons-csv-1.12.0.jar:\/Users\/ktoso\/.gradle\/caches\/modules-2\/files-2.1\/commons-io\/commons-io\/2.17.0\/ddcc8433eb019fb48fe25207c0278143f3e1d7e2\/commons-io-2.17.0.jar:\/Users\/ktoso\/.gradle\/caches\/modules-2\/files-2.1\/commons-codec\/commons-codec\/1.17.1\/973638b7149d333563584137ebf13a691bb60579\/commons-codec-1.17.1.jar:JavaKit\/build\/classes\/java\/main:..\/..\/JavaKit\/build\/classes\/java\/main:\/Users\/ktoso\/.gradle\/caches\/modules-2\/files-2.1\/org.apache.commons\/commons-csv\/1.12.0\/c77e053d7189bc0857f8d323ab61cb949965fbd1\/commons-csv-1.12.0.jar:\/Users\/ktoso\/.gradle\/caches\/modules-2\/files-2.1\/commons-io\/commons-io\/2.17.0\/ddcc8433eb019fb48fe25207c0278143f3e1d7e2\/commons-io-2.17.0.jar:\/Users\/ktoso\/.gradle\/caches\/modules-2\/files-2.1\/commons-codec\/commons-codec\/1.17.1\/973638b7149d333563584137ebf13a691bb60579\/commons-codec-1.17.1.jar:JavaKit\/build\/classes\/java\/main:..\/..\/JavaKit\/build\/classes\/java\/main:\/Users\/ktoso\/.gradle\/caches\/modules-2\/files-2.1\/org.apache.commons\/commons-csv\/1.12.0\/c77e053d7189bc0857f8d323ab61cb949965fbd1\/commons-csv-1.12.0.jar:\/Users\/ktoso\/.gradle\/caches\/modules-2\/files-2.1\/commons-io\/commons-io\/2.17.0\/ddcc8433eb019fb48fe25207c0278143f3e1d7e2\/commons-io-2.17.0.jar:\/Users\/ktoso\/.gradle\/caches\/modules-2\/files-2.1\/commons-codec\/commons-codec\/1.17.1\/973638b7149d333563584137ebf13a691bb60579\/commons-codec-1.17.1.jar:JavaKit\/build\/classes\/java\/main:..\/..\/JavaKit\/build\/classes\/java\/main:\/Users\/ktoso\/.gradle\/caches\/modules-2\/files-2.1\/org.apache.commons\/commons-csv\/1.12.0\/c77e053d7189bc0857f8d323ab61cb949965fbd1\/commons-csv-1.12.0.jar:\/Users\/ktoso\/.gradle\/caches\/modules-2\/files-2.1\/commons-io\/commons-io\/2.17.0\/ddcc8433eb019fb48fe25207c0278143f3e1d7e2\/commons-io-2.17.0.jar:\/Users\/ktoso\/.gradle\/caches\/modules-2\/files-2.1\/commons-codec\/commons-codec\/1.17.1\/973638b7149d333563584137ebf13a691bb60579\/commons-codec-1.17.1.jar:JavaKit\/build\/classes\/java\/main:..\/..\/JavaKit\/build\/classes\/java\/main:\/Users\/ktoso\/.gradle\/caches\/modules-2\/files-2.1\/org.apache.commons\/commons-csv\/1.12.0\/c77e053d7189bc0857f8d323ab61cb949965fbd1\/commons-csv-1.12.0.jar:\/Users\/ktoso\/.gradle\/caches\/modules-2\/files-2.1\/commons-io\/commons-io\/2.17.0\/ddcc8433eb019fb48fe25207c0278143f3e1d7e2\/commons-io-2.17.0.jar:\/Users\/ktoso\/.gradle\/caches\/modules-2\/files-2.1\/commons-codec\/commons-codec\/1.17.1\/973638b7149d333563584137ebf13a691bb60579\/commons-codec-1.17.1.jar:JavaKit\/build\/classes\/java\/main:..\/..\/JavaKit\/build\/classes\/java\/main",
5+
"classpath" : "\/Users\/ktoso\/.gradle\/caches\/modules-2\/files-2.1\/org.apache.commons\/commons-csv\/1.12.0\/c77e053d7189bc0857f8d323ab61cb949965fbd1\/commons-csv-1.12.0.jar:\/Users\/ktoso\/.gradle\/caches\/modules-2\/files-2.1\/commons-io\/commons-io\/2.17.0\/ddcc8433eb019fb48fe25207c0278143f3e1d7e2\/commons-io-2.17.0.jar:\/Users\/ktoso\/.gradle\/caches\/modules-2\/files-2.1\/commons-codec\/commons-codec\/1.17.1\/973638b7149d333563584137ebf13a691bb60579\/commons-codec-1.17.1.jar:\/Users\/ktoso\/.gradle\/caches\/modules-2\/files-2.1\/org.apache.commons\/commons-csv\/1.12.0\/c77e053d7189bc0857f8d323ab61cb949965fbd1\/commons-csv-1.12.0.jar:\/Users\/ktoso\/.gradle\/caches\/modules-2\/files-2.1\/commons-io\/commons-io\/2.17.0\/ddcc8433eb019fb48fe25207c0278143f3e1d7e2\/commons-io-2.17.0.jar:\/Users\/ktoso\/.gradle\/caches\/modules-2\/files-2.1\/commons-codec\/commons-codec\/1.17.1\/973638b7149d333563584137ebf13a691bb60579\/commons-codec-1.17.1.jar:JavaKit\/build\/classes\/java\/main:..\/..\/JavaKit\/build\/classes\/java\/main",
66
"dependencies" : [
77
"org.apache.commons:commons-csv:1.12.0"
88
]

Samples/JavaDependencySampleApp/Sources/JavaDependencySample/main.swift

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,29 @@
1414

1515
import JavaKit
1616
import JavaKitFunction
17+
import JavaKitConfigurationShared
18+
import Foundation
19+
20+
// Import the commons-csv library wrapper:
1721
import JavaCommonsCSV
1822

19-
// Just showcasing that we imported the module
20-
let s: Subscriber<Int>? = nil
23+
// Make sure we have the classpath loaded
24+
// TODO: this is more complex than that, need to account for dependencies of our module
25+
let currentDir = FileManager.default.currentDirectoryPath
26+
let configuration = try readConfiguration(sourceDir: "\(currentDir)/Sources/JavaCommonsCSV/")
27+
28+
// 1) Start a JVM with apropriate classpath
29+
let jvm = try JavaVirtualMachine.shared(classpath: configuration.classpathEntries)
30+
31+
// 2) Get the FilenameUtils Java class so we can call the static methods on it
32+
let FilenameUtilsClass = try JavaClass<FilenameUtils>()
33+
34+
// Some silly sample path we want to work with:
35+
let path = "/example/path/executable.exe"
36+
print("Path = \(path)")
37+
38+
let ext = try! FilenameUtilsClass.getExtension(path)
39+
print("Java FilenameUtils found extension = \(ext)")
40+
precondition(ext == "exe")
2141

22-
print("Done.")
42+
print("Done.")

Samples/JavaDependencySampleApp/ci-validate.sh

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,16 @@ MODULE_CONFIG_PATH="$MODULE_CONFIG_DIR/swift-java.config"
1111
--module-name "$MODULE_NAME" \
1212
--output-directory "$MODULE_CONFIG_DIR"
1313

14-
### 2) extract the config for the fetched dependency
15-
DEP_JAR_CP=$(jq .classpath "$MODULE_CONFIG_PATH")
16-
DEP_JAR_CP=$(echo "$DEP_JAR_CP" | tr -d '"') # trim the "..."
17-
# shellcheck disable=SC2086
18-
"$JAVASWIFT" --jar $DEP_JAR_CP \
19-
--module-name "$MODULE_NAME" \
20-
--existing-config amend
21-
# --java-package-filter com.google.common \
14+
#### 2) extract the config for the fetched dependency
15+
#DEP_JAR_CP=$(jq .classpath "$MODULE_CONFIG_PATH")
16+
#DEP_JAR_CP=$(echo "$DEP_JAR_CP" | tr -d '"') # trim the "..."
17+
## shellcheck disable=SC2086
18+
#"$JAVASWIFT" --jar $DEP_JAR_CP \
19+
# --module-name "$MODULE_NAME" \
20+
# --java-package-filter org.apache.commons \
21+
# --existing-config amend
22+
23+
# for now in CI we just use what we have already generated and comitted in the config
2224

2325
### 3) make wrappers for the module
24-
"$JAVASWIFT" "$MODULE_CONFIG_PATH" --module-name "$MODULE_NAME"
26+
swift run

Sources/Java2Swift/JavaToSwift.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ struct JavaToSwift: ParsableCommand {
161161
let toolMode: ToolMode
162162
if jar {
163163
if let moduleBaseDir {
164-
config = try readConfiguration(sourceDir: "file://" + moduleBaseDir.path)
164+
config = try readConfiguration(sourceDir: moduleBaseDir.path)
165165
} else {
166166
config = Configuration()
167167
}
@@ -304,7 +304,7 @@ struct JavaToSwift: ParsableCommand {
304304
fatalError(message)
305305
}
306306

307-
print("[info][swift-java] " + "Done.".green)
307+
print("[info][swift-java] " + "Done: ".green + CommandLine.arguments.joined(separator: " "))
308308
}
309309

310310
private func names(from javaClassNameOpt: String) -> (javaClassName: String, swiftName: String) {
@@ -380,7 +380,7 @@ extension JavaToSwift {
380380
return (false, .init())
381381
case .amend:
382382
let configPath = actualOutputDirectory
383-
return (true, try readConfiguration(sourceDir: "file://" + configPath.path))
383+
return (true, try readConfiguration(sourceDir: configPath.path))
384384
}
385385
}
386386
}

Sources/JavaKitConfigurationShared/Configuration.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,14 @@ public struct Configuration: Codable {
3232
/// The Java class path that should be passed along to the Java2Swift tool.
3333
public var classpath: String? = nil
3434

35+
public var classpathEntries: [String] {
36+
guard let classpath else {
37+
return []
38+
}
39+
40+
return classpath.split(separator: ":").map(String.init)
41+
}
42+
3543
/// The Java classes that should be translated to Swift. The keys are
3644
/// canonical Java class names (e.g., java.util.Vector) and the values are
3745
/// the corresponding Swift names (e.g., JavaVector).
@@ -86,6 +94,7 @@ public struct JavaDependencyDescriptor: Hashable, Codable {
8694
}
8795

8896
public func readConfiguration(sourceDir: String, file: String = #fileID, line: UInt = #line) throws -> Configuration {
97+
// Workaround since filePath is macOS 13
8998
let sourcePath =
9099
if sourceDir.hasPrefix("file://") { sourceDir } else { "file://" + sourceDir }
91100
let configFile = URL(string: sourcePath)!.appendingPathComponent("swift-java.config", isDirectory: false)

0 commit comments

Comments
 (0)