Leonard Seymore
2020-03-28 a651c082fa7d49a77f225b26e042a95fdd818339
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package za.co.taulite.openapi.openapiparser;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
 
import javax.swing.*;
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileSystemView;
import java.awt.*;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.Arrays;
 
@SpringBootApplication
public class SwingApp extends JFrame {
 
    @Autowired
    private Converter converter;
 
    public SwingApp() {
        super("OpenAPI2CSV - Theo se Tool");
 
        setLayout(new FlowLayout());
 
        var lblInputFile = new JLabel("Pick a file ... File -> Open");
        add(lblInputFile);
 
        var menuBar = new JMenuBar();
        var fileMenu = new JMenu("File");
        var openMenu = new JMenuItem("Open");
        openMenu.addActionListener(e -> {
            var fc = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
            fc.setDialogTitle("OpenAPI Descriptor");
            fc.setFileFilter(new FileFilter() {
                @Override
                public boolean accept(File file) {
                    return file.isDirectory() || file.getName().endsWith(".yaml");
                }
 
                @Override
                public String getDescription() {
                    return "OpenApi YAML";
                }
            });
            if (fc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
                var inputFile = fc.getSelectedFile();
                if (!inputFile.isDirectory()) {
                    try {
                        var url = inputFile.toURI().toURL();
                        lblInputFile.setText(inputFile.getAbsolutePath());
                        if (converter.isOpenApiDescriptor(url)) {
                            var fco = new JFileChooser(inputFile.getParentFile());
                            fco.setDialogTitle("Choose output directory");
                            fco.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
                            fco.setAcceptAllFileFilterUsed(false);
                            if (fco.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
                                var outputDir = fco.getSelectedFile();
                                var domainCsvFile = String.format("%s.domain.csv", inputFile.getName());
                                var domainCsvFilePath = Paths.get(outputDir.getAbsolutePath(), domainCsvFile);
                                var domainCsv = converter.domainToCsv(url);
 
                                var domainHtml = csvToHtml(domainCsv);
                                var domainHtmlFile = String.format("%s.domain.html", inputFile.getName());
                                var domainHtmlFilePath = Paths.get(outputDir.getAbsolutePath(), domainHtmlFile);
                                try {
                                    Files.writeString(domainCsvFilePath, domainCsv, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
                                    Files.writeString(domainHtmlFilePath, domainHtml, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
                                } catch (IOException ex) {
                                    lblInputFile.setText(ex.getMessage());
                                }
 
                                var operationsCsvFile = String.format("%s.operations.csv", inputFile.getName());
                                var operationsCsvFilePath = Paths.get(outputDir.getAbsolutePath(), operationsCsvFile);
                                var operationsCsv = converter.operationsToCsv(url);
 
                                var operationsHtml = csvToHtml(operationsCsv);
                                var operationsHtmlFile = String.format("%s.operations.html", inputFile.getName());
                                var operationsHtmlFilePath = Paths.get(outputDir.getAbsolutePath(), operationsHtmlFile);
                                try {
                                    Files.writeString(operationsCsvFilePath, operationsCsv, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
                                    Files.writeString(operationsHtmlFilePath, operationsHtml, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
                                } catch (IOException ex) {
                                    lblInputFile.setText(ex.getMessage());
                                }
 
                                lblInputFile.setText(String.format("Output generated: %s", outputDir.getAbsolutePath()));
                            }
                        } else {
                            lblInputFile.setText("Invalid file");
                        }
                    } catch (MalformedURLException ex) {
                        lblInputFile.setText(ex.getMessage());
                    }
                } else {
                    lblInputFile.setText("Please select valid file");
                }
            }
        });
 
        var exitMenu = new JMenuItem("Exit");
        exitMenu.addActionListener((event) -> System.exit(0));
 
        fileMenu.add(openMenu);
        fileMenu.add(exitMenu);
        menuBar.add(fileMenu);
 
        setJMenuBar(menuBar);
 
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(800, 600);
        setLocationRelativeTo(null);
    }
 
    private String csvToHtml(String csv) {
        var builder = new StringBuilder();
        builder.append("<html>\n");
        builder.append("<table border=\"1\">\n");
        Arrays.stream(csv.split("\n")).forEach(l -> {
            builder.append("\t<tr>\n");
            Arrays.stream(l.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)")).forEach(c -> {
                builder.append("\t\t<td>")
                        .append(c)
                        .append("</td>\n");
            });
            builder.append("\t</tr>\n");
        });
        builder.append("</table>\n");
        builder.append("</html>");
        return builder.toString();
    }
 
    public static void main(String[] args) {
 
        var ctx = new SpringApplicationBuilder(SwingApp.class)
                .headless(false).run(args);
 
        EventQueue.invokeLater(() -> {
 
            var ex = ctx.getBean(SwingApp.class);
            ex.setVisible(true);
        });
    }
}