Added storage classes - work in progress III

This commit is contained in:
Robert Vokac 2024-08-10 14:28:37 +02:00
parent 99d0b95b29
commit 2e9a1efd23
No known key found for this signature in database
GPG Key ID: C459E1E4B4A986BB
5 changed files with 174 additions and 154 deletions

View File

@ -33,6 +33,7 @@ public interface Storage {
public String cd(String path);
default String cd() {
cd("/");
mkdir("home");
cd("home");
mkdir("openeggbert");
@ -40,10 +41,14 @@ public interface Storage {
return "";
}
public String mkdir(String name);
default String mkdir(String... name) {
for(String n:name) {
public String mkdir(String argument);
default String mkdirmore(String... argument) {
// System.out.println("argumentCount=" + argument.length);
// for(String z: argument){System.out.println(z);}
if(argument.length == 0) {
return "Missing argument";
}
for(String n:argument) {
String result = mkdir(n);
if(!result.isEmpty()) {
return result;

View File

@ -65,19 +65,16 @@ public class MapStorage implements Storage {
@Override
public String cd(String path) {
String absolutePath = convertToAbsolutePathIfNeeded(path);
System.out.println("path="+path);
String absolutePath = path.equals(TWO_DOTS) ? getParentPath(workingDirectory) : convertToAbsolutePathIfNeeded(path);
if(path.equals(TWO_DOTS)) {
getParentPath(workingDirectory);
}
if (!exists(path)) {
final String msg = "Path does not exist: " + path;
if (!exists(absolutePath)) {
final String msg = "Path does not exist: " + absolutePath;
logError(msg);
return msg;
}
if (!isdir(path)) {
final String msg = "Path is not directory: " + path;
if (!isdir(absolutePath)) {
final String msg = "Path is not directory: " + absolutePath;
logError(msg);
return msg;
}
@ -95,6 +92,11 @@ public class MapStorage implements Storage {
@Override
public String mkdir(String path) {
if(path.isEmpty()) {
String msg = "Missing argument";
logError(msg);
return msg;
}
String absolutePath = convertToAbsolutePathIfNeeded(path);
final String parentPath = getParentPath(absolutePath);
if (!path.equals(SLASH) && !exists(parentPath)) {
@ -120,11 +122,12 @@ public class MapStorage implements Storage {
private static final String EIGHT_COLONS = "::::::::";
private static String getParentPath(String path) {
System.out.println("getParentPath()");
if (path == null) {
throw new OpenEggbertException("path is null");
throw new OpenEggbertException("Path is null");
}
if (path.trim().isEmpty()) {
throw new OpenEggbertException("path is empty");
throw new OpenEggbertException("Path is empty");
}
if (path.equals("/")) {

View File

@ -27,7 +27,7 @@ public interface StorageCommand {
public String getName();
StorageCommandResult execute(String commandWithArguments);
StorageCommandResult execute(String arguments);
StorageCommandLine getStorageCommandLine();
void setStorageCommandLine(StorageCommandLine storageCommandLine);

View File

@ -20,12 +20,12 @@
package com.openeggbert.lwjgl3.debugging.storage;
import com.openeggbert.storage.Storage;
import com.openeggbert.storage.map.MemoryStorage;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Scanner;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;
@ -36,23 +36,34 @@ import java.util.stream.Collectors;
*/
public class StorageCommandLine {
private String user;
private String hostname;
private Storage storage;
//
private boolean exited = false;
//
private long startNanoTime = System.nanoTime();
public String getCommandLineStart() {
return user + "@" + hostname + ":" + storage.pwd() + "$ ";
}
private String extractArgument(String arguments, int argumentIndex) {
String[] array = arguments.split(" ");
if(argumentIndex > (array.length - 1)) {
if (argumentIndex > (array.length - 1)) {
return "";
}
return array[argumentIndex];
}
private StorageCommandLine(String userIn, String hostnameIn, Storage storageIn) {
public StorageCommandLine(String userIn, String hostnameIn, Storage storageIn) {
this.user = userIn;
this.hostname = hostnameIn;
this.storage = storageIn;
addCommand("whoami", arguments -> modifyResult(result -> result.setOutput(user)));
addCommand("uptime", arguments -> modifyResult(result
addCommand("whoami", arguments -> provideOutput(result -> result.setOutput(user)));
addCommand("uptime", arguments -> provideOutput(result
-> result.setOutput(
LocalDateTime.now().toString().replace("T", " ").substring(10, 19) + " up "
+ (System.nanoTime() - startNanoTime) / 1000000000l / 60l
@ -60,31 +71,50 @@ public class StorageCommandLine {
+ ", 1 user"
)));
addCommand("hostname", arguments -> modifyResult(result -> result.setOutput(hostname)));
addCommand("uname", arguments -> modifyResult(result -> result.setOutput(
"LinuxBashCommandLinePartialEmulation"
+
((extractArgument(arguments, 0).equals("-a")) ?
(hostname + " 0.0.0 ("
+
LocalDateTime.now().toString().replace("T", " ").substring(0, 10) + ")"
)
: "")
addCommand("hostname", arguments -> provideOutput(result -> result.setOutput(hostname)));
addCommand("uname", arguments -> provideOutput(result -> result.setOutput(
"LinuxBashCommandLinePartialEmulation"
+ ((extractArgument(arguments, 0).equals("-a"))
? (hostname + " 0.0.0 ("
+ LocalDateTime.now().toString().replace("T", " ").substring(0, 10) + ")")
: "")
)));
// 12:31:18 up 2:10, 1 user
addCommand("ls", arguments -> provideOutput(result -> result.setOutput(storage
.ls()
.stream()
.map(l -> {
String[] a = l.split("/");
return a[a.length - 1];
}
).collect(Collectors.joining("\n")))));
addCommand("pwd", arguments -> provideOutput(result -> result.setOutput(storage.pwd())));
addCommand("depth", arguments -> provideOutput(result -> result.setOutput(storage.depth())));
addCommand("mkdir", arguments -> provideOutput(result
-> {
String string = storage.mkdirmore(extractArguments(arguments));
if (string.isEmpty()) {
result.setOutput("New directory was successfully created");
} else {
result.setErrorOutput("Creating new directory failed: " + string);
}
}
));
commands.keySet().stream().map(k -> commands.get(k)).forEach(c -> c.setStorageCommandLine(this));
}
private StorageCommandResult modifyResult(Consumer<StorageCommandResult> consumer) {
private String[] extractArguments(String arguments) {
return Arrays.asList(arguments.split(" ")).stream()
.filter(a->!a.isEmpty())
.toArray(String[]::new);
}
private StorageCommandResult provideOutput(Consumer<StorageCommandResult> consumer) {
StorageCommandResult result = StorageCommand.emptyNewResult();
consumer.accept(result);
@ -96,11 +126,6 @@ public class StorageCommandLine {
commands.put(storageCommand.getName(), storageCommand);
}
private String user;
private String hostname;
private Storage storage;
private boolean exited = false;
private final Map<String, StorageCommand> commands = new HashMap<>();
public String getUser() {
@ -136,81 +161,44 @@ public class StorageCommandLine {
StorageCommandResult finalResult = new StorageCommandResult();
switch (command) {
case "exit":
exited = true;
finalResult.setOutput("Exited");
break;
case "":
break;
case "ls":
String output = storage
.ls()
.stream()
.map(l -> {
String[] a = l.split("/");
return a[a.length - 1];
}
).collect(Collectors.joining("\n"));
finalResult.setOutput(output);
break;
case "pwd":
finalResult.setOutput(storage.pwd());
break;
case "depth":
finalResult.setOutput(storage.depth());
break;
case "mkdir":
if (checkArgumentCount(1, argumentCount)) {
String r = storage.mkdir(argument1.get());
if (r.isEmpty()) {
finalResult.setOutput("New directory was successfully created");
} else {
finalResult.setErrorOutput("Creating new directory failed: " + r);
}
}
break;
case "touch":
if (checkArgumentCount(1, argumentCount)) {
String result = storage.touch(argument1.get());
if (result.isEmpty()) {
finalResult.setOutput("New file was successfully created");
} else {
finalResult.setErrorOutput("Creating new directory failed: " + result);
}
String r = storage.touch(argument1.get());
if (r.isEmpty()) {
finalResult.setOutput("New file was successfully created");
} else {
finalResult.setErrorOutput("Creating new directory failed: " + r);
}
break;
case "readtext":
if (checkArgumentCount(1, argumentCount)) {
String result = storage.readtext(argument1.get());
if (result != null) {
finalResult.setOutput("Text file was successfully loaded" + "\n\n" + result);
} else {
finalResult.setErrorOutput("Loading text file failed:");
}
String rr = storage.readtext(argument1.get());
if (rr != null) {
finalResult.setOutput("Text file was successfully loaded" + "\n\n" + rr);
} else {
finalResult.setErrorOutput("Loading text file failed:");
}
break;
case "savetext":
if (checkArgumentCount(2, argumentCount)) {
String result = storage.savetext(argument1.get(), argument2.get());
if (result.isEmpty()) {
finalResult.setOutput("Text file was successfully saved");
} else {
finalResult.setErrorOutput("Saving text file failed: " + result);
}
String result = storage.savetext(argument1.get(), argument2.get());
if (result.isEmpty()) {
finalResult.setOutput("Text file was successfully saved");
} else {
finalResult.setErrorOutput("Saving text file failed: " + result);
}
break;
case "cd":
String r = argument1.isEmpty() ? storage.cd() : storage.cd(argument1.get());
if (r.isEmpty()) {
String rrr = argument1.isEmpty() ? storage.cd() : storage.cd(argument1.get());
if (rrr.isEmpty()) {
finalResult.setOutput("Changing working directory was successfully created");
} else {
finalResult.setErrorOutput("Changing working directory failed: " + r);
finalResult.setErrorOutput("Changing working directory failed: " + rrr);
}
break;
@ -218,6 +206,11 @@ public class StorageCommandLine {
finalResult.setOutput(storage.debug());
break;
case "exit":
exited = true;
finalResult.setOutput("Exited");
break;
default: {
finalResult.setErrorOutput("Unsupported command: " + command);
}
@ -225,53 +218,4 @@ public class StorageCommandLine {
return finalResult;
}
public static void main(String[] args) {
MemoryStorage memoryStorage = new MemoryStorage();
StorageCommandLine storageCommandWrapper = new StorageCommandLine("player", "openegggbert", memoryStorage);
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.print("player@openegggbert:" + memoryStorage.pwd() + "$ ");
String argument = scanner.nextLine();
StorageCommandResult result = storageCommandWrapper.execute(argument);
if (result.isError()) {
printError(result.getOutput());
} else {
print(result.getOutput());
}
if (storageCommandWrapper.isExited()) {
break;
}
}
}
private static void print(int msg) {
print(String.valueOf(msg));
}
private static void print(String msg) {
System.out.println(msg);
}
private static void printError(String msg) {
System.err.println(msg);
}
private static boolean checkArgumentCount(int wantedCount, int currentCount) {
// System.out.println("wantedCount=" + wantedCount);
// System.out.println("currentCount=" + currentCount);
boolean b = wantedCount < currentCount;
// System.out.println("b=" + b);
if (currentCount < wantedCount) {
printError("Wanted argument count is: " + wantedCount + ", but the current count of arguments is: " + currentCount);
// System.out.println("return false");
return false;
}
// System.out.println("return true");
return true;
}
}

View File

@ -0,0 +1,68 @@
///////////////////////////////////////////////////////////////////////////////////////////////
// Open Eggbert: Free recreation of the computer game Speedy Eggbert.
// Copyright (C) 2024 the original author or authors.
//
// This program is free software: you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation, either version 3
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see
// <https://www.gnu.org/licenses/> or write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
///////////////////////////////////////////////////////////////////////////////////////////////
package com.openeggbert.lwjgl3.debugging.storage;
import com.openeggbert.storage.map.MemoryStorage;
import java.util.Scanner;
/**
*
* @author robertvokac
*/
public class StorageCommandLineScanner {
private StorageCommandLineScanner() {
//Not meant to be instantiated.
}
public static void main(String[] args) {
MemoryStorage memoryStorage = new MemoryStorage();
final String user = "player";
final String hostname = "openegggbert";
StorageCommandLine storageCommandLine = new StorageCommandLine(user, hostname, memoryStorage);
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.print(storageCommandLine.getCommandLineStart());
String argument = scanner.nextLine();
StorageCommandResult result = storageCommandLine.execute(argument);
if (result.isError()) {
printError(result.getOutput());
} else {
print(result.getOutput());
}
if (storageCommandLine.isExited()) {
break;
}
}
}
private static void print(String msg) {
System.out.println(msg);
}
private static void printError(String msg) {
System.err.println(msg);
}
}