Skip to content

Commit fd580ac

Browse files
committed
Merge branch 'develop'
2 parents a3d73a9 + b88885c commit fd580ac

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+744
-271
lines changed

CHANGELOG.md

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,22 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

88
## [Unreleased]
99

10+
## [0.0.24] - 2023-06-30
11+
12+
### Added
13+
14+
- Add lock factory to `File*` utilities
15+
- Add uncloseable stream utilities
16+
- Add resource utilities
17+
18+
### Changed
19+
20+
- Improve path to file conversion
21+
22+
### Fixed
23+
24+
- Fix unexpected closing of resources in FileFormatter and FileParser
25+
1026
## [0.0.23] - 2023-06-09
1127

1228
### Added
@@ -208,7 +224,8 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
208224

209225
- Initial release
210226

211-
[Unreleased]: https://github.com/nbbrd/java-io-util/compare/v0.0.23...HEAD
227+
[Unreleased]: https://github.com/nbbrd/java-io-util/compare/v0.0.24...HEAD
228+
[0.0.24]: https://github.com/nbbrd/java-io-util/compare/v0.0.23...v0.0.24
212229
[0.0.23]: https://github.com/nbbrd/java-io-util/compare/v0.0.22...v0.0.23
213230
[0.0.22]: https://github.com/nbbrd/java-io-util/compare/v0.0.21...v0.0.22
214231
[0.0.21]: https://github.com/nbbrd/java-io-util/compare/v0.0.20...v0.0.21

java-io-base/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<groupId>com.github.nbbrd.java-io-util</groupId>
77
<artifactId>java-io-parent</artifactId>
8-
<version>0.0.23</version>
8+
<version>0.0.24</version>
99
</parent>
1010

1111
<artifactId>java-io-base</artifactId>

java-io-base/src/main/java/internal/io/DecodingFileFormatter.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import java.io.InputStream;
1111
import java.nio.file.Path;
1212

13+
import static nbbrd.io.Resource.uncloseableInputStream;
14+
1315
@lombok.RequiredArgsConstructor
1416
public final class DecodingFileFormatter<T> implements FileParser<T> {
1517

@@ -45,7 +47,7 @@ public final class DecodingFileFormatter<T> implements FileParser<T> {
4547

4648
@Override
4749
public @NonNull T parseStream(@NonNull InputStream resource) throws IOException {
48-
try (InputStream decoding = decoder.applyWithIO(resource)) {
50+
try (InputStream decoding = decoder.applyWithIO(uncloseableInputStream(resource))) {
4951
return parser.parseStream(decoding);
5052
}
5153
}

java-io-base/src/main/java/internal/io/EncodingFileFormatter.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import java.io.OutputStream;
1111
import java.nio.file.Path;
1212

13+
import static nbbrd.io.Resource.uncloseableOutputStream;
14+
1315
@lombok.RequiredArgsConstructor
1416
public final class EncodingFileFormatter<T> implements FileFormatter<T> {
1517

@@ -39,7 +41,7 @@ public void formatStream(@NonNull T value, @NonNull IOSupplier<? extends OutputS
3941

4042
@Override
4143
public void formatStream(@NonNull T value, @NonNull OutputStream resource) throws IOException {
42-
try (OutputStream encoding = encoder.applyWithIO(resource)) {
44+
try (OutputStream encoding = encoder.applyWithIO(uncloseableOutputStream(resource))) {
4345
formatter.formatStream(value, encoding);
4446
}
4547
}

java-io-base/src/main/java/internal/io/FunctionalFileFormatter.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,15 @@
77
import java.io.IOException;
88
import java.io.OutputStream;
99

10+
import static nbbrd.io.Resource.uncloseableOutputStream;
11+
1012
@lombok.RequiredArgsConstructor
1113
public final class FunctionalFileFormatter<T> implements FileFormatter<T> {
1214

13-
@NonNull
14-
private final IOBiConsumer<? super T, ? super OutputStream> function;
15+
private final @NonNull IOBiConsumer<? super T, ? super OutputStream> function;
1516

1617
@Override
1718
public void formatStream(@NonNull T value, @NonNull OutputStream resource) throws IOException {
18-
function.acceptWithIO(value, resource);
19+
function.acceptWithIO(value, uncloseableOutputStream(resource));
1920
}
2021
}

java-io-base/src/main/java/internal/io/FunctionalFileParser.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,15 @@
88
import java.io.InputStream;
99
import java.util.Objects;
1010

11+
import static nbbrd.io.Resource.uncloseableInputStream;
12+
1113
@lombok.RequiredArgsConstructor
1214
public final class FunctionalFileParser<T> implements FileParser<T> {
1315

14-
@NonNull
15-
private final IOFunction<? super InputStream, ? extends T> function;
16+
private final @NonNull IOFunction<? super InputStream, ? extends T> function;
1617

1718
@Override
1819
public @NonNull T parseStream(@NonNull InputStream resource) throws IOException {
19-
return Objects.requireNonNull(function.applyWithIO(resource), "result");
20+
return Objects.requireNonNull(function.applyWithIO(uncloseableInputStream(resource)), "result");
2021
}
2122
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package internal.io;
2+
3+
import lombok.NonNull;
4+
import nbbrd.io.FileFormatter;
5+
import nbbrd.io.function.IOSupplier;
6+
7+
import java.io.File;
8+
import java.io.FileOutputStream;
9+
import java.io.IOException;
10+
import java.io.OutputStream;
11+
import java.nio.channels.Channels;
12+
import java.nio.channels.FileChannel;
13+
import java.nio.channels.FileLock;
14+
import java.nio.file.Path;
15+
import java.nio.file.StandardOpenOption;
16+
17+
import static internal.io.text.FileSystemExceptions.checkTarget;
18+
19+
@lombok.RequiredArgsConstructor
20+
public final class LockingFileFormatter<T> implements FileFormatter<T> {
21+
22+
private final @NonNull FileFormatter<T> delegate;
23+
24+
@Override
25+
public void formatFile(@NonNull T value, @NonNull File target) throws IOException {
26+
try (FileOutputStream stream = new FileOutputStream(checkTarget(target))) {
27+
try (FileLock ignore = stream.getChannel().lock()) {
28+
delegate.formatStream(value, stream);
29+
}
30+
}
31+
}
32+
33+
@Override
34+
public void formatPath(@NonNull T value, @NonNull Path target) throws IOException {
35+
try (FileChannel channel = FileChannel.open(checkTarget(target), StandardOpenOption.WRITE, StandardOpenOption.CREATE)) {
36+
try (FileLock ignore = channel.lock()) {
37+
delegate.formatStream(value, Channels.newOutputStream(channel));
38+
}
39+
}
40+
}
41+
42+
@Override
43+
public void formatStream(@NonNull T value, @NonNull IOSupplier<? extends OutputStream> target) throws IOException {
44+
delegate.formatStream(value, target);
45+
}
46+
47+
@Override
48+
public void formatStream(@NonNull T value, @NonNull OutputStream resource) throws IOException {
49+
delegate.formatStream(value, resource);
50+
}
51+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package internal.io;
2+
3+
import lombok.NonNull;
4+
import nbbrd.io.FileParser;
5+
import nbbrd.io.function.IOSupplier;
6+
7+
import java.io.File;
8+
import java.io.FileInputStream;
9+
import java.io.IOException;
10+
import java.io.InputStream;
11+
import java.nio.channels.Channels;
12+
import java.nio.channels.FileChannel;
13+
import java.nio.channels.FileLock;
14+
import java.nio.file.Path;
15+
import java.nio.file.StandardOpenOption;
16+
17+
import static internal.io.text.FileSystemExceptions.checkSource;
18+
19+
@lombok.RequiredArgsConstructor
20+
public final class LockingFileParser<T> implements FileParser<T> {
21+
22+
private final @NonNull FileParser<T> delegate;
23+
24+
@Override
25+
public @NonNull T parseFile(@NonNull File source) throws IOException {
26+
try (FileInputStream stream = new FileInputStream(checkSource(source))) {
27+
try (FileLock ignore = stream.getChannel().lock(0, Long.MAX_VALUE, true)) {
28+
return delegate.parseStream(stream);
29+
}
30+
}
31+
}
32+
33+
@Override
34+
public @NonNull T parsePath(@NonNull Path source) throws IOException {
35+
try (FileChannel channel = FileChannel.open(checkSource(source), StandardOpenOption.READ)) {
36+
try (FileLock ignore = channel.lock(0, Long.MAX_VALUE, true)) {
37+
return delegate.parseStream(Channels.newInputStream(channel));
38+
}
39+
}
40+
}
41+
42+
@Override
43+
public @NonNull T parseResource(@NonNull Class<?> type, @NonNull String name) throws IOException {
44+
return delegate.parseResource(type, name);
45+
}
46+
47+
@Override
48+
public @NonNull T parseStream(@NonNull IOSupplier<? extends InputStream> source) throws IOException {
49+
return delegate.parseStream(source);
50+
}
51+
52+
@Override
53+
public @NonNull T parseStream(@NonNull InputStream resource) throws IOException {
54+
return delegate.parseStream(resource);
55+
}
56+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package internal.io;
2+
3+
import lombok.NonNull;
4+
import nbbrd.design.MightBePromoted;
5+
6+
import java.io.Closeable;
7+
import java.io.InputStream;
8+
9+
@MightBePromoted
10+
@lombok.AllArgsConstructor
11+
public final class UncloseableInputStream extends InputStream {
12+
13+
@lombok.experimental.Delegate(excludes = Closeable.class)
14+
private final @NonNull InputStream delegate;
15+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package internal.io;
2+
3+
import lombok.NonNull;
4+
import nbbrd.design.MightBePromoted;
5+
6+
import java.io.Closeable;
7+
import java.io.IOException;
8+
import java.io.OutputStream;
9+
10+
@MightBePromoted
11+
@lombok.AllArgsConstructor
12+
public final class UncloseableOutputStream extends OutputStream {
13+
14+
@lombok.experimental.Delegate(excludes = Closeable.class)
15+
private final @NonNull OutputStream delegate;
16+
17+
@Override
18+
public void close() throws IOException {
19+
flush();
20+
super.close();
21+
}
22+
}

0 commit comments

Comments
 (0)