Merge branch 'master' into 1.17
This commit is contained in:
commit
cab37358ed
7 files changed
+174
-41
No files matched your search
@@ -46,6 +46,7 @@ import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
@@ -79,7 +80,8 @@ public class FileArgument
|
||||
TEXT("text", ".txt"),
|
||||
NBT("nbt", ".nbt"),
|
||||
JSON("json", ".json"),
|
||||
FOLDER("folder", "");
|
||||
FOLDER("folder", ""),
|
||||
ANY("any", "");
|
||||
|
||||
private final String id;
|
||||
private final String extension;
|
||||
@@ -118,11 +120,11 @@ public class FileArgument
|
||||
public static FileArgument from(List<Value> lv, boolean isFolder, Reason reason)
|
||||
{
|
||||
if (lv.size() < 2) throw new InternalExpressionException("File functions require path and type as first two arguments");
|
||||
Pair<String, String> resource = recognizeResource(lv.get(0), isFolder);
|
||||
String origtype = lv.get(1).getString().toLowerCase(Locale.ROOT);
|
||||
boolean shared = origtype.startsWith("shared_");
|
||||
String typeString = shared ? origtype.substring(7) : origtype; //len(shared_)
|
||||
Type type = Type.of.get(typeString);
|
||||
Pair<String, String> resource = recognizeResource(lv.get(0).getString(), isFolder, type);
|
||||
if (type==null)
|
||||
throw new InternalExpressionException("Unsupported file type: "+origtype);
|
||||
if (type==Type.FOLDER && !isFolder)
|
||||
@@ -131,18 +133,26 @@ public class FileArgument
|
||||
|
||||
}
|
||||
|
||||
public static Pair<String,String> recognizeResource(Value value, boolean isFolder)
|
||||
public static FileArgument resourceFromPath(String path, Reason reason, boolean shared)
|
||||
{
|
||||
Pair<String, String> resource = recognizeResource(path, false, Type.ANY);
|
||||
return new FileArgument(resource.getLeft(), Type.ANY,resource.getRight(), false, shared, reason);
|
||||
}
|
||||
|
||||
public static Pair<String,String> recognizeResource(String origfile, boolean isFolder, Type type)
|
||||
{
|
||||
String origfile = value.getString();
|
||||
String[] pathElements = origfile.toLowerCase(Locale.ROOT).split("[/\\\\]+");
|
||||
List<String> path = new ArrayList<>();
|
||||
String zipPath = null;
|
||||
for (String token : pathElements)
|
||||
for (int i =0; i < pathElements.length; i++ )
|
||||
{
|
||||
String token = pathElements[i];
|
||||
boolean isZip = token.endsWith(".zip");
|
||||
if (zipPath != null && isZip) throw new InternalExpressionException(token+" indicates zip access in an already zipped location "+zipPath);
|
||||
if (isZip) token = token.substring(0, token.length()-4);
|
||||
token = token.replaceAll("[^A-Za-z0-9\\-+_]", "");
|
||||
token = (type==Type.ANY && i == pathElements.length-1)? // sloppy really, but should work
|
||||
token.replaceAll("[^A-Za-z0-9\\-+_.]", ""):
|
||||
token.replaceAll("[^A-Za-z0-9\\-+_]", "");
|
||||
if (token.isEmpty()) continue;
|
||||
if (isZip) token = token + ".zip";
|
||||
path.add(token);
|
||||
@@ -180,6 +190,7 @@ public class FileArgument
|
||||
zipPath = resolve(getDescriptor(module, zipContainer));
|
||||
if (!Files.exists(zipPath) && reason != Reason.CREATE) return null; // no zip file
|
||||
try {
|
||||
if (!Files.exists(zipPath.getParent())) Files.createDirectories(zipPath.getParent());
|
||||
zfs = FileSystems.newFileSystem(URI.create("jar:"+ zipPath.toUri().toString()), env);
|
||||
}
|
||||
catch (FileSystemNotFoundException | IOException fsnfe)
|
||||
@@ -215,6 +226,23 @@ public class FileArgument
|
||||
throw new InternalExpressionException("Invalid file descriptor: "+res);
|
||||
}
|
||||
|
||||
|
||||
public boolean findPathAndApply(Module module, Consumer<Path> action)
|
||||
{
|
||||
try { synchronized (writeIOSync)
|
||||
{
|
||||
Path dataFile = toPath(module);//, resourceName, supportedTypes.get(type), isShared);
|
||||
if (dataFile == null) return false;
|
||||
createPaths(dataFile);
|
||||
action.accept(dataFile);
|
||||
} }
|
||||
finally
|
||||
{
|
||||
close();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public Stream<Path> listFiles(Module module)
|
||||
{
|
||||
Path dir = toPath(module);
|
||||
|
||||
Reference in new issue
Block a user