179265bc8f388043991da2b31a5d3748afd3cafd
[Mograsim.git] / net.mograsim.logic.model.am2900 / src / net / mograsim / logic / model / examples / ReserializeJSONsSettingUsages.java
1 package net.mograsim.logic.model.examples;
2
3 import java.io.IOException;
4 import java.nio.file.Files;
5 import java.nio.file.Path;
6 import java.nio.file.Paths;
7 import java.util.Comparator;
8 import java.util.Map.Entry;
9 import java.util.Scanner;
10 import java.util.Set;
11 import java.util.stream.Collectors;
12 import java.util.stream.Stream;
13
14 import net.mograsim.logic.model.model.ViewModelModifiable;
15 import net.mograsim.logic.model.model.wires.GUIWire;
16 import net.mograsim.logic.model.model.wires.MovablePin;
17 import net.mograsim.logic.model.model.wires.Pin;
18 import net.mograsim.logic.model.model.wires.PinUsage;
19 import net.mograsim.logic.model.serializing.DeserializedSubmodelComponent;
20 import net.mograsim.logic.model.serializing.IndirectGUIComponentCreator;
21 import net.mograsim.logic.model.serializing.SubmodelComponentSerializer;
22
23 public class ReserializeJSONsSettingUsages
24 {
25         public static void main(String[] args) throws IOException
26         {
27                 try (Scanner sysin = new Scanner(System.in))
28                 {
29                         System.out.print("Directory to search for JSONs in / JSON file to reserialize >");
30                         Path root = Paths.get(sysin.nextLine());
31                         if (!Files.exists(root))
32                                 throw new IllegalArgumentException("Path doesn't exist");
33                         if (Files.isRegularFile(root))
34                                 reserializeJSON(root, sysin);
35                         else
36                         {
37                                 System.out.print("Recursive? >");
38                                 boolean recursive = Boolean.valueOf(sysin.nextLine());
39                                 try (Stream<Path> jsons = recursive ? Files.walk(root) : Files.list(root))
40                                 {
41                                         jsons.filter(Files::isRegularFile).filter(p -> p.getFileName().toString().endsWith(".json"))
42                                                         .forEach(j -> reserializeJSON(j, sysin));
43                                 }
44                         }
45                 }
46         }
47
48         public static void reserializeJSON(Path json, Scanner sysin)
49         {
50                 try
51                 {
52                         DeserializedSubmodelComponent comp = (DeserializedSubmodelComponent) IndirectGUIComponentCreator
53                                         .createComponent(new ViewModelModifiable(), "jsonfile:" + json.toString());
54                         System.out.println("Reserializing " + json);
55                         comp.getSupermodelPins().entrySet().stream().sorted(Comparator.comparing(Entry::getKey)).map(Entry::getValue).forEach(pin ->
56                         {
57                                 System.out.print("  Usage for interface pin " + pin.name + " (empty: " + pin.usage + ") >");
58                                 String usageStr = sysin.nextLine().toUpperCase();
59                                 PinUsage usage = usageStr.equals("") ? pin.usage
60                                                 : usageStr.equals("I") ? PinUsage.INPUT
61                                                                 : usageStr.equals("O") ? PinUsage.OUTPUT
62                                                                                 : usageStr.equals("T") ? PinUsage.TRISTATE : PinUsage.valueOf(usageStr);
63                                 setInterfacePinUsage(comp, pin, usage);
64                         });
65                         SubmodelComponentSerializer.serialize(comp, json.toString());
66                 }
67                 catch (Exception e)
68                 {
69                         System.err.println("An error occurred visiting " + json + ":");
70                         e.printStackTrace();
71                 }
72         }
73
74         private static void setInterfacePinUsage(DeserializedSubmodelComponent comp, Pin interfacePin, PinUsage usage)
75         {
76                 Set<GUIWire> wiresConnectedToPin = comp.submodel.getWiresByName().values().stream()
77                                 .filter(w -> w.getPin1() == interfacePin || w.getPin2() == interfacePin).collect(Collectors.toSet());
78                 wiresConnectedToPin.forEach(comp.getSubmodelModifiable()::destroyWire);
79                 comp.removeSubmodelInterface(interfacePin.name);
80                 comp.addSubmodelInterface(
81                                 new MovablePin(comp, interfacePin.name, interfacePin.logicWidth, usage, interfacePin.getRelX(), interfacePin.getRelY()));
82                 ViewModelModifiable submodelModifiable = comp.getSubmodelModifiable();
83                 wiresConnectedToPin.forEach(w -> new GUIWire(submodelModifiable, w.getPin1(), w.getPin2()));
84         }
85 }