Skip to content

Commit 0af1732

Browse files
committed
Add JavaIO and CSV example
1 parent 00df828 commit 0af1732

34 files changed

+983
-110
lines changed

Package.swift

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,11 @@ let package = Package(
7676
targets: ["JavaKitNetwork"]
7777
),
7878

79+
.library(
80+
name: "JavaKitIO",
81+
targets: ["JavaKitIO"]
82+
),
83+
7984
.library(
8085
name: "JavaKitReflection",
8186
targets: ["JavaKitReflection"]
@@ -241,6 +246,15 @@ let package = Package(
241246
.unsafeFlags(["-I\(javaIncludePath)", "-I\(javaPlatformIncludePath)"])
242247
]
243248
),
249+
.target(
250+
name: "JavaKitIO",
251+
dependencies: ["JavaKit", "JavaKitCollection"],
252+
exclude: ["swift-java.config"],
253+
swiftSettings: [
254+
.swiftLanguageMode(.v5),
255+
.unsafeFlags(["-I\(javaIncludePath)", "-I\(javaPlatformIncludePath)"])
256+
]
257+
),
244258
.target(
245259
name: "JavaKitReflection",
246260
dependencies: ["JavaKit", "JavaKitCollection"],
@@ -448,6 +462,6 @@ let package = Package(
448462
swiftSettings: [
449463
.swiftLanguageMode(.v5)
450464
]
451-
)
465+
),
452466
]
453467
)

Samples/JavaDependencySampleApp/Package.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ let package = Package(
8686
.product(name: "JavaKit", package: "swift-java"),
8787
.product(name: "JavaKitFunction", package: "swift-java"),
8888
.product(name: "JavaKitCollection", package: "swift-java"),
89+
.product(name: "JavaKitIO", package: "swift-java"),
90+
.product(name: "JavaKitNetwork", package: "swift-java"),
8991
],
9092
exclude: ["swift-java.config"],
9193
swiftSettings: [
@@ -98,5 +100,7 @@ let package = Package(
98100
]
99101
),
100102

103+
.target(name: "JavaExample"),
104+
101105
]
102106
)

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
{
22
"classes" : {
33
"org.apache.commons.io.FilenameUtils" : "FilenameUtils",
4-
"org.apache.commons.io.IOCase" : "IOCase"
4+
"org.apache.commons.io.IOCase" : "IOCase",
5+
"org.apache.commons.csv.CSVFormat" : "CSVFormat",
6+
"org.apache.commons.csv.CSVParser" : "CSVParser",
7+
"org.apache.commons.csv.CSVRecord" : "CSVRecord"
58
},
69
"dependencies" : [
710
"org.apache.commons:commons-csv:1.12.0"

Samples/JavaDependencySampleApp/Sources/JavaDependencySample/main.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
import JavaKit
1616
import JavaKitFunction
17+
import JavaKitIO
1718
import JavaKitConfigurationShared
1819
import Foundation
1920

@@ -42,4 +43,13 @@ let ext = try! FilenameUtilsClass.getExtension(path)
4243
print("org.apache.commons.io.FilenameUtils.getExtension = \(ext)")
4344
precondition(ext == "exe")
4445

46+
let CSCFormatClass = try JavaClass<CSVFormat>()
47+
48+
let reader = StringReader("hello,example")
49+
for record in try CSCFormatClass.RFC4180.parse(reader)!.getRecords()! {
50+
for field in record.toList()! {
51+
print("Field: \(field)")
52+
}
53+
}
54+
4555
print("Done.")

Samples/JavaDependencySampleApp/Sources/JavaExample/JavaExample.swift

Whitespace-only changes.
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2024 Apple Inc. and the Swift.org project authors
6+
// Licensed under Apache License v2.0
7+
//
8+
// See LICENSE.txt for license information
9+
// See CONTRIBUTORS.txt for the list of Swift.org project authors
10+
//
11+
// SPDX-License-Identifier: Apache-2.0
12+
//
13+
//===----------------------------------------------------------------------===//
14+
15+
import JavaTypes
16+
17+
// TODO: extension JavaValue: CustomStringConvertible where JNIType == jobject? {
18+
extension JavaObject: CustomStringConvertible {
19+
public var description: String {
20+
"\(toString())"
21+
}
22+
}
23+
24+
extension JavaInteger: JavaValue {
25+
public typealias JNIType = jobject?
26+
27+
public static var jvalueKeyPath: WritableKeyPath<jvalue, JNIType> { \.l }
28+
29+
public static var javaType: JavaType {
30+
.class(package: "java.lang", name: "Integer")
31+
}
32+
33+
// FIXME: cannot implement in extension, need to fix source generator
34+
// public required init(fromJNI value: JNIType, in environment: JNIEnvironment) {
35+
// fatalError()
36+
// }
37+
38+
39+
public func getJNIValue(in environment: JNIEnvironment) -> JNIType {
40+
fatalError()
41+
}
42+
43+
public static func jniMethodCall(in environment: JNIEnvironment) -> JNIMethodCall<JNIType> {
44+
environment.interface.CallObjectMethodA
45+
}
46+
47+
public static func jniFieldGet(in environment: JNIEnvironment) -> JNIFieldGet<JNIType> {
48+
environment.interface.GetObjectField
49+
}
50+
51+
public static func jniFieldSet(in environment: JNIEnvironment) -> JNIFieldSet<JNIType> {
52+
environment.interface.SetObjectField
53+
}
54+
55+
public static func jniStaticMethodCall(in environment: JNIEnvironment) -> JNIStaticMethodCall<JNIType> {
56+
environment.interface.CallStaticObjectMethodA
57+
}
58+
59+
public static func jniStaticFieldGet(in environment: JNIEnvironment) -> JNIStaticFieldGet<JNIType> {
60+
environment.interface.GetStaticObjectField
61+
}
62+
63+
public static func jniStaticFieldSet(in environment: JNIEnvironment) -> JNIStaticFieldSet<JNIType> {
64+
environment.interface.SetStaticObjectField
65+
}
66+
67+
public static func jniNewArray(in environment: JNIEnvironment) -> JNINewArray {
68+
return { environment, size in
69+
// FIXME: Introduce a JavaString class that we can use for this.
70+
let clazz = environment.interface.FindClass(environment, "java/lang/Integer")
71+
return environment.interface.NewObjectArray(environment, size, clazz, nil)
72+
}
73+
}
74+
75+
public static func jniGetArrayRegion(in environment: JNIEnvironment) -> JNIGetArrayRegion<JNIType> {
76+
return { environment, array, start, length, outPointer in
77+
let buffer = UnsafeMutableBufferPointer(start: outPointer, count: Int(length))
78+
for i in 0..<length {
79+
buffer.initializeElement(
80+
at: Int(i),
81+
to: environment.interface.GetObjectArrayElement(environment, array, Int32(start + i))
82+
)
83+
}
84+
}
85+
}
86+
87+
public static func jniSetArrayRegion(in environment: JNIEnvironment) -> JNISetArrayRegion<JNIType> {
88+
return { environment, array, start, length, outPointer in
89+
let buffer = UnsafeBufferPointer(start: outPointer, count: Int(length))
90+
for i in start..<start + length {
91+
environment.interface.SetObjectArrayElement(environment, array, i, buffer[Int(i)])
92+
}
93+
}
94+
}
95+
96+
public static var jniPlaceholderValue: jobject? {
97+
nil
98+
}
99+
}

Sources/JavaKit/Exceptions/Throwable+Error.swift

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,7 @@
1313
//===----------------------------------------------------------------------===//
1414

1515
// Translate all Java Throwable instances in a Swift error.
16-
extension Throwable: Error, CustomStringConvertible {
17-
public var description: String {
18-
return getMessage()
19-
}
16+
extension Throwable: Error {
2017
}
2118

2219
extension JavaClass<Throwable> {
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// Auto-generated by Java-to-Swift wrapper generator.
2+
import JavaRuntime
3+
4+
@JavaInterface("java.lang.Appendable")
5+
public struct Appendable {
6+
@JavaMethod
7+
public func append(_ arg0: CharSequence?) throws -> Appendable!
8+
9+
@JavaMethod
10+
public func append(_ arg0: CharSequence?, _ arg1: Int32, _ arg2: Int32) throws -> Appendable!
11+
12+
@JavaMethod
13+
public func append(_ arg0: UInt16) throws -> Appendable!
14+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// Auto-generated by Java-to-Swift wrapper generator.
2+
import JavaRuntime
3+
4+
@JavaInterface("java.lang.CharSequence")
5+
public struct CharSequence {
6+
@JavaMethod
7+
public func length() -> Int32
8+
9+
@JavaMethod
10+
public func toString() -> String
11+
12+
@JavaMethod
13+
public func charAt(_ arg0: Int32) -> UInt16
14+
15+
@JavaMethod
16+
public func isEmpty() -> Bool
17+
18+
@JavaMethod
19+
public func subSequence(_ arg0: Int32, _ arg1: Int32) -> CharSequence!
20+
}
21+
extension JavaClass<CharSequence> {
22+
@JavaStaticMethod
23+
public func compare(_ arg0: CharSequence?, _ arg1: CharSequence?) -> Int32
24+
}

Sources/JavaKit/generated/JavaInteger.swift

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,14 @@ import JavaRuntime
33

44
@JavaClass("java.lang.Integer")
55
open class JavaInteger: JavaNumber {
6+
7+
// FIXME: this is a workaround
8+
public required init(fromJNI value: JNIType, in environment: JNIEnvironment) {
9+
fatalError()
10+
}
11+
612
@JavaMethod
7-
@_nonoverride public convenience init(_ arg0: Int32, environment: JNIEnvironment? = nil)
13+
@ _nonoverride public convenience init(_ arg0: Int32, environment: JNIEnvironment? = nil)
814

915
@JavaMethod
1016
@_nonoverride public convenience init(_ arg0: String, environment: JNIEnvironment? = nil) throws

Sources/JavaKit/generated/JavaLong.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,12 +167,18 @@ extension JavaClass<JavaLong> {
167167
@JavaStaticMethod
168168
public func rotateRight(_ arg0: Int64, _ arg1: Int32) -> Int64
169169

170+
@JavaStaticMethod
171+
public func parseLong(_ arg0: CharSequence?, _ arg1: Int32, _ arg2: Int32, _ arg3: Int32) throws -> Int64
172+
170173
@JavaStaticMethod
171174
public func parseLong(_ arg0: String, _ arg1: Int32) throws -> Int64
172175

173176
@JavaStaticMethod
174177
public func parseLong(_ arg0: String) throws -> Int64
175178

179+
@JavaStaticMethod
180+
public func parseUnsignedLong(_ arg0: CharSequence?, _ arg1: Int32, _ arg2: Int32, _ arg3: Int32) throws -> Int64
181+
176182
@JavaStaticMethod
177183
public func parseUnsignedLong(_ arg0: String, _ arg1: Int32) throws -> Int64
178184

0 commit comments

Comments
 (0)