diff --git a/jre_emul/Classes/java/nio/file/attribute/FileTime.java b/jre_emul/Classes/java/nio/file/attribute/FileTime.java index 61100c82c6..16d290bea7 100644 --- a/jre_emul/Classes/java/nio/file/attribute/FileTime.java +++ b/jre_emul/Classes/java/nio/file/attribute/FileTime.java @@ -17,6 +17,7 @@ package java.nio.file.attribute; +import java.time.Instant; import java.util.concurrent.TimeUnit; /** @@ -52,6 +53,40 @@ public static FileTime fromMillis(long value) { return new FileTime(value); } + public native Instant toInstant() /*-[ + id p = [JavaNioFileAttributeFileTime getProvider]; + if (p) { + return [p toInstantWithJavaNioFileAttributeFileTime:self]; + } + @throw create_JavaLangUnsupportedOperationException_initWithNSString_(@"java.time is not available"); + ]-*/; + + public static FileTime from(Instant instant) { + return getProvider().fromInstant(instant); + } + + private static Provider provider; + + private static Provider getProvider() { + if (provider == null) { + try { + Class.forName("java.nio.file.attribute.FileTimeProvider").newInstance(); + } catch (Exception e) { + throw new UnsupportedOperationException("java.time is not available", e); + } + } + return provider; + } + + public interface Provider { + Object toInstant(FileTime fileTime); + FileTime fromInstant(Object instant); + } + + public static void setProvider(Provider p) { + provider = p; + } + @Override public int compareTo(FileTime o) { if (o.millis < millis) { diff --git a/jre_emul/Classes/java/nio/file/attribute/FileTimeProvider.java b/jre_emul/Classes/java/nio/file/attribute/FileTimeProvider.java new file mode 100644 index 0000000000..99c62367bb --- /dev/null +++ b/jre_emul/Classes/java/nio/file/attribute/FileTimeProvider.java @@ -0,0 +1,19 @@ +package java.nio.file.attribute; + +import java.time.Instant; + +public class FileTimeProvider implements FileTime.Provider { + public FileTimeProvider() { + FileTime.setProvider(this); + } + + @Override + public Object toInstant(FileTime fileTime) { + return Instant.ofEpochMilli(fileTime.toMillis()); + } + + @Override + public FileTime fromInstant(Object instant) { + return FileTime.fromMillis(((Instant) instant).toEpochMilli()); + } +}