diff --git a/gradle.properties b/gradle.properties index b33eec2464..032d47c158 100644 --- a/gradle.properties +++ b/gradle.properties @@ -14,7 +14,7 @@ mod_version = 0.23.999-dev # Minecraft, Fabric Loader and API and mappings versions minecraft_version_out = 25w06a minecraft_version = 25w06a -mappings_version = 25w06a+build.2 +mappings_version = 25w06a+build.4 fabric_loader_version = 0.16.10 mod_menu_version = 13.0.1 diff --git a/src/main/java/fi/dy/masa/malilib/gui/interfaces/IDirectoryCache.java b/src/main/java/fi/dy/masa/malilib/gui/interfaces/IDirectoryCache.java index dc9ea78a52..a03a83d9f9 100644 --- a/src/main/java/fi/dy/masa/malilib/gui/interfaces/IDirectoryCache.java +++ b/src/main/java/fi/dy/masa/malilib/gui/interfaces/IDirectoryCache.java @@ -1,13 +1,12 @@ package fi.dy.masa.malilib.gui.interfaces; -import java.io.File; +import java.nio.file.Path; import javax.annotation.Nullable; public interface IDirectoryCache { - // TODO -- Remove the file system; needs to deal with the FileFilter mechanism to make it compat with Path @Nullable - File getCurrentDirectoryForContext(String context); + Path getCurrentDirectoryForContext(String context); - void setCurrentDirectoryForContext(String context, File dir); + void setCurrentDirectoryForContext(String context, Path dir); } diff --git a/src/main/java/fi/dy/masa/malilib/gui/interfaces/IDirectoryNavigator.java b/src/main/java/fi/dy/masa/malilib/gui/interfaces/IDirectoryNavigator.java index f634776091..8117ad72b4 100644 --- a/src/main/java/fi/dy/masa/malilib/gui/interfaces/IDirectoryNavigator.java +++ b/src/main/java/fi/dy/masa/malilib/gui/interfaces/IDirectoryNavigator.java @@ -1,13 +1,12 @@ package fi.dy.masa.malilib.gui.interfaces; -import java.io.File; +import java.nio.file.Path; public interface IDirectoryNavigator { - // TODO -- Remove the file system; needs to deal with the FileFilter mechanism to make it compat with Path - File getCurrentDirectory(); + Path getCurrentDirectory(); - void switchToDirectory(File dir); + void switchToDirectory(Path dir); void switchToParentDirectory(); diff --git a/src/main/java/fi/dy/masa/malilib/gui/interfaces/IFileBrowserIconProvider.java b/src/main/java/fi/dy/masa/malilib/gui/interfaces/IFileBrowserIconProvider.java index 5ba151cd8b..50815b50a3 100644 --- a/src/main/java/fi/dy/masa/malilib/gui/interfaces/IFileBrowserIconProvider.java +++ b/src/main/java/fi/dy/masa/malilib/gui/interfaces/IFileBrowserIconProvider.java @@ -1,6 +1,6 @@ package fi.dy.masa.malilib.gui.interfaces; -import java.io.File; +import java.nio.file.Path; import javax.annotation.Nullable; public interface IFileBrowserIconProvider @@ -16,5 +16,5 @@ public interface IFileBrowserIconProvider IGuiIcon getIconDirectory(); @Nullable - IGuiIcon getIconForFile(File file); + IGuiIcon getIconForFile(Path file); } diff --git a/src/main/java/fi/dy/masa/malilib/gui/widgets/WidgetDirectoryEntry.java b/src/main/java/fi/dy/masa/malilib/gui/widgets/WidgetDirectoryEntry.java index a83f2495f5..b397f2fef9 100644 --- a/src/main/java/fi/dy/masa/malilib/gui/widgets/WidgetDirectoryEntry.java +++ b/src/main/java/fi/dy/masa/malilib/gui/widgets/WidgetDirectoryEntry.java @@ -1,7 +1,5 @@ package fi.dy.masa.malilib.gui.widgets; -import java.io.File; - import net.minecraft.client.gui.DrawContext; import fi.dy.masa.malilib.gui.interfaces.IDirectoryNavigator; @@ -40,7 +38,7 @@ protected boolean onMouseClickedImpl(int mouseX, int mouseY, int mouseButton) { if (this.entry.getType() == DirectoryEntryType.DIRECTORY) { - this.navigator.switchToDirectory(new File(this.entry.getDirectory(), this.entry.getName())); + this.navigator.switchToDirectory(this.entry.getDirectory().resolve(this.entry.getName())); } else { diff --git a/src/main/java/fi/dy/masa/malilib/gui/widgets/WidgetDirectoryNavigation.java b/src/main/java/fi/dy/masa/malilib/gui/widgets/WidgetDirectoryNavigation.java index ee96e5349f..afbcb310fe 100644 --- a/src/main/java/fi/dy/masa/malilib/gui/widgets/WidgetDirectoryNavigation.java +++ b/src/main/java/fi/dy/masa/malilib/gui/widgets/WidgetDirectoryNavigation.java @@ -1,6 +1,6 @@ package fi.dy.masa.malilib.gui.widgets; -import java.io.File; +import java.nio.file.Path; import java.util.Arrays; import javax.annotation.Nullable; @@ -19,16 +19,17 @@ public class WidgetDirectoryNavigation extends WidgetSearchBar { - // TODO -- Remove the file system; needs to deal with the FileFilter mechanism to make it compat with Path - protected final File currentDir; - protected final File rootDir; + //protected final File currentDir; + //protected final File rootDir; + protected final Path currentDir; + protected final Path rootDir; protected final IDirectoryNavigator navigator; protected final WidgetIcon iconRoot; protected final WidgetIcon iconUp; protected final WidgetIcon iconCreateDir; public WidgetDirectoryNavigation(int x, int y, int width, int height, - File currentDir, File rootDir, IDirectoryNavigator navigator, IFileBrowserIconProvider iconProvider) + Path currentDir, Path rootDir, IDirectoryNavigator navigator, IFileBrowserIconProvider iconProvider) { super(x, y, width, height, 0, iconProvider.getIconSearch(), LeftRight.RIGHT); diff --git a/src/main/java/fi/dy/masa/malilib/gui/widgets/WidgetFileBrowserBase.java b/src/main/java/fi/dy/masa/malilib/gui/widgets/WidgetFileBrowserBase.java index dc08695557..d7b391b869 100644 --- a/src/main/java/fi/dy/masa/malilib/gui/widgets/WidgetFileBrowserBase.java +++ b/src/main/java/fi/dy/masa/malilib/gui/widgets/WidgetFileBrowserBase.java @@ -1,12 +1,13 @@ package fi.dy.masa.malilib.gui.widgets; -import java.io.File; -import java.io.FileFilter; +import java.io.IOException; +import java.nio.file.DirectoryStream; +import java.nio.file.Files; +import java.nio.file.Path; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Locale; import javax.annotation.Nullable; import net.minecraft.client.gui.DrawContext; @@ -22,18 +23,18 @@ public abstract class WidgetFileBrowserBase extends WidgetListBase implements IDirectoryNavigator { - // TODO -- Remove the file system; needs to deal with the FileFilter mechanism to make it compat with Path - protected static final FileFilter DIRECTORY_FILTER = new FileFilterDirectories(); + protected static final PathFilter DIRECTORY_FILTER = new PathFilter(); public static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); protected final IDirectoryCache cache; - protected File currentDirectory; + //protected File currentDirectory; + protected Path currentDirectory; protected final String browserContext; protected final IFileBrowserIconProvider iconProvider; @Nullable protected WidgetDirectoryNavigation directoryNavigationWidget; public WidgetFileBrowserBase(int x, int y, int width, int height, - IDirectoryCache cache, String browserContext, File defaultDirectory, + IDirectoryCache cache, String browserContext, Path defaultDirectory, @Nullable ISelectionListener selectionListener, IFileBrowserIconProvider iconProvider) { super(x, y, width, height, selectionListener); @@ -69,7 +70,7 @@ public boolean onKeyTyped(int keyCode, int scanCode, int modifiers) else if ((keyCode == KeyCodes.KEY_RIGHT || keyCode == KeyCodes.KEY_ENTER) && this.getLastSelectedEntry() != null && this.getLastSelectedEntry().getType() == DirectoryEntryType.DIRECTORY) { - this.switchToDirectory(new File(this.getLastSelectedEntry().getDirectory(), this.getLastSelectedEntry().getName())); + this.switchToDirectory(this.getLastSelectedEntry().getDirectory().resolve(this.getLastSelectedEntry().getName())); return true; } @@ -128,9 +129,9 @@ protected void refreshBrowserEntries() { this.listContents.clear(); - File dir = this.currentDirectory; + Path dir = this.currentDirectory; - if (dir.isDirectory() && dir.canRead()) + if (Files.isDirectory(dir)) { if (this.hasFilter()) { @@ -145,7 +146,7 @@ protected void refreshBrowserEntries() this.reCreateListEntryWidgets(); } - protected void addNonFilteredContents(File dir) + protected void addNonFilteredContents(Path dir) { List list = new ArrayList<>(); @@ -160,7 +161,7 @@ protected void addNonFilteredContents(File dir) this.listContents.addAll(list); } - protected void addFilteredContents(File dir) + protected void addFilteredContents(Path dir) { String filterText = this.widgetSearchBar.getFilter(); List list = new ArrayList<>(); @@ -168,25 +169,26 @@ protected void addFilteredContents(File dir) this.listContents.addAll(list); } - protected void addFilteredContents(File dir, String filterText, List listOut, @Nullable String prefix) + protected void addFilteredContents(Path dir, String filterText, List listOut, @Nullable String prefix) { List list = new ArrayList<>(); + List subDirs = this.getSubDirectories(dir); this.addMatchingEntriesToList(this.getDirectoryFilter(), dir, list, filterText, prefix); Collections.sort(list); listOut.addAll(list); list.clear(); - for (File subDir : this.getSubDirectories(dir)) + for (Path subDir : subDirs) { String pre; if (prefix != null) { - pre = prefix + subDir.getName() + "/"; + pre = prefix + subDir.getFileName().toString() + "/"; } else { - pre = subDir.getName() + "/"; + pre = subDir.getFileName().toString() + "/"; } this.addFilteredContents(subDir, filterText, list, pre); @@ -200,34 +202,59 @@ protected void addFilteredContents(File dir, String filterText, List list, @Nullable String filterText, @Nullable String displayNamePrefix) + protected void addMatchingEntriesToList(PathFilter filter, Path dir, List list, @Nullable String filterText, @Nullable String displayNamePrefix) { - for (File file : dir.listFiles(filter)) + try (DirectoryStream stream = Files.newDirectoryStream(dir, filter)) { - String name = FileUtils.getNameWithoutExtension(file.getName().toLowerCase()); + for (Path file : stream) + { + String name = FileUtils.getNameWithoutExtension(file.getFileName().toString().toLowerCase()); + + if (filterText == null || this.matchesFilter(name, filterText)) + { + list.add(new DirectoryEntry(DirectoryEntryType.fromFile(file), dir, file.getFileName().toString(), displayNamePrefix)); + } + } + } + catch (Exception ignored) { } + } - if (filterText == null || this.matchesFilter(name, filterText)) + protected void addMatchingEntriesToList(FileFilter filter, Path dir, List list, @Nullable String filterText, @Nullable String displayNamePrefix) + { + try (DirectoryStream stream = Files.newDirectoryStream(dir, filter)) + { + for (Path file : stream) { - list.add(new DirectoryEntry(DirectoryEntryType.fromFile(file), dir, file.getName(), displayNamePrefix)); + String name = FileUtils.getNameWithoutExtension(file.getFileName().toString().toLowerCase()); + + if (filterText == null || this.matchesFilter(name, filterText)) + { + list.add(new DirectoryEntry(DirectoryEntryType.fromFile(file), dir, file.getFileName().toString(), displayNamePrefix)); + } } } + catch (Exception ignored) { } } - protected List getSubDirectories(File dir) + protected List getSubDirectories(Path dir) { - List dirs = new ArrayList<>(); + List dirs = new ArrayList<>(); - for (File file : dir.listFiles(DIRECTORY_FILTER)) + try (DirectoryStream stream = Files.newDirectoryStream(dir, DIRECTORY_FILTER)) { - dirs.add(file); + for (Path file : stream) + { + dirs.add(file); + } } + catch (Exception ignored) { } return dirs; } - protected abstract File getRootDirectory(); + protected abstract Path getRootDirectory(); - protected FileFilter getDirectoryFilter() + protected PathFilter getDirectoryFilter() { return DIRECTORY_FILTER; } @@ -247,17 +274,17 @@ protected boolean currentDirectoryIsRoot() } @Override - public File getCurrentDirectory() + public Path getCurrentDirectory() { return this.currentDirectory; } @Override - public void switchToDirectory(File dir) + public void switchToDirectory(Path dir) { this.clearSelection(); - this.currentDirectory = FileUtils.getCanonicalFileIfPossible(dir); + this.currentDirectory = FileUtils.getRealPathIfPossible(dir); this.cache.setCurrentDirectoryForContext(this.browserContext, dir); this.refreshEntries(); @@ -273,11 +300,11 @@ public void switchToRootDirectory() @Override public void switchToParentDirectory() { - File parent = this.currentDirectory.getParentFile(); + Path parent = this.currentDirectory.getParent(); if (this.currentDirectoryIsRoot() == false && parent != null && - this.currentDirectory.getAbsolutePath().contains(this.getRootDirectory().getAbsolutePath())) + this.currentDirectory.toAbsolutePath().compareTo(this.getRootDirectory().toAbsolutePath()) == 0) { this.switchToDirectory(parent); } @@ -290,11 +317,12 @@ public void switchToParentDirectory() public static class DirectoryEntry implements Comparable { private final DirectoryEntryType type; - private final File dir; + //private final File dir; + private final Path dir; private final String name; @Nullable private final String displaynamePrefix; - public DirectoryEntry(DirectoryEntryType type, File dir, String name, @Nullable String displaynamePrefix) + public DirectoryEntry(DirectoryEntryType type, Path dir, String name, @Nullable String displaynamePrefix) { this.type = type; this.dir = dir; @@ -307,7 +335,7 @@ public DirectoryEntryType getType() return this.type; } - public File getDirectory() + public Path getDirectory() { return this.dir; } @@ -328,15 +356,16 @@ public String getDisplayName() return this.displaynamePrefix != null ? this.displaynamePrefix + this.name : this.name; } - public File getFullPath() + public Path getFullPath() { - return new File(this.dir, this.name); + return this.dir.resolve(this.name); } @Override public int compareTo(DirectoryEntry other) { - return this.name.toLowerCase(Locale.US).compareTo(other.getName().toLowerCase(Locale.US)); + //return this.name.toLowerCase(Locale.US).compareTo(other.getName().toLowerCase(Locale.US)); + return this.name.toLowerCase().compareTo(other.getName().toLowerCase()); } } @@ -346,23 +375,28 @@ public enum DirectoryEntryType DIRECTORY, FILE; - public static DirectoryEntryType fromFile(File file) + public static DirectoryEntryType fromFile(Path file) { - if (file.exists() == false) + if (!Files.exists(file)) { return INVALID; } - else if (file.isDirectory()) + else if (Files.isDirectory(file)) { return DIRECTORY; } - else + else if (Files.isRegularFile(file)) { return FILE; } + else + { + return INVALID; + } } } + /* public static class FileFilterDirectories implements FileFilter { @Override @@ -371,4 +405,38 @@ public boolean accept(File pathName) return pathName.isDirectory() && pathName.getName().startsWith(".") == false; } } + */ + + public static class PathFilter implements DirectoryStream.Filter + { + @Override + public boolean accept(Path entry) throws IOException + { + try + { + return Files.isDirectory(entry) && !entry.getFileName().startsWith("."); + } + catch (Exception err) + { + throw new IOException(err.getMessage()); + } + } + } + + public static class FileFilter implements DirectoryStream.Filter + { + @Override + public boolean accept(Path entry) throws IOException + { + try + { + return Files.isRegularFile(entry) && !entry.getFileName().startsWith("."); + } + catch (Exception err) + { + throw new IOException(err.getMessage()); + } + } + } + } diff --git a/src/main/java/fi/dy/masa/malilib/util/DirectoryCreator.java b/src/main/java/fi/dy/masa/malilib/util/DirectoryCreator.java index 367fa91a17..dc36116047 100644 --- a/src/main/java/fi/dy/masa/malilib/util/DirectoryCreator.java +++ b/src/main/java/fi/dy/masa/malilib/util/DirectoryCreator.java @@ -1,18 +1,20 @@ package fi.dy.masa.malilib.util; -import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; import javax.annotation.Nullable; + import fi.dy.masa.malilib.gui.Message.MessageType; import fi.dy.masa.malilib.gui.interfaces.IDirectoryNavigator; import fi.dy.masa.malilib.interfaces.IStringConsumerFeedback; public class DirectoryCreator implements IStringConsumerFeedback { - // TODO -- Remove the file system; needs to deal with the FileFilter mechanism to make it compat with Path - protected final File dir; + //protected final File dir; + protected final Path dir; @Nullable protected final IDirectoryNavigator navigator; - public DirectoryCreator(File dir, @Nullable IDirectoryNavigator navigator) + public DirectoryCreator(Path dir, @Nullable IDirectoryNavigator navigator) { this.dir = dir; this.navigator = navigator; @@ -27,17 +29,22 @@ public boolean setString(String string) return false; } - File file = new File(this.dir, string); + //File file = new File(this.dir, string); + Path file = this.dir.resolve(string); - if (file.exists()) + if (Files.exists(file)) { - InfoUtils.showGuiOrActionBarMessage(MessageType.ERROR, "malilib.error.file_or_directory_already_exists", file.getAbsolutePath()); + InfoUtils.showGuiOrActionBarMessage(MessageType.ERROR, "malilib.error.file_or_directory_already_exists", file.toAbsolutePath()); return false; } - if (file.mkdirs() == false) + try + { + Files.createDirectory(file); + } + catch (Exception err) { - InfoUtils.showGuiOrActionBarMessage(MessageType.ERROR, "malilib.error.failed_to_create_directory", file.getAbsolutePath()); + InfoUtils.showGuiOrActionBarMessage(MessageType.ERROR, "malilib.error.failed_to_create_directory", file.toAbsolutePath()); return false; } diff --git a/src/main/java/fi/dy/masa/malilib/util/FileUtils.java b/src/main/java/fi/dy/masa/malilib/util/FileUtils.java index 53c7dcae49..92fd0f35e6 100644 --- a/src/main/java/fi/dy/masa/malilib/util/FileUtils.java +++ b/src/main/java/fi/dy/masa/malilib/util/FileUtils.java @@ -325,6 +325,17 @@ public static File getCanonicalFileIfPossible(File file) return file; } + public static Path getRealPathIfPossible(Path file) + { + try + { + file = file.toRealPath(); + } + catch (Exception ignored) { } + + return file; + } + public static String getJoinedTrailingPathElements(File file, File rootPath, int maxStringLength, String separator) { String path = "";