From ec504fd886310a865939cda4956f8d2696ffc2f6 Mon Sep 17 00:00:00 2001 From: Pastor Date: Fri, 18 Oct 2024 15:39:22 +0300 Subject: [PATCH] Bank --- .../ru/mifi/practice/val3/hasq/Chain.java | 186 ++++++++++++++++++ .../java/ru/mifi/practice/val3/hasq/Core.java | 117 ----------- 2 files changed, 186 insertions(+), 117 deletions(-) create mode 100644 vol3/src/main/java/ru/mifi/practice/val3/hasq/Chain.java delete mode 100644 vol3/src/main/java/ru/mifi/practice/val3/hasq/Core.java diff --git a/vol3/src/main/java/ru/mifi/practice/val3/hasq/Chain.java b/vol3/src/main/java/ru/mifi/practice/val3/hasq/Chain.java new file mode 100644 index 0000000..1f6bd23 --- /dev/null +++ b/vol3/src/main/java/ru/mifi/practice/val3/hasq/Chain.java @@ -0,0 +1,186 @@ +package ru.mifi.practice.val3.hasq; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; +import java.security.MessageDigest; +import java.util.ArrayList; +import java.util.HexFormat; +import java.util.List; +import java.util.Locale; +import java.util.Objects; + +public interface Chain { + + public static void main(String[] args) throws IOException { + newChain(new Token("1000000000"), "init") + .add("init", "Next") + .add("init", "Next") + .add("init", "Next") + .write(Path.of("1000000000.csv")); + } + + static Chain newChain(Token token, String passphrase) { + return new Default(token).add(passphrase, "Created"); + } + + Chain write(Path path) throws IOException; + + Chain add(String passphrase, String note); + + interface Value { + String value(); + } + + final class Default implements Chain { + private final List lines = new ArrayList<>(); + private final Token token; + + Default(Token token) { + this.token = token; + } + + @Override + public Chain add(String passphrase, String note) { + if (lines.isEmpty()) { + Key key = createKey(0, passphrase); + lines.add(new Record(0, token, key, note)); + } else { + Record line = lines.get(lines.size() - 1); + int id = line.id + 1; + Key key = createKey(id, passphrase); + Generator generator = createGenerator(line.id, key); + line.generator = generator; + lines.add(new Record(id, token, key, note)); + if (lines.size() > 2) { + line = lines.get(lines.size() - 3); + line.owner = createOwner(line.id, generator); + } + } + return this; + } + + public Chain write(Path path) throws IOException { + Files.write(path, lines.stream().map(Record::toString).toList(), StandardOpenOption.CREATE_NEW); + return this; + } + + public void read(Path path) throws IOException { + Files.readAllLines(path).forEach(line -> { + String[] parts = line.split(";"); + lines.add(Record.from(parts)); + }); + } + + private Key createKey(int id, String passphrase) { + return new Key(id, Utils.hash(String.valueOf(id), token.value(), passphrase)); + } + + private Generator createGenerator(int id, Key key) { + return new Generator(id, Utils.hash(String.valueOf(id), token.value(), key.value())); + } + + private Owner createOwner(int id, Generator generator) { + return new Owner(id, Utils.hash(String.valueOf(id), token.value(), generator.value())); + } + } + + final class Record { + private final int id; + private final Token token; + private final Key key; + private final String note; + private Generator generator; + private Owner owner; + + private Record(int id, Token token, Key key, String note) { + this(id, token, key, note, null, null); + } + + public Record(int id, Token token, Key key, String note, Generator generator, Owner owner) { + this.id = id; + this.token = token; + this.key = key; + this.note = note; + this.generator = generator; + this.owner = owner; + } + + private static Record from(String[] parts) { + int id = Integer.parseInt(parts[0]); + if (parts.length == 6) { + return new Record( + id, + new Token(parts[1]), + new Key(id, parts[2]), + parts[5], + new Generator(id, parts[3]), + new Owner(id, parts[4]) + ); + } else { + return new Record( + id, + new Token(parts[1]), + new Key(id, parts[2]), + parts[5] + ); + } + } + + @Override + public String toString() { + return String.format("%05d;%s;%s;%s;%s;%s", + id, token.value(), key.value(), + Objects.requireNonNullElse(generator, ""), + Objects.requireNonNullElse(owner, ""), + note); + } + } + + record Key(int id, String value) implements Value { + @Override + public String toString() { + return value; + } + } + + record Generator(int id, String value) implements Value { + @Override + public String toString() { + return value; + } + } + + record Token(String value) implements Value { + @Override + public String toString() { + return value; + } + } + + record Owner(int id, String value) implements Value { + @Override + public String toString() { + return value; + } + } + + final class Utils { + private Utils() { + } + + private static String hash(Object... objects) { + try { + MessageDigest digest = MessageDigest.getInstance("MD5"); + for (Object object : objects) { + digest.update(object.toString().getBytes()); + } + byte[] bytes = digest.digest(); + return HexFormat.of().formatHex(bytes).toUpperCase(Locale.ROOT); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } +} diff --git a/vol3/src/main/java/ru/mifi/practice/val3/hasq/Core.java b/vol3/src/main/java/ru/mifi/practice/val3/hasq/Core.java deleted file mode 100644 index f93369d..0000000 --- a/vol3/src/main/java/ru/mifi/practice/val3/hasq/Core.java +++ /dev/null @@ -1,117 +0,0 @@ -package ru.mifi.practice.val3.hasq; - -import java.security.MessageDigest; -import java.util.ArrayList; -import java.util.HexFormat; -import java.util.List; -import java.util.Locale; - -public interface Core { - - Sequence newSequence(Token token, String passphrase); - - interface Sequence { - - void add(String passphrase, String note); - - final class Default implements Sequence { - private final List lines = new ArrayList<>(); - - Default(Line line) { - lines.add(line); - } - - private void add(Generator generator, String note) { - Line last = lines.get(lines.size() - 1); - last.generator = generator; - last.note = note; - if (lines.size() > 2) { - Line line = lines.get(lines.size() - 2); - line.owner = Utils.createOwner(line.id, line.token, generator); - } - } - - @Override - public void add(String passphrase, String note) { - Line line = lines.getLast(); - Key key = Utils.createKey(line.id + 1, line.token, passphrase); - Generator generator = Utils.createGenerator(line.id, line.token, key); - add(generator, note); - } - } - } - - final class Line { - private final int id; - private final Token token; - private final Key key; - private Generator generator; - private Owner owner; - private String note; - - private Line(int id, Token token, Key key, Generator generator, Owner owner, String note) { - this.id = id; - this.token = token; - this.key = key; - this.generator = generator; - this.owner = owner; - this.note = note; - } - - private Line(int id, Token token, Key key, String note) { - this(id, token, key, null, null, note); - } - } - - final class Default implements Core { - - @Override - public Sequence newSequence(Token token, String passphrase) { - Key key = Utils.createKey(0, token, passphrase); - return new Sequence.Default(new Line(0, token, key, null, null, "Create")); - } - } - - record Key(String value) { - - } - - record Generator(String value) { - - } - - record Token(String value) { - - } - - record Owner(String value) { - - } - - final class Utils { - private static String hash(Object... objects) { - try { - MessageDigest digest = MessageDigest.getInstance("MD5"); - for (Object object : objects) { - digest.update(object.toString().getBytes()); - } - byte[] bytes = digest.digest(); - return HexFormat.of().formatHex(bytes).toUpperCase(Locale.ROOT); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - private static Key createKey(int i, Token token, String passphrase) { - return new Key(hash(String.valueOf(i), token.value, passphrase)); - } - - private static Generator createGenerator(int i, Token token, Key key) { - return new Generator(hash(String.valueOf(i), token.value, key.value)); - } - - private static Owner createOwner(int i, Token token, Generator generator) { - return new Owner(hash(String.valueOf(i), token.value, generator.value)); - } - } -}