Added storage classes - work in progress II
This commit is contained in:
parent
31914ff6af
commit
99d0b95b29
@ -37,6 +37,8 @@ import com.openeggbert.mods.Mod;
|
|||||||
import com.openeggbert.mods.ModIdentification;
|
import com.openeggbert.mods.ModIdentification;
|
||||||
import com.openeggbert.screens.GameSpaceListScreen;
|
import com.openeggbert.screens.GameSpaceListScreen;
|
||||||
import com.openeggbert.screens.InitScreen;
|
import com.openeggbert.screens.InitScreen;
|
||||||
|
import com.openeggbert.storage.Storage;
|
||||||
|
import com.openeggbert.storage.StorageImplementationLoader;
|
||||||
import com.openeggbert.utils.OpenEggbertDisplayMode;
|
import com.openeggbert.utils.OpenEggbertDisplayMode;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -66,6 +68,7 @@ public class OpenEggbertGame extends Game {
|
|||||||
private AssetsTxt assets;
|
private AssetsTxt assets;
|
||||||
private ConfigDef configDef;
|
private ConfigDef configDef;
|
||||||
private OpenEggbertDisplayMode openEggbertDisplayMode = OpenEggbertDisplayMode.WINDOW;
|
private OpenEggbertDisplayMode openEggbertDisplayMode = OpenEggbertDisplayMode.WINDOW;
|
||||||
|
private Storage storage;
|
||||||
|
|
||||||
public OpenEggbertGame() {
|
public OpenEggbertGame() {
|
||||||
this(null, null);
|
this(null, null);
|
||||||
@ -80,6 +83,13 @@ public class OpenEggbertGame extends Game {
|
|||||||
this.currentDirectory = currentDirectory;
|
this.currentDirectory = currentDirectory;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Storage getStorage() {
|
||||||
|
if(storage == null) {
|
||||||
|
this.storage = StorageImplementationLoader.getStorage();
|
||||||
|
}
|
||||||
|
return storage;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void create() {
|
public void create() {
|
||||||
|
@ -63,6 +63,7 @@ public abstract class AbstractOpenEggbertScreen extends ScreenAdapter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void loadBackgroundTextureIfNeeded() {
|
private void loadBackgroundTextureIfNeeded() {
|
||||||
|
if(true) return;//todo
|
||||||
if (getBackgroundFileName().isEmpty()) {
|
if (getBackgroundFileName().isEmpty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -72,6 +72,8 @@ public class GameSpaceListScreen extends AbstractOpenEggbertScreen {
|
|||||||
Preferences prefs = Gdx.app.getPreferences("My Preferences");
|
Preferences prefs = Gdx.app.getPreferences("My Preferences");
|
||||||
prefs.putString("test", "abc");
|
prefs.putString("test", "abc");
|
||||||
prefs.flush();
|
prefs.flush();
|
||||||
|
game.getStorage().mkdir("modes");
|
||||||
|
game.getStorage().mkdir("game_spaces");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -175,6 +177,7 @@ public class GameSpaceListScreen extends AbstractOpenEggbertScreen {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void renderOpenEggbertScreen(float delta) {
|
public void renderOpenEggbertScreen(float delta) {
|
||||||
|
Gdx.app.log(getClass().getName(), game.getStorage().debug());
|
||||||
|
|
||||||
timeSeconds += Gdx.graphics.getRawDeltaTime();
|
timeSeconds += Gdx.graphics.getRawDeltaTime();
|
||||||
if (timeSeconds > 60) {
|
if (timeSeconds > 60) {
|
||||||
|
@ -89,5 +89,7 @@ public interface Storage {
|
|||||||
public boolean isdir(String name);
|
public boolean isdir(String name);
|
||||||
|
|
||||||
public String debug();
|
public String debug();
|
||||||
|
|
||||||
|
public void flush();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -120,5 +120,10 @@ public abstract class DesktopAndroidStorage implements Storage {
|
|||||||
@Override
|
@Override
|
||||||
public String debug() {
|
public String debug() {
|
||||||
throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
|
throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void flush() {
|
||||||
|
//nothing to do
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -60,11 +60,17 @@ public class MapStorage implements Storage {
|
|||||||
|
|
||||||
return workingDirectory + (workingDirectory.equals("/") ? "" : SLASH) + path;
|
return workingDirectory + (workingDirectory.equals("/") ? "" : SLASH) + path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final String TWO_DOTS = "..";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String cd(String path) {
|
public String cd(String path) {
|
||||||
String absolutePath = convertToAbsolutePathIfNeeded(path);
|
String absolutePath = convertToAbsolutePathIfNeeded(path);
|
||||||
|
|
||||||
|
if(path.equals(TWO_DOTS)) {
|
||||||
|
getParentPath(workingDirectory);
|
||||||
|
}
|
||||||
|
|
||||||
if (!exists(path)) {
|
if (!exists(path)) {
|
||||||
final String msg = "Path does not exist: " + path;
|
final String msg = "Path does not exist: " + path;
|
||||||
logError(msg);
|
logError(msg);
|
||||||
@ -324,4 +330,9 @@ public class MapStorage implements Storage {
|
|||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void flush() {
|
||||||
|
map.flush();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -28,7 +28,6 @@ import com.openeggbert.entity.common.GameFileType;
|
|||||||
import com.openeggbert.entity.common.OpenEggbertException;
|
import com.openeggbert.entity.common.OpenEggbertException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Base64;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
@ -1,203 +0,0 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// 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;
|
|
||||||
|
|
||||||
import com.openeggbert.storage.Storage;
|
|
||||||
import com.openeggbert.storage.map.MemoryStorage;
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.Scanner;
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.Data;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author robertvokac
|
|
||||||
*/
|
|
||||||
public class StorageCommandWrapper {
|
|
||||||
|
|
||||||
private StorageCommandWrapper(String userIn, String hostnameIn, Storage storageIn) {
|
|
||||||
this.user = userIn;
|
|
||||||
this.hostname = hostnameIn;
|
|
||||||
this.storage = storageIn;
|
|
||||||
}
|
|
||||||
private String user;
|
|
||||||
private String hostname;
|
|
||||||
private Storage storage;
|
|
||||||
|
|
||||||
// @AllArgsConstructor
|
|
||||||
// @Data
|
|
||||||
// class StorageCommandWrapperResult {
|
|
||||||
//
|
|
||||||
// private String output;
|
|
||||||
// private boolean error;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public StorageCommandWrapperResult execute(String commandWithArguments) {
|
|
||||||
// return null;
|
|
||||||
// }
|
|
||||||
|
|
||||||
public static void main(String[] args) {
|
|
||||||
|
|
||||||
Scanner scanner = new Scanner(System.in);
|
|
||||||
|
|
||||||
MemoryStorage memoryStorage = new MemoryStorage();
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
System.out.print("player@openegggbert:" + memoryStorage.pwd() + "$ ");
|
|
||||||
String argument = scanner.nextLine();
|
|
||||||
String[] arguments = argument.split(" ");
|
|
||||||
int argumentCount = arguments.length - 1;
|
|
||||||
//System.out.println("argumentCount=" + argumentCount);
|
|
||||||
Optional<String> argument1 = Optional.ofNullable(argumentCount >= 1 ? arguments[1] : null);
|
|
||||||
Optional<String> argument2 = Optional.ofNullable(argumentCount >= 2 ? arguments[2] : null);
|
|
||||||
String command = arguments.length == 0 ? "" : arguments[0];
|
|
||||||
|
|
||||||
switch (command) {
|
|
||||||
case "whoami":
|
|
||||||
print("player");break;
|
|
||||||
case "hostname":
|
|
||||||
print("openegggbert");break;
|
|
||||||
case "uname":
|
|
||||||
if (argumentCount == 0) {
|
|
||||||
print("LinuxBashCommandLinePartialEmulation");
|
|
||||||
} else {
|
|
||||||
if (argument1.get().equals("-a")) {
|
|
||||||
print("LinuxBashCommandLinePartialEmulation openeggbert 0.0.0 (" + LocalDateTime.now().toString().replace("T", " ").substring(0, 10) + ")");
|
|
||||||
} else {
|
|
||||||
print("LinuxBashCommandLinePartialEmulation");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case "exit":
|
|
||||||
return;
|
|
||||||
case "":
|
|
||||||
continue;
|
|
||||||
case "ls":
|
|
||||||
memoryStorage
|
|
||||||
.ls()
|
|
||||||
.stream()
|
|
||||||
.map(l->{
|
|
||||||
String[] a = l.split("/");return a[a.length-1];
|
|
||||||
}
|
|
||||||
)
|
|
||||||
.forEach(l -> print(l));
|
|
||||||
break;
|
|
||||||
case "pwd":
|
|
||||||
print(memoryStorage.pwd());
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "depth":
|
|
||||||
print(memoryStorage.depth());
|
|
||||||
break;
|
|
||||||
case "mkdir":
|
|
||||||
if (checkArgumentCount(1, argumentCount)) {
|
|
||||||
String result = memoryStorage.mkdir(argument1.get());
|
|
||||||
if (result.isEmpty()) {
|
|
||||||
System.out.println("New directory was successfully created");
|
|
||||||
} else {
|
|
||||||
System.err.println("Creating new directory failed: " + result);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case "touch":
|
|
||||||
if (checkArgumentCount(1, argumentCount)) {
|
|
||||||
String result = memoryStorage.touch(argument1.get());
|
|
||||||
if (result.isEmpty()) {
|
|
||||||
System.out.println("New file was successfully created");
|
|
||||||
} else {
|
|
||||||
System.err.println("Creating new directory failed: " + result);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case "readtext":
|
|
||||||
if (checkArgumentCount(1, argumentCount)) {
|
|
||||||
String result = memoryStorage.readtext(argument1.get());
|
|
||||||
if (result != null) {
|
|
||||||
System.out.println("Text file was successfully loaded");
|
|
||||||
System.out.println(result);
|
|
||||||
} else {
|
|
||||||
System.err.println("Loading text file failed:");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "savetext":
|
|
||||||
if (checkArgumentCount(2, argumentCount)) {
|
|
||||||
String result = memoryStorage.savetext(argument1.get(), argument2.get());
|
|
||||||
if (result.isEmpty()) {
|
|
||||||
System.out.println("Text file was successfully saved");
|
|
||||||
} else {
|
|
||||||
System.err.println("Saving text file failed: " + result);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case "cd":
|
|
||||||
String result = argument1.isEmpty() ? memoryStorage.cd() : memoryStorage.cd(argument1.get());
|
|
||||||
if (result.isEmpty()) {
|
|
||||||
System.out.println("Changing working directory was successfully created");
|
|
||||||
} else {
|
|
||||||
System.err.println("Changing working directory failed: " + result);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
case "debug":
|
|
||||||
print(memoryStorage.debug());
|
|
||||||
|
|
||||||
break;
|
|
||||||
default: {
|
|
||||||
System.err.println("Unsupported command: " + command);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,63 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// 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 java.util.function.Function;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author robertvokac
|
||||||
|
*/
|
||||||
|
public class BaseCommandLine implements StorageCommand {
|
||||||
|
|
||||||
|
private StorageCommandLine storageCommandLine = null;
|
||||||
|
private String name;
|
||||||
|
private final Function<String, StorageCommandResult> function;
|
||||||
|
|
||||||
|
public BaseCommandLine(
|
||||||
|
StorageCommandLine storageCommandLineIn, String nameIn, Function<String, StorageCommandResult> functionIn
|
||||||
|
) {
|
||||||
|
setStorageCommandLine(storageCommandLineIn);
|
||||||
|
this.name = nameIn;
|
||||||
|
this.function = functionIn;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final void setStorageCommandLine(StorageCommandLine storageCommandLineIn) {
|
||||||
|
storageCommandLine = storageCommandLineIn;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final StorageCommandLine getStorageCommandLine() {
|
||||||
|
return storageCommandLine;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StorageCommandResult execute(String commandWithArguments) {
|
||||||
|
return function.apply(commandWithArguments);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// 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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author robertvokac
|
||||||
|
*/
|
||||||
|
public interface StorageCommand {
|
||||||
|
|
||||||
|
public String getName();
|
||||||
|
|
||||||
|
StorageCommandResult execute(String commandWithArguments);
|
||||||
|
StorageCommandLine getStorageCommandLine();
|
||||||
|
|
||||||
|
void setStorageCommandLine(StorageCommandLine storageCommandLine);
|
||||||
|
static StorageCommandResult emptyNewResult() {
|
||||||
|
return new StorageCommandResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,277 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// 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.Storage;
|
||||||
|
import com.openeggbert.storage.map.MemoryStorage;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.HashMap;
|
||||||
|
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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author robertvokac
|
||||||
|
*/
|
||||||
|
public class StorageCommandLine {
|
||||||
|
|
||||||
|
private long startNanoTime = System.nanoTime();
|
||||||
|
|
||||||
|
private String extractArgument(String arguments, int argumentIndex) {
|
||||||
|
String[] array = arguments.split(" ");
|
||||||
|
if(argumentIndex > (array.length - 1)) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
return array[argumentIndex];
|
||||||
|
}
|
||||||
|
private 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
|
||||||
|
-> result.setOutput(
|
||||||
|
LocalDateTime.now().toString().replace("T", " ").substring(10, 19) + " up "
|
||||||
|
+ (System.nanoTime() - startNanoTime) / 1000000000l / 60l
|
||||||
|
+ " minutes"
|
||||||
|
+ ", 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) + ")"
|
||||||
|
)
|
||||||
|
: "")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
)));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// 12:31:18 up 2:10, 1 user
|
||||||
|
commands.keySet().stream().map(k -> commands.get(k)).forEach(c -> c.setStorageCommandLine(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
private StorageCommandResult modifyResult(Consumer<StorageCommandResult> consumer) {
|
||||||
|
|
||||||
|
StorageCommandResult result = StorageCommand.emptyNewResult();
|
||||||
|
consumer.accept(result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addCommand(String nameIn, Function<String, StorageCommandResult> functionIn) {
|
||||||
|
StorageCommand storageCommand = new BaseCommandLine(this, nameIn, functionIn);
|
||||||
|
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() {
|
||||||
|
return user;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getHostname() {
|
||||||
|
return hostname;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Storage getStorage() {
|
||||||
|
return storage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isExited() {
|
||||||
|
return exited;
|
||||||
|
}
|
||||||
|
|
||||||
|
public StorageCommandResult execute(String commandWithArguments) {
|
||||||
|
|
||||||
|
String[] arguments = commandWithArguments.split(" ");
|
||||||
|
String command = arguments.length == 0 ? "" : arguments[0];
|
||||||
|
|
||||||
|
StorageCommand storageCommand = commands.get(command);
|
||||||
|
if (storageCommand != null) {
|
||||||
|
return storageCommand.execute(commandWithArguments.substring(command.length()));
|
||||||
|
}
|
||||||
|
|
||||||
|
int argumentCount = arguments.length - 1;
|
||||||
|
//System.out.println("argumentCount=" + argumentCount);
|
||||||
|
Optional<String> argument1 = Optional.ofNullable(argumentCount >= 1 ? arguments[1] : null);
|
||||||
|
Optional<String> argument2 = Optional.ofNullable(argumentCount >= 2 ? arguments[2] : null);
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
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:");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "cd":
|
||||||
|
String r = argument1.isEmpty() ? storage.cd() : storage.cd(argument1.get());
|
||||||
|
if (r.isEmpty()) {
|
||||||
|
finalResult.setOutput("Changing working directory was successfully created");
|
||||||
|
} else {
|
||||||
|
finalResult.setErrorOutput("Changing working directory failed: " + r);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case "debug":
|
||||||
|
finalResult.setOutput(storage.debug());
|
||||||
|
|
||||||
|
break;
|
||||||
|
default: {
|
||||||
|
finalResult.setErrorOutput("Unsupported command: " + command);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author robertvokac
|
||||||
|
*/
|
||||||
|
public class StorageCommandResult {
|
||||||
|
|
||||||
|
public StorageCommandResult() {
|
||||||
|
this("");
|
||||||
|
}
|
||||||
|
|
||||||
|
public StorageCommandResult(String output) {
|
||||||
|
this(output, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public StorageCommandResult(String output, boolean error) {
|
||||||
|
this.output = output;
|
||||||
|
this.error = error;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getOutput() {
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isError() {
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOutput(int output) {
|
||||||
|
setOutput(String.valueOf(output));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setErrorOutput(String output) {
|
||||||
|
this.output = output;
|
||||||
|
setError(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOutput(String output) {
|
||||||
|
this.output = output;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setError(boolean error) {
|
||||||
|
this.error = error;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String output;
|
||||||
|
private boolean error;
|
||||||
|
}
|
Reference in New Issue
Block a user