The new version
This commit is contained in:
@ -5,14 +5,15 @@ import java.nio.file.Files;
|
||||
import java.nio.file.InvalidPathException;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.Scanner;
|
||||
import java.util.logging.*;
|
||||
|
||||
import itmo.lab5.cli.CommandBuilder;
|
||||
import itmo.lab5.cli.CommandInvoker;
|
||||
import itmo.lab5.cli.CommandContext;
|
||||
import itmo.lab5.cli.CommandRegistry;
|
||||
import itmo.lab5.interfaces.Command;
|
||||
import itmo.lab5.cli.commands.*;
|
||||
import itmo.lab5.models.Flat;
|
||||
import itmo.lab5.parser.Reader;
|
||||
@ -38,6 +39,12 @@ public class App {
|
||||
.register("insert", new InsertCommand())
|
||||
.register("update", new UpdateCommand())
|
||||
.register("save", new SaveCommand())
|
||||
.register("execute_script", new ExecuteCommand())
|
||||
.register("print_field_ascending_number_of_rooms", new FieldCommand())
|
||||
.register("filter_less_than_view", new FilterCommand("less"))
|
||||
.register("filter_greater_than_view", new FilterCommand("greater"))
|
||||
.register("replace_if_lower", new ReplaceCommand("lower"))
|
||||
.register("replace_if_greater", new ReplaceCommand("greater"))
|
||||
.build();
|
||||
|
||||
try {
|
||||
@ -53,29 +60,23 @@ public class App {
|
||||
context.set("history", history);
|
||||
context.set("path", dataFilePath.toString());
|
||||
|
||||
var scanner = new Scanner(System.in);
|
||||
CommandInvoker invoker = new CommandInvoker(registry, context, history);
|
||||
context.set("commandInvoker", invoker);
|
||||
|
||||
var scanner = new Scanner(System.in);
|
||||
while (true) {
|
||||
System.out.print("> ");
|
||||
|
||||
String input = scanner.nextLine().trim();
|
||||
if (input.isEmpty())
|
||||
continue;
|
||||
|
||||
String[] args = input.split(" ");
|
||||
String commandName = args[0];
|
||||
Command command = registry.getByName(commandName);
|
||||
String[] commandArgs = args.length > 1 ? Arrays.copyOfRange(args, 1, args.length) : new String[0];
|
||||
|
||||
if (command != null) {
|
||||
history.add(commandName);
|
||||
var localArgs = args.length > 1 ? java.util.Arrays.copyOfRange(args, 1, args.length) : new String[0];
|
||||
var response = command.execute(localArgs, context);
|
||||
System.out.println(response);
|
||||
} else {
|
||||
System.out.println("Unknown command: " + commandName);
|
||||
}
|
||||
String response = invoker.executeCommand(commandName, commandArgs);
|
||||
System.out.println(response);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static Path getDataFileFromEnv(String envVariable) throws IOException {
|
||||
|
@ -3,7 +3,7 @@ package itmo.lab5.cli;
|
||||
import itmo.lab5.cli.helpers.History;
|
||||
import itmo.lab5.interfaces.*;
|
||||
|
||||
class CommandInvoker {
|
||||
public class CommandInvoker {
|
||||
private final CommandRegistry registry;
|
||||
private final CommandContext context;
|
||||
private final History history;
|
||||
|
61
app/src/main/java/itmo/lab5/cli/commands/ExecuteCommand.java
Normal file
61
app/src/main/java/itmo/lab5/cli/commands/ExecuteCommand.java
Normal file
@ -0,0 +1,61 @@
|
||||
package itmo.lab5.cli.commands;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.util.Scanner;
|
||||
import java.util.Set;
|
||||
import java.util.HashSet;
|
||||
|
||||
import itmo.lab5.cli.CommandInvoker;
|
||||
import itmo.lab5.cli.CommandContext;
|
||||
import itmo.lab5.interfaces.*;
|
||||
|
||||
public class ExecuteCommand implements Command {
|
||||
private static final Set<String> executingScripts = new HashSet<String>();
|
||||
|
||||
@Override
|
||||
public String execute(String args[], CommandContext context) {
|
||||
if (args.length < 1) {
|
||||
return "Usage: execute_script <file_name>";
|
||||
}
|
||||
|
||||
String fileName = args[0];
|
||||
File scriptFile = new File(fileName);
|
||||
|
||||
if (executingScripts.contains(scriptFile.getAbsolutePath())) {
|
||||
return "Error: Recursive script execution detected for file: " + fileName;
|
||||
}
|
||||
|
||||
executingScripts.add(scriptFile.getAbsolutePath());
|
||||
|
||||
try (Scanner fileScanner = new Scanner(scriptFile)) {
|
||||
CommandInvoker commandInvoker = (CommandInvoker) context.get("commandInvoker");
|
||||
StringBuilder output = new StringBuilder();
|
||||
|
||||
while (fileScanner.hasNextLine()) {
|
||||
String line = fileScanner.nextLine().trim();
|
||||
if (line.isEmpty() || line.startsWith("#")) {
|
||||
continue;
|
||||
}
|
||||
|
||||
try {
|
||||
String[] parts = line.split(" ", 2);
|
||||
String commandName = parts[0];
|
||||
String[] commandArgs = parts.length > 1 ? parts[1].split(" ") : new String[0];
|
||||
|
||||
String result = commandInvoker.executeCommand(commandName, commandArgs);
|
||||
output.append("> ").append(line).append("\n").append(result).append("\n");
|
||||
} catch (Exception e) {
|
||||
output.append("Error executing command '").append(line).append("': ")
|
||||
.append(e.getMessage()).append("\n");
|
||||
}
|
||||
}
|
||||
|
||||
return output.toString();
|
||||
} catch (FileNotFoundException e) {
|
||||
return "Error: Script file not found: " + fileName;
|
||||
} finally {
|
||||
executingScripts.remove(scriptFile.getAbsolutePath());
|
||||
}
|
||||
}
|
||||
}
|
36
app/src/main/java/itmo/lab5/cli/commands/FieldCommand.java
Normal file
36
app/src/main/java/itmo/lab5/cli/commands/FieldCommand.java
Normal file
@ -0,0 +1,36 @@
|
||||
package itmo.lab5.cli.commands;
|
||||
|
||||
import itmo.lab5.cli.CommandContext;
|
||||
import itmo.lab5.interfaces.Command;
|
||||
import itmo.lab5.models.Flat;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class FieldCommand implements Command {
|
||||
@Override
|
||||
public String execute(String args[], CommandContext context) {
|
||||
var collection = new HashMap<Integer, Flat>();
|
||||
|
||||
try {
|
||||
collection = (HashMap<Integer, Flat>) context.get("collection");
|
||||
} catch (ClassCastException e) {
|
||||
return "Can't parse collection!";
|
||||
}
|
||||
|
||||
if (collection.isEmpty() || collection.size() == 0) {
|
||||
return "Nothing to show!";
|
||||
}
|
||||
|
||||
List<Map.Entry<Integer, Flat>> sortedEntries = collection.entrySet().stream()
|
||||
.sorted(Comparator.comparingInt(entry -> entry.getValue().getNumberOfRooms()))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
sortedEntries.forEach(entry -> {
|
||||
System.out.println("Key: " + entry.getKey() +
|
||||
", Rooms: " + entry.getValue().getNumberOfRooms());
|
||||
});
|
||||
|
||||
return "";
|
||||
}
|
||||
}
|
57
app/src/main/java/itmo/lab5/cli/commands/FilterCommand.java
Normal file
57
app/src/main/java/itmo/lab5/cli/commands/FilterCommand.java
Normal file
@ -0,0 +1,57 @@
|
||||
package itmo.lab5.cli.commands;
|
||||
|
||||
import itmo.lab5.interfaces.*;
|
||||
import itmo.lab5.cli.*;
|
||||
import itmo.lab5.models.*;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.*;
|
||||
|
||||
public class FilterCommand implements Command {
|
||||
private String classificator;
|
||||
|
||||
@Override
|
||||
public String execute(String args[], CommandContext context) {
|
||||
if (args.length < 1)
|
||||
return "There's no classificator provided!";
|
||||
|
||||
var collection = new HashMap<Integer, Flat>();
|
||||
Integer threshold = null;
|
||||
List<Flat> result;
|
||||
|
||||
try {
|
||||
collection = (HashMap<Integer, Flat>) context.get("collection");
|
||||
threshold = Integer.parseInt(args[0]);
|
||||
} catch (ClassCastException e) {
|
||||
return "Can't parse collection!";
|
||||
}
|
||||
|
||||
if (collection.isEmpty() || collection.size() == 0 || threshold == null) {
|
||||
return "Nothing to show!";
|
||||
}
|
||||
|
||||
final int finalThreshold = threshold;
|
||||
if (classificator == "less") {
|
||||
result = collection.values().stream()
|
||||
.filter(flat -> flat.getView() != null && flat.getView().ordinal() < finalThreshold)
|
||||
.sorted(Comparator.comparingInt(flat -> flat.getView().ordinal()))
|
||||
.collect(Collectors.toList());
|
||||
} else {
|
||||
result = collection.values().stream()
|
||||
.filter(flat -> flat.getView() != null && flat.getView().ordinal() > finalThreshold)
|
||||
.sorted(Comparator.comparingInt(flat -> flat.getView().ordinal()))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
result.forEach(entry -> {
|
||||
System.out.println(entry);
|
||||
});
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
public FilterCommand(String classificator) {
|
||||
this.classificator = classificator;
|
||||
}
|
||||
}
|
51
app/src/main/java/itmo/lab5/cli/commands/ReplaceCommand.java
Normal file
51
app/src/main/java/itmo/lab5/cli/commands/ReplaceCommand.java
Normal file
@ -0,0 +1,51 @@
|
||||
package itmo.lab5.cli.commands;
|
||||
|
||||
import itmo.lab5.cli.CommandContext;
|
||||
import itmo.lab5.interfaces.*;
|
||||
import itmo.lab5.models.Flat;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
public class ReplaceCommand implements Command {
|
||||
private String classificator;
|
||||
|
||||
public ReplaceCommand(String classificator) {
|
||||
this.classificator = classificator;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String execute(String args[], CommandContext context) {
|
||||
var collection = new HashMap<Integer, Flat>();
|
||||
int idToUpdate;
|
||||
|
||||
HashMap<String, String> params = new HashMap<>();
|
||||
|
||||
for (String arg : args) {
|
||||
String[] parts = arg.split("=", 2);
|
||||
if (parts.length == 2)
|
||||
params.put(parts[0], parts[1]);
|
||||
}
|
||||
|
||||
if (args.length < 1)
|
||||
return "Can't get value without id!";
|
||||
|
||||
try {
|
||||
collection = (HashMap<Integer, Flat>) context.get("collection");
|
||||
} catch (ClassCastException e) {
|
||||
return "Can't parse collection!";
|
||||
}
|
||||
|
||||
try {
|
||||
idToUpdate = Integer.parseInt(args[0]);
|
||||
} catch (NumberFormatException e) {
|
||||
return "Can't parse provided id!";
|
||||
}
|
||||
|
||||
if (collection.isEmpty() || collection.size() == 0)
|
||||
return "Nothing to show!";
|
||||
|
||||
var currentFlat = collection.get(idToUpdate);
|
||||
|
||||
return "";
|
||||
}
|
||||
}
|
@ -9,6 +9,7 @@ import java.io.IOException;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.BufferedWriter;
|
||||
import java.util.HashMap;
|
||||
import java.text.SimpleDateFormat;
|
||||
|
||||
public class SaveCommand implements Command {
|
||||
@Override
|
||||
@ -30,19 +31,28 @@ public class SaveCommand implements Command {
|
||||
}
|
||||
}
|
||||
|
||||
static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
|
||||
|
||||
public String saveCollectionToFile(HashMap<Integer, Flat> flats, String filename) {
|
||||
try (FileOutputStream fos = new FileOutputStream(filename);
|
||||
OutputStreamWriter osw = new OutputStreamWriter(fos);
|
||||
BufferedWriter writer = new BufferedWriter(osw)) {
|
||||
|
||||
writer.write("id,name,x,y,area,numberOfRooms,furnish,view,transport,houseName,houseYear,houseFloors\n");
|
||||
|
||||
for (Flat flat : flats.values()) {
|
||||
String line = String.format("%d,%s,%d,%d,%.2f,%d,%s,%s,%s,%s,%d,%d\n",
|
||||
String date = "";
|
||||
|
||||
try {
|
||||
date = dateFormat.format(flat.getCreationDate()).toString();
|
||||
} catch (Exception e) {
|
||||
System.out.println(e.getMessage());
|
||||
}
|
||||
|
||||
String line = String.format("%d,%s,%d,%d,%s,%.2f,%d,%s,%s,%s,%s,%d,%d\n",
|
||||
flat.getId(),
|
||||
flat.getName(),
|
||||
flat.getCoordinates().getX(),
|
||||
flat.getCoordinates().getY(),
|
||||
date,
|
||||
flat.getArea(),
|
||||
flat.getNumberOfRooms(),
|
||||
flat.getFurnish(),
|
||||
|
@ -33,9 +33,8 @@ public class UpdateCommand implements Command {
|
||||
return "There's an error while trying to parse collection";
|
||||
}
|
||||
|
||||
if (!collection.containsKey(idToUpdate)) {
|
||||
if (!collection.containsKey(idToUpdate))
|
||||
return "No flat with ID: " + idToUpdate;
|
||||
}
|
||||
|
||||
Flat oldFlat = collection.get(idToUpdate);
|
||||
|
||||
|
Reference in New Issue
Block a user