173 lines
6.5 KiB
Java
173 lines
6.5 KiB
Java
package de.joethei.hs.java2.praktikum.praktikum4;
|
|
|
|
import org.apache.log4j.Logger;
|
|
|
|
import java.io.*;
|
|
import java.net.ServerSocket;
|
|
import java.util.*;
|
|
import java.util.concurrent.*;
|
|
|
|
public class KlausurenServer {
|
|
|
|
private ConcurrentMap<String, TreeSet<Integer>> data = new ConcurrentHashMap<>();
|
|
private ExecutorService executorService = Executors.newCachedThreadPool();
|
|
private ServerSocket serverSocket;
|
|
|
|
private static Logger logger = Logger.getLogger("KlausurenServer");
|
|
private static Map<String, CommandHandler> commands = new HashMap<>();
|
|
|
|
static Map<String, CommandHandler> getCommands() {
|
|
return commands;
|
|
}
|
|
|
|
public static Logger getLogger() {
|
|
return logger;
|
|
}
|
|
|
|
private boolean running;
|
|
|
|
public KlausurenServer(int port) {
|
|
load();
|
|
|
|
commands.put("test", ((writer, args) -> writer.write("Hallo Welt")));
|
|
commands.put("delall", (writer, args) -> {
|
|
data.clear();
|
|
save();
|
|
});
|
|
commands.put("put", (writer, args) -> {
|
|
if (args.size() >= 3) {
|
|
TreeSet<Integer> set = new TreeSet<>();
|
|
for (int i = 2; i <= args.size() - 1; i++) {
|
|
try {
|
|
set.add(Integer.parseInt(args.get(i)));
|
|
} catch (NumberFormatException ex) {
|
|
}
|
|
}
|
|
writer.write("1 ");
|
|
if (data.containsKey(args.get(1).toLowerCase())) {
|
|
writer.write(data.get(args.get(1).toLowerCase()).toString().replace('[', ' ').replace(']', ' ').replaceAll(" ", ""));
|
|
}
|
|
data.put(args.get(1).toLowerCase(), set);
|
|
save();
|
|
} else {
|
|
writer.write("0");
|
|
}
|
|
});
|
|
commands.put("getall", (writer, args) -> {
|
|
if (!data.isEmpty()) {
|
|
writer.write("1 ");
|
|
ConcurrentMap<String, TreeSet<Integer>> set = new ConcurrentHashMap<>(data);
|
|
Set<TreeSet<Integer>> result = new HashSet<>();
|
|
|
|
set.forEach((key, value) -> set.forEach((s, integers) -> {
|
|
if (!value.equals(integers) && integers.containsAll(value)) {
|
|
set.remove(key);
|
|
}
|
|
}));
|
|
|
|
set.forEach((key, value) -> result.add(value));
|
|
|
|
result.removeIf(TreeSet::isEmpty);
|
|
|
|
writer.write(result.toString().substring(1, result.toString().length() - 1).replace(" ", ""));
|
|
} else {
|
|
writer.write("0");
|
|
}
|
|
});
|
|
commands.put("get", (writer, args) -> {
|
|
if (args.size() == 2) {
|
|
if (data.containsKey(args.get(1).toLowerCase())) {
|
|
writer.write("1 " + data.get(args.get(1).toLowerCase()).toString().replace('[', ' ').replace(']', ' ').replace(" ", ""));
|
|
} else writer.write("0");
|
|
} else writer.write("0");
|
|
});
|
|
commands.put("del", (writer, args) -> {
|
|
if (args.size() == 2) {
|
|
if (data.containsKey(args.get(1).toLowerCase())) {
|
|
writer.write("1 " + data.remove(args.get(1).toLowerCase()).toString().replace('[', ' ').replace(']', ' ').replace(" ", ""));
|
|
save();
|
|
} else writer.write("0");
|
|
} else writer.write("0");
|
|
});
|
|
commands.put("stop", ((writer, args) -> {
|
|
writer.write("1");
|
|
save();
|
|
running = false;
|
|
}));
|
|
running = true;
|
|
Runnable runnable = () -> {
|
|
try {
|
|
serverSocket = new ServerSocket(port);
|
|
logger.info("waiting for clients");
|
|
while (running) {
|
|
executorService.submit(new ClientRunnable(serverSocket.accept()));
|
|
}
|
|
executorService.shutdown();
|
|
try {
|
|
executorService.awaitTermination(1, TimeUnit.MINUTES);
|
|
} catch (InterruptedException e) {
|
|
Thread.currentThread().interrupt();
|
|
}
|
|
|
|
serverSocket.close();
|
|
logger.info("server shutdown");
|
|
Thread.currentThread().interrupt();
|
|
} catch (IOException e) {
|
|
logger.error("Fehler beim Server beenden", e.getCause());
|
|
}
|
|
|
|
};
|
|
Thread thread = new Thread(runnable);
|
|
thread.start();
|
|
}
|
|
|
|
private synchronized void load() {
|
|
FileReader fileReader = null;
|
|
try {
|
|
fileReader = new FileReader(Objects.requireNonNull(getClass().getClassLoader().getResource("praktikum4/data.txt")).getFile());
|
|
} catch (FileNotFoundException e) {
|
|
logger.error(this, e.getCause());
|
|
}
|
|
try (BufferedReader br = new BufferedReader(Objects.requireNonNull(fileReader))) {
|
|
for (String line = br.readLine(); line != null; line = br.readLine()) {
|
|
TreeSet<Integer> set = new TreeSet<>();
|
|
String[] array = line.split(":");
|
|
for (int i = 1; i <= array.length - 1; i++) {
|
|
set.add(Integer.parseInt(array[i]));
|
|
}
|
|
data.put(array[0], set);
|
|
}
|
|
} catch (IOException e) {
|
|
logger.error("Fehler beim laden der Datei", e.getCause());
|
|
}
|
|
}
|
|
|
|
private synchronized void save() {
|
|
FileOutputStream fileOutputStream;
|
|
PrintWriter printWriter = null;
|
|
try {
|
|
fileOutputStream = new FileOutputStream(Objects.requireNonNull(getClass().getClassLoader().getResource("praktikum4/data.txt")).getFile());
|
|
printWriter = new PrintWriter(fileOutputStream);
|
|
|
|
for (Map.Entry<String, TreeSet<Integer>> entry : data.entrySet()) {
|
|
StringBuilder tmp = new StringBuilder(entry.getKey());
|
|
for (int integer : entry.getValue()) {
|
|
tmp.append(":").append(integer);
|
|
}
|
|
printWriter.println(tmp.toString());
|
|
|
|
}
|
|
} catch (IOException e) {
|
|
logger.error("Fehler beim speichern", e.getCause());
|
|
} finally {
|
|
assert printWriter != null;
|
|
printWriter.close();
|
|
|
|
|
|
}
|
|
}
|
|
|
|
public static void main(String[] args) {
|
|
new KlausurenServer(Integer.parseInt(args[0]));
|
|
}
|
|
} |