Skip to content

Commit 94c70c3

Browse files
committed
implement improved include/exclude filtering for wrap-java
1 parent 070ae87 commit 94c70c3

File tree

19 files changed

+334
-214
lines changed

19 files changed

+334
-214
lines changed

Package.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ func findJavaHome() -> String {
1414
print("JAVA_HOME = \(home)")
1515
return home
1616
}
17+
if let opts = ProcessInfo.processInfo.environment["JAVA_OPTS"] {
18+
print("JAVA_OPTS = \(opts)")
19+
}
1720

1821
// This is a workaround for envs (some IDEs) which have trouble with
1922
// picking up env variables during the build process

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
{
22
"classes" : {
33
"org.apache.commons.io.FilenameUtils" : "FilenameUtils",
4-
"org.apache.commons.io.IOCase" : "IOCase",
54
"org.apache.commons.csv.CSVFormat" : "CSVFormat",
65
"org.apache.commons.csv.CSVParser" : "CSVParser",
76
"org.apache.commons.csv.CSVRecord" : "CSVRecord"
87
},
9-
"classes-ignore" : {
10-
"org.apache.commons.csv.CSVFormat$Predefined" : "",
11-
},
8+
"filterExclude" : [
9+
"org.apache.commons.csv.CSVFormat$Predefined",
10+
],
1211
"dependencies" : [
1312
"org.apache.commons:commons-csv:1.12.0"
1413
]

Sources/SwiftJava/JVM/JavaVirtualMachine.swift

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,10 @@ public final class JavaVirtualMachine: @unchecked Sendable {
9494
allVMOptions.append("-Djava.class.path=\(pathSeparatedClassPath)")
9595
}
9696
allVMOptions.append(contentsOf: vmOptions)
97+
98+
// Append VM options from Environment
99+
allVMOptions.append(contentsOf: vmOptions)
100+
allVMOptions.append(contentsOf: Self.getSwiftJavaJVMEnvOptions())
97101

98102
// Convert the options
99103
let optionsBuffer = UnsafeMutableBufferPointer<JavaVMOption>.allocate(capacity: allVMOptions.count)
@@ -421,6 +425,24 @@ extension JavaVirtualMachine {
421425
sharedJVMPointer.classpath = []
422426
}
423427
}
428+
429+
/// Parse JVM options from the SWIFT_JAVA_JVM_OPTIONS environment variable.
430+
///
431+
/// For example, to enable verbose JNI logging you can do:
432+
/// ```
433+
/// export JAVA_OPTS="-verbose:jni"
434+
/// ```
435+
public static func getSwiftJavaJVMEnvOptions() -> [String] {
436+
guard let optionsString = ProcessInfo.processInfo.environment["JAVA_OPTS"],
437+
!optionsString.isEmpty else {
438+
return []
439+
}
440+
441+
return optionsString
442+
.split(separator: ",")
443+
.map { $0.trimmingCharacters(in: .whitespacesAndNewlines) }
444+
.filter { !$0.isEmpty }
445+
}
424446
}
425447

426448
extension JavaVirtualMachine {

Sources/SwiftJava/JavaObjectHolder.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ import CSwiftJavaJNI
1717
/// Stores a reference to a Java object, managing it as a global reference so
1818
/// that the Java virtual machine will not move or deallocate the object
1919
/// while this instance is live.
20-
public class JavaObjectHolder {
21-
public private(set) var object: jobject?
20+
public final class JavaObjectHolder {
21+
public private(set) var object: jobject? // TODO: thread-safety
2222
public let environment: JNIEnvironment
2323

2424
/// Take a reference to a Java object and promote it to a global reference

Sources/SwiftJava/generated/JavaCharacter.swift

Lines changed: 164 additions & 164 deletions
Large diffs are not rendered by default.
Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
1-
// Auto-generated by Java-to-Swift wrapper generator.
2-
import CSwiftJavaJNI
1+
// // Auto-generated by Java-to-Swift wrapper generator.
2+
// import CSwiftJavaJNI
33

4-
@JavaClass("java.lang.Enum")
5-
open class JavaEnum<T: AnyJavaObject>: JavaObject {
6-
}
4+
// @JavaClass("java.lang.Enum")
5+
// open class JavaEnum<T: AnyJavaObject>: JavaObject {
6+
// @JavaMethod
7+
// public func name() -> String
8+
9+
// @JavaMethod
10+
// public func ordinal() -> Int32
11+
// }

Sources/SwiftJava/swift-java.config

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
"java.lang.Long" : "JavaLong",
1717
"java.lang.Number" : "JavaNumber",
1818
"java.lang.Object" : "JavaObject",
19-
"java.lang.Enum" : "JavaEnum",
2019
"java.lang.RuntimeException" : "RuntimeException",
2120
"java.lang.Short" : "JavaShort",
2221
"java.lang.String" : "JavaString",

Sources/SwiftJavaConfigurationShared/Configuration.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,10 @@ public struct Configuration: Codable {
8686
public var targetCompatibility: JavaVersion?
8787

8888
/// Filter input Java types by their package prefix if set.
89-
/// Can be overriden by `--filter-java-package`.
90-
public var filterJavaPackage: String?
89+
public var filterInclude: [String]?
90+
91+
/// Exclude input Java types by their package prefix or exact match.
92+
public var filterExclude: [String]?
9193

9294
// ==== dependencies ---------------------------------------------------------
9395

Sources/SwiftJavaTool/Commands/ConfigureCommand.swift

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -103,17 +103,16 @@ extension SwiftJava.ConfigureCommand {
103103
var log = Self.log
104104
log.logLevel = .init(rawValue: self.logLevel.rawValue)!
105105

106-
107106
log.info("Run: emit configuration...")
108107
var (amendExistingConfig, configuration) = try getBaseConfigurationForWrite()
109108

110-
if let filterJavaPackage = self.commonJVMOptions.filterJavaPackage {
111-
log.debug("Generate Java->Swift type mappings. Active filter: \(filterJavaPackage)")
112-
} else if let filterJavaPackage = configuration.filterJavaPackage {
109+
if !self.commonOptions.filterInclude.isEmpty {
110+
log.debug("Generate Java->Swift type mappings. Active include filters: \(self.commonOptions.filterInclude)")
111+
} else if let filters = configuration.filterInclude, !filters.isEmpty {
113112
// take the package filter from the configuration file
114-
self.commonJVMOptions.filterJavaPackage = filterJavaPackage
113+
self.commonOptions.filterInclude = filters
115114
} else {
116-
log.debug("Generate Java->Swift type mappings. No package filter applied.")
115+
log.debug("Generate Java->Swift type mappings. No package include filter applied.")
117116
}
118117
log.debug("Classpath: \(classpathEntries)")
119118

@@ -195,10 +194,8 @@ extension SwiftJava.ConfigureCommand {
195194
let javaCanonicalName = String(entry.getName().replacing("/", with: ".")
196195
.dropLast(".class".count))
197196

198-
199-
if let filterJavaPackage = self.commonJVMOptions.filterJavaPackage,
200-
!javaCanonicalName.hasPrefix(filterJavaPackage) {
201-
// Skip classes which don't match our expected prefix
197+
guard SwiftJava.shouldImport(javaCanonicalName: javaCanonicalName, commonOptions: self.commonOptions) else {
198+
log.info("Skip importing class: \(javaCanonicalName) due to include/exclude filters")
202199
continue
203200
}
204201

Sources/SwiftJavaTool/Commands/JExtractCommand.swift

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,7 @@ extension SwiftJava {
8686

8787
extension SwiftJava.JExtractCommand {
8888
func runSwiftJavaCommand(config: inout Configuration) async throws {
89-
if let javaPackage {
90-
config.javaPackage = javaPackage
91-
}
89+
configure(&config.javaPackage, overrideWith: self.javaPackage)
9290
configure(&config.mode, overrideWith: self.mode)
9391
config.swiftModule = self.effectiveSwiftModule
9492
config.outputJavaDirectory = outputJava
@@ -136,12 +134,6 @@ extension SwiftJava.JExtractCommand {
136134
}
137135
}
138136
}
139-
140-
func configure<T>(_ setting: inout T?, overrideWith value: T?) {
141-
if let value {
142-
setting = value
143-
}
144-
}
145137
}
146138

147139
struct IncompatibleModeError: Error {

0 commit comments

Comments
 (0)