From fbf07a46408a5601b9342af1f781a9eb81bb93e2 Mon Sep 17 00:00:00 2001 From: ElinRin Date: Wed, 17 Dec 2014 08:47:02 +0300 Subject: [PATCH 01/13] =?UTF-8?q?=D0=94=D0=B5=D0=BD=D0=B8=D1=81=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=20=D0=AD=D0=BB=D0=B8=D0=BD=D0=B0=20396=20JUnit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../elina_denisova/j_unit/Commands.java | 35 ++ .../j_unit/HandlerException.java | 15 + .../j_unit/InteractiveParse.java | 30 ++ .../elina_denisova/j_unit/MyTable.java | 311 ++++++++++++++++++ .../j_unit/MyTableProvider.java | 149 +++++++++ .../j_unit/MyTableProviderFactory.java | 15 + .../elina_denisova/j_unit/PackageParse.java | 32 ++ .../elina_denisova/j_unit/ParserCommands.java | 178 ++++++++++ .../elina_denisova/j_unit/Runner.java | 30 ++ .../test/MyTableProviderFactoryTest.java | 40 +++ .../j_unit/test/MyTableProviderTest.java | 69 ++++ .../j_unit/test/MyTableTest.java | 151 +++++++++ 12 files changed, 1055 insertions(+) create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/j_unit/Commands.java create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/j_unit/HandlerException.java create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/j_unit/InteractiveParse.java create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProvider.java create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProviderFactory.java create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/j_unit/PackageParse.java create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/j_unit/ParserCommands.java create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/j_unit/Runner.java create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableProviderFactoryTest.java create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableProviderTest.java create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableTest.java diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/Commands.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/Commands.java new file mode 100644 index 000000000..664f3b938 --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/Commands.java @@ -0,0 +1,35 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit; + +public enum Commands { + + CREATECOMMAND("create"), + COMMITCOMMAND("commit"), + ROLLBACKCOMMAND("rollback"), + DROPCOMMAND("drop"), + USECOMMAND("use"), + SHOWCOMMAND("show"), + PUTCOMMAND("put"), + GETCOMMAND("get"), + REMOVECOMMAND("remove"), + LISTCOMMAND("list"), + EXITCOMMAND("exit"); + + + private String value; + private Commands(String word) { + value = word; + } + + public static Commands getCommand(String word) throws IllegalArgumentException { + for (Commands command : Commands.values()) { + if (command.getValue().equals(word)) { + return command; + } + } + throw new IllegalArgumentException(word + " - unknown command"); + } + + public String getValue() { + return value; + } +} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/HandlerException.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/HandlerException.java new file mode 100644 index 000000000..1a663ddff --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/HandlerException.java @@ -0,0 +1,15 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit; + +public class HandlerException { + public static void handler(String message, Throwable cause) { + System.err.println(message + cause.getMessage()); + System.exit(1); + } + public static void handler(Throwable cause) { + System.err.println(cause.getMessage()); + System.exit(1); + } + +} + + diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/InteractiveParse.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/InteractiveParse.java new file mode 100644 index 000000000..540aa0b82 --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/InteractiveParse.java @@ -0,0 +1,30 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit; + +import java.util.Scanner; + +public class InteractiveParse { + public static void parse(MyTableProvider directory) { + Scanner in = new Scanner(System.in); + try { + while (true) { + System.out.print("$ "); + String s; + s = in.nextLine(); + s = s.trim(); + String[] current = s.split("\\s+"); + for (int i = 0; i < current.length; ++i) { + current[i].trim(); + } + ParserCommands.commandsExecution(current, directory); + } + } catch (IllegalMonitorStateException e) { + in.close(); + System.out.println("Goodbye"); + System.exit(0); + } catch (Exception e) { + in.close(); + HandlerException.handler("InteractiveParse: Unknown error", e); + } + in.close(); + } +} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java new file mode 100644 index 000000000..f9019199b --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java @@ -0,0 +1,311 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit; + +import ru.fizteh.fivt.storage.strings.Table; + +import java.io.*; +import java.nio.file.DirectoryNotEmptyException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MyTable implements Table { + + private Path mainDir; + private Map> databases; + private static Map> changes = new HashMap<>(); + private int numberChanges = 0; + + public MyTable(File tableDir) { + try { + databases = new HashMap<>(); + mainDir = tableDir.toPath(); + + for (int i = 0; i < 16; i++) { + File subDir = new File(tableDir, i + ".dir"); + for (int j = 0; j < 16; j++) { + File dbFile = new File(subDir, j + ".dat"); + if (dbFile.exists()) { + String adds = Integer.toString(i * 100 + j); + databases.put(adds, new HashMap()); + readFromFile(dbFile, databases.get(adds)); + } + } + } + } catch (Exception e) { + HandlerException.handler("TableProvider: Unknown error", e); + } + } + + public boolean containsKey(String adds) { + return databases.containsKey(adds); + } + + @Override + public String getName() { + return mainDir.toString(); + }; + + @Override + public String get(String key) throws IllegalArgumentException { + if (key != null) { + int hashCode = Math.abs(key.hashCode()); + int dir = hashCode % 16; + int file = hashCode / 16 % 16; + String adds = Integer.toString(dir * 100 + file); + return databases.get(adds).get(key); + } + else { + throw new IllegalArgumentException("Table.get: Haven't key. "); + } + } + + @Override + public String put(String key, String value) { + if ((key != null) || (value != null)) { + try { + int hashCode = Math.abs(key.hashCode()); + int dir = hashCode % 16; + int file = hashCode / 16 % 16; + String adds = Integer.toString(dir * 100 + file); + if (!databases.containsKey(adds)) { + File subDir = new File(mainDir.toString(), dir + ".dir"); + if (!subDir.exists()) { + if (!subDir.mkdir()) { + throw new UnsupportedOperationException("ParserCommands.commandsExecution.put:" + + " Unable to create directories in working catalog"); + } + } + File dbFile = new File(subDir, file + ".dat"); + if (!dbFile.exists()) { + if (!dbFile.createNewFile()) { + throw new UnsupportedOperationException("ParserCommands.commandsExecution.put:" + + " Unable to create database files in working catalog"); + } + } + databases.put(adds, new HashMap()); + } + + String oldValue = databases.get(adds).get(key); + databases.get(adds).put(key, value); + numberChanges++; + changes.put(numberChanges, new ArrayList()); + changes.get(numberChanges).add("put"); + changes.get(numberChanges).add(key); + changes.get(numberChanges).add(value); + if (oldValue == null) { + changes.get(numberChanges).add("new"); + } else { + changes.get(numberChanges).add(oldValue); + } + return oldValue; + + + } catch (IOException e) { + throw new NullPointerException("MyTable.put: Cannot create new file. "); + } + } else { + throw new IllegalArgumentException("MyTable.put: Haven't key or value. "); + } + } + + @Override + public String remove(String key) { + if (key != null) { + int hashCode = Math.abs(key.hashCode()); + int dir = hashCode % 16; + int file = hashCode / 16 % 16; + String adds = Integer.toString(dir * 100 + file); + if (!databases.containsKey(adds)) { + return null; + } else { + String oldValue = databases.get(adds).get(key); + databases.get(adds).remove(key); + numberChanges++; + changes.put(numberChanges, new ArrayList()); + changes.get(numberChanges).add("remove"); + changes.get(numberChanges).add(key); + changes.get(numberChanges).add(oldValue); + return oldValue; + } + } else { + throw new IllegalArgumentException("Table.get: Haven't key. "); + } + } + + @Override + public int size() { + int answer = 0; + for (int i = 0; i < 16; i++) { + for (int j = 0; j < 16; j++) { + String adds = Integer.toString(i * 100 + j); + if (databases.containsKey(adds)) { + answer += databases.get(adds).size(); + } + } + } + return answer; + } + + @Override + public int commit() { + numberChanges = 0; + changes = new HashMap<>(); + + int count = 0; + for (int i = 0; i < 16; i++) { + for (int j = 0; j < 16; j++) { + String adds = Integer.toString(i * 100 + j); + if (databases.containsKey(adds)) { + File directory = new File(mainDir.toString(), i + ".dir"); + File dataBaseOld = new File(directory, j + ".dat"); + try { + Files.delete(dataBaseOld.toPath()); + } catch (IOException e) { + throw new RuntimeException("MyTable.writeInFile: Can't overwrite file"); + } + File dataBase = new File(directory, j + ".dat"); + try (RandomAccessFile dbFile = new RandomAccessFile(dataBase, "rw")) { + for (Map.Entry current : databases.get(adds).entrySet()) { + count++; + writeNext(dbFile, current.getKey()); + writeNext(dbFile, current.getValue()); + } + } catch (FileNotFoundException e) { + throw new RuntimeException("MyTable.writeInFile: File not found"); + } catch (IOException e) { + throw new RuntimeException("MyTable.writeInFile: Can't write to file.", e); + } + + if (databases.get(adds).size() == 0) { + File subDir = new File(mainDir.toString(), i + ".dir"); + File dbFile = new File(subDir, j + ".dat"); + try { + if (dbFile.exists()) { + Files.delete(dbFile.toPath()); + } + } catch (IOException e) { + throw new IllegalStateException("MyTable.remove: " + + "Cannot delete database file. ", e); + } + databases.remove(adds); + + int k = 0; + for (int file = 0; file < 16; file++) { + String variable_adds = Integer.toString(i * 100 + file); + if (databases.containsKey(variable_adds)) { + k++; + } + } + if (k == 16) { + try { + Files.delete(subDir.toPath()); + } catch (DirectoryNotEmptyException e) { + throw new IllegalStateException("MyTable.remove: Cannot remove table subdirectory. " + + "Redundant files", e); + } catch (IOException e) { + throw new IllegalStateException("MyTable.remove: " + + "Cannot delete database subdirectory", e); + } + } + } + } + } + } + return count; + + } + + private void writeNext(RandomAccessFile dbFile, String word) throws IOException { + try { + dbFile.writeInt(word.getBytes("UTF-8").length); + dbFile.write(word.getBytes("UTF-8")); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException("Table.writeNext: Don't supported encoding UTF-8. "); + } catch (IOException e) { + throw new RuntimeException("Table.writeNext: Can't write to database. ", e); + } + } + public void readFromFile(File dbFileName, Map data) throws IllegalArgumentException { + try (RandomAccessFile file = new RandomAccessFile(dbFileName.toString(), "r")) { + + if (file.length() > 0) { + while (file.getFilePointer() < file.length()) { + String key = readNext(file); + String value = readNext(file); + if (data.containsKey(key)) { + throw new IllegalArgumentException("Table.readFromFile: Two same keys in database file"); + } + data.put(key, value); + } + } + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } catch (IllegalArgumentException e) { + throw new RuntimeException(e); + } catch (FileNotFoundException e) { + throw new RuntimeException("Table.readFromFile: File not found", e); + } catch (IOException e) { + throw new RuntimeException(" Table.readFromFile: Problems with reading from database file " + e.toString()); + } catch (Exception e) { + throw new RuntimeException("Table.readFromFile: Unknown error", e); + } + } + + + private String readNext(RandomAccessFile dbFile) throws IOException { + try { + int wordLength = dbFile.readInt(); + byte[] word = new byte[wordLength]; + dbFile.read(word, 0, wordLength); + return new String(word, "UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new UnsupportedEncodingException("Table.readNext: UTF-8 encoding is not supported"); + } catch (IOException e) { + throw new IOException(" Table.readNext: Can't read from database " + e.toString()); + } + } + + + @Override + public int rollback() { + int count = 0; + Map> saveChanges = changes; + for (int i = saveChanges.size(); i > 0; i--) { + String[] com = new String[saveChanges.get(i).size()]; + com = saveChanges.get(i).toArray(com); + String message; + if (com[0].equals("put")) { + if (com[3].equals("new")) { + message = remove(com[1]); + } else { + message = put(com[1], com[3]); + } + } + if (com[0].equals("remove")) { + put(com[1], com[2]); + } + count++; + } + numberChanges = 0; + changes = new HashMap<>(); + return count; + } + + @Override + public List list() { + List listKey = new ArrayList<>(); + for (int i = 0; i < 16; i++) { + for (int j = 0; j < 16; j++) { + String adds = Integer.toString(i * 100 + j); + if (databases.containsKey(adds)) { + for (String key : databases.get(adds).keySet()) { + listKey.add(key); + } + } + } + } return listKey; + } +} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProvider.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProvider.java new file mode 100644 index 000000000..1617876c1 --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProvider.java @@ -0,0 +1,149 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit; + +import ru.fizteh.fivt.storage.strings.Table; +import ru.fizteh.fivt.storage.strings.TableProvider; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.nio.file.DirectoryNotEmptyException; +import java.nio.file.Files; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + + +public class MyTableProvider implements TableProvider { + + private HashMap tables; + private String using; + private File parentDirectory; + + + public MyTableProvider(String path) { + parentDirectory = new File(path); + using = null; + tables = new HashMap<>(); + + try { + if (path == null) { + throw new NullPointerException("MyTableProvider: Wrong path"); + } + if (!Files.exists(parentDirectory.toPath()) && !parentDirectory.mkdir()) { + throw new UnsupportedOperationException("MyTableProvider: Cannot create working directory"); + } + if (!parentDirectory.isDirectory()) { + throw new FileNotFoundException("MyTableProvider:" + parentDirectory.toString() + + " is not a directory"); + } + for (String childName : parentDirectory.list()) { + File childDirectory = new File(parentDirectory, childName); + if (childDirectory.isDirectory()) { + tables.put(childName, new MyTable(childDirectory)); + } else { + throw new Exception("MyTableProvider:" + childName + + " from databases directory is not a directory"); + } + } + } catch (UnsupportedOperationException e) { + HandlerException.handler(e); + } catch (NullPointerException e) { + HandlerException.handler(e); + } catch (FileNotFoundException e) { + HandlerException.handler(e); + } catch (Exception e) { + HandlerException.handler("TableProviderFactory: Unknown error", e); + } + } + + @Override + public Table getTable(String name) { + return tables.get(name); + } + + @Override + public Table createTable(String name) { + if (name == null) { + throw new IllegalArgumentException("MyTableProvider.createTable: " + + "Invalid name. "); + } + if (tables.containsKey(name)) { + return null; + } else { + File newTable = new File(parentDirectory, name); + if (!newTable.mkdir()) { + throw new UnsupportedOperationException("MyTableProvider.createTable: " + + "Unable to create working directory for new table. "); + } + tables.put(name, new MyTable(newTable)); + return tables.get(name); + } + } + + @Override + public void removeTable(String name) { + if (name == null) { + throw new IllegalArgumentException("MyTableProvider.removeTable: " + + "Invalid name. "); + } + if (tables.containsKey(name)) { + File table = new File(parentDirectory, name); + for (int i = 0; i < 16; i++) { + File subDir = new File(table, i + ".dir"); + for (int j = 0; j < 16; j++) { + String adds = Integer.toString(i * 100 + j); + if (tables.get(name).containsKey(adds)) { + File dbFile = new File(subDir, j + ".dat"); + if (dbFile.exists()) { + try { + Files.delete(dbFile.toPath()); + } catch (IOException e) { + throw new RuntimeException("MyTableProvider.removeTable: cannon delete database file", e); + } + } + } + } + if (subDir.exists()) { + try { + Files.delete(subDir.toPath()); + } catch (DirectoryNotEmptyException e) { + throw new RuntimeException("MyTableProvider.removeTable: " + + "cannot remove table subdirectory", e); + } catch (IOException e) { + throw new RuntimeException("MyTableProvider.removeTable: " + + "cannot delete database subdirectory", e); + } + } + } + try { + Files.delete(table.toPath()); + } catch (DirectoryNotEmptyException e) { + throw new RuntimeException("TableProvider.tDrop: cannot remove main table directory", e); + } catch (IOException e) { + throw new RuntimeException("TableProvider.tDrop: cannot delete main database directory", e); + } + tables.remove(name); + } else { + throw new IllegalStateException("MyTableProvider.removeTable: " + name + "doesn't exist"); + } + } + + public Table getUsing() { + return tables.get(using); + } + + public void changeUsingTable(String table) { + using = table; + } + + + public Set> entrySet() { + return tables.entrySet(); + } + + + public boolean containsKey(String key) { + return tables.containsKey(key); + } + +} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProviderFactory.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProviderFactory.java new file mode 100644 index 000000000..3f397e2c7 --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProviderFactory.java @@ -0,0 +1,15 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit; + +import ru.fizteh.fivt.storage.strings.TableProviderFactory; + +public class MyTableProviderFactory implements TableProviderFactory { + + @Override + public MyTableProvider create(String dir) { + if (dir == null) { + throw new IllegalArgumentException("MyTableProvider.create: " + dir + + " isn't a directory. "); + } + return new MyTableProvider(dir); + } +} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/PackageParse.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/PackageParse.java new file mode 100644 index 000000000..356542540 --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/PackageParse.java @@ -0,0 +1,32 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit; + +import java.util.ArrayList; + +public class PackageParse { + public static void parse(MyTableProvider directory, String[] arg) { + try { + ArrayList current = new ArrayList(); + for (int i = 0; i < arg.length; ++i) { + current.clear(); + while (i < arg.length) { + if (!(arg[i].contains(";"))) { + current.add(arg[i]); + i++; + } else { + current.add(arg[i].substring(0, arg[i].indexOf(";"))); + break; + } + } + ParserCommands.commandsExecution(current, directory); + } + directory.getUsing().commit(); + } catch (IllegalMonitorStateException e) { + System.out.println("Goodbye"); + System.exit(0); + } catch (IllegalArgumentException e) { + HandlerException.handler("PackageParse: Wrong arguments", e); + } catch (Exception e) { + HandlerException.handler("PackageParse: Unknown error", e); + } + } +} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/ParserCommands.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/ParserCommands.java new file mode 100644 index 000000000..d7ae329c3 --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/ParserCommands.java @@ -0,0 +1,178 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit; + +import java.util.ArrayList; +import java.util.Map; + +public class ParserCommands { + + private static int numberChanges = 0; + + public static void commandsExecution(String[] command, MyTableProvider directory) + throws IllegalMonitorStateException { + if (command.length == 0) { + return; + } + try { + Commands request = Commands.getCommand(command[0]); + switch (request) { + case CREATECOMMAND: + try { + if (directory.createTable(command[1]) == null) { + System.out.println(command[1] + " exists"); + } else { + System.out.println("created"); + } + } catch (UnsupportedOperationException e) { + HandlerException.handler(e); + } catch (ArrayIndexOutOfBoundsException e) { + System.err.println("create: need argument"); + } + break; + case PUTCOMMAND: + try { + if (directory.getUsing() == null) { + System.out.println("no table"); + } else { + String oldValue = directory.getUsing().put(command[1], command[2]); + if (oldValue != null) { + System.out.println("overwrite"); + System.out.println(oldValue); + } else { + System.out.println("new"); + } + numberChanges++; + } + } catch (UnsupportedOperationException e) { + HandlerException.handler(e); + } catch (ArrayIndexOutOfBoundsException e) { + System.err.println("put: need two arguments"); + } catch (NullPointerException e) { + HandlerException.handler(e); + } catch (Exception e) { + HandlerException.handler("ParserCommands.commandsExecution.put: Unknown error", e); + } + break; + case GETCOMMAND: + try { + if (directory.getUsing() == null) { + System.out.println("no table"); + } else { + if (directory.getUsing().get(command[1]) != null) { + System.out.println("found"); + System.out.println(directory.getUsing().get(command[1])); + } else { + System.out.println("not found"); + } + } + } catch (IllegalArgumentException e) { + HandlerException.handler(e); + } catch (ArrayIndexOutOfBoundsException e) { + System.err.println("get: need argument"); + } + break; + case REMOVECOMMAND: + try { + if (directory.getUsing() == null) { + System.out.println("no table"); + } else { + String oldValue = directory.getUsing().remove(command[1]); + if (oldValue != null) { + System.out.println("removed"); + numberChanges++; + } else { + System.out.println("not found"); + } + } + } catch (ArrayIndexOutOfBoundsException e) { + System.err.println("remove: need argument"); + } + break; + case DROPCOMMAND: + try { + if (directory.getTable(command[1]) == directory.getUsing()) { + numberChanges = 0; + } + directory.removeTable(command[1]); + System.out.println("dropped"); + } catch (IllegalStateException e) { + System.out.println(command[1] + " not exist"); + } catch (ArrayIndexOutOfBoundsException e) { + System.err.println("drop: need argument"); + } + break; + case COMMITCOMMAND: + directory.getUsing().commit(); + System.out.println(numberChanges); + numberChanges = 0; + break; + case ROLLBACKCOMMAND: + System.out.println(directory.getUsing().rollback()); + numberChanges = 0; + break; + case USECOMMAND: + try { + if (numberChanges == 0) { + if (!directory.containsKey(command[1])) { + System.err.println("use: " + command[1] + " not exists"); + } else { + directory.changeUsingTable(command[1]); + System.out.println("using " + command[1]); + } + } else { + System.err.println(numberChanges + " unsaved changes"); + } + } catch (ArrayIndexOutOfBoundsException e) { + System.err.println("use: need argument"); + } + break; + case SHOWCOMMAND: + try { + if (command[1].equals("tables")) { + for (Map.Entry entry: directory.entrySet()) { + String name = entry.getKey(); + + int size = entry.getValue().size(); + System.out.println(name + " " + size); + } + + } else { + throw new IllegalArgumentException(); + } + + } catch (IllegalArgumentException e) { + System.err.println(command[0] + " - unknown command"); + } + break; + case LISTCOMMAND: + if (directory.getUsing() == null) { + System.out.println("no table"); + } else { + System.out.println(directory.getUsing().list()); + } + break; + case EXITCOMMAND: + if (numberChanges == 0) { + throw new IllegalMonitorStateException("Exit"); + } else { + System.err.println(numberChanges + " unsaved changes"); + } + break; + default: + System.err.println(command[0] + " - unknown command"); + } + } catch (IllegalArgumentException e) { + System.err.println(e.toString()); + } + } + + + + public static void commandsExecution(ArrayList commands, MyTableProvider directory) { + if (commands.size() == 0) { + return; + } + String[] com = new String[commands.size()]; + com = commands.toArray(com); + commandsExecution(com, directory); + } +} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/Runner.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/Runner.java new file mode 100644 index 000000000..fcea471b7 --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/Runner.java @@ -0,0 +1,30 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit; + +public class Runner { + public static void main(String[] args) { + + try { + String path = System.getProperty("fizteh.db.dir"); + if (path == null) { + throw new NullPointerException("Runner: Directory doesn't exist"); + } + MyTableProviderFactory factory = new MyTableProviderFactory(); + MyTableProvider base = factory.create(path); + + + if (args.length == 0) { + InteractiveParse.parse(base); + } else { + PackageParse.parse(base, args); + } + } catch (IllegalArgumentException e) { + HandlerException.handler(e); + } catch (NullPointerException e) { + HandlerException.handler(e); + } catch (Exception e) { + HandlerException.handler("Runner: Unknown error", e); + } + } + +} + diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableProviderFactoryTest.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableProviderFactoryTest.java new file mode 100644 index 000000000..5e0e93534 --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableProviderFactoryTest.java @@ -0,0 +1,40 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit.test; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import ru.fizteh.fivt.storage.strings.TableProviderFactory; +import ru.fizteh.fivt.students.elina_denisova.j_unit.MyTableProviderFactory; + +import java.io.IOException; + +import static junit.framework.Assert.assertNotNull; + +public class MyTableProviderFactoryTest { + + private TableProviderFactory factory; + + @Rule + public TemporaryFolder folder = new TemporaryFolder(); + + @Before + public void before() { + factory = new MyTableProviderFactory(); + } + + @Test + public void create() throws IOException { + assertNotNull(factory.create(folder.newFolder().getCanonicalPath())); + } + + @Test(expected = IllegalArgumentException.class) + public void createWithNullArgument() { + factory.create(null); + } + + @Test(expected = IllegalArgumentException.class) + public void createWithIncorrectArgument() throws IOException { + factory.create(""); + } +} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableProviderTest.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableProviderTest.java new file mode 100644 index 000000000..6c01e5b54 --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableProviderTest.java @@ -0,0 +1,69 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit.test; + + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import ru.fizteh.fivt.storage.strings.TableProvider; +import ru.fizteh.fivt.storage.strings.TableProviderFactory; +import ru.fizteh.fivt.students.elina_denisova.j_unit.MyTableProviderFactory; + +import java.io.IOException; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +public class MyTableProviderTest { + @Rule + public TemporaryFolder folder = new TemporaryFolder(); + + public TableProvider provider; + + @Before + public void initProvider() throws IOException { + TableProviderFactory factory = new MyTableProviderFactory(); + provider = factory.create(folder.newFolder().getAbsolutePath()); + } + + @Test (expected = IllegalArgumentException.class) + public void getNullTable() { + provider.getTable(null); + } + + @Test (expected = IllegalArgumentException.class) + public void createNullTable() { + provider.createTable(null); + } + + @Test (expected = IllegalArgumentException.class) + public void removeNullTable() { + provider.removeTable(null); + } + + @Test + public void createAndGetTable() { + provider.createTable("newTable"); + assertNull(provider.getTable("notExistingTable")); + assertNotNull(provider.getTable("newTable")); + } + + @Test (expected = IllegalStateException.class) + public void removeNotExistingTable() { + provider.removeTable("notExistingTable"); + } + + @Test + public void createAndRemoveTable() { + assertNotNull(provider.createTable("newTable")); + assertNotNull(provider.getTable("newTable")); + provider.removeTable("newTable"); + assertNull(provider.getTable("newTable")); + } + + @Test + public void doubleTableCreation() { + assertNotNull(provider.createTable("newTable")); + assertNull(provider.createTable("newTable")); + } +} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableTest.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableTest.java new file mode 100644 index 000000000..d1791b411 --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableTest.java @@ -0,0 +1,151 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit.test; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import ru.fizteh.fivt.storage.strings.Table; +import ru.fizteh.fivt.storage.strings.TableProvider; +import ru.fizteh.fivt.storage.strings.TableProviderFactory; +import ru.fizteh.fivt.students.elina_denisova.j_unit.MyTableProviderFactory; + +import java.io.IOException; +import java.util.Arrays; +import java.util.LinkedList; + +import static org.junit.Assert.*; + +public class MyTableTest { + + @Rule + public TemporaryFolder folder = new TemporaryFolder(); + + public Table table; + public String dbDirPath; + + @Before + public void initTable() throws IOException { + TableProviderFactory factory = new MyTableProviderFactory(); + dbDirPath = folder.newFolder().getAbsolutePath(); + TableProvider provider = factory.create(dbDirPath); + table = provider.createTable("table"); + } + + @Test + public void testGetName() { + assertEquals("table", table.getName()); + } + + @Test (expected = IllegalArgumentException.class) + public void putNull() { + table.put(null, null); + } + + @Test (expected = IllegalArgumentException.class) + public void getNull() { + table.get(null); + } + + @Test (expected = IllegalArgumentException.class) + public void removeNull() { + table.remove(null); + } + + @Test + public void testPutAndGet() { + assertNull(table.put("1", "2")); + assertEquals("2", table.get("1")); + assertEquals("2", table.put("1", "3")); + assertEquals("3", table.get("1")); + assertNull(table.get("a")); + } + + @Test + public void testPutAndRemove() { + assertNull(table.put("1", "2")); + assertNull(table.remove("2")); + assertEquals("2", table.remove("1")); + assertNull(table.remove("1")); + assertNull(table.get("1")); + } + + @Test + public void testSize() { + assertEquals(0, table.size()); + table.put("1", "2"); + assertEquals(1, table.size()); + table.put("3", "4"); + assertEquals(2, table.size()); + table.put("3", "5"); + assertEquals(2, table.size()); + table.remove("1"); + assertEquals(1, table.size()); + table.remove("1"); + assertEquals(1, table.size()); + table.remove("3"); + assertEquals(0, table.size()); + } + + @Test + public void testList() { + assertEquals(0, table.list().size()); + table.put("1", "2"); + table.put("3", "4"); + table.put("3", "5"); + table.remove("1"); + table.put("6", "7"); + table.put("key", "value"); + assertEquals(3, table.list().size()); + assertTrue(table.list().containsAll(new LinkedList<>(Arrays.asList("3", "6", "key")))); + } + + @Test + public void testRollBack() { + assertEquals(0, table.rollback()); + table.put("1", "2"); + table.put("2", "3"); + table.put("3", "4"); + table.remove("1"); + table.put("1", "5"); + assertEquals(3, table.size()); + assertEquals(3, table.rollback()); + assertEquals(0, table.size()); + } + + @Test + public void testCommit() { + assertEquals(0, table.commit()); + table.put("1", "2"); + table.put("2", "3"); + table.put("3", "4"); + table.remove("3"); + assertEquals(2, table.commit()); + assertEquals(2, table.size()); + TableProviderFactory factory = new MyTableProviderFactory(); + TableProvider provider = factory.create(dbDirPath); + Table sameTable = provider.getTable("table"); + assertEquals(2, sameTable.size()); + } + + @Test + public void testCommitAndRollback() { + table.put("1", "2"); + table.put("2", "3"); + table.put("3", "4"); + assertEquals(3, table.commit()); + table.remove("1"); + table.remove("2"); + assertNull(table.get("1")); + assertNull(table.get("2")); + assertEquals(2, table.rollback()); + assertEquals("2", table.get("1")); + assertEquals("3", table.get("2")); + table.remove("1"); + assertEquals(1, table.commit()); + assertEquals(2, table.size()); + table.put("1", "2"); + assertEquals(3, table.size()); + assertEquals(1, table.rollback()); + assertEquals(2, table.size()); + } +} From a584f4f671b849c9427372df414f1c8216be8a72 Mon Sep 17 00:00:00 2001 From: ElinRin Date: Wed, 17 Dec 2014 09:12:16 +0300 Subject: [PATCH 02/13] ' --- .../fivt/students/elina_denisova/j_unit/MyTable.java | 7 +++---- .../students/elina_denisova/j_unit/MyTableProvider.java | 3 ++- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java index f9019199b..1d349009f 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java @@ -56,8 +56,7 @@ public String get(String key) throws IllegalArgumentException { int file = hashCode / 16 % 16; String adds = Integer.toString(dir * 100 + file); return databases.get(adds).get(key); - } - else { + } else { throw new IllegalArgumentException("Table.get: Haven't key. "); } } @@ -194,8 +193,8 @@ public int commit() { int k = 0; for (int file = 0; file < 16; file++) { - String variable_adds = Integer.toString(i * 100 + file); - if (databases.containsKey(variable_adds)) { + String variableAdds = Integer.toString(i * 100 + file); + if (databases.containsKey(variableAdds)) { k++; } } diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProvider.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProvider.java index 1617876c1..f802f6bb9 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProvider.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProvider.java @@ -98,7 +98,8 @@ public void removeTable(String name) { try { Files.delete(dbFile.toPath()); } catch (IOException e) { - throw new RuntimeException("MyTableProvider.removeTable: cannon delete database file", e); + throw new RuntimeException("MyTableProvider.removeTable: " + + "cannon delete database file", e); } } } From 471f62f46179e53a2122c1f1f867235a52444755 Mon Sep 17 00:00:00 2001 From: ElinRin Date: Sat, 20 Dec 2014 16:57:44 +0300 Subject: [PATCH 03/13] '' --- .../elina_denisova/j_unit/test/MyTableProviderFactoryTest.java | 2 +- .../elina_denisova/j_unit/test/MyTableProviderTest.java | 2 +- .../fivt/students/elina_denisova/j_unit/test/MyTableTest.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableProviderFactoryTest.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableProviderFactoryTest.java index 5e0e93534..5a98b4ca6 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableProviderFactoryTest.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableProviderFactoryTest.java @@ -25,7 +25,7 @@ public void before() { @Test public void create() throws IOException { - assertNotNull(factory.create(folder.newFolder().getCanonicalPath())); + assertNotNull(factory.create(folder.newFolder("test").getCanonicalPath())); } @Test(expected = IllegalArgumentException.class) diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableProviderTest.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableProviderTest.java index 6c01e5b54..272061197 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableProviderTest.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableProviderTest.java @@ -23,7 +23,7 @@ public class MyTableProviderTest { @Before public void initProvider() throws IOException { TableProviderFactory factory = new MyTableProviderFactory(); - provider = factory.create(folder.newFolder().getAbsolutePath()); + provider = factory.create(folder.newFolder("test").getAbsolutePath()); } @Test (expected = IllegalArgumentException.class) diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableTest.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableTest.java index d1791b411..b0a3fa0dd 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableTest.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableTest.java @@ -26,7 +26,7 @@ public class MyTableTest { @Before public void initTable() throws IOException { TableProviderFactory factory = new MyTableProviderFactory(); - dbDirPath = folder.newFolder().getAbsolutePath(); + dbDirPath = folder.newFolder("test").getAbsolutePath(); TableProvider provider = factory.create(dbDirPath); table = provider.createTable("table"); } From b48ea0224c9a7d9dba8c00f2a0644b5cf2af566d Mon Sep 17 00:00:00 2001 From: ElinRin Date: Sun, 21 Dec 2014 20:18:09 +0300 Subject: [PATCH 04/13] fixed --- .../j_unit/HandlerException.java | 2 +- .../j_unit/InteractiveParse.java | 2 +- .../elina_denisova/j_unit/MyTable.java | 139 +++++++++--------- .../j_unit/MyTableProvider.java | 11 +- .../elina_denisova/j_unit/PackageParse.java | 2 +- .../elina_denisova/j_unit/ParserCommands.java | 44 +++++- .../elina_denisova/j_unit/Runner.java | 2 +- 7 files changed, 120 insertions(+), 82 deletions(-) diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/HandlerException.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/HandlerException.java index 1a663ddff..b0a8d45f8 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/HandlerException.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/HandlerException.java @@ -2,7 +2,7 @@ public class HandlerException { public static void handler(String message, Throwable cause) { - System.err.println(message + cause.getMessage()); + System.err.println(message + ". " + cause.getMessage()); System.exit(1); } public static void handler(Throwable cause) { diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/InteractiveParse.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/InteractiveParse.java index 540aa0b82..03a3b4855 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/InteractiveParse.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/InteractiveParse.java @@ -23,7 +23,7 @@ public static void parse(MyTableProvider directory) { System.exit(0); } catch (Exception e) { in.close(); - HandlerException.handler("InteractiveParse: Unknown error", e); + HandlerException.handler("InteractiveParse: ", e); } in.close(); } diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java index 1d349009f..7c1cf9f1a 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java @@ -18,24 +18,28 @@ public class MyTable implements Table { private static Map> changes = new HashMap<>(); private int numberChanges = 0; + public static final int COUNT_OBJECT = 16; + public static final int COMMON_CONSTANT_INDEX = 100; + + public MyTable(File tableDir) { try { databases = new HashMap<>(); mainDir = tableDir.toPath(); - for (int i = 0; i < 16; i++) { + for (int i = 0; i < COUNT_OBJECT; i++) { File subDir = new File(tableDir, i + ".dir"); - for (int j = 0; j < 16; j++) { + for (int j = 0; j < COUNT_OBJECT; j++) { File dbFile = new File(subDir, j + ".dat"); if (dbFile.exists()) { - String adds = Integer.toString(i * 100 + j); + String adds = Integer.toString(i * COMMON_CONSTANT_INDEX + j); databases.put(adds, new HashMap()); readFromFile(dbFile, databases.get(adds)); } } } } catch (Exception e) { - HandlerException.handler("TableProvider: Unknown error", e); + HandlerException.handler("TableProvider: ", e); } } @@ -52,9 +56,9 @@ public String getName() { public String get(String key) throws IllegalArgumentException { if (key != null) { int hashCode = Math.abs(key.hashCode()); - int dir = hashCode % 16; - int file = hashCode / 16 % 16; - String adds = Integer.toString(dir * 100 + file); + int dir = hashCode % COUNT_OBJECT; + int file = hashCode / COUNT_OBJECT % COUNT_OBJECT; + String adds = Integer.toString(dir * COMMON_CONSTANT_INDEX + file); return databases.get(adds).get(key); } else { throw new IllegalArgumentException("Table.get: Haven't key. "); @@ -64,47 +68,27 @@ public String get(String key) throws IllegalArgumentException { @Override public String put(String key, String value) { if ((key != null) || (value != null)) { - try { - int hashCode = Math.abs(key.hashCode()); - int dir = hashCode % 16; - int file = hashCode / 16 % 16; - String adds = Integer.toString(dir * 100 + file); - if (!databases.containsKey(adds)) { - File subDir = new File(mainDir.toString(), dir + ".dir"); - if (!subDir.exists()) { - if (!subDir.mkdir()) { - throw new UnsupportedOperationException("ParserCommands.commandsExecution.put:" - + " Unable to create directories in working catalog"); - } - } - File dbFile = new File(subDir, file + ".dat"); - if (!dbFile.exists()) { - if (!dbFile.createNewFile()) { - throw new UnsupportedOperationException("ParserCommands.commandsExecution.put:" - + " Unable to create database files in working catalog"); - } - } - databases.put(adds, new HashMap()); - } - - String oldValue = databases.get(adds).get(key); - databases.get(adds).put(key, value); - numberChanges++; - changes.put(numberChanges, new ArrayList()); - changes.get(numberChanges).add("put"); - changes.get(numberChanges).add(key); - changes.get(numberChanges).add(value); - if (oldValue == null) { - changes.get(numberChanges).add("new"); - } else { - changes.get(numberChanges).add(oldValue); - } - return oldValue; - + int hashCode = Math.abs(key.hashCode()); + int dir = hashCode % COUNT_OBJECT; + int file = hashCode / COUNT_OBJECT % COUNT_OBJECT; + String adds = Integer.toString(dir * COMMON_CONSTANT_INDEX + file); + if (!databases.containsKey(adds)) { + databases.put(adds, new HashMap()); + } - } catch (IOException e) { - throw new NullPointerException("MyTable.put: Cannot create new file. "); + String oldValue = databases.get(adds).get(key); + databases.get(adds).put(key, value); + numberChanges++; + changes.put(numberChanges, new ArrayList()); + changes.get(numberChanges).add("put"); + changes.get(numberChanges).add(key); + changes.get(numberChanges).add(value); + if (oldValue == null) { + changes.get(numberChanges).add("new"); + } else { + changes.get(numberChanges).add(oldValue); } + return oldValue; } else { throw new IllegalArgumentException("MyTable.put: Haven't key or value. "); } @@ -114,9 +98,9 @@ public String put(String key, String value) { public String remove(String key) { if (key != null) { int hashCode = Math.abs(key.hashCode()); - int dir = hashCode % 16; - int file = hashCode / 16 % 16; - String adds = Integer.toString(dir * 100 + file); + int dir = hashCode % COUNT_OBJECT; + int file = hashCode / COUNT_OBJECT % COUNT_OBJECT; + String adds = Integer.toString(dir * COMMON_CONSTANT_INDEX + file); if (!databases.containsKey(adds)) { return null; } else { @@ -137,9 +121,9 @@ public String remove(String key) { @Override public int size() { int answer = 0; - for (int i = 0; i < 16; i++) { - for (int j = 0; j < 16; j++) { - String adds = Integer.toString(i * 100 + j); + for (int i = 0; i < COUNT_OBJECT; i++) { + for (int j = 0; j < COUNT_OBJECT; j++) { + String adds = Integer.toString(i * COMMON_CONSTANT_INDEX + j); if (databases.containsKey(adds)) { answer += databases.get(adds).size(); } @@ -154,19 +138,38 @@ public int commit() { changes = new HashMap<>(); int count = 0; - for (int i = 0; i < 16; i++) { - for (int j = 0; j < 16; j++) { - String adds = Integer.toString(i * 100 + j); + for (int i = 0; i < COUNT_OBJECT; i++) { + for (int j = 0; j < COUNT_OBJECT; j++) { + String adds = Integer.toString(i * COMMON_CONSTANT_INDEX + j); if (databases.containsKey(adds)) { File directory = new File(mainDir.toString(), i + ".dir"); + if (!directory.exists()) { + if (!directory.mkdir()) { + throw new UnsupportedOperationException("ParserCommands.commandsExecution.put:" + + " Unable to create directories in working catalog"); + } + } File dataBaseOld = new File(directory, j + ".dat"); - try { - Files.delete(dataBaseOld.toPath()); - } catch (IOException e) { - throw new RuntimeException("MyTable.writeInFile: Can't overwrite file"); + if (dataBaseOld.exists()) { + try { + Files.delete(dataBaseOld.toPath()); + } catch (IOException e) { + throw new RuntimeException("MyTable.writeInFile: Can't overwrite file"); + } + } + + if (!dataBaseOld.exists()) { + try { + if (!dataBaseOld.createNewFile()) { + throw new UnsupportedOperationException("ParserCommands.commandsExecution.put:" + + " Unable to create database files in working catalog"); + } + } catch (IOException e) { + throw new UnsupportedOperationException("ParserCommands.commandsExecution.put:" + + " Unable to create database files in working catalog"); + } } - File dataBase = new File(directory, j + ".dat"); - try (RandomAccessFile dbFile = new RandomAccessFile(dataBase, "rw")) { + try (RandomAccessFile dbFile = new RandomAccessFile(dataBaseOld, "rw")) { for (Map.Entry current : databases.get(adds).entrySet()) { count++; writeNext(dbFile, current.getKey()); @@ -192,13 +195,13 @@ public int commit() { databases.remove(adds); int k = 0; - for (int file = 0; file < 16; file++) { - String variableAdds = Integer.toString(i * 100 + file); + for (int file = 0; file < COUNT_OBJECT; file++) { + String variableAdds = Integer.toString(i * COMMON_CONSTANT_INDEX + file); if (databases.containsKey(variableAdds)) { k++; } } - if (k == 16) { + if (k == COUNT_OBJECT) { try { Files.delete(subDir.toPath()); } catch (DirectoryNotEmptyException e) { @@ -249,7 +252,7 @@ public void readFromFile(File dbFileName, Map data) throws Ille } catch (IOException e) { throw new RuntimeException(" Table.readFromFile: Problems with reading from database file " + e.toString()); } catch (Exception e) { - throw new RuntimeException("Table.readFromFile: Unknown error", e); + throw new RuntimeException("Table.readFromFile: ", e); } } @@ -296,9 +299,9 @@ public int rollback() { @Override public List list() { List listKey = new ArrayList<>(); - for (int i = 0; i < 16; i++) { - for (int j = 0; j < 16; j++) { - String adds = Integer.toString(i * 100 + j); + for (int i = 0; i < COUNT_OBJECT; i++) { + for (int j = 0; j < COUNT_OBJECT; j++) { + String adds = Integer.toString(i * COMMON_CONSTANT_INDEX + j); if (databases.containsKey(adds)) { for (String key : databases.get(adds).keySet()) { listKey.add(key); diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProvider.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProvider.java index f802f6bb9..760b7f9db 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProvider.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProvider.java @@ -19,6 +19,9 @@ public class MyTableProvider implements TableProvider { private String using; private File parentDirectory; + public static final int COUNT_OBJECT = 16; + public static final int COMMON_CONSTANT_INDEX = 100; + public MyTableProvider(String path) { parentDirectory = new File(path); @@ -52,7 +55,7 @@ public MyTableProvider(String path) { } catch (FileNotFoundException e) { HandlerException.handler(e); } catch (Exception e) { - HandlerException.handler("TableProviderFactory: Unknown error", e); + HandlerException.handler("TableProviderFactory: ", e); } } @@ -88,10 +91,10 @@ public void removeTable(String name) { } if (tables.containsKey(name)) { File table = new File(parentDirectory, name); - for (int i = 0; i < 16; i++) { + for (int i = 0; i < COUNT_OBJECT; i++) { File subDir = new File(table, i + ".dir"); - for (int j = 0; j < 16; j++) { - String adds = Integer.toString(i * 100 + j); + for (int j = 0; j < COUNT_OBJECT; j++) { + String adds = Integer.toString(i * COMMON_CONSTANT_INDEX + j); if (tables.get(name).containsKey(adds)) { File dbFile = new File(subDir, j + ".dat"); if (dbFile.exists()) { diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/PackageParse.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/PackageParse.java index 356542540..96d7e05c7 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/PackageParse.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/PackageParse.java @@ -26,7 +26,7 @@ public static void parse(MyTableProvider directory, String[] arg) { } catch (IllegalArgumentException e) { HandlerException.handler("PackageParse: Wrong arguments", e); } catch (Exception e) { - HandlerException.handler("PackageParse: Unknown error", e); + HandlerException.handler("PackageParse: ", e); } } } diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/ParserCommands.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/ParserCommands.java index d7ae329c3..2d75b93cb 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/ParserCommands.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/ParserCommands.java @@ -17,6 +17,12 @@ public static void commandsExecution(String[] command, MyTableProvider directory switch (request) { case CREATECOMMAND: try { + try { + if (command[2] != null) { + System.err.println("create: need only one argument"); + } + } catch (ArrayIndexOutOfBoundsException e) {} + if (directory.createTable(command[1]) == null) { System.out.println(command[1] + " exists"); } else { @@ -25,11 +31,16 @@ public static void commandsExecution(String[] command, MyTableProvider directory } catch (UnsupportedOperationException e) { HandlerException.handler(e); } catch (ArrayIndexOutOfBoundsException e) { - System.err.println("create: need argument"); + System.err.println("create: need only one argument"); } break; case PUTCOMMAND: try { + try { + if (command[3] != null) { + System.err.println("create: need two arguments"); + } + } catch (ArrayIndexOutOfBoundsException e) {} if (directory.getUsing() == null) { System.out.println("no table"); } else { @@ -42,6 +53,7 @@ public static void commandsExecution(String[] command, MyTableProvider directory } numberChanges++; } + } catch (UnsupportedOperationException e) { HandlerException.handler(e); } catch (ArrayIndexOutOfBoundsException e) { @@ -49,11 +61,16 @@ public static void commandsExecution(String[] command, MyTableProvider directory } catch (NullPointerException e) { HandlerException.handler(e); } catch (Exception e) { - HandlerException.handler("ParserCommands.commandsExecution.put: Unknown error", e); + HandlerException.handler("ParserCommands.commandsExecution.put: ", e); } break; case GETCOMMAND: try { + try { + if (command[2] != null) { + System.err.println("create: need only one argument"); + } + } catch (ArrayIndexOutOfBoundsException e) {} if (directory.getUsing() == null) { System.out.println("no table"); } else { @@ -65,13 +82,18 @@ public static void commandsExecution(String[] command, MyTableProvider directory } } } catch (IllegalArgumentException e) { - HandlerException.handler(e); + System.out.println("not found"); } catch (ArrayIndexOutOfBoundsException e) { - System.err.println("get: need argument"); + System.err.println("get: need only one argument"); } break; case REMOVECOMMAND: try { + try { + if (command[2] != null) { + System.err.println("create: need only one argument"); + } + } catch (ArrayIndexOutOfBoundsException e) {} if (directory.getUsing() == null) { System.out.println("no table"); } else { @@ -84,11 +106,16 @@ public static void commandsExecution(String[] command, MyTableProvider directory } } } catch (ArrayIndexOutOfBoundsException e) { - System.err.println("remove: need argument"); + System.err.println("remove: need only one argument"); } break; case DROPCOMMAND: try { + try { + if (command[2] != null) { + System.err.println("create: need only one argument"); + } + } catch (ArrayIndexOutOfBoundsException e) {} if (directory.getTable(command[1]) == directory.getUsing()) { numberChanges = 0; } @@ -97,7 +124,7 @@ public static void commandsExecution(String[] command, MyTableProvider directory } catch (IllegalStateException e) { System.out.println(command[1] + " not exist"); } catch (ArrayIndexOutOfBoundsException e) { - System.err.println("drop: need argument"); + System.err.println("drop: need only one argument"); } break; case COMMITCOMMAND: @@ -111,6 +138,11 @@ public static void commandsExecution(String[] command, MyTableProvider directory break; case USECOMMAND: try { + try { + if (command[2] != null) { + System.err.println("create: need only one argument"); + } + } catch (ArrayIndexOutOfBoundsException e) {} if (numberChanges == 0) { if (!directory.containsKey(command[1])) { System.err.println("use: " + command[1] + " not exists"); diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/Runner.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/Runner.java index fcea471b7..22f2e1d44 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/Runner.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/Runner.java @@ -22,7 +22,7 @@ public static void main(String[] args) { } catch (NullPointerException e) { HandlerException.handler(e); } catch (Exception e) { - HandlerException.handler("Runner: Unknown error", e); + HandlerException.handler("Runner: ", e); } } From 801adb02ed8a1988904088085dd1ec1abf68f062 Mon Sep 17 00:00:00 2001 From: ElinRin Date: Sun, 21 Dec 2014 20:34:42 +0300 Subject: [PATCH 05/13] ' --- .../elina_denisova/j_unit/ParserCommands.java | 96 ++++++++++--------- 1 file changed, 51 insertions(+), 45 deletions(-) diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/ParserCommands.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/ParserCommands.java index 2d75b93cb..70e0cf9c3 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/ParserCommands.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/ParserCommands.java @@ -21,12 +21,13 @@ public static void commandsExecution(String[] command, MyTableProvider directory if (command[2] != null) { System.err.println("create: need only one argument"); } - } catch (ArrayIndexOutOfBoundsException e) {} + } catch (ArrayIndexOutOfBoundsException e) { - if (directory.createTable(command[1]) == null) { - System.out.println(command[1] + " exists"); - } else { - System.out.println("created"); + if (directory.createTable(command[1]) == null) { + System.out.println(command[1] + " exists"); + } else { + System.out.println("created"); + } } } catch (UnsupportedOperationException e) { HandlerException.handler(e); @@ -40,18 +41,19 @@ public static void commandsExecution(String[] command, MyTableProvider directory if (command[3] != null) { System.err.println("create: need two arguments"); } - } catch (ArrayIndexOutOfBoundsException e) {} - if (directory.getUsing() == null) { - System.out.println("no table"); - } else { - String oldValue = directory.getUsing().put(command[1], command[2]); - if (oldValue != null) { - System.out.println("overwrite"); - System.out.println(oldValue); + } catch (ArrayIndexOutOfBoundsException e) { + if (directory.getUsing() == null) { + System.out.println("no table"); } else { - System.out.println("new"); + String oldValue = directory.getUsing().put(command[1], command[2]); + if (oldValue != null) { + System.out.println("overwrite"); + System.out.println(oldValue); + } else { + System.out.println("new"); + } + numberChanges++; } - numberChanges++; } } catch (UnsupportedOperationException e) { @@ -70,15 +72,16 @@ public static void commandsExecution(String[] command, MyTableProvider directory if (command[2] != null) { System.err.println("create: need only one argument"); } - } catch (ArrayIndexOutOfBoundsException e) {} - if (directory.getUsing() == null) { - System.out.println("no table"); - } else { - if (directory.getUsing().get(command[1]) != null) { - System.out.println("found"); - System.out.println(directory.getUsing().get(command[1])); + } catch (ArrayIndexOutOfBoundsException e) { + if (directory.getUsing() == null) { + System.out.println("no table"); } else { - System.out.println("not found"); + if (directory.getUsing().get(command[1]) != null) { + System.out.println("found"); + System.out.println(directory.getUsing().get(command[1])); + } else { + System.out.println("not found"); + } } } } catch (IllegalArgumentException e) { @@ -93,16 +96,17 @@ public static void commandsExecution(String[] command, MyTableProvider directory if (command[2] != null) { System.err.println("create: need only one argument"); } - } catch (ArrayIndexOutOfBoundsException e) {} - if (directory.getUsing() == null) { - System.out.println("no table"); - } else { - String oldValue = directory.getUsing().remove(command[1]); - if (oldValue != null) { - System.out.println("removed"); - numberChanges++; + } catch (ArrayIndexOutOfBoundsException e) { + if (directory.getUsing() == null) { + System.out.println("no table"); } else { - System.out.println("not found"); + String oldValue = directory.getUsing().remove(command[1]); + if (oldValue != null) { + System.out.println("removed"); + numberChanges++; + } else { + System.out.println("not found"); + } } } } catch (ArrayIndexOutOfBoundsException e) { @@ -115,12 +119,13 @@ public static void commandsExecution(String[] command, MyTableProvider directory if (command[2] != null) { System.err.println("create: need only one argument"); } - } catch (ArrayIndexOutOfBoundsException e) {} - if (directory.getTable(command[1]) == directory.getUsing()) { - numberChanges = 0; + } catch (ArrayIndexOutOfBoundsException e) { + if (directory.getTable(command[1]) == directory.getUsing()) { + numberChanges = 0; + } + directory.removeTable(command[1]); + System.out.println("dropped"); } - directory.removeTable(command[1]); - System.out.println("dropped"); } catch (IllegalStateException e) { System.out.println(command[1] + " not exist"); } catch (ArrayIndexOutOfBoundsException e) { @@ -142,16 +147,17 @@ public static void commandsExecution(String[] command, MyTableProvider directory if (command[2] != null) { System.err.println("create: need only one argument"); } - } catch (ArrayIndexOutOfBoundsException e) {} - if (numberChanges == 0) { - if (!directory.containsKey(command[1])) { - System.err.println("use: " + command[1] + " not exists"); + } catch (ArrayIndexOutOfBoundsException e) { + if (numberChanges == 0) { + if (!directory.containsKey(command[1])) { + System.err.println("use: " + command[1] + " not exists"); + } else { + directory.changeUsingTable(command[1]); + System.out.println("using " + command[1]); + } } else { - directory.changeUsingTable(command[1]); - System.out.println("using " + command[1]); + System.err.println(numberChanges + " unsaved changes"); } - } else { - System.err.println(numberChanges + " unsaved changes"); } } catch (ArrayIndexOutOfBoundsException e) { System.err.println("use: need argument"); From 78fd594275a8740fc7549b6c211eb1b929512d20 Mon Sep 17 00:00:00 2001 From: ElinRin Date: Mon, 22 Dec 2014 01:43:51 +0300 Subject: [PATCH 06/13] size --- .../fivt/students/elina_denisova/j_unit/Commands.java | 1 + .../students/elina_denisova/j_unit/ParserCommands.java | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/Commands.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/Commands.java index 664f3b938..a81a3ffe7 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/Commands.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/Commands.java @@ -3,6 +3,7 @@ public enum Commands { CREATECOMMAND("create"), + SIZECOMMAND("size"), COMMITCOMMAND("commit"), ROLLBACKCOMMAND("rollback"), DROPCOMMAND("drop"), diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/ParserCommands.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/ParserCommands.java index 70e0cf9c3..a9c7febba 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/ParserCommands.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/ParserCommands.java @@ -188,6 +188,13 @@ public static void commandsExecution(String[] command, MyTableProvider directory System.out.println(directory.getUsing().list()); } break; + case SIZECOMMAND: + if (directory.getUsing() == null) { + System.out.println("no table"); + } else { + System.out.println(directory.getUsing().size()); + } + break; case EXITCOMMAND: if (numberChanges == 0) { throw new IllegalMonitorStateException("Exit"); From 2d493bf1a143081a13686a9fce53cc32bc935f2f Mon Sep 17 00:00:00 2001 From: ElinRin Date: Thu, 25 Dec 2014 10:45:56 +0300 Subject: [PATCH 07/13] fixed --- .../elina_denisova/j_unit/Commands.java | 36 ++ .../j_unit/HandlerException.java | 15 + .../j_unit/InteractiveParse.java | 30 ++ .../elina_denisova/j_unit/MyTable.java | 312 ++++++++++++++++++ .../j_unit/MyTableProvider.java | 155 +++++++++ .../j_unit/MyTableProviderFactory.java | 15 + .../elina_denisova/j_unit/PackageParse.java | 32 ++ .../elina_denisova/j_unit/ParserCommands.java | 225 +++++++++++++ .../elina_denisova/j_unit/Runner.java | 30 ++ .../test/MyTableProviderFactoryTest.java | 40 +++ .../j_unit/test/MyTableProviderTest.java | 69 ++++ .../j_unit/test/MyTableTest.java | 152 +++++++++ .../elina_denisova/j_unit/MyTable.java | 55 ++- .../j_unit/MyTableProvider.java | 6 +- .../elina_denisova/j_unit/ParserCommands.java | 8 +- .../j_unit/test/MyTableTest.java | 1 + 16 files changed, 1148 insertions(+), 33 deletions(-) create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/Commands.java create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/HandlerException.java create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/InteractiveParse.java create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/MyTable.java create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/MyTableProvider.java create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/MyTableProviderFactory.java create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/PackageParse.java create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/ParserCommands.java create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/Runner.java create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/test/MyTableProviderFactoryTest.java create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/test/MyTableProviderTest.java create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/test/MyTableTest.java diff --git a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/Commands.java b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/Commands.java new file mode 100644 index 000000000..a81a3ffe7 --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/Commands.java @@ -0,0 +1,36 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit; + +public enum Commands { + + CREATECOMMAND("create"), + SIZECOMMAND("size"), + COMMITCOMMAND("commit"), + ROLLBACKCOMMAND("rollback"), + DROPCOMMAND("drop"), + USECOMMAND("use"), + SHOWCOMMAND("show"), + PUTCOMMAND("put"), + GETCOMMAND("get"), + REMOVECOMMAND("remove"), + LISTCOMMAND("list"), + EXITCOMMAND("exit"); + + + private String value; + private Commands(String word) { + value = word; + } + + public static Commands getCommand(String word) throws IllegalArgumentException { + for (Commands command : Commands.values()) { + if (command.getValue().equals(word)) { + return command; + } + } + throw new IllegalArgumentException(word + " - unknown command"); + } + + public String getValue() { + return value; + } +} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/HandlerException.java b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/HandlerException.java new file mode 100644 index 000000000..b0a8d45f8 --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/HandlerException.java @@ -0,0 +1,15 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit; + +public class HandlerException { + public static void handler(String message, Throwable cause) { + System.err.println(message + ". " + cause.getMessage()); + System.exit(1); + } + public static void handler(Throwable cause) { + System.err.println(cause.getMessage()); + System.exit(1); + } + +} + + diff --git a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/InteractiveParse.java b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/InteractiveParse.java new file mode 100644 index 000000000..03a3b4855 --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/InteractiveParse.java @@ -0,0 +1,30 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit; + +import java.util.Scanner; + +public class InteractiveParse { + public static void parse(MyTableProvider directory) { + Scanner in = new Scanner(System.in); + try { + while (true) { + System.out.print("$ "); + String s; + s = in.nextLine(); + s = s.trim(); + String[] current = s.split("\\s+"); + for (int i = 0; i < current.length; ++i) { + current[i].trim(); + } + ParserCommands.commandsExecution(current, directory); + } + } catch (IllegalMonitorStateException e) { + in.close(); + System.out.println("Goodbye"); + System.exit(0); + } catch (Exception e) { + in.close(); + HandlerException.handler("InteractiveParse: ", e); + } + in.close(); + } +} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/MyTable.java b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/MyTable.java new file mode 100644 index 000000000..edf525345 --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/MyTable.java @@ -0,0 +1,312 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit; + +import ru.fizteh.fivt.storage.strings.Table; + +import java.io.*; +import java.nio.file.DirectoryNotEmptyException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MyTable implements Table { + + private Path mainDir; + private Map> databases; + private static Map> changes = new HashMap<>(); + private int numberChanges = 0; + + public static final int COUNT_OBJECT = 16; + public static final int COMMON_CONSTANT_INDEX = 100; + public static final String ENCODING = "UTF-8"; + public static final String SUF_DIR = ".dir"; + public static final String SUF_FILE = ".dat"; + + public MyTable(File tableDir) { + try { + databases = new HashMap<>(); + mainDir = tableDir.toPath(); + + for (int i = 0; i < COUNT_OBJECT; i++) { + File subDir = new File(tableDir, i + SUF_DIR); + for (int j = 0; j < COUNT_OBJECT; j++) { + File dbFile = new File(subDir, j + SUF_FILE); + if (dbFile.exists()) { + String adds = Integer.toString(i * COMMON_CONSTANT_INDEX + j); + databases.put(adds, new HashMap()); + readFromFile(dbFile, databases.get(adds)); + } + } + } + } catch (Exception e) { + HandlerException.handler("TableProvider: ", e); + } + } + + public boolean containsKey(String adds) { + return databases.containsKey(adds); + } + + @Override + public String getName() { + return mainDir.toString(); + }; + + private String pathname(String key) { + int hashCode = Math.abs(key.hashCode()); + int dir = hashCode % COUNT_OBJECT; + int file = hashCode / COUNT_OBJECT % COUNT_OBJECT; + return Integer.toString(dir * COMMON_CONSTANT_INDEX + file); + } + + @Override + public String get(String key) throws IllegalArgumentException { + if (key != null) { + String adds = pathname(key); + return databases.get(adds).get(key); + } else { + throw new IllegalArgumentException("Table.get: Haven't key. "); + } + } + + @Override + public String put(String key, String value) { + if ((key != null) || (value != null)) { + String adds = pathname(key); + if (!databases.containsKey(adds)) { + databases.put(adds, new HashMap()); + } + + String oldValue = databases.get(adds).get(key); + databases.get(adds).put(key, value); + numberChanges++; + changes.put(numberChanges, new ArrayList()); + changes.get(numberChanges).add("put"); + changes.get(numberChanges).add(key); + changes.get(numberChanges).add(value); + if (oldValue == null) { + changes.get(numberChanges).add("new"); + } else { + changes.get(numberChanges).add(oldValue); + } + return oldValue; + } else { + throw new IllegalArgumentException("MyTable.put: Haven't key or value. "); + } + } + + @Override + public String remove(String key) { + if (key != null) { + String adds = pathname(key); + if (!databases.containsKey(adds)) { + return null; + } else { + String oldValue = databases.get(adds).get(key); + databases.get(adds).remove(key); + numberChanges++; + changes.put(numberChanges, new ArrayList()); + changes.get(numberChanges).add("remove"); + changes.get(numberChanges).add(key); + changes.get(numberChanges).add(oldValue); + return oldValue; + } + } else { + throw new IllegalArgumentException("Table.get: Haven't key. "); + } + } + + @Override + public int size() { + int answer = 0; + for (int i = 0; i < COUNT_OBJECT; i++) { + for (int j = 0; j < COUNT_OBJECT; j++) { + String adds = Integer.toString(i * COMMON_CONSTANT_INDEX + j); + if (databases.containsKey(adds)) { + answer += databases.get(adds).size(); + } + } + } + return answer; + } + + @Override + public int commit() { + numberChanges = 0; + changes = new HashMap<>(); + + int count = 0; + for (int i = 0; i < COUNT_OBJECT; i++) { + for (int j = 0; j < COUNT_OBJECT; j++) { + String adds = Integer.toString(i * COMMON_CONSTANT_INDEX + j); + if (databases.containsKey(adds)) { + File directory = new File(mainDir.toString(), i + SUF_DIR); + if (!directory.exists()) { + if (!directory.mkdir()) { + throw new UnsupportedOperationException("ParserCommands.commandsExecution.put:" + + " Unable to create directories in working catalog"); + } + } + File dataBaseOld = new File(directory, j + SUF_FILE); + if (dataBaseOld.exists()) { + try { + Files.delete(dataBaseOld.toPath()); + } catch (IOException e) { + throw new RuntimeException("MyTable.writeInFile: Can't overwrite file"); + } + } + + if (!dataBaseOld.exists()) { + try { + if(!dataBaseOld.createNewFile()) { + throw new IOException(); + } + } catch (IOException | NullPointerException e) { + throw new UnsupportedOperationException("ParserCommands.commandsExecution.put:" + + " Unable to create database files in working catalog"); + } + } + try (RandomAccessFile dbFile = new RandomAccessFile(dataBaseOld, "rw")) { + for (Map.Entry current : databases.get(adds).entrySet()) { + count++; + writeNext(dbFile, current.getKey()); + writeNext(dbFile, current.getValue()); + } + } catch (FileNotFoundException e) { + throw new RuntimeException("MyTable.writeInFile: File not found"); + } catch (IOException e) { + throw new RuntimeException("MyTable.writeInFile: Can't write to file.", e); + } + + if (databases.get(adds).size() == 0) { + File subDir = new File(mainDir.toString(), i + SUF_DIR); + File dbFile = new File(subDir, j + SUF_FILE); + try { + if (dbFile.exists()) { + Files.delete(dbFile.toPath()); + } + } catch (IOException e) { + throw new IllegalStateException("MyTable.remove: " + + "Cannot delete database file. ", e); + } + databases.remove(adds); + + int k = 0; + for (int file = 0; file < COUNT_OBJECT; file++) { + String variableAdds = Integer.toString(i * COMMON_CONSTANT_INDEX + file); + if (databases.containsKey(variableAdds)) { + k++; + } + } + if (k == 0) { + try { + Files.delete(subDir.toPath()); + } catch (DirectoryNotEmptyException e) { + throw new IllegalStateException("MyTable.remove: Cannot remove table subdirectory. " + + "Redundant files", e); + } catch (IOException e) { + throw new IllegalStateException("MyTable.remove: " + + "Cannot delete database subdirectory", e); + } + } + } + } + } + } + return count; + + } + + private void writeNext(RandomAccessFile dbFile, String word) throws IOException { + try { + dbFile.writeInt(word.getBytes(ENCODING).length); + dbFile.write(word.getBytes(ENCODING)); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException("Table.writeNext: Don't supported encoding " + ENCODING + ". "); + } catch (IOException e) { + throw new RuntimeException("Table.writeNext: Can't write to database. ", e); + } + } + public void readFromFile(File dbFileName, Map data) throws IllegalArgumentException { + try (RandomAccessFile file = new RandomAccessFile(dbFileName.toString(), "r")) { + + if (file.length() > 0) { + while (file.getFilePointer() < file.length()) { + String key = readNext(file); + String value = readNext(file); + if (data.containsKey(key)) { + throw new IllegalArgumentException("Table.readFromFile: Two same keys in database file"); + } + data.put(key, value); + } + } + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } catch (IllegalArgumentException e) { + throw new RuntimeException(e); + } catch (FileNotFoundException e) { + throw new RuntimeException("Table.readFromFile: File not found", e); + } catch (IOException e) { + throw new RuntimeException(" Table.readFromFile: Problems with reading from database file " + e.toString()); + } catch (Exception e) { + throw new RuntimeException("Table.readFromFile: ", e); + } + } + + + private String readNext(RandomAccessFile dbFile) throws IOException { + try { + int wordLength = dbFile.readInt(); + byte[] word = new byte[wordLength]; + dbFile.read(word, 0, wordLength); + return new String(word, ENCODING); + } catch (UnsupportedEncodingException e) { + throw new UnsupportedEncodingException("Table.readNext: UTF-8 encoding is not supported"); + } catch (IOException e) { + throw new IOException(" Table.readNext: Can't read from database " + e.toString()); + } + } + + + @Override + public int rollback() { + int count = 0; + Map> saveChanges = changes; + for (int i = saveChanges.size(); i > 0; i--) { + String[] com = new String[saveChanges.get(i).size()]; + com = saveChanges.get(i).toArray(com); + String message; + if (com[0].equals("put")) { + if (com[3].equals("new")) { + message = remove(com[1]); + } else { + message = put(com[1], com[3]); + } + } + if (com[0].equals("remove")) { + put(com[1], com[2]); + } + count++; + } + numberChanges = 0; + changes = new HashMap<>(); + return count; + } + + @Override + public List list() { + List listKey = new ArrayList<>(); + for (int i = 0; i < COUNT_OBJECT; i++) { + for (int j = 0; j < COUNT_OBJECT; j++) { + String adds = Integer.toString(i * COMMON_CONSTANT_INDEX + j); + if (databases.containsKey(adds)) { + for (String key : databases.get(adds).keySet()) { + listKey.add(key); + } + } + } + } return listKey; + } +} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/MyTableProvider.java b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/MyTableProvider.java new file mode 100644 index 000000000..28afd4bb1 --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/MyTableProvider.java @@ -0,0 +1,155 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit; + +import ru.fizteh.fivt.storage.strings.Table; +import ru.fizteh.fivt.storage.strings.TableProvider; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.nio.file.DirectoryNotEmptyException; +import java.nio.file.Files; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + + +public class MyTableProvider implements TableProvider { + + private HashMap tables; + private String using; + private File parentDirectory; + + public static final int COUNT_OBJECT = 16; + public static final int COMMON_CONSTANT_INDEX = 100; + public static final String SUF_DIR = ".dir"; + public static final String SUF_FILE = ".dat"; + + + public MyTableProvider(String path) { + parentDirectory = new File(path); + using = null; + tables = new HashMap<>(); + + try { + if (path == null) { + throw new NullPointerException("MyTableProvider: Wrong path"); + } + if (!Files.exists(parentDirectory.toPath()) && !parentDirectory.mkdir()) { + throw new UnsupportedOperationException("MyTableProvider: Cannot create working directory"); + } + if (!parentDirectory.isDirectory()) { + throw new FileNotFoundException("MyTableProvider:" + parentDirectory.toString() + + " is not a directory"); + } + for (String childName : parentDirectory.list()) { + File childDirectory = new File(parentDirectory, childName); + if (childDirectory.isDirectory()) { + tables.put(childName, new MyTable(childDirectory)); + } else { + throw new Exception("MyTableProvider:" + childName + + " from databases directory is not a directory"); + } + } + } catch (UnsupportedOperationException e) { + HandlerException.handler(e); + } catch (NullPointerException e) { + HandlerException.handler(e); + } catch (FileNotFoundException e) { + HandlerException.handler(e); + } catch (Exception e) { + HandlerException.handler("TableProviderFactory: ", e); + } + } + + @Override + public Table getTable(String name) { + return tables.get(name); + } + + @Override + public Table createTable(String name) { + if (name == null) { + throw new IllegalArgumentException("MyTableProvider.createTable: " + + "Invalid name. "); + } + if (tables.containsKey(name)) { + return null; + } else { + File newTable = new File(parentDirectory, name); + if (!newTable.mkdir()) { + throw new UnsupportedOperationException("MyTableProvider.createTable: " + + "Unable to create working directory for new table. "); + } + tables.put(name, new MyTable(newTable)); + return tables.get(name); + } + } + + @Override + public void removeTable(String name) { + if (name == null) { + throw new IllegalArgumentException("MyTableProvider.removeTable: " + + "Invalid name. "); + } + if (tables.containsKey(name)) { + File table = new File(parentDirectory, name); + for (int i = 0; i < COUNT_OBJECT; i++) { + File subDir = new File(table, i + SUF_DIR); + for (int j = 0; j < COUNT_OBJECT; j++) { + String adds = Integer.toString(i * COMMON_CONSTANT_INDEX + j); + if (tables.get(name).containsKey(adds)) { + File dbFile = new File(subDir, j + SUF_FILE); + if (dbFile.exists()) { + try { + Files.delete(dbFile.toPath()); + } catch (IOException e) { + throw new RuntimeException("MyTableProvider.removeTable: " + + "cannon delete database file", e); + } + } + } + } + if (subDir.exists()) { + try { + Files.delete(subDir.toPath()); + } catch (DirectoryNotEmptyException e) { + throw new RuntimeException("MyTableProvider.removeTable: " + + "cannot remove table subdirectory", e); + } catch (IOException e) { + throw new RuntimeException("MyTableProvider.removeTable: " + + "cannot delete database subdirectory", e); + } + } + } + try { + Files.delete(table.toPath()); + } catch (DirectoryNotEmptyException e) { + throw new RuntimeException("TableProvider.tDrop: cannot remove main table directory", e); + } catch (IOException e) { + throw new RuntimeException("TableProvider.tDrop: cannot delete main database directory", e); + } + tables.remove(name); + } else { + throw new IllegalStateException("MyTableProvider.removeTable: " + name + "doesn't exist"); + } + } + + public Table getUsing() { + return tables.get(using); + } + + public void changeUsingTable(String table) { + using = table; + } + + + public Set> entrySet() { + return tables.entrySet(); + } + + + public boolean containsKey(String key) { + return tables.containsKey(key); + } + +} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/MyTableProviderFactory.java b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/MyTableProviderFactory.java new file mode 100644 index 000000000..3f397e2c7 --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/MyTableProviderFactory.java @@ -0,0 +1,15 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit; + +import ru.fizteh.fivt.storage.strings.TableProviderFactory; + +public class MyTableProviderFactory implements TableProviderFactory { + + @Override + public MyTableProvider create(String dir) { + if (dir == null) { + throw new IllegalArgumentException("MyTableProvider.create: " + dir + + " isn't a directory. "); + } + return new MyTableProvider(dir); + } +} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/PackageParse.java b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/PackageParse.java new file mode 100644 index 000000000..96d7e05c7 --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/PackageParse.java @@ -0,0 +1,32 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit; + +import java.util.ArrayList; + +public class PackageParse { + public static void parse(MyTableProvider directory, String[] arg) { + try { + ArrayList current = new ArrayList(); + for (int i = 0; i < arg.length; ++i) { + current.clear(); + while (i < arg.length) { + if (!(arg[i].contains(";"))) { + current.add(arg[i]); + i++; + } else { + current.add(arg[i].substring(0, arg[i].indexOf(";"))); + break; + } + } + ParserCommands.commandsExecution(current, directory); + } + directory.getUsing().commit(); + } catch (IllegalMonitorStateException e) { + System.out.println("Goodbye"); + System.exit(0); + } catch (IllegalArgumentException e) { + HandlerException.handler("PackageParse: Wrong arguments", e); + } catch (Exception e) { + HandlerException.handler("PackageParse: ", e); + } + } +} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/ParserCommands.java b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/ParserCommands.java new file mode 100644 index 000000000..e98ff57ad --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/ParserCommands.java @@ -0,0 +1,225 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit; + +import java.util.ArrayList; +import java.util.Map; + +public class ParserCommands { + + private static int numberChanges = 0; + + + public static void commandsExecution(String[] command, MyTableProvider directory) + throws IllegalMonitorStateException { + if (command.length == 0) { + return; + } + try { + Commands request = Commands.getCommand(command[0]); + switch (request) { + case CREATECOMMAND: + try { + try { + if (command[2] != null) { + System.err.println("create: need only one argument"); + } + } catch (ArrayIndexOutOfBoundsException e) { + + if (directory.createTable(command[1]) == null) { + System.out.println(command[1] + " exists"); + } else { + System.out.println("created"); + } + } + } catch (UnsupportedOperationException e) { + HandlerException.handler(e); + } catch (ArrayIndexOutOfBoundsException e) { + System.err.println("create: need only one argument"); + } + break; + case PUTCOMMAND: + try { + try { + if (command[3] != null) { + System.err.println("create: need two arguments"); + } + } catch (ArrayIndexOutOfBoundsException e) { + if (directory.getUsing() == null) { + System.out.println("no table"); + } else { + String oldValue = directory.getUsing().put(command[1], command[2]); + if (oldValue != null) { + System.out.println("overwrite"); + System.out.println(oldValue); + } else { + System.out.println("new"); + } + numberChanges++; + } + } + + } catch (UnsupportedOperationException e) { + HandlerException.handler(e); + } catch (ArrayIndexOutOfBoundsException e) { + System.err.println("put: need two arguments"); + } catch (NullPointerException e) { + HandlerException.handler(e); + } catch (Exception e) { + HandlerException.handler("ParserCommands.commandsExecution.put: ", e); + } + break; + case GETCOMMAND: + try { + try { + if (command[2] != null) { + System.err.println("create: need only one argument"); + } + } catch (ArrayIndexOutOfBoundsException e) { + if (directory.getUsing() == null) { + System.out.println("no table"); + } else { + String value = directory.getUsing().get(command[1]); + if (value != null) { + System.out.println("found"); + System.out.println(value); + } else { + System.out.println("not found"); + } + } + } + } catch (IllegalArgumentException e) { + System.out.println("not found"); + } catch (ArrayIndexOutOfBoundsException e) { + System.err.println("get: need only one argument"); + } + break; + case REMOVECOMMAND: + try { + try { + if (command[2] != null) { + System.err.println("create: need only one argument"); + } + } catch (ArrayIndexOutOfBoundsException e) { + if (directory.getUsing() == null) { + System.out.println("no table"); + } else { + String oldValue = directory.getUsing().remove(command[1]); + if (oldValue != null) { + System.out.println("removed"); + numberChanges++; + } else { + System.out.println("not found"); + } + } + } + } catch (ArrayIndexOutOfBoundsException e) { + System.err.println("remove: need only one argument"); + } + break; + case DROPCOMMAND: + try { + try { + if (command[2] != null) { + System.err.println("create: need only one argument"); + } + } catch (ArrayIndexOutOfBoundsException e) { + if (directory.getTable(command[1]) == directory.getUsing()) { + numberChanges = 0; + } + directory.removeTable(command[1]); + System.out.println("dropped"); + } + } catch (IllegalStateException e) { + System.out.println(command[1] + " not exist"); + } catch (ArrayIndexOutOfBoundsException e) { + System.err.println("drop: need only one argument"); + } + break; + case COMMITCOMMAND: + directory.getUsing().commit(); + System.out.println(numberChanges); + numberChanges = 0; + break; + case ROLLBACKCOMMAND: + System.out.println(directory.getUsing().rollback()); + numberChanges = 0; + break; + case USECOMMAND: + try { + try { + if (command[2] != null) { + System.err.println("create: need only one argument"); + } + } catch (ArrayIndexOutOfBoundsException e) { + if (numberChanges == 0) { + if (!directory.containsKey(command[1])) { + System.err.println("use: " + command[1] + " not exists"); + } else { + directory.changeUsingTable(command[1]); + System.out.println("using " + command[1]); + } + } else { + System.err.println(numberChanges + " unsaved changes"); + } + } + } catch (ArrayIndexOutOfBoundsException e) { + System.err.println("use: need argument"); + } + break; + case SHOWCOMMAND: + try { + if (command[1].equals("tables")) { + for (Map.Entry entry: directory.entrySet()) { + String name = entry.getKey(); + + int size = entry.getValue().size(); + System.out.println(name + " " + size); + } + + } else { + throw new IllegalArgumentException(); + } + + } catch (IllegalArgumentException e) { + System.err.println(command[0] + " - unknown command"); + } + break; + case LISTCOMMAND: + if (directory.getUsing() == null) { + System.out.println("no table"); + } else { + System.out.println(directory.getUsing().list()); + } + break; + case SIZECOMMAND: + if (directory.getUsing() == null) { + System.out.println("no table"); + } else { + System.out.println(directory.getUsing().size()); + } + break; + case EXITCOMMAND: + if (numberChanges == 0) { + throw new IllegalMonitorStateException("Exit"); + } else { + System.err.println(numberChanges + " unsaved changes"); + } + break; + default: + System.err.println(command[0] + " - unknown command"); + } + } catch (IllegalArgumentException e) { + System.err.println(e.getMessage()); + } + } + + + + public static void commandsExecution(ArrayList commands, MyTableProvider directory) { + if (commands.size() == 0) { + return; + } + String[] com = new String[commands.size()]; + com = commands.toArray(com); + commandsExecution(com, directory); + } +} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/Runner.java b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/Runner.java new file mode 100644 index 000000000..22f2e1d44 --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/Runner.java @@ -0,0 +1,30 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit; + +public class Runner { + public static void main(String[] args) { + + try { + String path = System.getProperty("fizteh.db.dir"); + if (path == null) { + throw new NullPointerException("Runner: Directory doesn't exist"); + } + MyTableProviderFactory factory = new MyTableProviderFactory(); + MyTableProvider base = factory.create(path); + + + if (args.length == 0) { + InteractiveParse.parse(base); + } else { + PackageParse.parse(base, args); + } + } catch (IllegalArgumentException e) { + HandlerException.handler(e); + } catch (NullPointerException e) { + HandlerException.handler(e); + } catch (Exception e) { + HandlerException.handler("Runner: ", e); + } + } + +} + diff --git a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/test/MyTableProviderFactoryTest.java b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/test/MyTableProviderFactoryTest.java new file mode 100644 index 000000000..5a98b4ca6 --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/test/MyTableProviderFactoryTest.java @@ -0,0 +1,40 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit.test; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import ru.fizteh.fivt.storage.strings.TableProviderFactory; +import ru.fizteh.fivt.students.elina_denisova.j_unit.MyTableProviderFactory; + +import java.io.IOException; + +import static junit.framework.Assert.assertNotNull; + +public class MyTableProviderFactoryTest { + + private TableProviderFactory factory; + + @Rule + public TemporaryFolder folder = new TemporaryFolder(); + + @Before + public void before() { + factory = new MyTableProviderFactory(); + } + + @Test + public void create() throws IOException { + assertNotNull(factory.create(folder.newFolder("test").getCanonicalPath())); + } + + @Test(expected = IllegalArgumentException.class) + public void createWithNullArgument() { + factory.create(null); + } + + @Test(expected = IllegalArgumentException.class) + public void createWithIncorrectArgument() throws IOException { + factory.create(""); + } +} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/test/MyTableProviderTest.java b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/test/MyTableProviderTest.java new file mode 100644 index 000000000..272061197 --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/test/MyTableProviderTest.java @@ -0,0 +1,69 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit.test; + + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import ru.fizteh.fivt.storage.strings.TableProvider; +import ru.fizteh.fivt.storage.strings.TableProviderFactory; +import ru.fizteh.fivt.students.elina_denisova.j_unit.MyTableProviderFactory; + +import java.io.IOException; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +public class MyTableProviderTest { + @Rule + public TemporaryFolder folder = new TemporaryFolder(); + + public TableProvider provider; + + @Before + public void initProvider() throws IOException { + TableProviderFactory factory = new MyTableProviderFactory(); + provider = factory.create(folder.newFolder("test").getAbsolutePath()); + } + + @Test (expected = IllegalArgumentException.class) + public void getNullTable() { + provider.getTable(null); + } + + @Test (expected = IllegalArgumentException.class) + public void createNullTable() { + provider.createTable(null); + } + + @Test (expected = IllegalArgumentException.class) + public void removeNullTable() { + provider.removeTable(null); + } + + @Test + public void createAndGetTable() { + provider.createTable("newTable"); + assertNull(provider.getTable("notExistingTable")); + assertNotNull(provider.getTable("newTable")); + } + + @Test (expected = IllegalStateException.class) + public void removeNotExistingTable() { + provider.removeTable("notExistingTable"); + } + + @Test + public void createAndRemoveTable() { + assertNotNull(provider.createTable("newTable")); + assertNotNull(provider.getTable("newTable")); + provider.removeTable("newTable"); + assertNull(provider.getTable("newTable")); + } + + @Test + public void doubleTableCreation() { + assertNotNull(provider.createTable("newTable")); + assertNull(provider.createTable("newTable")); + } +} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/test/MyTableTest.java b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/test/MyTableTest.java new file mode 100644 index 000000000..b1a81255d --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/test/MyTableTest.java @@ -0,0 +1,152 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit.test; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import ru.fizteh.fivt.storage.strings.Table; +import ru.fizteh.fivt.storage.strings.TableProvider; +import ru.fizteh.fivt.storage.strings.TableProviderFactory; +import ru.fizteh.fivt.students.elina_denisova.j_unit.MyTableProviderFactory; + +import java.io.IOException; +import java.util.Arrays; +import java.util.LinkedList; + +import static org.junit.Assert.*; + +public class MyTableTest { + + @Rule + public TemporaryFolder folder = new TemporaryFolder(); + + public Table table; + public String dbDirPath; + + @Before + public void initTable() throws IOException { + TableProviderFactory factory = new MyTableProviderFactory(); + dbDirPath = folder.newFolder("test").getAbsolutePath(); + TableProvider provider = factory.create(dbDirPath); + table = provider.createTable("table"); + } + + @Test + public void testGetName() { + assertEquals("table", table.getName()); + } + + @Test (expected = IllegalArgumentException.class) + public void putNull() { + table.put(null, null); + } + + @Test (expected = IllegalArgumentException.class) + public void getNull() { + table.get(null); + } + + @Test (expected = IllegalArgumentException.class) + public void removeNull() { + table.remove(null); + } + + @Test + public void testPutAndGet() { + assertNull(table.put("1", "2")); + assertEquals("2", table.get("1")); + assertEquals("2", table.put("1", "3")); + assertEquals("3", table.get("1")); + assertNull(table.get("a")); + } + + @Test + public void testPutAndRemove() { + assertNull(table.put("1", "2")); + assertNull(table.remove("2")); + assertEquals("2", table.remove("1")); + assertNull(table.remove("1")); + assertNull(table.get("1")); + } + + @Test + public void testSize() { + assertEquals(0, table.size()); + table.put("1", "2"); + assertEquals(1, table.size()); + table.put("3", "4"); + assertEquals(2, table.size()); + table.put("3", "5"); + assertEquals(2, table.size()); + table.remove("1"); + assertEquals(1, table.size()); + table.remove("1"); + assertEquals(1, table.size()); + table.remove("3"); + assertEquals(0, table.size()); + } + + @Test + public void testList() { + assertEquals(0, table.list().size()); + table.put("1", "2"); + table.put("3", "4"); + table.put("3", "5"); + table.remove("1"); + table.put("6", "7"); + table.put("key", "value"); + assertEquals(3, table.list().size()); + assertTrue(table.list().containsAll(new LinkedList<>(Arrays.asList("3", "6", "key")))); + } + + @Test + public void testRollBack() { + assertEquals(0, table.rollback()); + table.put("1", "2"); + table.put("2", "3"); + table.put("3", "4"); + table.remove("1"); + table.put("1", "5"); + assertEquals(3, table.size()); + assertEquals(3, table.rollback()); + assertEquals(0, table.size()); + } + + @Test + public void testCommit() { + assertEquals(0, table.commit()); + table.put("1", "2"); + table.put("2", "3"); + table.put("3", "4"); + table.remove("3"); + assertEquals(2, table.commit()); + assertEquals(2, table.size()); + TableProviderFactory factory = new MyTableProviderFactory(); + TableProvider provider = factory.create(dbDirPath); + Table sameTable = provider.getTable("table"); + assertEquals(2, sameTable.size()); + } + + @Test + public void testCommitAndRollback() { + table.put("1", "2"); + table.put("2", "3"); + table.put("3", "4"); + assertEquals(3, table.commit()); + table.remove("1"); + table.remove("2"); + assertNull(table.get("1")); + assertNull(table.get("2")); + assertEquals(2, table.rollback()); + assertEquals("2", table.get("1")); + assertEquals("3", table.get("2")); + table.remove("1"); + assertEquals(1, table.commit()); + assertEquals(2, table.size()); + table.put("1", "2"); + assertEquals(3, table.size()); + assertEquals(1, table.rollback()); + assertEquals(2, table.size()); + assertEquals(null, table.get("1")); + } +} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java index 7c1cf9f1a..edf525345 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java @@ -20,7 +20,9 @@ public class MyTable implements Table { public static final int COUNT_OBJECT = 16; public static final int COMMON_CONSTANT_INDEX = 100; - + public static final String ENCODING = "UTF-8"; + public static final String SUF_DIR = ".dir"; + public static final String SUF_FILE = ".dat"; public MyTable(File tableDir) { try { @@ -28,9 +30,9 @@ public MyTable(File tableDir) { mainDir = tableDir.toPath(); for (int i = 0; i < COUNT_OBJECT; i++) { - File subDir = new File(tableDir, i + ".dir"); + File subDir = new File(tableDir, i + SUF_DIR); for (int j = 0; j < COUNT_OBJECT; j++) { - File dbFile = new File(subDir, j + ".dat"); + File dbFile = new File(subDir, j + SUF_FILE); if (dbFile.exists()) { String adds = Integer.toString(i * COMMON_CONSTANT_INDEX + j); databases.put(adds, new HashMap()); @@ -52,13 +54,17 @@ public String getName() { return mainDir.toString(); }; + private String pathname(String key) { + int hashCode = Math.abs(key.hashCode()); + int dir = hashCode % COUNT_OBJECT; + int file = hashCode / COUNT_OBJECT % COUNT_OBJECT; + return Integer.toString(dir * COMMON_CONSTANT_INDEX + file); + } + @Override public String get(String key) throws IllegalArgumentException { if (key != null) { - int hashCode = Math.abs(key.hashCode()); - int dir = hashCode % COUNT_OBJECT; - int file = hashCode / COUNT_OBJECT % COUNT_OBJECT; - String adds = Integer.toString(dir * COMMON_CONSTANT_INDEX + file); + String adds = pathname(key); return databases.get(adds).get(key); } else { throw new IllegalArgumentException("Table.get: Haven't key. "); @@ -68,10 +74,7 @@ public String get(String key) throws IllegalArgumentException { @Override public String put(String key, String value) { if ((key != null) || (value != null)) { - int hashCode = Math.abs(key.hashCode()); - int dir = hashCode % COUNT_OBJECT; - int file = hashCode / COUNT_OBJECT % COUNT_OBJECT; - String adds = Integer.toString(dir * COMMON_CONSTANT_INDEX + file); + String adds = pathname(key); if (!databases.containsKey(adds)) { databases.put(adds, new HashMap()); } @@ -97,10 +100,7 @@ public String put(String key, String value) { @Override public String remove(String key) { if (key != null) { - int hashCode = Math.abs(key.hashCode()); - int dir = hashCode % COUNT_OBJECT; - int file = hashCode / COUNT_OBJECT % COUNT_OBJECT; - String adds = Integer.toString(dir * COMMON_CONSTANT_INDEX + file); + String adds = pathname(key); if (!databases.containsKey(adds)) { return null; } else { @@ -142,14 +142,14 @@ public int commit() { for (int j = 0; j < COUNT_OBJECT; j++) { String adds = Integer.toString(i * COMMON_CONSTANT_INDEX + j); if (databases.containsKey(adds)) { - File directory = new File(mainDir.toString(), i + ".dir"); + File directory = new File(mainDir.toString(), i + SUF_DIR); if (!directory.exists()) { if (!directory.mkdir()) { throw new UnsupportedOperationException("ParserCommands.commandsExecution.put:" + " Unable to create directories in working catalog"); } } - File dataBaseOld = new File(directory, j + ".dat"); + File dataBaseOld = new File(directory, j + SUF_FILE); if (dataBaseOld.exists()) { try { Files.delete(dataBaseOld.toPath()); @@ -160,11 +160,10 @@ public int commit() { if (!dataBaseOld.exists()) { try { - if (!dataBaseOld.createNewFile()) { - throw new UnsupportedOperationException("ParserCommands.commandsExecution.put:" - + " Unable to create database files in working catalog"); + if(!dataBaseOld.createNewFile()) { + throw new IOException(); } - } catch (IOException e) { + } catch (IOException | NullPointerException e) { throw new UnsupportedOperationException("ParserCommands.commandsExecution.put:" + " Unable to create database files in working catalog"); } @@ -182,8 +181,8 @@ public int commit() { } if (databases.get(adds).size() == 0) { - File subDir = new File(mainDir.toString(), i + ".dir"); - File dbFile = new File(subDir, j + ".dat"); + File subDir = new File(mainDir.toString(), i + SUF_DIR); + File dbFile = new File(subDir, j + SUF_FILE); try { if (dbFile.exists()) { Files.delete(dbFile.toPath()); @@ -201,7 +200,7 @@ public int commit() { k++; } } - if (k == COUNT_OBJECT) { + if (k == 0) { try { Files.delete(subDir.toPath()); } catch (DirectoryNotEmptyException e) { @@ -222,10 +221,10 @@ public int commit() { private void writeNext(RandomAccessFile dbFile, String word) throws IOException { try { - dbFile.writeInt(word.getBytes("UTF-8").length); - dbFile.write(word.getBytes("UTF-8")); + dbFile.writeInt(word.getBytes(ENCODING).length); + dbFile.write(word.getBytes(ENCODING)); } catch (UnsupportedEncodingException e) { - throw new RuntimeException("Table.writeNext: Don't supported encoding UTF-8. "); + throw new RuntimeException("Table.writeNext: Don't supported encoding " + ENCODING + ". "); } catch (IOException e) { throw new RuntimeException("Table.writeNext: Can't write to database. ", e); } @@ -262,7 +261,7 @@ private String readNext(RandomAccessFile dbFile) throws IOException { int wordLength = dbFile.readInt(); byte[] word = new byte[wordLength]; dbFile.read(word, 0, wordLength); - return new String(word, "UTF-8"); + return new String(word, ENCODING); } catch (UnsupportedEncodingException e) { throw new UnsupportedEncodingException("Table.readNext: UTF-8 encoding is not supported"); } catch (IOException e) { diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProvider.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProvider.java index 760b7f9db..28afd4bb1 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProvider.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProvider.java @@ -21,6 +21,8 @@ public class MyTableProvider implements TableProvider { public static final int COUNT_OBJECT = 16; public static final int COMMON_CONSTANT_INDEX = 100; + public static final String SUF_DIR = ".dir"; + public static final String SUF_FILE = ".dat"; public MyTableProvider(String path) { @@ -92,11 +94,11 @@ public void removeTable(String name) { if (tables.containsKey(name)) { File table = new File(parentDirectory, name); for (int i = 0; i < COUNT_OBJECT; i++) { - File subDir = new File(table, i + ".dir"); + File subDir = new File(table, i + SUF_DIR); for (int j = 0; j < COUNT_OBJECT; j++) { String adds = Integer.toString(i * COMMON_CONSTANT_INDEX + j); if (tables.get(name).containsKey(adds)) { - File dbFile = new File(subDir, j + ".dat"); + File dbFile = new File(subDir, j + SUF_FILE); if (dbFile.exists()) { try { Files.delete(dbFile.toPath()); diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/ParserCommands.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/ParserCommands.java index a9c7febba..e98ff57ad 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/ParserCommands.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/ParserCommands.java @@ -7,6 +7,7 @@ public class ParserCommands { private static int numberChanges = 0; + public static void commandsExecution(String[] command, MyTableProvider directory) throws IllegalMonitorStateException { if (command.length == 0) { @@ -76,9 +77,10 @@ public static void commandsExecution(String[] command, MyTableProvider directory if (directory.getUsing() == null) { System.out.println("no table"); } else { - if (directory.getUsing().get(command[1]) != null) { + String value = directory.getUsing().get(command[1]); + if (value != null) { System.out.println("found"); - System.out.println(directory.getUsing().get(command[1])); + System.out.println(value); } else { System.out.println("not found"); } @@ -206,7 +208,7 @@ public static void commandsExecution(String[] command, MyTableProvider directory System.err.println(command[0] + " - unknown command"); } } catch (IllegalArgumentException e) { - System.err.println(e.toString()); + System.err.println(e.getMessage()); } } diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableTest.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableTest.java index b0a3fa0dd..b1a81255d 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableTest.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableTest.java @@ -147,5 +147,6 @@ public void testCommitAndRollback() { assertEquals(3, table.size()); assertEquals(1, table.rollback()); assertEquals(2, table.size()); + assertEquals(null, table.get("1")); } } From 947169038fc09b297addd372aa66188fd58d6517 Mon Sep 17 00:00:00 2001 From: ElinRin Date: Thu, 25 Dec 2014 10:46:21 +0300 Subject: [PATCH 08/13] Revert "fixed" This reverts commit 2d493bf1a143081a13686a9fce53cc32bc935f2f. --- .../elina_denisova/j_unit/Commands.java | 36 -- .../j_unit/HandlerException.java | 15 - .../j_unit/InteractiveParse.java | 30 -- .../elina_denisova/j_unit/MyTable.java | 312 ------------------ .../j_unit/MyTableProvider.java | 155 --------- .../j_unit/MyTableProviderFactory.java | 15 - .../elina_denisova/j_unit/PackageParse.java | 32 -- .../elina_denisova/j_unit/ParserCommands.java | 225 ------------- .../elina_denisova/j_unit/Runner.java | 30 -- .../test/MyTableProviderFactoryTest.java | 40 --- .../j_unit/test/MyTableProviderTest.java | 69 ---- .../j_unit/test/MyTableTest.java | 152 --------- .../elina_denisova/j_unit/MyTable.java | 55 +-- .../j_unit/MyTableProvider.java | 6 +- .../elina_denisova/j_unit/ParserCommands.java | 8 +- .../j_unit/test/MyTableTest.java | 1 - 16 files changed, 33 insertions(+), 1148 deletions(-) delete mode 100644 src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/Commands.java delete mode 100644 src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/HandlerException.java delete mode 100644 src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/InteractiveParse.java delete mode 100644 src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/MyTable.java delete mode 100644 src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/MyTableProvider.java delete mode 100644 src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/MyTableProviderFactory.java delete mode 100644 src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/PackageParse.java delete mode 100644 src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/ParserCommands.java delete mode 100644 src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/Runner.java delete mode 100644 src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/test/MyTableProviderFactoryTest.java delete mode 100644 src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/test/MyTableProviderTest.java delete mode 100644 src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/test/MyTableTest.java diff --git a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/Commands.java b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/Commands.java deleted file mode 100644 index a81a3ffe7..000000000 --- a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/Commands.java +++ /dev/null @@ -1,36 +0,0 @@ -package ru.fizteh.fivt.students.elina_denisova.j_unit; - -public enum Commands { - - CREATECOMMAND("create"), - SIZECOMMAND("size"), - COMMITCOMMAND("commit"), - ROLLBACKCOMMAND("rollback"), - DROPCOMMAND("drop"), - USECOMMAND("use"), - SHOWCOMMAND("show"), - PUTCOMMAND("put"), - GETCOMMAND("get"), - REMOVECOMMAND("remove"), - LISTCOMMAND("list"), - EXITCOMMAND("exit"); - - - private String value; - private Commands(String word) { - value = word; - } - - public static Commands getCommand(String word) throws IllegalArgumentException { - for (Commands command : Commands.values()) { - if (command.getValue().equals(word)) { - return command; - } - } - throw new IllegalArgumentException(word + " - unknown command"); - } - - public String getValue() { - return value; - } -} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/HandlerException.java b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/HandlerException.java deleted file mode 100644 index b0a8d45f8..000000000 --- a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/HandlerException.java +++ /dev/null @@ -1,15 +0,0 @@ -package ru.fizteh.fivt.students.elina_denisova.j_unit; - -public class HandlerException { - public static void handler(String message, Throwable cause) { - System.err.println(message + ". " + cause.getMessage()); - System.exit(1); - } - public static void handler(Throwable cause) { - System.err.println(cause.getMessage()); - System.exit(1); - } - -} - - diff --git a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/InteractiveParse.java b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/InteractiveParse.java deleted file mode 100644 index 03a3b4855..000000000 --- a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/InteractiveParse.java +++ /dev/null @@ -1,30 +0,0 @@ -package ru.fizteh.fivt.students.elina_denisova.j_unit; - -import java.util.Scanner; - -public class InteractiveParse { - public static void parse(MyTableProvider directory) { - Scanner in = new Scanner(System.in); - try { - while (true) { - System.out.print("$ "); - String s; - s = in.nextLine(); - s = s.trim(); - String[] current = s.split("\\s+"); - for (int i = 0; i < current.length; ++i) { - current[i].trim(); - } - ParserCommands.commandsExecution(current, directory); - } - } catch (IllegalMonitorStateException e) { - in.close(); - System.out.println("Goodbye"); - System.exit(0); - } catch (Exception e) { - in.close(); - HandlerException.handler("InteractiveParse: ", e); - } - in.close(); - } -} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/MyTable.java b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/MyTable.java deleted file mode 100644 index edf525345..000000000 --- a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/MyTable.java +++ /dev/null @@ -1,312 +0,0 @@ -package ru.fizteh.fivt.students.elina_denisova.j_unit; - -import ru.fizteh.fivt.storage.strings.Table; - -import java.io.*; -import java.nio.file.DirectoryNotEmptyException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class MyTable implements Table { - - private Path mainDir; - private Map> databases; - private static Map> changes = new HashMap<>(); - private int numberChanges = 0; - - public static final int COUNT_OBJECT = 16; - public static final int COMMON_CONSTANT_INDEX = 100; - public static final String ENCODING = "UTF-8"; - public static final String SUF_DIR = ".dir"; - public static final String SUF_FILE = ".dat"; - - public MyTable(File tableDir) { - try { - databases = new HashMap<>(); - mainDir = tableDir.toPath(); - - for (int i = 0; i < COUNT_OBJECT; i++) { - File subDir = new File(tableDir, i + SUF_DIR); - for (int j = 0; j < COUNT_OBJECT; j++) { - File dbFile = new File(subDir, j + SUF_FILE); - if (dbFile.exists()) { - String adds = Integer.toString(i * COMMON_CONSTANT_INDEX + j); - databases.put(adds, new HashMap()); - readFromFile(dbFile, databases.get(adds)); - } - } - } - } catch (Exception e) { - HandlerException.handler("TableProvider: ", e); - } - } - - public boolean containsKey(String adds) { - return databases.containsKey(adds); - } - - @Override - public String getName() { - return mainDir.toString(); - }; - - private String pathname(String key) { - int hashCode = Math.abs(key.hashCode()); - int dir = hashCode % COUNT_OBJECT; - int file = hashCode / COUNT_OBJECT % COUNT_OBJECT; - return Integer.toString(dir * COMMON_CONSTANT_INDEX + file); - } - - @Override - public String get(String key) throws IllegalArgumentException { - if (key != null) { - String adds = pathname(key); - return databases.get(adds).get(key); - } else { - throw new IllegalArgumentException("Table.get: Haven't key. "); - } - } - - @Override - public String put(String key, String value) { - if ((key != null) || (value != null)) { - String adds = pathname(key); - if (!databases.containsKey(adds)) { - databases.put(adds, new HashMap()); - } - - String oldValue = databases.get(adds).get(key); - databases.get(adds).put(key, value); - numberChanges++; - changes.put(numberChanges, new ArrayList()); - changes.get(numberChanges).add("put"); - changes.get(numberChanges).add(key); - changes.get(numberChanges).add(value); - if (oldValue == null) { - changes.get(numberChanges).add("new"); - } else { - changes.get(numberChanges).add(oldValue); - } - return oldValue; - } else { - throw new IllegalArgumentException("MyTable.put: Haven't key or value. "); - } - } - - @Override - public String remove(String key) { - if (key != null) { - String adds = pathname(key); - if (!databases.containsKey(adds)) { - return null; - } else { - String oldValue = databases.get(adds).get(key); - databases.get(adds).remove(key); - numberChanges++; - changes.put(numberChanges, new ArrayList()); - changes.get(numberChanges).add("remove"); - changes.get(numberChanges).add(key); - changes.get(numberChanges).add(oldValue); - return oldValue; - } - } else { - throw new IllegalArgumentException("Table.get: Haven't key. "); - } - } - - @Override - public int size() { - int answer = 0; - for (int i = 0; i < COUNT_OBJECT; i++) { - for (int j = 0; j < COUNT_OBJECT; j++) { - String adds = Integer.toString(i * COMMON_CONSTANT_INDEX + j); - if (databases.containsKey(adds)) { - answer += databases.get(adds).size(); - } - } - } - return answer; - } - - @Override - public int commit() { - numberChanges = 0; - changes = new HashMap<>(); - - int count = 0; - for (int i = 0; i < COUNT_OBJECT; i++) { - for (int j = 0; j < COUNT_OBJECT; j++) { - String adds = Integer.toString(i * COMMON_CONSTANT_INDEX + j); - if (databases.containsKey(adds)) { - File directory = new File(mainDir.toString(), i + SUF_DIR); - if (!directory.exists()) { - if (!directory.mkdir()) { - throw new UnsupportedOperationException("ParserCommands.commandsExecution.put:" - + " Unable to create directories in working catalog"); - } - } - File dataBaseOld = new File(directory, j + SUF_FILE); - if (dataBaseOld.exists()) { - try { - Files.delete(dataBaseOld.toPath()); - } catch (IOException e) { - throw new RuntimeException("MyTable.writeInFile: Can't overwrite file"); - } - } - - if (!dataBaseOld.exists()) { - try { - if(!dataBaseOld.createNewFile()) { - throw new IOException(); - } - } catch (IOException | NullPointerException e) { - throw new UnsupportedOperationException("ParserCommands.commandsExecution.put:" - + " Unable to create database files in working catalog"); - } - } - try (RandomAccessFile dbFile = new RandomAccessFile(dataBaseOld, "rw")) { - for (Map.Entry current : databases.get(adds).entrySet()) { - count++; - writeNext(dbFile, current.getKey()); - writeNext(dbFile, current.getValue()); - } - } catch (FileNotFoundException e) { - throw new RuntimeException("MyTable.writeInFile: File not found"); - } catch (IOException e) { - throw new RuntimeException("MyTable.writeInFile: Can't write to file.", e); - } - - if (databases.get(adds).size() == 0) { - File subDir = new File(mainDir.toString(), i + SUF_DIR); - File dbFile = new File(subDir, j + SUF_FILE); - try { - if (dbFile.exists()) { - Files.delete(dbFile.toPath()); - } - } catch (IOException e) { - throw new IllegalStateException("MyTable.remove: " - + "Cannot delete database file. ", e); - } - databases.remove(adds); - - int k = 0; - for (int file = 0; file < COUNT_OBJECT; file++) { - String variableAdds = Integer.toString(i * COMMON_CONSTANT_INDEX + file); - if (databases.containsKey(variableAdds)) { - k++; - } - } - if (k == 0) { - try { - Files.delete(subDir.toPath()); - } catch (DirectoryNotEmptyException e) { - throw new IllegalStateException("MyTable.remove: Cannot remove table subdirectory. " - + "Redundant files", e); - } catch (IOException e) { - throw new IllegalStateException("MyTable.remove: " - + "Cannot delete database subdirectory", e); - } - } - } - } - } - } - return count; - - } - - private void writeNext(RandomAccessFile dbFile, String word) throws IOException { - try { - dbFile.writeInt(word.getBytes(ENCODING).length); - dbFile.write(word.getBytes(ENCODING)); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException("Table.writeNext: Don't supported encoding " + ENCODING + ". "); - } catch (IOException e) { - throw new RuntimeException("Table.writeNext: Can't write to database. ", e); - } - } - public void readFromFile(File dbFileName, Map data) throws IllegalArgumentException { - try (RandomAccessFile file = new RandomAccessFile(dbFileName.toString(), "r")) { - - if (file.length() > 0) { - while (file.getFilePointer() < file.length()) { - String key = readNext(file); - String value = readNext(file); - if (data.containsKey(key)) { - throw new IllegalArgumentException("Table.readFromFile: Two same keys in database file"); - } - data.put(key, value); - } - } - } catch (UnsupportedEncodingException e) { - throw new RuntimeException(e); - } catch (IllegalArgumentException e) { - throw new RuntimeException(e); - } catch (FileNotFoundException e) { - throw new RuntimeException("Table.readFromFile: File not found", e); - } catch (IOException e) { - throw new RuntimeException(" Table.readFromFile: Problems with reading from database file " + e.toString()); - } catch (Exception e) { - throw new RuntimeException("Table.readFromFile: ", e); - } - } - - - private String readNext(RandomAccessFile dbFile) throws IOException { - try { - int wordLength = dbFile.readInt(); - byte[] word = new byte[wordLength]; - dbFile.read(word, 0, wordLength); - return new String(word, ENCODING); - } catch (UnsupportedEncodingException e) { - throw new UnsupportedEncodingException("Table.readNext: UTF-8 encoding is not supported"); - } catch (IOException e) { - throw new IOException(" Table.readNext: Can't read from database " + e.toString()); - } - } - - - @Override - public int rollback() { - int count = 0; - Map> saveChanges = changes; - for (int i = saveChanges.size(); i > 0; i--) { - String[] com = new String[saveChanges.get(i).size()]; - com = saveChanges.get(i).toArray(com); - String message; - if (com[0].equals("put")) { - if (com[3].equals("new")) { - message = remove(com[1]); - } else { - message = put(com[1], com[3]); - } - } - if (com[0].equals("remove")) { - put(com[1], com[2]); - } - count++; - } - numberChanges = 0; - changes = new HashMap<>(); - return count; - } - - @Override - public List list() { - List listKey = new ArrayList<>(); - for (int i = 0; i < COUNT_OBJECT; i++) { - for (int j = 0; j < COUNT_OBJECT; j++) { - String adds = Integer.toString(i * COMMON_CONSTANT_INDEX + j); - if (databases.containsKey(adds)) { - for (String key : databases.get(adds).keySet()) { - listKey.add(key); - } - } - } - } return listKey; - } -} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/MyTableProvider.java b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/MyTableProvider.java deleted file mode 100644 index 28afd4bb1..000000000 --- a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/MyTableProvider.java +++ /dev/null @@ -1,155 +0,0 @@ -package ru.fizteh.fivt.students.elina_denisova.j_unit; - -import ru.fizteh.fivt.storage.strings.Table; -import ru.fizteh.fivt.storage.strings.TableProvider; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.nio.file.DirectoryNotEmptyException; -import java.nio.file.Files; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; - - -public class MyTableProvider implements TableProvider { - - private HashMap tables; - private String using; - private File parentDirectory; - - public static final int COUNT_OBJECT = 16; - public static final int COMMON_CONSTANT_INDEX = 100; - public static final String SUF_DIR = ".dir"; - public static final String SUF_FILE = ".dat"; - - - public MyTableProvider(String path) { - parentDirectory = new File(path); - using = null; - tables = new HashMap<>(); - - try { - if (path == null) { - throw new NullPointerException("MyTableProvider: Wrong path"); - } - if (!Files.exists(parentDirectory.toPath()) && !parentDirectory.mkdir()) { - throw new UnsupportedOperationException("MyTableProvider: Cannot create working directory"); - } - if (!parentDirectory.isDirectory()) { - throw new FileNotFoundException("MyTableProvider:" + parentDirectory.toString() - + " is not a directory"); - } - for (String childName : parentDirectory.list()) { - File childDirectory = new File(parentDirectory, childName); - if (childDirectory.isDirectory()) { - tables.put(childName, new MyTable(childDirectory)); - } else { - throw new Exception("MyTableProvider:" + childName - + " from databases directory is not a directory"); - } - } - } catch (UnsupportedOperationException e) { - HandlerException.handler(e); - } catch (NullPointerException e) { - HandlerException.handler(e); - } catch (FileNotFoundException e) { - HandlerException.handler(e); - } catch (Exception e) { - HandlerException.handler("TableProviderFactory: ", e); - } - } - - @Override - public Table getTable(String name) { - return tables.get(name); - } - - @Override - public Table createTable(String name) { - if (name == null) { - throw new IllegalArgumentException("MyTableProvider.createTable: " - + "Invalid name. "); - } - if (tables.containsKey(name)) { - return null; - } else { - File newTable = new File(parentDirectory, name); - if (!newTable.mkdir()) { - throw new UnsupportedOperationException("MyTableProvider.createTable: " - + "Unable to create working directory for new table. "); - } - tables.put(name, new MyTable(newTable)); - return tables.get(name); - } - } - - @Override - public void removeTable(String name) { - if (name == null) { - throw new IllegalArgumentException("MyTableProvider.removeTable: " - + "Invalid name. "); - } - if (tables.containsKey(name)) { - File table = new File(parentDirectory, name); - for (int i = 0; i < COUNT_OBJECT; i++) { - File subDir = new File(table, i + SUF_DIR); - for (int j = 0; j < COUNT_OBJECT; j++) { - String adds = Integer.toString(i * COMMON_CONSTANT_INDEX + j); - if (tables.get(name).containsKey(adds)) { - File dbFile = new File(subDir, j + SUF_FILE); - if (dbFile.exists()) { - try { - Files.delete(dbFile.toPath()); - } catch (IOException e) { - throw new RuntimeException("MyTableProvider.removeTable: " - + "cannon delete database file", e); - } - } - } - } - if (subDir.exists()) { - try { - Files.delete(subDir.toPath()); - } catch (DirectoryNotEmptyException e) { - throw new RuntimeException("MyTableProvider.removeTable: " - + "cannot remove table subdirectory", e); - } catch (IOException e) { - throw new RuntimeException("MyTableProvider.removeTable: " - + "cannot delete database subdirectory", e); - } - } - } - try { - Files.delete(table.toPath()); - } catch (DirectoryNotEmptyException e) { - throw new RuntimeException("TableProvider.tDrop: cannot remove main table directory", e); - } catch (IOException e) { - throw new RuntimeException("TableProvider.tDrop: cannot delete main database directory", e); - } - tables.remove(name); - } else { - throw new IllegalStateException("MyTableProvider.removeTable: " + name + "doesn't exist"); - } - } - - public Table getUsing() { - return tables.get(using); - } - - public void changeUsingTable(String table) { - using = table; - } - - - public Set> entrySet() { - return tables.entrySet(); - } - - - public boolean containsKey(String key) { - return tables.containsKey(key); - } - -} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/MyTableProviderFactory.java b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/MyTableProviderFactory.java deleted file mode 100644 index 3f397e2c7..000000000 --- a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/MyTableProviderFactory.java +++ /dev/null @@ -1,15 +0,0 @@ -package ru.fizteh.fivt.students.elina_denisova.j_unit; - -import ru.fizteh.fivt.storage.strings.TableProviderFactory; - -public class MyTableProviderFactory implements TableProviderFactory { - - @Override - public MyTableProvider create(String dir) { - if (dir == null) { - throw new IllegalArgumentException("MyTableProvider.create: " + dir - + " isn't a directory. "); - } - return new MyTableProvider(dir); - } -} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/PackageParse.java b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/PackageParse.java deleted file mode 100644 index 96d7e05c7..000000000 --- a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/PackageParse.java +++ /dev/null @@ -1,32 +0,0 @@ -package ru.fizteh.fivt.students.elina_denisova.j_unit; - -import java.util.ArrayList; - -public class PackageParse { - public static void parse(MyTableProvider directory, String[] arg) { - try { - ArrayList current = new ArrayList(); - for (int i = 0; i < arg.length; ++i) { - current.clear(); - while (i < arg.length) { - if (!(arg[i].contains(";"))) { - current.add(arg[i]); - i++; - } else { - current.add(arg[i].substring(0, arg[i].indexOf(";"))); - break; - } - } - ParserCommands.commandsExecution(current, directory); - } - directory.getUsing().commit(); - } catch (IllegalMonitorStateException e) { - System.out.println("Goodbye"); - System.exit(0); - } catch (IllegalArgumentException e) { - HandlerException.handler("PackageParse: Wrong arguments", e); - } catch (Exception e) { - HandlerException.handler("PackageParse: ", e); - } - } -} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/ParserCommands.java b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/ParserCommands.java deleted file mode 100644 index e98ff57ad..000000000 --- a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/ParserCommands.java +++ /dev/null @@ -1,225 +0,0 @@ -package ru.fizteh.fivt.students.elina_denisova.j_unit; - -import java.util.ArrayList; -import java.util.Map; - -public class ParserCommands { - - private static int numberChanges = 0; - - - public static void commandsExecution(String[] command, MyTableProvider directory) - throws IllegalMonitorStateException { - if (command.length == 0) { - return; - } - try { - Commands request = Commands.getCommand(command[0]); - switch (request) { - case CREATECOMMAND: - try { - try { - if (command[2] != null) { - System.err.println("create: need only one argument"); - } - } catch (ArrayIndexOutOfBoundsException e) { - - if (directory.createTable(command[1]) == null) { - System.out.println(command[1] + " exists"); - } else { - System.out.println("created"); - } - } - } catch (UnsupportedOperationException e) { - HandlerException.handler(e); - } catch (ArrayIndexOutOfBoundsException e) { - System.err.println("create: need only one argument"); - } - break; - case PUTCOMMAND: - try { - try { - if (command[3] != null) { - System.err.println("create: need two arguments"); - } - } catch (ArrayIndexOutOfBoundsException e) { - if (directory.getUsing() == null) { - System.out.println("no table"); - } else { - String oldValue = directory.getUsing().put(command[1], command[2]); - if (oldValue != null) { - System.out.println("overwrite"); - System.out.println(oldValue); - } else { - System.out.println("new"); - } - numberChanges++; - } - } - - } catch (UnsupportedOperationException e) { - HandlerException.handler(e); - } catch (ArrayIndexOutOfBoundsException e) { - System.err.println("put: need two arguments"); - } catch (NullPointerException e) { - HandlerException.handler(e); - } catch (Exception e) { - HandlerException.handler("ParserCommands.commandsExecution.put: ", e); - } - break; - case GETCOMMAND: - try { - try { - if (command[2] != null) { - System.err.println("create: need only one argument"); - } - } catch (ArrayIndexOutOfBoundsException e) { - if (directory.getUsing() == null) { - System.out.println("no table"); - } else { - String value = directory.getUsing().get(command[1]); - if (value != null) { - System.out.println("found"); - System.out.println(value); - } else { - System.out.println("not found"); - } - } - } - } catch (IllegalArgumentException e) { - System.out.println("not found"); - } catch (ArrayIndexOutOfBoundsException e) { - System.err.println("get: need only one argument"); - } - break; - case REMOVECOMMAND: - try { - try { - if (command[2] != null) { - System.err.println("create: need only one argument"); - } - } catch (ArrayIndexOutOfBoundsException e) { - if (directory.getUsing() == null) { - System.out.println("no table"); - } else { - String oldValue = directory.getUsing().remove(command[1]); - if (oldValue != null) { - System.out.println("removed"); - numberChanges++; - } else { - System.out.println("not found"); - } - } - } - } catch (ArrayIndexOutOfBoundsException e) { - System.err.println("remove: need only one argument"); - } - break; - case DROPCOMMAND: - try { - try { - if (command[2] != null) { - System.err.println("create: need only one argument"); - } - } catch (ArrayIndexOutOfBoundsException e) { - if (directory.getTable(command[1]) == directory.getUsing()) { - numberChanges = 0; - } - directory.removeTable(command[1]); - System.out.println("dropped"); - } - } catch (IllegalStateException e) { - System.out.println(command[1] + " not exist"); - } catch (ArrayIndexOutOfBoundsException e) { - System.err.println("drop: need only one argument"); - } - break; - case COMMITCOMMAND: - directory.getUsing().commit(); - System.out.println(numberChanges); - numberChanges = 0; - break; - case ROLLBACKCOMMAND: - System.out.println(directory.getUsing().rollback()); - numberChanges = 0; - break; - case USECOMMAND: - try { - try { - if (command[2] != null) { - System.err.println("create: need only one argument"); - } - } catch (ArrayIndexOutOfBoundsException e) { - if (numberChanges == 0) { - if (!directory.containsKey(command[1])) { - System.err.println("use: " + command[1] + " not exists"); - } else { - directory.changeUsingTable(command[1]); - System.out.println("using " + command[1]); - } - } else { - System.err.println(numberChanges + " unsaved changes"); - } - } - } catch (ArrayIndexOutOfBoundsException e) { - System.err.println("use: need argument"); - } - break; - case SHOWCOMMAND: - try { - if (command[1].equals("tables")) { - for (Map.Entry entry: directory.entrySet()) { - String name = entry.getKey(); - - int size = entry.getValue().size(); - System.out.println(name + " " + size); - } - - } else { - throw new IllegalArgumentException(); - } - - } catch (IllegalArgumentException e) { - System.err.println(command[0] + " - unknown command"); - } - break; - case LISTCOMMAND: - if (directory.getUsing() == null) { - System.out.println("no table"); - } else { - System.out.println(directory.getUsing().list()); - } - break; - case SIZECOMMAND: - if (directory.getUsing() == null) { - System.out.println("no table"); - } else { - System.out.println(directory.getUsing().size()); - } - break; - case EXITCOMMAND: - if (numberChanges == 0) { - throw new IllegalMonitorStateException("Exit"); - } else { - System.err.println(numberChanges + " unsaved changes"); - } - break; - default: - System.err.println(command[0] + " - unknown command"); - } - } catch (IllegalArgumentException e) { - System.err.println(e.getMessage()); - } - } - - - - public static void commandsExecution(ArrayList commands, MyTableProvider directory) { - if (commands.size() == 0) { - return; - } - String[] com = new String[commands.size()]; - com = commands.toArray(com); - commandsExecution(com, directory); - } -} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/Runner.java b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/Runner.java deleted file mode 100644 index 22f2e1d44..000000000 --- a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/Runner.java +++ /dev/null @@ -1,30 +0,0 @@ -package ru.fizteh.fivt.students.elina_denisova.j_unit; - -public class Runner { - public static void main(String[] args) { - - try { - String path = System.getProperty("fizteh.db.dir"); - if (path == null) { - throw new NullPointerException("Runner: Directory doesn't exist"); - } - MyTableProviderFactory factory = new MyTableProviderFactory(); - MyTableProvider base = factory.create(path); - - - if (args.length == 0) { - InteractiveParse.parse(base); - } else { - PackageParse.parse(base, args); - } - } catch (IllegalArgumentException e) { - HandlerException.handler(e); - } catch (NullPointerException e) { - HandlerException.handler(e); - } catch (Exception e) { - HandlerException.handler("Runner: ", e); - } - } - -} - diff --git a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/test/MyTableProviderFactoryTest.java b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/test/MyTableProviderFactoryTest.java deleted file mode 100644 index 5a98b4ca6..000000000 --- a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/test/MyTableProviderFactoryTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package ru.fizteh.fivt.students.elina_denisova.j_unit.test; - -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; -import ru.fizteh.fivt.storage.strings.TableProviderFactory; -import ru.fizteh.fivt.students.elina_denisova.j_unit.MyTableProviderFactory; - -import java.io.IOException; - -import static junit.framework.Assert.assertNotNull; - -public class MyTableProviderFactoryTest { - - private TableProviderFactory factory; - - @Rule - public TemporaryFolder folder = new TemporaryFolder(); - - @Before - public void before() { - factory = new MyTableProviderFactory(); - } - - @Test - public void create() throws IOException { - assertNotNull(factory.create(folder.newFolder("test").getCanonicalPath())); - } - - @Test(expected = IllegalArgumentException.class) - public void createWithNullArgument() { - factory.create(null); - } - - @Test(expected = IllegalArgumentException.class) - public void createWithIncorrectArgument() throws IOException { - factory.create(""); - } -} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/test/MyTableProviderTest.java b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/test/MyTableProviderTest.java deleted file mode 100644 index 272061197..000000000 --- a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/test/MyTableProviderTest.java +++ /dev/null @@ -1,69 +0,0 @@ -package ru.fizteh.fivt.students.elina_denisova.j_unit.test; - - -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; -import ru.fizteh.fivt.storage.strings.TableProvider; -import ru.fizteh.fivt.storage.strings.TableProviderFactory; -import ru.fizteh.fivt.students.elina_denisova.j_unit.MyTableProviderFactory; - -import java.io.IOException; - -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; - -public class MyTableProviderTest { - @Rule - public TemporaryFolder folder = new TemporaryFolder(); - - public TableProvider provider; - - @Before - public void initProvider() throws IOException { - TableProviderFactory factory = new MyTableProviderFactory(); - provider = factory.create(folder.newFolder("test").getAbsolutePath()); - } - - @Test (expected = IllegalArgumentException.class) - public void getNullTable() { - provider.getTable(null); - } - - @Test (expected = IllegalArgumentException.class) - public void createNullTable() { - provider.createTable(null); - } - - @Test (expected = IllegalArgumentException.class) - public void removeNullTable() { - provider.removeTable(null); - } - - @Test - public void createAndGetTable() { - provider.createTable("newTable"); - assertNull(provider.getTable("notExistingTable")); - assertNotNull(provider.getTable("newTable")); - } - - @Test (expected = IllegalStateException.class) - public void removeNotExistingTable() { - provider.removeTable("notExistingTable"); - } - - @Test - public void createAndRemoveTable() { - assertNotNull(provider.createTable("newTable")); - assertNotNull(provider.getTable("newTable")); - provider.removeTable("newTable"); - assertNull(provider.getTable("newTable")); - } - - @Test - public void doubleTableCreation() { - assertNotNull(provider.createTable("newTable")); - assertNull(provider.createTable("newTable")); - } -} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/test/MyTableTest.java b/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/test/MyTableTest.java deleted file mode 100644 index b1a81255d..000000000 --- a/src/ru/fizteh/fivt/students/elina_denisova/elina_denisova/j_unit/test/MyTableTest.java +++ /dev/null @@ -1,152 +0,0 @@ -package ru.fizteh.fivt.students.elina_denisova.j_unit.test; - -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; -import ru.fizteh.fivt.storage.strings.Table; -import ru.fizteh.fivt.storage.strings.TableProvider; -import ru.fizteh.fivt.storage.strings.TableProviderFactory; -import ru.fizteh.fivt.students.elina_denisova.j_unit.MyTableProviderFactory; - -import java.io.IOException; -import java.util.Arrays; -import java.util.LinkedList; - -import static org.junit.Assert.*; - -public class MyTableTest { - - @Rule - public TemporaryFolder folder = new TemporaryFolder(); - - public Table table; - public String dbDirPath; - - @Before - public void initTable() throws IOException { - TableProviderFactory factory = new MyTableProviderFactory(); - dbDirPath = folder.newFolder("test").getAbsolutePath(); - TableProvider provider = factory.create(dbDirPath); - table = provider.createTable("table"); - } - - @Test - public void testGetName() { - assertEquals("table", table.getName()); - } - - @Test (expected = IllegalArgumentException.class) - public void putNull() { - table.put(null, null); - } - - @Test (expected = IllegalArgumentException.class) - public void getNull() { - table.get(null); - } - - @Test (expected = IllegalArgumentException.class) - public void removeNull() { - table.remove(null); - } - - @Test - public void testPutAndGet() { - assertNull(table.put("1", "2")); - assertEquals("2", table.get("1")); - assertEquals("2", table.put("1", "3")); - assertEquals("3", table.get("1")); - assertNull(table.get("a")); - } - - @Test - public void testPutAndRemove() { - assertNull(table.put("1", "2")); - assertNull(table.remove("2")); - assertEquals("2", table.remove("1")); - assertNull(table.remove("1")); - assertNull(table.get("1")); - } - - @Test - public void testSize() { - assertEquals(0, table.size()); - table.put("1", "2"); - assertEquals(1, table.size()); - table.put("3", "4"); - assertEquals(2, table.size()); - table.put("3", "5"); - assertEquals(2, table.size()); - table.remove("1"); - assertEquals(1, table.size()); - table.remove("1"); - assertEquals(1, table.size()); - table.remove("3"); - assertEquals(0, table.size()); - } - - @Test - public void testList() { - assertEquals(0, table.list().size()); - table.put("1", "2"); - table.put("3", "4"); - table.put("3", "5"); - table.remove("1"); - table.put("6", "7"); - table.put("key", "value"); - assertEquals(3, table.list().size()); - assertTrue(table.list().containsAll(new LinkedList<>(Arrays.asList("3", "6", "key")))); - } - - @Test - public void testRollBack() { - assertEquals(0, table.rollback()); - table.put("1", "2"); - table.put("2", "3"); - table.put("3", "4"); - table.remove("1"); - table.put("1", "5"); - assertEquals(3, table.size()); - assertEquals(3, table.rollback()); - assertEquals(0, table.size()); - } - - @Test - public void testCommit() { - assertEquals(0, table.commit()); - table.put("1", "2"); - table.put("2", "3"); - table.put("3", "4"); - table.remove("3"); - assertEquals(2, table.commit()); - assertEquals(2, table.size()); - TableProviderFactory factory = new MyTableProviderFactory(); - TableProvider provider = factory.create(dbDirPath); - Table sameTable = provider.getTable("table"); - assertEquals(2, sameTable.size()); - } - - @Test - public void testCommitAndRollback() { - table.put("1", "2"); - table.put("2", "3"); - table.put("3", "4"); - assertEquals(3, table.commit()); - table.remove("1"); - table.remove("2"); - assertNull(table.get("1")); - assertNull(table.get("2")); - assertEquals(2, table.rollback()); - assertEquals("2", table.get("1")); - assertEquals("3", table.get("2")); - table.remove("1"); - assertEquals(1, table.commit()); - assertEquals(2, table.size()); - table.put("1", "2"); - assertEquals(3, table.size()); - assertEquals(1, table.rollback()); - assertEquals(2, table.size()); - assertEquals(null, table.get("1")); - } -} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java index edf525345..7c1cf9f1a 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java @@ -20,9 +20,7 @@ public class MyTable implements Table { public static final int COUNT_OBJECT = 16; public static final int COMMON_CONSTANT_INDEX = 100; - public static final String ENCODING = "UTF-8"; - public static final String SUF_DIR = ".dir"; - public static final String SUF_FILE = ".dat"; + public MyTable(File tableDir) { try { @@ -30,9 +28,9 @@ public MyTable(File tableDir) { mainDir = tableDir.toPath(); for (int i = 0; i < COUNT_OBJECT; i++) { - File subDir = new File(tableDir, i + SUF_DIR); + File subDir = new File(tableDir, i + ".dir"); for (int j = 0; j < COUNT_OBJECT; j++) { - File dbFile = new File(subDir, j + SUF_FILE); + File dbFile = new File(subDir, j + ".dat"); if (dbFile.exists()) { String adds = Integer.toString(i * COMMON_CONSTANT_INDEX + j); databases.put(adds, new HashMap()); @@ -54,17 +52,13 @@ public String getName() { return mainDir.toString(); }; - private String pathname(String key) { - int hashCode = Math.abs(key.hashCode()); - int dir = hashCode % COUNT_OBJECT; - int file = hashCode / COUNT_OBJECT % COUNT_OBJECT; - return Integer.toString(dir * COMMON_CONSTANT_INDEX + file); - } - @Override public String get(String key) throws IllegalArgumentException { if (key != null) { - String adds = pathname(key); + int hashCode = Math.abs(key.hashCode()); + int dir = hashCode % COUNT_OBJECT; + int file = hashCode / COUNT_OBJECT % COUNT_OBJECT; + String adds = Integer.toString(dir * COMMON_CONSTANT_INDEX + file); return databases.get(adds).get(key); } else { throw new IllegalArgumentException("Table.get: Haven't key. "); @@ -74,7 +68,10 @@ public String get(String key) throws IllegalArgumentException { @Override public String put(String key, String value) { if ((key != null) || (value != null)) { - String adds = pathname(key); + int hashCode = Math.abs(key.hashCode()); + int dir = hashCode % COUNT_OBJECT; + int file = hashCode / COUNT_OBJECT % COUNT_OBJECT; + String adds = Integer.toString(dir * COMMON_CONSTANT_INDEX + file); if (!databases.containsKey(adds)) { databases.put(adds, new HashMap()); } @@ -100,7 +97,10 @@ public String put(String key, String value) { @Override public String remove(String key) { if (key != null) { - String adds = pathname(key); + int hashCode = Math.abs(key.hashCode()); + int dir = hashCode % COUNT_OBJECT; + int file = hashCode / COUNT_OBJECT % COUNT_OBJECT; + String adds = Integer.toString(dir * COMMON_CONSTANT_INDEX + file); if (!databases.containsKey(adds)) { return null; } else { @@ -142,14 +142,14 @@ public int commit() { for (int j = 0; j < COUNT_OBJECT; j++) { String adds = Integer.toString(i * COMMON_CONSTANT_INDEX + j); if (databases.containsKey(adds)) { - File directory = new File(mainDir.toString(), i + SUF_DIR); + File directory = new File(mainDir.toString(), i + ".dir"); if (!directory.exists()) { if (!directory.mkdir()) { throw new UnsupportedOperationException("ParserCommands.commandsExecution.put:" + " Unable to create directories in working catalog"); } } - File dataBaseOld = new File(directory, j + SUF_FILE); + File dataBaseOld = new File(directory, j + ".dat"); if (dataBaseOld.exists()) { try { Files.delete(dataBaseOld.toPath()); @@ -160,10 +160,11 @@ public int commit() { if (!dataBaseOld.exists()) { try { - if(!dataBaseOld.createNewFile()) { - throw new IOException(); + if (!dataBaseOld.createNewFile()) { + throw new UnsupportedOperationException("ParserCommands.commandsExecution.put:" + + " Unable to create database files in working catalog"); } - } catch (IOException | NullPointerException e) { + } catch (IOException e) { throw new UnsupportedOperationException("ParserCommands.commandsExecution.put:" + " Unable to create database files in working catalog"); } @@ -181,8 +182,8 @@ public int commit() { } if (databases.get(adds).size() == 0) { - File subDir = new File(mainDir.toString(), i + SUF_DIR); - File dbFile = new File(subDir, j + SUF_FILE); + File subDir = new File(mainDir.toString(), i + ".dir"); + File dbFile = new File(subDir, j + ".dat"); try { if (dbFile.exists()) { Files.delete(dbFile.toPath()); @@ -200,7 +201,7 @@ public int commit() { k++; } } - if (k == 0) { + if (k == COUNT_OBJECT) { try { Files.delete(subDir.toPath()); } catch (DirectoryNotEmptyException e) { @@ -221,10 +222,10 @@ public int commit() { private void writeNext(RandomAccessFile dbFile, String word) throws IOException { try { - dbFile.writeInt(word.getBytes(ENCODING).length); - dbFile.write(word.getBytes(ENCODING)); + dbFile.writeInt(word.getBytes("UTF-8").length); + dbFile.write(word.getBytes("UTF-8")); } catch (UnsupportedEncodingException e) { - throw new RuntimeException("Table.writeNext: Don't supported encoding " + ENCODING + ". "); + throw new RuntimeException("Table.writeNext: Don't supported encoding UTF-8. "); } catch (IOException e) { throw new RuntimeException("Table.writeNext: Can't write to database. ", e); } @@ -261,7 +262,7 @@ private String readNext(RandomAccessFile dbFile) throws IOException { int wordLength = dbFile.readInt(); byte[] word = new byte[wordLength]; dbFile.read(word, 0, wordLength); - return new String(word, ENCODING); + return new String(word, "UTF-8"); } catch (UnsupportedEncodingException e) { throw new UnsupportedEncodingException("Table.readNext: UTF-8 encoding is not supported"); } catch (IOException e) { diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProvider.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProvider.java index 28afd4bb1..760b7f9db 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProvider.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProvider.java @@ -21,8 +21,6 @@ public class MyTableProvider implements TableProvider { public static final int COUNT_OBJECT = 16; public static final int COMMON_CONSTANT_INDEX = 100; - public static final String SUF_DIR = ".dir"; - public static final String SUF_FILE = ".dat"; public MyTableProvider(String path) { @@ -94,11 +92,11 @@ public void removeTable(String name) { if (tables.containsKey(name)) { File table = new File(parentDirectory, name); for (int i = 0; i < COUNT_OBJECT; i++) { - File subDir = new File(table, i + SUF_DIR); + File subDir = new File(table, i + ".dir"); for (int j = 0; j < COUNT_OBJECT; j++) { String adds = Integer.toString(i * COMMON_CONSTANT_INDEX + j); if (tables.get(name).containsKey(adds)) { - File dbFile = new File(subDir, j + SUF_FILE); + File dbFile = new File(subDir, j + ".dat"); if (dbFile.exists()) { try { Files.delete(dbFile.toPath()); diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/ParserCommands.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/ParserCommands.java index e98ff57ad..a9c7febba 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/ParserCommands.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/ParserCommands.java @@ -7,7 +7,6 @@ public class ParserCommands { private static int numberChanges = 0; - public static void commandsExecution(String[] command, MyTableProvider directory) throws IllegalMonitorStateException { if (command.length == 0) { @@ -77,10 +76,9 @@ public static void commandsExecution(String[] command, MyTableProvider directory if (directory.getUsing() == null) { System.out.println("no table"); } else { - String value = directory.getUsing().get(command[1]); - if (value != null) { + if (directory.getUsing().get(command[1]) != null) { System.out.println("found"); - System.out.println(value); + System.out.println(directory.getUsing().get(command[1])); } else { System.out.println("not found"); } @@ -208,7 +206,7 @@ public static void commandsExecution(String[] command, MyTableProvider directory System.err.println(command[0] + " - unknown command"); } } catch (IllegalArgumentException e) { - System.err.println(e.getMessage()); + System.err.println(e.toString()); } } diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableTest.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableTest.java index b1a81255d..b0a3fa0dd 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableTest.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableTest.java @@ -147,6 +147,5 @@ public void testCommitAndRollback() { assertEquals(3, table.size()); assertEquals(1, table.rollback()); assertEquals(2, table.size()); - assertEquals(null, table.get("1")); } } From 74a7127c09a5e1d2785894bff38cbfe90272f46f Mon Sep 17 00:00:00 2001 From: ElinRin Date: Thu, 25 Dec 2014 10:47:34 +0300 Subject: [PATCH 09/13] fixed --- .../elina_denisova/j_unit/MyTable.java | 55 +++++++++---------- .../j_unit/MyTableProvider.java | 6 +- .../elina_denisova/j_unit/ParserCommands.java | 8 ++- .../j_unit/test/MyTableTest.java | 1 + 4 files changed, 37 insertions(+), 33 deletions(-) diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java index 7c1cf9f1a..edf525345 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java @@ -20,7 +20,9 @@ public class MyTable implements Table { public static final int COUNT_OBJECT = 16; public static final int COMMON_CONSTANT_INDEX = 100; - + public static final String ENCODING = "UTF-8"; + public static final String SUF_DIR = ".dir"; + public static final String SUF_FILE = ".dat"; public MyTable(File tableDir) { try { @@ -28,9 +30,9 @@ public MyTable(File tableDir) { mainDir = tableDir.toPath(); for (int i = 0; i < COUNT_OBJECT; i++) { - File subDir = new File(tableDir, i + ".dir"); + File subDir = new File(tableDir, i + SUF_DIR); for (int j = 0; j < COUNT_OBJECT; j++) { - File dbFile = new File(subDir, j + ".dat"); + File dbFile = new File(subDir, j + SUF_FILE); if (dbFile.exists()) { String adds = Integer.toString(i * COMMON_CONSTANT_INDEX + j); databases.put(adds, new HashMap()); @@ -52,13 +54,17 @@ public String getName() { return mainDir.toString(); }; + private String pathname(String key) { + int hashCode = Math.abs(key.hashCode()); + int dir = hashCode % COUNT_OBJECT; + int file = hashCode / COUNT_OBJECT % COUNT_OBJECT; + return Integer.toString(dir * COMMON_CONSTANT_INDEX + file); + } + @Override public String get(String key) throws IllegalArgumentException { if (key != null) { - int hashCode = Math.abs(key.hashCode()); - int dir = hashCode % COUNT_OBJECT; - int file = hashCode / COUNT_OBJECT % COUNT_OBJECT; - String adds = Integer.toString(dir * COMMON_CONSTANT_INDEX + file); + String adds = pathname(key); return databases.get(adds).get(key); } else { throw new IllegalArgumentException("Table.get: Haven't key. "); @@ -68,10 +74,7 @@ public String get(String key) throws IllegalArgumentException { @Override public String put(String key, String value) { if ((key != null) || (value != null)) { - int hashCode = Math.abs(key.hashCode()); - int dir = hashCode % COUNT_OBJECT; - int file = hashCode / COUNT_OBJECT % COUNT_OBJECT; - String adds = Integer.toString(dir * COMMON_CONSTANT_INDEX + file); + String adds = pathname(key); if (!databases.containsKey(adds)) { databases.put(adds, new HashMap()); } @@ -97,10 +100,7 @@ public String put(String key, String value) { @Override public String remove(String key) { if (key != null) { - int hashCode = Math.abs(key.hashCode()); - int dir = hashCode % COUNT_OBJECT; - int file = hashCode / COUNT_OBJECT % COUNT_OBJECT; - String adds = Integer.toString(dir * COMMON_CONSTANT_INDEX + file); + String adds = pathname(key); if (!databases.containsKey(adds)) { return null; } else { @@ -142,14 +142,14 @@ public int commit() { for (int j = 0; j < COUNT_OBJECT; j++) { String adds = Integer.toString(i * COMMON_CONSTANT_INDEX + j); if (databases.containsKey(adds)) { - File directory = new File(mainDir.toString(), i + ".dir"); + File directory = new File(mainDir.toString(), i + SUF_DIR); if (!directory.exists()) { if (!directory.mkdir()) { throw new UnsupportedOperationException("ParserCommands.commandsExecution.put:" + " Unable to create directories in working catalog"); } } - File dataBaseOld = new File(directory, j + ".dat"); + File dataBaseOld = new File(directory, j + SUF_FILE); if (dataBaseOld.exists()) { try { Files.delete(dataBaseOld.toPath()); @@ -160,11 +160,10 @@ public int commit() { if (!dataBaseOld.exists()) { try { - if (!dataBaseOld.createNewFile()) { - throw new UnsupportedOperationException("ParserCommands.commandsExecution.put:" - + " Unable to create database files in working catalog"); + if(!dataBaseOld.createNewFile()) { + throw new IOException(); } - } catch (IOException e) { + } catch (IOException | NullPointerException e) { throw new UnsupportedOperationException("ParserCommands.commandsExecution.put:" + " Unable to create database files in working catalog"); } @@ -182,8 +181,8 @@ public int commit() { } if (databases.get(adds).size() == 0) { - File subDir = new File(mainDir.toString(), i + ".dir"); - File dbFile = new File(subDir, j + ".dat"); + File subDir = new File(mainDir.toString(), i + SUF_DIR); + File dbFile = new File(subDir, j + SUF_FILE); try { if (dbFile.exists()) { Files.delete(dbFile.toPath()); @@ -201,7 +200,7 @@ public int commit() { k++; } } - if (k == COUNT_OBJECT) { + if (k == 0) { try { Files.delete(subDir.toPath()); } catch (DirectoryNotEmptyException e) { @@ -222,10 +221,10 @@ public int commit() { private void writeNext(RandomAccessFile dbFile, String word) throws IOException { try { - dbFile.writeInt(word.getBytes("UTF-8").length); - dbFile.write(word.getBytes("UTF-8")); + dbFile.writeInt(word.getBytes(ENCODING).length); + dbFile.write(word.getBytes(ENCODING)); } catch (UnsupportedEncodingException e) { - throw new RuntimeException("Table.writeNext: Don't supported encoding UTF-8. "); + throw new RuntimeException("Table.writeNext: Don't supported encoding " + ENCODING + ". "); } catch (IOException e) { throw new RuntimeException("Table.writeNext: Can't write to database. ", e); } @@ -262,7 +261,7 @@ private String readNext(RandomAccessFile dbFile) throws IOException { int wordLength = dbFile.readInt(); byte[] word = new byte[wordLength]; dbFile.read(word, 0, wordLength); - return new String(word, "UTF-8"); + return new String(word, ENCODING); } catch (UnsupportedEncodingException e) { throw new UnsupportedEncodingException("Table.readNext: UTF-8 encoding is not supported"); } catch (IOException e) { diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProvider.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProvider.java index 760b7f9db..28afd4bb1 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProvider.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProvider.java @@ -21,6 +21,8 @@ public class MyTableProvider implements TableProvider { public static final int COUNT_OBJECT = 16; public static final int COMMON_CONSTANT_INDEX = 100; + public static final String SUF_DIR = ".dir"; + public static final String SUF_FILE = ".dat"; public MyTableProvider(String path) { @@ -92,11 +94,11 @@ public void removeTable(String name) { if (tables.containsKey(name)) { File table = new File(parentDirectory, name); for (int i = 0; i < COUNT_OBJECT; i++) { - File subDir = new File(table, i + ".dir"); + File subDir = new File(table, i + SUF_DIR); for (int j = 0; j < COUNT_OBJECT; j++) { String adds = Integer.toString(i * COMMON_CONSTANT_INDEX + j); if (tables.get(name).containsKey(adds)) { - File dbFile = new File(subDir, j + ".dat"); + File dbFile = new File(subDir, j + SUF_FILE); if (dbFile.exists()) { try { Files.delete(dbFile.toPath()); diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/ParserCommands.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/ParserCommands.java index a9c7febba..e98ff57ad 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/ParserCommands.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/ParserCommands.java @@ -7,6 +7,7 @@ public class ParserCommands { private static int numberChanges = 0; + public static void commandsExecution(String[] command, MyTableProvider directory) throws IllegalMonitorStateException { if (command.length == 0) { @@ -76,9 +77,10 @@ public static void commandsExecution(String[] command, MyTableProvider directory if (directory.getUsing() == null) { System.out.println("no table"); } else { - if (directory.getUsing().get(command[1]) != null) { + String value = directory.getUsing().get(command[1]); + if (value != null) { System.out.println("found"); - System.out.println(directory.getUsing().get(command[1])); + System.out.println(value); } else { System.out.println("not found"); } @@ -206,7 +208,7 @@ public static void commandsExecution(String[] command, MyTableProvider directory System.err.println(command[0] + " - unknown command"); } } catch (IllegalArgumentException e) { - System.err.println(e.toString()); + System.err.println(e.getMessage()); } } diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableTest.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableTest.java index b0a3fa0dd..b1a81255d 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableTest.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/test/MyTableTest.java @@ -147,5 +147,6 @@ public void testCommitAndRollback() { assertEquals(3, table.size()); assertEquals(1, table.rollback()); assertEquals(2, table.size()); + assertEquals(null, table.get("1")); } } From 6b0b99fdf74a766815482b0d71ab3bdb92878480 Mon Sep 17 00:00:00 2001 From: ElinRin Date: Thu, 25 Dec 2014 11:02:31 +0300 Subject: [PATCH 10/13] ' --- src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java index edf525345..0f972a8fb 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java @@ -160,7 +160,7 @@ public int commit() { if (!dataBaseOld.exists()) { try { - if(!dataBaseOld.createNewFile()) { + if (!dataBaseOld.createNewFile()) { throw new IOException(); } } catch (IOException | NullPointerException e) { From 411483bbd5e5fbab18b4fa87d9b5578a5f247378 Mon Sep 17 00:00:00 2001 From: ElinRin Date: Thu, 25 Dec 2014 19:09:28 +0300 Subject: [PATCH 11/13] commands --- .../j_unit/InteractiveParse.java | 12 ++++- .../elina_denisova/j_unit/MyTable.java | 4 ++ .../elina_denisova/j_unit/PackageParse.java | 15 +++++- .../j_unit/commands/Commands.java | 52 +++++++++++++++++++ .../j_unit/commands/CommitCommand.java | 19 +++++++ .../j_unit/commands/CreateCommand.java | 24 +++++++++ .../j_unit/commands/DropCommand.java | 28 ++++++++++ .../j_unit/commands/ExitCommand.java | 20 +++++++ .../j_unit/commands/GetCommand.java | 32 ++++++++++++ .../j_unit/commands/ListCommand.java | 19 +++++++ .../j_unit/commands/PutCommand.java | 36 +++++++++++++ .../j_unit/commands/RemoveCommand.java | 32 ++++++++++++ .../j_unit/commands/RollbackCommand.java | 20 +++++++ .../j_unit/commands/ShowTablesCommand.java | 24 +++++++++ .../j_unit/commands/SizeCommand.java | 19 +++++++ .../j_unit/commands/UseCommand.java | 33 ++++++++++++ 16 files changed, 387 insertions(+), 2 deletions(-) create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/Commands.java create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/CommitCommand.java create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/CreateCommand.java create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/DropCommand.java create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/ExitCommand.java create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/GetCommand.java create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/ListCommand.java create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/PutCommand.java create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/RemoveCommand.java create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/RollbackCommand.java create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/ShowTablesCommand.java create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/SizeCommand.java create mode 100644 src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/UseCommand.java diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/InteractiveParse.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/InteractiveParse.java index 03a3b4855..d3765680e 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/InteractiveParse.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/InteractiveParse.java @@ -1,5 +1,8 @@ package ru.fizteh.fivt.students.elina_denisova.j_unit; +import ru.fizteh.fivt.students.elina_denisova.j_unit.commands.Commands; + +import java.util.NoSuchElementException; import java.util.Scanner; public class InteractiveParse { @@ -15,12 +18,19 @@ public static void parse(MyTableProvider directory) { for (int i = 0; i < current.length; ++i) { current[i].trim(); } - ParserCommands.commandsExecution(current, directory); + try { + Commands command = Commands.fromString(current); + command.execute(directory); + } catch (NoSuchElementException e) { + System.err.println(e.getMessage()); + } } } catch (IllegalMonitorStateException e) { in.close(); System.out.println("Goodbye"); System.exit(0); + } catch (NoSuchElementException e) { + System.err.println(e.getMessage()); } catch (Exception e) { in.close(); HandlerException.handler("InteractiveParse: ", e); diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java index 0f972a8fb..b7e8febcb 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java @@ -309,4 +309,8 @@ public List list() { } } return listKey; } + + public int unsavedChanges() { + return numberChanges; + } } diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/PackageParse.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/PackageParse.java index 96d7e05c7..126863cab 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/PackageParse.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/PackageParse.java @@ -1,6 +1,9 @@ package ru.fizteh.fivt.students.elina_denisova.j_unit; +import ru.fizteh.fivt.students.elina_denisova.j_unit.commands.Commands; + import java.util.ArrayList; +import java.util.NoSuchElementException; public class PackageParse { public static void parse(MyTableProvider directory, String[] arg) { @@ -17,7 +20,17 @@ public static void parse(MyTableProvider directory, String[] arg) { break; } } - ParserCommands.commandsExecution(current, directory); + if (current.size() == 0) { + return; + } + String[] com = new String[current.size()]; + com = current.toArray(com); + try { + Commands command = Commands.fromString(com); + command.execute(directory); + } catch (NoSuchElementException e) { + System.err.println(e.getMessage()); + } } directory.getUsing().commit(); } catch (IllegalMonitorStateException e) { diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/Commands.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/Commands.java new file mode 100644 index 000000000..d106da3e2 --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/Commands.java @@ -0,0 +1,52 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit.commands; + +import ru.fizteh.fivt.students.elina_denisova.j_unit.MyTableProvider; + +import java.util.HashMap; +import java.util.NoSuchElementException; + +public abstract class Commands { + private static final HashMap COMMANDS; + + static { + COMMANDS = new HashMap<>(); + COMMANDS.put("create", new CreateCommand()); + COMMANDS.put("drop", new DropCommand()); + COMMANDS.put("use", new UseCommand()); + COMMANDS.put("show_tables", new ShowTablesCommand()); + COMMANDS.put("put", new PutCommand()); + COMMANDS.put("get", new GetCommand()); + COMMANDS.put("remove", new RemoveCommand()); + COMMANDS.put("list", new ListCommand()); + COMMANDS.put("exit", new ExitCommand()); + COMMANDS.put("commit", new CommitCommand()); + COMMANDS.put("rollback", new RollbackCommand()); + COMMANDS.put("size", new SizeCommand()); + } + + public static Commands fromString(String[] s) throws Exception { + if (s[0] == "") { + throw new NoSuchElementException(""); + } + if (s[0].equals("show")) { + s[0] += "_" + s[1]; + } + + if (COMMANDS.containsKey(s[0])) { + Commands command = COMMANDS.get(s[0]); + if (s.length - 1 != command.numberOfArguments()) { + throw new NoSuchElementException("Unexpected number of arguments: " + + command.numberOfArguments() + " required"); + } + command.putArguments(s); + return command; + } else { + throw new NoSuchElementException(s[0] + " is unknown command"); + } + } + + public abstract void execute(MyTableProvider provider); + protected void putArguments(String[] args) { + } + protected abstract int numberOfArguments(); +} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/CommitCommand.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/CommitCommand.java new file mode 100644 index 000000000..0e5ced63f --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/CommitCommand.java @@ -0,0 +1,19 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit.commands; + +import ru.fizteh.fivt.students.elina_denisova.j_unit.MyTableProvider; + +public class CommitCommand extends Commands { + @Override + public void execute(MyTableProvider base) { + if (base.getUsing() == null) { + System.out.println("no table"); + } else { + System.out.println(base.getUsing().commit()); + } + } + + @Override + protected int numberOfArguments() { + return 0; + } +} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/CreateCommand.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/CreateCommand.java new file mode 100644 index 000000000..f70cf1c08 --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/CreateCommand.java @@ -0,0 +1,24 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit.commands; + +import ru.fizteh.fivt.students.elina_denisova.j_unit.MyTableProvider; + +public class CreateCommand extends Commands { + private String tableName; + + @Override + public void execute(MyTableProvider base) { + if (base.createTable(tableName) == null) { + System.out.println(tableName + " exists"); + } else { + System.out.println("created"); + } + } + + protected final void putArguments(String[] args) { + tableName = args[1]; + } + + protected final int numberOfArguments() { + return 1; + } +} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/DropCommand.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/DropCommand.java new file mode 100644 index 000000000..670145aa8 --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/DropCommand.java @@ -0,0 +1,28 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit.commands; + +import ru.fizteh.fivt.students.elina_denisova.j_unit.MyTableProvider; + +public class DropCommand extends Commands { + private String tableName; + + @Override + public void execute(MyTableProvider base) { + try { + if (base.getTable(tableName) == base.getUsing()) { + base.changeUsingTable(null); + } + base.removeTable(tableName); + System.out.println("dropped"); + } catch (IllegalStateException e) { + System.out.println(tableName + " not exists"); + } + } + + protected final void putArguments(String[] args) { + tableName = args[1]; + } + + protected final int numberOfArguments() { + return 1; + } +} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/ExitCommand.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/ExitCommand.java new file mode 100644 index 000000000..b4d129013 --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/ExitCommand.java @@ -0,0 +1,20 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit.commands; + +import ru.fizteh.fivt.students.elina_denisova.j_unit.MyTable; +import ru.fizteh.fivt.students.elina_denisova.j_unit.MyTableProvider; + +public class ExitCommand extends Commands { + @Override + public void execute(MyTableProvider base) { + if (base.getUsing() == null || ((MyTable) base.getUsing()).unsavedChanges() == 0) { + throw new IllegalMonitorStateException("Exit"); + } else { + System.err.println(((MyTable) base.getUsing()).unsavedChanges() + " unsaved changes"); + } + } + + @Override + protected int numberOfArguments() { + return 0; + } +} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/GetCommand.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/GetCommand.java new file mode 100644 index 000000000..74b36ddfa --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/GetCommand.java @@ -0,0 +1,32 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit.commands; + +import ru.fizteh.fivt.students.elina_denisova.j_unit.MyTableProvider; + +public class GetCommand extends Commands { + + private String key; + + @Override + public void execute(MyTableProvider base) { + if (base.getUsing() == null) { + System.out.println("no table"); + } else { + String result = base.getUsing().get(key); + if (result == null) { + System.out.println("not found"); + } else { + System.out.println("found"); + System.out.println(result); + } + } + } + + protected final void putArguments(String[] args) { + key = args[1]; + } + + @Override + protected int numberOfArguments() { + return 1; + } +} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/ListCommand.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/ListCommand.java new file mode 100644 index 000000000..18f57b68d --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/ListCommand.java @@ -0,0 +1,19 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit.commands; + +import ru.fizteh.fivt.students.elina_denisova.j_unit.MyTableProvider; + +public class ListCommand extends Commands { + @Override + public void execute(MyTableProvider base) { + if (base.getUsing() == null) { + System.out.println("no table"); + } else { + System.out.println(String.join(", ", base.getUsing().list())); + } + } + + @Override + protected int numberOfArguments() { + return 0; + } +} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/PutCommand.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/PutCommand.java new file mode 100644 index 000000000..4b2a9a26e --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/PutCommand.java @@ -0,0 +1,36 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit.commands; + +import ru.fizteh.fivt.students.elina_denisova.j_unit.MyTableProvider; + +public class PutCommand extends Commands { + + private String key; + private String value; + + @Override + public void execute(MyTableProvider base) { + if (base.getUsing() == null) { + System.out.println("no table"); + } else { + String result = base.getUsing().put(key, value); + if (result == null) { + System.out.println("new"); + } else { + System.out.println("overwrite"); + System.out.println(result); + } + } + } + + @Override + protected int numberOfArguments() { + return 2; + } + + @Override + protected void putArguments(String[] args) { + key = args[1]; + value = args[2]; + } +} + diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/RemoveCommand.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/RemoveCommand.java new file mode 100644 index 000000000..d7deadec0 --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/RemoveCommand.java @@ -0,0 +1,32 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit.commands; + +import ru.fizteh.fivt.students.elina_denisova.j_unit.MyTableProvider; + +public class RemoveCommand extends Commands { + + private String key; + + @Override + public void execute(MyTableProvider base) { + if (base.getUsing() == null) { + System.out.println("no table"); + } else { + String result = base.getUsing().remove(key); + if (result != null) { + System.out.println("removed"); + } else { + System.out.println("not found"); + } + } + } + + protected final void putArguments(String[] args) { + key = args[1]; + } + + @Override + protected int numberOfArguments() { + return 1; + } +} + diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/RollbackCommand.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/RollbackCommand.java new file mode 100644 index 000000000..510764e48 --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/RollbackCommand.java @@ -0,0 +1,20 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit.commands; + +import ru.fizteh.fivt.students.elina_denisova.j_unit.MyTableProvider; + +public class RollbackCommand extends Commands { + @Override + public void execute(MyTableProvider base) { + if (base.getUsing() == null) { + System.out.println("no table"); + } else { + System.out.println(base.getUsing().rollback()); + } + } + + @Override + protected int numberOfArguments() { + return 0; + } +} + diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/ShowTablesCommand.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/ShowTablesCommand.java new file mode 100644 index 000000000..a5db48886 --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/ShowTablesCommand.java @@ -0,0 +1,24 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit.commands; + +import ru.fizteh.fivt.students.elina_denisova.j_unit.MyTable; +import ru.fizteh.fivt.students.elina_denisova.j_unit.MyTableProvider; + +import java.util.Map; + +public class ShowTablesCommand extends Commands { + @Override + public void execute(MyTableProvider base) { + for (Map.Entry entry: base.entrySet()) { + String name = entry.getKey(); + + int size = entry.getValue().size(); + System.out.println(name + " " + size); + } + } + + @Override + protected int numberOfArguments() { + return 1; + } +} + diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/SizeCommand.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/SizeCommand.java new file mode 100644 index 000000000..7697b4c11 --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/SizeCommand.java @@ -0,0 +1,19 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit.commands; + +import ru.fizteh.fivt.students.elina_denisova.j_unit.MyTableProvider; + +public class SizeCommand extends Commands { + @Override + public void execute(MyTableProvider base) { + if (base.getUsing() == null) { + System.out.println("no table"); + } else { + System.out.println(base.getUsing().size()); + } + } + + @Override + protected int numberOfArguments() { + return 0; + } +} diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/UseCommand.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/UseCommand.java new file mode 100644 index 000000000..9c70b9fcd --- /dev/null +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/UseCommand.java @@ -0,0 +1,33 @@ +package ru.fizteh.fivt.students.elina_denisova.j_unit.commands; + +import ru.fizteh.fivt.students.elina_denisova.j_unit.MyTable; +import ru.fizteh.fivt.students.elina_denisova.j_unit.MyTableProvider; + +public class UseCommand extends Commands { + + String tableName; + + @Override + public void execute(MyTableProvider base) { + if (base.getUsing() != null && ((MyTable) base.getUsing()).unsavedChanges() != 0) { + System.out.println(((MyTable) base.getUsing()).unsavedChanges() + " unsaved changes"); + } else { + if (base.getTable(tableName) == null) { + System.out.println(tableName + " not exists"); + } else { + base.changeUsingTable(tableName); + System.out.println("using " + tableName); + } + } + } + + @Override + protected int numberOfArguments() { + return 1; + } + + @Override + protected void putArguments(String[] args) { + tableName = args[1]; + } +} From d0fbf4c0247bdb9ddee2902c2d6f8e60ce8e83fa Mon Sep 17 00:00:00 2001 From: ElinRin Date: Thu, 25 Dec 2014 19:20:04 +0300 Subject: [PATCH 12/13] ' --- .../fivt/students/elina_denisova/j_unit/commands/Commands.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/Commands.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/Commands.java index d106da3e2..1b0b6527a 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/Commands.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/commands/Commands.java @@ -25,7 +25,7 @@ public abstract class Commands { } public static Commands fromString(String[] s) throws Exception { - if (s[0] == "") { + if (s[0].equals("")) { throw new NoSuchElementException(""); } if (s[0].equals("show")) { From aa2e1622c8d063f93142e3c2320d2db867858ccc Mon Sep 17 00:00:00 2001 From: ElinRin Date: Thu, 12 Mar 2015 12:12:04 +0300 Subject: [PATCH 13/13] 2 --- .../j_unit/InteractiveParse.java | 2 +- .../elina_denisova/j_unit/MyTable.java | 58 +++++++++---------- .../j_unit/MyTableProvider.java | 38 +++++------- .../j_unit/MyTableProviderFactory.java | 2 +- .../elina_denisova/j_unit/PackageParse.java | 4 +- .../elina_denisova/j_unit/Runner.java | 6 +- 6 files changed, 48 insertions(+), 62 deletions(-) diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/InteractiveParse.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/InteractiveParse.java index d3765680e..2fe7ae336 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/InteractiveParse.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/InteractiveParse.java @@ -33,7 +33,7 @@ public static void parse(MyTableProvider directory) { System.err.println(e.getMessage()); } catch (Exception e) { in.close(); - HandlerException.handler("InteractiveParse: ", e); + HandlerException.handler(e); } in.close(); } diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java index b7e8febcb..214774e97 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTable.java @@ -34,14 +34,14 @@ public MyTable(File tableDir) { for (int j = 0; j < COUNT_OBJECT; j++) { File dbFile = new File(subDir, j + SUF_FILE); if (dbFile.exists()) { - String adds = Integer.toString(i * COMMON_CONSTANT_INDEX + j); + String adds = index(i, j); databases.put(adds, new HashMap()); readFromFile(dbFile, databases.get(adds)); } } } - } catch (Exception e) { - HandlerException.handler("TableProvider: ", e); + } catch (IllegalArgumentException e) { + HandlerException.handler(e); } } @@ -58,7 +58,11 @@ private String pathname(String key) { int hashCode = Math.abs(key.hashCode()); int dir = hashCode % COUNT_OBJECT; int file = hashCode / COUNT_OBJECT % COUNT_OBJECT; - return Integer.toString(dir * COMMON_CONSTANT_INDEX + file); + return index(dir, file); + } + + private String index(int i, int j) { + return Integer.toString(i * COMMON_CONSTANT_INDEX + j); } @Override @@ -67,7 +71,7 @@ public String get(String key) throws IllegalArgumentException { String adds = pathname(key); return databases.get(adds).get(key); } else { - throw new IllegalArgumentException("Table.get: Haven't key. "); + throw new IllegalArgumentException("get: Haven't key. "); } } @@ -93,7 +97,7 @@ public String put(String key, String value) { } return oldValue; } else { - throw new IllegalArgumentException("MyTable.put: Haven't key or value. "); + throw new IllegalArgumentException("put: Haven't key or value. "); } } @@ -114,7 +118,7 @@ public String remove(String key) { return oldValue; } } else { - throw new IllegalArgumentException("Table.get: Haven't key. "); + throw new IllegalArgumentException("get: Haven't key. "); } } @@ -123,7 +127,7 @@ public int size() { int answer = 0; for (int i = 0; i < COUNT_OBJECT; i++) { for (int j = 0; j < COUNT_OBJECT; j++) { - String adds = Integer.toString(i * COMMON_CONSTANT_INDEX + j); + String adds = index(i, j); if (databases.containsKey(adds)) { answer += databases.get(adds).size(); } @@ -140,7 +144,7 @@ public int commit() { int count = 0; for (int i = 0; i < COUNT_OBJECT; i++) { for (int j = 0; j < COUNT_OBJECT; j++) { - String adds = Integer.toString(i * COMMON_CONSTANT_INDEX + j); + String adds = index(i, j); if (databases.containsKey(adds)) { File directory = new File(mainDir.toString(), i + SUF_DIR); if (!directory.exists()) { @@ -154,7 +158,7 @@ public int commit() { try { Files.delete(dataBaseOld.toPath()); } catch (IOException e) { - throw new RuntimeException("MyTable.writeInFile: Can't overwrite file"); + throw new RuntimeException("writeInFile: Can't overwrite file"); } } @@ -175,9 +179,9 @@ public int commit() { writeNext(dbFile, current.getValue()); } } catch (FileNotFoundException e) { - throw new RuntimeException("MyTable.writeInFile: File not found"); + throw new RuntimeException("writeInFile: File not found"); } catch (IOException e) { - throw new RuntimeException("MyTable.writeInFile: Can't write to file.", e); + throw new RuntimeException("writeInFile: Can't write to file.", e); } if (databases.get(adds).size() == 0) { @@ -188,14 +192,14 @@ public int commit() { Files.delete(dbFile.toPath()); } } catch (IOException e) { - throw new IllegalStateException("MyTable.remove: " + throw new IllegalStateException("remove: " + "Cannot delete database file. ", e); } databases.remove(adds); int k = 0; for (int file = 0; file < COUNT_OBJECT; file++) { - String variableAdds = Integer.toString(i * COMMON_CONSTANT_INDEX + file); + String variableAdds = index(i, file); if (databases.containsKey(variableAdds)) { k++; } @@ -204,10 +208,10 @@ public int commit() { try { Files.delete(subDir.toPath()); } catch (DirectoryNotEmptyException e) { - throw new IllegalStateException("MyTable.remove: Cannot remove table subdirectory. " + throw new IllegalStateException("remove: Cannot remove table subdirectory. " + "Redundant files", e); } catch (IOException e) { - throw new IllegalStateException("MyTable.remove: " + throw new IllegalStateException("remove: " + "Cannot delete database subdirectory", e); } } @@ -224,9 +228,9 @@ private void writeNext(RandomAccessFile dbFile, String word) throws IOException dbFile.writeInt(word.getBytes(ENCODING).length); dbFile.write(word.getBytes(ENCODING)); } catch (UnsupportedEncodingException e) { - throw new RuntimeException("Table.writeNext: Don't supported encoding " + ENCODING + ". "); + throw new RuntimeException("writeNext: Don't supported encoding " + ENCODING + ". "); } catch (IOException e) { - throw new RuntimeException("Table.writeNext: Can't write to database. ", e); + throw new RuntimeException("writeNext: Can't write to database. ", e); } } public void readFromFile(File dbFileName, Map data) throws IllegalArgumentException { @@ -237,21 +241,17 @@ public void readFromFile(File dbFileName, Map data) throws Ille String key = readNext(file); String value = readNext(file); if (data.containsKey(key)) { - throw new IllegalArgumentException("Table.readFromFile: Two same keys in database file"); + throw new IllegalArgumentException("readFromFile: Two same keys in database file"); } data.put(key, value); } } - } catch (UnsupportedEncodingException e) { - throw new RuntimeException(e); - } catch (IllegalArgumentException e) { + } catch (UnsupportedEncodingException | IllegalArgumentException | FileNotFoundException e) { throw new RuntimeException(e); - } catch (FileNotFoundException e) { - throw new RuntimeException("Table.readFromFile: File not found", e); } catch (IOException e) { - throw new RuntimeException(" Table.readFromFile: Problems with reading from database file " + e.toString()); + throw new RuntimeException(" readFromFile: Problems with reading from database file " + e.toString()); } catch (Exception e) { - throw new RuntimeException("Table.readFromFile: ", e); + throw new RuntimeException("readFromFile: ", e); } } @@ -263,9 +263,9 @@ private String readNext(RandomAccessFile dbFile) throws IOException { dbFile.read(word, 0, wordLength); return new String(word, ENCODING); } catch (UnsupportedEncodingException e) { - throw new UnsupportedEncodingException("Table.readNext: UTF-8 encoding is not supported"); + throw new UnsupportedEncodingException("readNext: UTF-8 encoding is not supported"); } catch (IOException e) { - throw new IOException(" Table.readNext: Can't read from database " + e.toString()); + throw new IOException(" readNext: Can't read from database " + e.toString()); } } @@ -300,7 +300,7 @@ public List list() { List listKey = new ArrayList<>(); for (int i = 0; i < COUNT_OBJECT; i++) { for (int j = 0; j < COUNT_OBJECT; j++) { - String adds = Integer.toString(i * COMMON_CONSTANT_INDEX + j); + String adds = index(i, j); if (databases.containsKey(adds)) { for (String key : databases.get(adds).keySet()) { listKey.add(key); diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProvider.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProvider.java index 28afd4bb1..25480c37e 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProvider.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProvider.java @@ -4,7 +4,6 @@ import ru.fizteh.fivt.storage.strings.TableProvider; import java.io.File; -import java.io.FileNotFoundException; import java.io.IOException; import java.nio.file.DirectoryNotEmptyException; import java.nio.file.Files; @@ -32,13 +31,13 @@ public MyTableProvider(String path) { try { if (path == null) { - throw new NullPointerException("MyTableProvider: Wrong path"); + throw new NullPointerException(" Wrong path"); } if (!Files.exists(parentDirectory.toPath()) && !parentDirectory.mkdir()) { - throw new UnsupportedOperationException("MyTableProvider: Cannot create working directory"); + throw new IllegalArgumentException(" Cannot create working directory"); } if (!parentDirectory.isDirectory()) { - throw new FileNotFoundException("MyTableProvider:" + parentDirectory.toString() + throw new IllegalArgumentException("" + parentDirectory.toString() + " is not a directory"); } for (String childName : parentDirectory.list()) { @@ -46,18 +45,12 @@ public MyTableProvider(String path) { if (childDirectory.isDirectory()) { tables.put(childName, new MyTable(childDirectory)); } else { - throw new Exception("MyTableProvider:" + childName + throw new IllegalArgumentException(childName + " from databases directory is not a directory"); } } - } catch (UnsupportedOperationException e) { + } catch (IllegalArgumentException e) { HandlerException.handler(e); - } catch (NullPointerException e) { - HandlerException.handler(e); - } catch (FileNotFoundException e) { - HandlerException.handler(e); - } catch (Exception e) { - HandlerException.handler("TableProviderFactory: ", e); } } @@ -69,7 +62,7 @@ public Table getTable(String name) { @Override public Table createTable(String name) { if (name == null) { - throw new IllegalArgumentException("MyTableProvider.createTable: " + throw new IllegalArgumentException("createTable: " + "Invalid name. "); } if (tables.containsKey(name)) { @@ -77,7 +70,7 @@ public Table createTable(String name) { } else { File newTable = new File(parentDirectory, name); if (!newTable.mkdir()) { - throw new UnsupportedOperationException("MyTableProvider.createTable: " + throw new UnsupportedOperationException("createTable: " + "Unable to create working directory for new table. "); } tables.put(name, new MyTable(newTable)); @@ -88,7 +81,7 @@ public Table createTable(String name) { @Override public void removeTable(String name) { if (name == null) { - throw new IllegalArgumentException("MyTableProvider.removeTable: " + throw new IllegalArgumentException("removeTable: " + "Invalid name. "); } if (tables.containsKey(name)) { @@ -103,7 +96,7 @@ public void removeTable(String name) { try { Files.delete(dbFile.toPath()); } catch (IOException e) { - throw new RuntimeException("MyTableProvider.removeTable: " + throw new RuntimeException("removeTable: " + "cannon delete database file", e); } } @@ -113,10 +106,10 @@ public void removeTable(String name) { try { Files.delete(subDir.toPath()); } catch (DirectoryNotEmptyException e) { - throw new RuntimeException("MyTableProvider.removeTable: " + throw new RuntimeException("removeTable: " + "cannot remove table subdirectory", e); } catch (IOException e) { - throw new RuntimeException("MyTableProvider.removeTable: " + throw new RuntimeException("removeTable: " + "cannot delete database subdirectory", e); } } @@ -124,13 +117,13 @@ public void removeTable(String name) { try { Files.delete(table.toPath()); } catch (DirectoryNotEmptyException e) { - throw new RuntimeException("TableProvider.tDrop: cannot remove main table directory", e); + throw new RuntimeException("removeTable: cannot remove main table directory", e); } catch (IOException e) { - throw new RuntimeException("TableProvider.tDrop: cannot delete main database directory", e); + throw new RuntimeException("removeTable: cannot delete main database directory", e); } tables.remove(name); } else { - throw new IllegalStateException("MyTableProvider.removeTable: " + name + "doesn't exist"); + throw new IllegalStateException("removeTable: " + name + "doesn't exist"); } } @@ -148,8 +141,5 @@ public Set> entrySet() { } - public boolean containsKey(String key) { - return tables.containsKey(key); - } } diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProviderFactory.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProviderFactory.java index 3f397e2c7..1ae2d83b0 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProviderFactory.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/MyTableProviderFactory.java @@ -7,7 +7,7 @@ public class MyTableProviderFactory implements TableProviderFactory { @Override public MyTableProvider create(String dir) { if (dir == null) { - throw new IllegalArgumentException("MyTableProvider.create: " + dir + throw new IllegalArgumentException("create: " + dir + " isn't a directory. "); } return new MyTableProvider(dir); diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/PackageParse.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/PackageParse.java index 126863cab..741f49097 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/PackageParse.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/PackageParse.java @@ -37,9 +37,9 @@ public static void parse(MyTableProvider directory, String[] arg) { System.out.println("Goodbye"); System.exit(0); } catch (IllegalArgumentException e) { - HandlerException.handler("PackageParse: Wrong arguments", e); + HandlerException.handler("Wrong arguments", e); } catch (Exception e) { - HandlerException.handler("PackageParse: ", e); + HandlerException.handler( e); } } } diff --git a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/Runner.java b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/Runner.java index 22f2e1d44..172ef1a9d 100644 --- a/src/ru/fizteh/fivt/students/elina_denisova/j_unit/Runner.java +++ b/src/ru/fizteh/fivt/students/elina_denisova/j_unit/Runner.java @@ -6,7 +6,7 @@ public static void main(String[] args) { try { String path = System.getProperty("fizteh.db.dir"); if (path == null) { - throw new NullPointerException("Runner: Directory doesn't exist"); + throw new IllegalArgumentException("Directory doesn't exist"); } MyTableProviderFactory factory = new MyTableProviderFactory(); MyTableProvider base = factory.create(path); @@ -19,10 +19,6 @@ public static void main(String[] args) { } } catch (IllegalArgumentException e) { HandlerException.handler(e); - } catch (NullPointerException e) { - HandlerException.handler(e); - } catch (Exception e) { - HandlerException.handler("Runner: ", e); } }