Skip to content

Commit 8c23a23

Browse files
committed
writing swift-java.classpath per module now
1 parent 47915d2 commit 8c23a23

File tree

7 files changed

+77
-40
lines changed

7 files changed

+77
-40
lines changed

JavaKit/src/main/java/org/swift/javakit/dependencies/DependencyResolver.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
* Fetches dependencies using the Gradle resolver and returns the resulting classpath which includes
3030
* the fetched dependency and all of its dependencies.
3131
*/
32+
@UsedFromSwift
33+
@SuppressWarnings("unused")
3234
public class DependencyResolver {
3335

3436
private static final String COMMAND_OUTPUT_LINE_PREFIX_CLASSPATH = "CLASSPATH:";
@@ -48,7 +50,6 @@ public class DependencyResolver {
4850
public static String resolveDependenciesToClasspath(String projectBaseDirectoryString, String[] dependencies) throws IOException {
4951
try {
5052
simpleLog("Fetch dependencies: " + Arrays.toString(dependencies));
51-
simpleLog("Classpath: " + System.getProperty("java.class.path"));
5253
var projectBasePath = new File(projectBaseDirectoryString).toPath();
5354

5455
File projectDir = Files.createTempDirectory("java-swift-dependencies").toFile();

Plugins/Java2SwiftPlugin/Java2SwiftPlugin.swift

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -97,17 +97,23 @@ struct Java2SwiftBuildToolPlugin: SwiftJavaPluginProtocol, BuildToolPlugin {
9797
}
9898
arguments.append(configFile.path(percentEncoded: false))
9999

100-
guard let classes = config.classes else {
101-
log("Config at \(configFile) did not have 'classes' configured, skipping java2swift step.")
102-
return []
103-
}
104-
100+
// guard let classes = config.classes else {
101+
// log("Config at \(configFile) did not have 'classes' configured, skipping java2swift step.")
102+
// return []
103+
// }
104+
let classes = config.classes ?? [:]
105+
105106
/// Determine the set of Swift files that will be emitted by the Java2Swift
106107
/// tool.
107108
let outputSwiftFiles = classes.map { (javaClassName, swiftName) in
108109
let swiftNestedName = swiftName.replacingOccurrences(of: ".", with: "+")
109110
return outputDirectory.appending(path: "\(swiftNestedName).swift")
110111
}
112+
113+
arguments += [
114+
"--cache-directory",
115+
context.pluginWorkDirectoryURL.path(percentEncoded: false)
116+
]
111117

112118
// Find the Java .class files generated from prior plugins.
113119
let compiledClassFiles = sourceModule.pluginGeneratedResources.filter { url in
@@ -141,19 +147,17 @@ struct Java2SwiftBuildToolPlugin: SwiftJavaPluginProtocol, BuildToolPlugin {
141147
}
142148
}
143149

144-
guard let classes = config.classes else {
145-
log("Skipping java2swift step: Missing 'classes' key in swift-java.config at '\(configFile.path)'")
146-
return []
147-
}
148-
149150
let executable = try context.tool(named: "Java2Swift").url
150151

151152
return [
152153
.buildCommand(
153-
displayName: "Wrapping \(classes.count) Java classes target \(sourceModule.name) in Swift",
154+
displayName: "Wrapping \(classes.count) Java classes target in Swift target '\(sourceModule.name)'",
154155
executable: executable,
155156
arguments: arguments,
156-
inputFiles: [ configFile ] + compiledClassFiles,
157+
inputFiles: compiledClassFiles + [
158+
configFile,
159+
context.cachedClasspathFile(moduleName: sourceModule.name)
160+
],
157161
outputFiles: outputSwiftFiles
158162
)
159163
]

Plugins/PluginsShared/PluginUtils.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,9 @@ extension PluginContext {
7171
self.pluginWorkDirectoryURL
7272
.appending(path: "Sources")
7373
}
74+
75+
func cachedClasspathFile(moduleName: String) -> URL {
76+
self.pluginWorkDirectoryURL
77+
.appending(path: "\(moduleName)", directoryHint: .notDirectory)
78+
}
7479
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
{
22
"classes" : {
3-
3+
"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:\/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:\/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",
56
"dependencies" : [
67
"org.apache.commons:commons-csv:1.12.0"
78
]

Samples/JavaDependencySampleApp/ci-validate.sh

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,20 @@ MODULE_CONFIG_DIR=$(pwd)/Sources/$MODULE_NAME/
1212
echo "Resolve dependencies..."
1313
"$JAVASWIFT" --fetch "$MODULE_CONFIG_DIR/swift-java.config" \
1414
--module-name "$MODULE_NAME" \
15+
--cache-dir "Plugins/outputs/javadependencysampleapp/${MODULE_NAME}/destination"
1516
--output-directory "$MODULE_CONFIG_DIR"
1617

1718
#### 2) extract the config for the fetched dependency
18-
#MODULE_CONFIG_PATH="$MODULE_CONFIG_DIR/swift-java.config"
19-
#DEP_JAR_CP=$(jq .classpath "$MODULE_CONFIG_PATH")
20-
#DEP_JAR_CP=$(echo "$DEP_JAR_CP" | tr -d '"') # trim the "..."
21-
## shellcheck disable=SC2086
22-
#"$JAVASWIFT" --jar $DEP_JAR_CP \
23-
# --module-name "$MODULE_NAME" \
24-
# --java-package-filter org.apache.commons \
25-
# --existing-config amend
19+
MODULE_CONFIG_PATH="$MODULE_CONFIG_DIR/swift-java.config"
20+
DEP_JAR_CP=$(jq .classpath "$MODULE_CONFIG_PATH")
21+
DEP_JAR_CP=$(echo "$DEP_JAR_CP" | tr -d '"') # trim the "..."
22+
23+
# Import just a single class for our test purposes
24+
# shellcheck disable=SC2086
25+
"$JAVASWIFT" --jar $DEP_JAR_CP \
26+
--module-name "$MODULE_NAME" \
27+
--java-package-filter org.apache.commons.io.FilenameUtils \
28+
--existing-config amend
2629

2730
# for now in CI we just use what we have already generated and comitted in the config
2831

Sources/Java2Swift/JavaToSwift+FetchDependencies.swift

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -75,24 +75,22 @@ extension JavaToSwift {
7575
}
7676

7777
extension JavaToSwift {
78-
mutating func writeFetchDependencies(resolvedClasspath: ResolvedDependencyClasspath) throws {
79-
var configuration = Configuration()
80-
configuration.dependencies = resolvedClasspath.rootDependencies
81-
configuration.classpath = resolvedClasspath.classpath
82-
78+
mutating func writeFetchedDependenciesClasspath(
79+
moduleName: String,
80+
cacheDir: String,
81+
resolvedClasspath: ResolvedDependencyClasspath) throws {
8382
// Convert the artifact name to a module name
8483
// e.g. reactive-streams -> ReactiveStreams
85-
// TODO: Should we prefix them with `Java...`?
86-
let targetModule = artifactIDAsModuleID(resolvedClasspath.rootDependencies.first!.artifactID)
8784

88-
// Encode the configuration.
89-
let contents = try configuration.renderJSON()
85+
// The file contents are just plain
86+
let contents = resolvedClasspath.classpath
9087

9188
// Write the file
9289
try writeContents(
9390
contents,
94-
to: "swift-java.config",
95-
description: "swift-java configuration file"
91+
outputDirectoryOverride: URL(fileURLWithPath: cacheDir),
92+
to: "\(moduleName).swift-java.classpath",
93+
description: "swift-java.classpath file for module \(moduleName)"
9694
)
9795
}
9896

Sources/Java2Swift/JavaToSwift.swift

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,20 @@ struct JavaToSwift: ParsableCommand {
6262
@Option(name: .shortAndLong, help: "The directory in which to output the generated Swift files or the Java2Swift configuration file.")
6363
var outputDirectory: String? = nil
6464

65+
66+
@Option(name: .shortAndLong, help: "Directory where to write cached values (e.g. swift-java.classpath files)")
67+
var cacheDirectory: String? = nil
68+
69+
var effectiveCacheDirectory: String? {
70+
if let cacheDirectory {
71+
return cacheDirectory
72+
} else if let outputDirectory {
73+
return outputDirectory
74+
} else {
75+
return nil
76+
}
77+
}
78+
6579
@Option(name: .shortAndLong, help: "How to handle an existing swift-java.config; by default 'overwrite' by can be changed to amending a configuration")
6680
var existingConfig: ExistingConfigFileMode = .overwrite
6781
public enum ExistingConfigFileMode: String, ExpressibleByArgument, Codable {
@@ -288,10 +302,16 @@ struct JavaToSwift: ParsableCommand {
288302
environment: jvm.environment()
289303
)
290304

291-
case .fetchDependencies/*(let config)*/:
305+
case .fetchDependencies:
292306
guard let dependencies = config.dependencies else {
293307
fatalError("Configuration for fetching dependencies must have 'dependencies' defined!")
294308
}
309+
guard let moduleName = self.moduleName else {
310+
fatalError("Fetching dependencies must specify module name (--module-name)!")
311+
}
312+
guard let effectiveCacheDirectory else {
313+
fatalError("Fetching dependencies must effective cache directory! Specify --output-directory or --cache-directory")
314+
}
295315

296316
let dependencyClasspath = try fetchDependencies(
297317
moduleName: moduleName,
@@ -300,7 +320,10 @@ struct JavaToSwift: ParsableCommand {
300320
environment: jvm.environment()
301321
)
302322

303-
try writeFetchDependencies(resolvedClasspath: dependencyClasspath)
323+
try writeFetchedDependenciesClasspath(
324+
moduleName: moduleName,
325+
cacheDir: effectiveCacheDirectory,
326+
resolvedClasspath: dependencyClasspath)
304327
}
305328
} catch {
306329
// We fail like this since throwing out of the run often ends up hiding the failure reason when it is executed as SwiftPM plugin (!)
@@ -309,7 +332,8 @@ struct JavaToSwift: ParsableCommand {
309332
fatalError(message)
310333
}
311334

312-
print("[info][swift-java] " + "Done: ".green + CommandLine.arguments.joined(separator: " "))
335+
// Just for debugging so it is clear which command has finished
336+
print("[debug][swift-java] " + "Done: ".green + CommandLine.arguments.joined(separator: " ").green)
313337
}
314338

315339
private func names(from javaClassNameOpt: String) -> (javaClassName: String, swiftName: String) {
@@ -346,8 +370,9 @@ struct JavaToSwift: ParsableCommand {
346370
mutating func writeContents(
347371
_ contents: String,
348372
outputDirectoryOverride: Foundation.URL?,
349-
to filename: String, description: String) throws {
350-
guard let outputDir = actualOutputDirectory else {
373+
to filename: String,
374+
description: String) throws {
375+
guard let outputDir = (outputDirectoryOverride ?? actualOutputDirectory) else {
351376
print("// \(filename) - \(description)")
352377
print(contents)
353378
return
@@ -365,9 +390,9 @@ struct JavaToSwift: ParsableCommand {
365390

366391
// Write the file:
367392
let file = outputDir.appendingPathComponent(filename)
368-
print("[swift-java] Writing \(description) to '\(file.path)'...", terminator: "")
393+
print("[debug][swift-java] Writing \(description) to '\(file.path)'... ", terminator: "")
369394
try contents.write(to: file, atomically: true, encoding: .utf8)
370-
print(" done.".green)
395+
print("done.".green)
371396
}
372397
}
373398

0 commit comments

Comments
 (0)