diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..63d620b --- /dev/null +++ b/build.gradle @@ -0,0 +1,20 @@ +plugins { + id 'java' +} + +group 'org.example' +version '1.0-SNAPSHOT' + +repositories { + mavenCentral() +} + +dependencies { + // https://mvnrepository.com/artifact/junit/junit + testImplementation group: 'junit', name: 'junit', version: '4.13.2' +} + +test { + useJUnit() +} + diff --git a/src/main/java/ru/sber/mironov/ClientType/ClientType.java b/src/main/java/ru/sber/mironov/ClientType/ClientType.java new file mode 100644 index 0000000..3247a12 --- /dev/null +++ b/src/main/java/ru/sber/mironov/ClientType/ClientType.java @@ -0,0 +1,33 @@ +package ru.sber.mironov.ClientType; + + +import ru.sber.mironov.Clients.Client; +import ru.sber.mironov.Clients.HoldingClient; +import ru.sber.mironov.Clients.IndividualClient; +import ru.sber.mironov.Clients.LegalEntityClient; +import ru.sber.mironov.MyJsonLibrary.MyJsonObject; + + +import java.util.HashMap; +import java.util.List; + +public enum ClientType { + INDIVIDUAL { + public Client createClient(MyJsonObject client) { + return new IndividualClient(client); + } + }, + LEGAL_ENTITY { + public Client createClient(MyJsonObject client) { + return new LegalEntityClient(client); + } + }, + HOLDING { + public Client createClient(MyJsonObject client) { + return new HoldingClient(client); + } + }; + + public abstract Client createClient(MyJsonObject client); +} + diff --git a/src/main/java/ru/sber/mironov/Clients/Client.java b/src/main/java/ru/sber/mironov/Clients/Client.java new file mode 100644 index 0000000..a3c002f --- /dev/null +++ b/src/main/java/ru/sber/mironov/Clients/Client.java @@ -0,0 +1,40 @@ +package ru.sber.mironov.Clients; + +import ru.sber.mironov.ClientType.ClientType; +import ru.sber.mironov.MyJsonLibrary.MyJsonObject; + +import java.util.HashMap; + +public class Client { + private final String name; + private final String inn; + private final ClientType type; + + public Client(String name, String inn, ClientType type) { + this.name = name; + this.inn = inn; + this.type = type; + } + + public Client(MyJsonObject client) { + this.name = (String) client.getString("name"); + this.inn = (String) client.getString("inn"); + this.type = ClientType.valueOf(client.getString("ClientType")); + } + + public String toString() { + return name.toString() + " " + inn.toString() + " " + type; + } + + public String getName() { + return name; + } + + public String getInn() { + return inn; + } + + public ClientType getType() { + return type; + } +} diff --git a/src/main/java/ru/sber/mironov/Clients/HoldingClient.java b/src/main/java/ru/sber/mironov/Clients/HoldingClient.java new file mode 100644 index 0000000..3c34785 --- /dev/null +++ b/src/main/java/ru/sber/mironov/Clients/HoldingClient.java @@ -0,0 +1,17 @@ +package ru.sber.mironov.Clients; + + +import ru.sber.mironov.MyJsonLibrary.MyJsonObject; + +public class HoldingClient extends Client { + private final double level; + + public HoldingClient(MyJsonObject client) { + super(client); + level = Double.parseDouble(client.getString("level")); + } + + public double getLevel() { + return level; + } +} diff --git a/src/main/java/ru/sber/mironov/Clients/IndividualClient.java b/src/main/java/ru/sber/mironov/Clients/IndividualClient.java new file mode 100644 index 0000000..02089b1 --- /dev/null +++ b/src/main/java/ru/sber/mironov/Clients/IndividualClient.java @@ -0,0 +1,26 @@ +package ru.sber.mironov.Clients; + + +import ru.sber.mironov.ClientType.ClientType; +import ru.sber.mironov.MyJsonLibrary.MyJsonObject; + + +import java.util.HashMap; + +public class IndividualClient extends Client { + private final int salary; + + public IndividualClient(String name, String inn, ClientType type, int salary) { + super(name, inn, type); + this.salary = salary; + } + + public IndividualClient(MyJsonObject client) { + super(client); + this.salary = Integer.parseInt(client.getString("salary")); + } + + public int getSalary() { + return salary; + } +} diff --git a/src/main/java/ru/sber/mironov/Clients/LegalEntityClient.java b/src/main/java/ru/sber/mironov/Clients/LegalEntityClient.java new file mode 100644 index 0000000..3a2f3d5 --- /dev/null +++ b/src/main/java/ru/sber/mironov/Clients/LegalEntityClient.java @@ -0,0 +1,24 @@ +package ru.sber.mironov.Clients; + + +import ru.sber.mironov.ClientType.ClientType; +import ru.sber.mironov.MyJsonLibrary.MyJsonObject; + +public class LegalEntityClient extends Client { + + private final Boolean realLegal; + + public LegalEntityClient(String name, String inn, ClientType type, Boolean realLegal) { + super(name, inn, type); + this.realLegal = realLegal; + } + + public LegalEntityClient(MyJsonObject client) { + super(client); + realLegal = Boolean.parseBoolean(client.getString("realLegsl")); + } + + public Boolean getRealLegal() { + return realLegal; + } +} diff --git a/src/main/java/ru/sber/mironov/ClientsJsonParser/ClientsJsonParser.java b/src/main/java/ru/sber/mironov/ClientsJsonParser/ClientsJsonParser.java new file mode 100644 index 0000000..f49e8f5 --- /dev/null +++ b/src/main/java/ru/sber/mironov/ClientsJsonParser/ClientsJsonParser.java @@ -0,0 +1,35 @@ +package ru.sber.mironov.ClientsJsonParser; + + +import ru.sber.mironov.ClientType.ClientType; +import ru.sber.mironov.Clients.Client; +import ru.sber.mironov.MyJsonLibrary.MyJsonArray; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; + +public class ClientsJsonParser { + public static ArrayList parseClientsJson(String filePath) throws IOException { + StringBuilder fileData = new StringBuilder(); + + try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) { + char[] buf = new char[1024]; + int numRead; + while ((numRead = reader.read(buf)) != -1) { + String readData = String.valueOf(buf, 0, numRead); + fileData.append(readData); + } + } + String content = fileData.toString(); + MyJsonArray clients = new MyJsonArray(content); + + ArrayList people = new ArrayList<>(); + for (var o : clients) { + ClientType ct = ClientType.valueOf(o.getString("ClientType")); + people.add(ct.createClient(o)); + } + return people; + } +} diff --git a/src/main/java/ru/sber/mironov/Main.java b/src/main/java/ru/sber/mironov/Main.java new file mode 100644 index 0000000..072d0cb --- /dev/null +++ b/src/main/java/ru/sber/mironov/Main.java @@ -0,0 +1,51 @@ +package ru.sber.mironov; + +import ru.sber.mironov.ClientsJsonParser.ClientsJsonParser; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class Main { + public static void main(String[] args) throws IOException { + /*String[] a = {"1", "2", "3"}; + ArrayList q = new ArrayList<>(List.of(a));*/ + String fileName = "src/main/resources/Clients.json"; + System.out.println(ClientsJsonParser.parseClientsJson(fileName)); + + /*String s = "[\n" + + " {\n" + + " \"ClientType\": \"INDIVIDUAL\",\n" + + " \"inn\": \"1688\",\n" + + " \"name\": \"Alex\",\n" + + " \"salary\": \"100\"\n" + + " },\n" + + " {\n" + + " \"ClientType\": \"LEGAL_ENTITY\",\n" + + " \"name\": \"Vadim\",\n" + + " \"inn\": \"1432\"\n" + + " },\n" + + " {\n" + + " \"ClientType\": \"HOLDING\",\n" + + " \"name\": \"Gera\",\n" + + " \"inn\": \"2001\"\n" + + " }\n" + + "]"; + String str = "{ { { {"; + Pattern p = Pattern.compile("\\{(\\s.+)+?}"); + Matcher m = p.matcher(s); + while (m.find()) { + System.out.println(s.substring(m.start(), m.end())); + }*/ + /*var people = ClientsJsonParser.parseClientsJson((args[0])); + System.out.println(people);*/ + + + + + } +} + + diff --git a/src/main/java/ru/sber/mironov/MyJsonLibrary/MyJsonArray.java b/src/main/java/ru/sber/mironov/MyJsonLibrary/MyJsonArray.java new file mode 100644 index 0000000..ce728a7 --- /dev/null +++ b/src/main/java/ru/sber/mironov/MyJsonLibrary/MyJsonArray.java @@ -0,0 +1,46 @@ +package ru.sber.mironov.MyJsonLibrary; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import java.util.function.Consumer; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class MyJsonArray implements Iterable { + ArrayList jsonObjects; + + public MyJsonArray(String content) { + ArrayList clients = new ArrayList<>(); + for (var x : getSubstrings(content)) { + clients.add(new MyJsonObject(content.substring(x.get(0), x.get(1)))); + } + jsonObjects = clients; + } + + @Override + public Iterator iterator() { + return jsonObjects.iterator(); + } + + @Override + public void forEach(Consumer action) { + jsonObjects.forEach(action); + } + + private ArrayList> getSubstrings(String content) { + ArrayList> res = new ArrayList<>(); + int prev = 0; + int now = 0; + for (int i = 0; i < content.length(); i++) { + if (content.charAt(i) == '{') { + prev = i; + } else if (content.charAt(i) == '}') { + now = i + 1; + res.add(new ArrayList<>(List.of(prev, now))); + } + } + return res; + } +} diff --git a/src/main/java/ru/sber/mironov/MyJsonLibrary/MyJsonObject.java b/src/main/java/ru/sber/mironov/MyJsonLibrary/MyJsonObject.java new file mode 100644 index 0000000..4ffac9a --- /dev/null +++ b/src/main/java/ru/sber/mironov/MyJsonLibrary/MyJsonObject.java @@ -0,0 +1,34 @@ +package ru.sber.mironov.MyJsonLibrary; + +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class MyJsonObject { + private final Map map; + + public MyJsonObject(Map map) { + this.map = map; + } + + public MyJsonObject(String str) { + Map newMap = new HashMap<>(); + String[] strings = str.split(","); + for (var s : strings) { + String[] splitString = s.replace("\s", "") + .replace("{", "") + .replace("}", "") + .replace("\"", "") + .replace(",", "") + .replaceAll("[ \\f\\n\\r\\t\\v]", "") + .split(":"); + newMap.put(splitString[0], splitString[1]); + } + map = newMap; + } + + public String getString(String key) { + return map.get(key); + } +} diff --git a/src/main/resources/Clients.json b/src/main/resources/Clients.json new file mode 100644 index 0000000..388f389 --- /dev/null +++ b/src/main/resources/Clients.json @@ -0,0 +1,20 @@ +[ + { + "ClientType": "INDIVIDUAL", + "inn": "1688", + "name": "Alex", + "salary": 100 + }, + { + "ClientType": "LEGAL_ENTITY", + "name": "Vadim", + "inn": "1432", + "realLegal": false + }, + { + "ClientType": "HOLDING", + "name": "Gera", + "inn": "2001", + "level": 34.5 + } +] \ No newline at end of file diff --git a/src/test/java/ru/sber/mironov/ClientsJsonParser/ClientsJsonParserTest.java b/src/test/java/ru/sber/mironov/ClientsJsonParser/ClientsJsonParserTest.java new file mode 100644 index 0000000..37226af --- /dev/null +++ b/src/test/java/ru/sber/mironov/ClientsJsonParser/ClientsJsonParserTest.java @@ -0,0 +1,41 @@ +package ru.sber.mironov.ClientsJsonParser; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import ru.sber.mironov.ClientType.ClientType; +import ru.sber.mironov.Clients.Client; +import ru.sber.mironov.Clients.HoldingClient; +import ru.sber.mironov.Clients.IndividualClient; +import ru.sber.mironov.Clients.LegalEntityClient; + +import java.io.IOException; +import java.util.ArrayList; + + +public class ClientsJsonParserTest { + private ArrayList people; + + @Before + public void setUpPeople() throws IOException { + String fileName = "src/test/resources/Clients.json"; + + people = ClientsJsonParser.parseClientsJson(fileName); + } + + @After + public void tearDown() { + people.clear(); + } + + @Test + public void parseClientsJson() { + Assert.assertEquals(this.people.get(0).getName(), "Alex"); + Assert.assertEquals(this.people.get(0).getInn(), "1688"); + Assert.assertEquals(this.people.get(0).getType(), ClientType.INDIVIDUAL); + Assert.assertEquals(((IndividualClient) people.get(0)).getSalary(), 100); + Assert.assertEquals(((LegalEntityClient) people.get(1)).getRealLegal(), false); + assert (((HoldingClient) people.get(2)).getLevel() == 34.5); + } +} \ No newline at end of file diff --git a/src/test/resources/Clients.json b/src/test/resources/Clients.json new file mode 100644 index 0000000..388f389 --- /dev/null +++ b/src/test/resources/Clients.json @@ -0,0 +1,20 @@ +[ + { + "ClientType": "INDIVIDUAL", + "inn": "1688", + "name": "Alex", + "salary": 100 + }, + { + "ClientType": "LEGAL_ENTITY", + "name": "Vadim", + "inn": "1432", + "realLegal": false + }, + { + "ClientType": "HOLDING", + "name": "Gera", + "inn": "2001", + "level": 34.5 + } +] \ No newline at end of file