diff --git a/javafx.bootstrap/javafx.bootstrap/icon.ico b/javafx.bootstrap/javafx.bootstrap/icon.ico new file mode 100644 index 0000000..2c0ff3c Binary files /dev/null and b/javafx.bootstrap/javafx.bootstrap/icon.ico differ diff --git a/javafx.bootstrap/javafx.bootstrap/javafx.bootstrap.rc b/javafx.bootstrap/javafx.bootstrap/javafx.bootstrap.rc index 222a172..6ad1bf4 100644 --- a/javafx.bootstrap/javafx.bootstrap/javafx.bootstrap.rc +++ b/javafx.bootstrap/javafx.bootstrap/javafx.bootstrap.rc @@ -52,7 +52,7 @@ END // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. -IDI_ICON2 ICON "C:\\Users\\robof\\Downloads\\icon.ico" +IDI_ICON2 ICON ".\\icon.ico" #endif // English (United States) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/javafx.bootstrap/javafx.bootstrap/main.cpp b/javafx.bootstrap/javafx.bootstrap/main.cpp index 72aa108..5365560 100644 --- a/javafx.bootstrap/javafx.bootstrap/main.cpp +++ b/javafx.bootstrap/javafx.bootstrap/main.cpp @@ -13,7 +13,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdParam si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); - LPTSTR command = _tcsdup(TEXT(".\\runtime\\bin\\javaw.exe --module-path \".\\lib\" --add-modules javafx.controls,javafx.fxml -jar .\\app\\EndPoint.jar")); + LPTSTR command = _tcsdup(TEXT(".\\runtime\\bin\\javaw.exe -cp .\\app\\EndPoint.jar ovh.alexisdelhaie.endpoint.Application")); if (!CreateProcess(NULL, command, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { CloseHandle(&pi.hProcess); diff --git a/src/main/java/META-INF/MANIFEST.MF b/src/main/java/META-INF/MANIFEST.MF new file mode 100644 index 0000000..c0393eb --- /dev/null +++ b/src/main/java/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: ovh.alexisdelhaie.endpoint.Application + diff --git a/src/main/java/ovh/alexisdelhaie/endpoint/Application.java b/src/main/java/ovh/alexisdelhaie/endpoint/Application.java index a241036..0f65b7b 100644 --- a/src/main/java/ovh/alexisdelhaie/endpoint/Application.java +++ b/src/main/java/ovh/alexisdelhaie/endpoint/Application.java @@ -5,10 +5,11 @@ import ovh.alexisdelhaie.endpoint.utils.Tools; import javax.swing.*; import java.awt.*; +import java.io.IOException; public class Application { - public static void main(String[] args) throws UnsupportedLookAndFeelException { + public static void main(String[] args) throws UnsupportedLookAndFeelException, IOException { UIManager.setLookAndFeel(new FlatIntelliJLaf()); MainWindow dialog = new MainWindow(); dialog.pack(); diff --git a/src/main/java/ovh/alexisdelhaie/endpoint/MainWindow.form b/src/main/java/ovh/alexisdelhaie/endpoint/MainWindow.form index ef73f21..83b9eb6 100644 --- a/src/main/java/ovh/alexisdelhaie/endpoint/MainWindow.form +++ b/src/main/java/ovh/alexisdelhaie/endpoint/MainWindow.form @@ -1,6 +1,6 @@
- + @@ -10,7 +10,9 @@ - + + + @@ -24,7 +26,7 @@ - + @@ -32,7 +34,7 @@ - + @@ -40,7 +42,7 @@ - + @@ -50,51 +52,76 @@ - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + - - - - - - - - - - - - - - - - - - - - - + - + - + + + + + + + + + + + + + + diff --git a/src/main/java/ovh/alexisdelhaie/endpoint/MainWindow.java b/src/main/java/ovh/alexisdelhaie/endpoint/MainWindow.java index 2fc1ecc..354d1f1 100644 --- a/src/main/java/ovh/alexisdelhaie/endpoint/MainWindow.java +++ b/src/main/java/ovh/alexisdelhaie/endpoint/MainWindow.java @@ -1,6 +1,7 @@ package ovh.alexisdelhaie.endpoint; import ovh.alexisdelhaie.endpoint.builder.TabBuilder; +import ovh.alexisdelhaie.endpoint.configuration.ConfigurationDialog; import ovh.alexisdelhaie.endpoint.configuration.ConfigurationProperties; import ovh.alexisdelhaie.endpoint.http.HttpClient; import ovh.alexisdelhaie.endpoint.http.Request; @@ -8,9 +9,8 @@ import ovh.alexisdelhaie.endpoint.http.RequestBuilder; import ovh.alexisdelhaie.endpoint.http.Response; import ovh.alexisdelhaie.endpoint.utils.MessageDialog; +import javax.imageio.ImageIO; import javax.swing.*; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import java.awt.*; @@ -22,9 +22,28 @@ import java.security.NoSuchAlgorithmException; import java.util.HashMap; import java.util.Objects; import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; public class MainWindow extends JFrame { + private enum StatusColor { + INFORMATION("#53baf5"), + SUCCESS("#7ccf16"), + REDIRECTION("#b153f5"), + ERROR_CLIENT("#f5ca53"), + ERROR_SERVER("#f55353"); + + private final String hex; + + StatusColor(String s) { + hex = s; + } + + public String getHex() { + return hex; + } + } + // Constants public final static int WIDTH = 1280; public final static int HEIGHT = 720; @@ -36,27 +55,45 @@ public class MainWindow extends JFrame { private JTabbedPane tabbedPane1; private JButton newTabButton; private JProgressBar progressBar1; + private JLabel statusLabel; + private JButton settingsButton; private final ConfigurationProperties props; private final HashMap urls; - public MainWindow() { + private final ConcurrentHashMap controlState; + private final ConcurrentHashMap responses; + + public MainWindow() throws IOException { props = new ConfigurationProperties(); + controlState = new ConcurrentHashMap<>(); + responses = new ConcurrentHashMap<>(); urls = new HashMap<>(); + setIconImage(ImageIO.read(MainWindow.class.getResource("/icon.png"))); setContentPane(contentPane); setMinimumSize(new Dimension(WIDTH, HEIGHT)); setSize(WIDTH, HEIGHT); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - TabBuilder.create(tabbedPane1, "New request", urls); + TabBuilder.create(tabbedPane1, "New request", urls, urlField); Component tab = tabbedPane1.getSelectedComponent(); urls.put(tab.hashCode(), ""); + enableControl(true, tab.hashCode()); + settingsButton.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + super.mouseClicked(e); + ConfigurationDialog.showDialog(props); + } + }); newTabButton.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { super.mouseClicked(e); - TabBuilder.create(tabbedPane1, "New request", urls); + TabBuilder.create(tabbedPane1, "New request", urls, urlField); Component tab = tabbedPane1.getSelectedComponent(); urls.put(tab.hashCode(), ""); + enableControl(true, tab.hashCode()); + showStatus(tab.hashCode()); } }); sendButton.addMouseListener(new MouseAdapter() { @@ -70,11 +107,12 @@ public class MainWindow extends JFrame { } } }); - tabbedPane1.addChangeListener(new ChangeListener() { - public void stateChanged(ChangeEvent e) { - if (tabbedPane1.getSelectedIndex() != -1) { - urlField.setText(urls.get(tabbedPane1.getSelectedComponent().hashCode())); - } + tabbedPane1.addChangeListener(e -> { + if (tabbedPane1.getSelectedIndex() != -1) { + int hashCode = tabbedPane1.getSelectedComponent().hashCode(); + urlField.setText(urls.get(hashCode)); + enableControl(controlState.get(hashCode), hashCode); + showStatus(tab.hashCode()); } }); urlField.getDocument().addDocumentListener(new DocumentListener() { @@ -100,32 +138,44 @@ public class MainWindow extends JFrame { Optional possibleTab = getSelectedTab(); if (possibleTab.isPresent()) { JSplitPane tab = possibleTab.get(); + int tabHashCode = tab.hashCode(); + statusLabel.setVisible(false); + enableControl(false, tabHashCode); int i = tabbedPane1.indexOfComponent(tab); - JTextArea bodyField = TabBuilder.getResponseArea(i); - progressBar1.setVisible(true); + JTextArea responseBody = TabBuilder.getResponseArea(i); + responseBody.setForeground(Color.black); + responseBody.setText(""); + JTextArea bodyField = TabBuilder.getBody(i); new Thread(() -> { try { String url = urlField.getText(); HttpClient h = new HttpClient(props); Request r = new RequestBuilder(url) + .setCustomHeaders(TabBuilder.getHeaders(i)) .build(); Optional possibleRes = Optional.empty(); switch ((String) Objects.requireNonNull(methodBox.getSelectedItem())) { case "GET" -> possibleRes = h.get(r); - case "POST" -> possibleRes = h.post(r, ""); - case "PUT" -> possibleRes = h.put(r, ""); + case "POST" -> possibleRes = h.post(r, bodyField.getText()); + case "PUT" -> possibleRes = h.put(r, bodyField.getText()); case "DELETE" -> possibleRes = h.delete(r); case "HEAD" -> possibleRes = h.head(r); } if (possibleRes.isPresent()) { Response res = possibleRes.get(); - - bodyField.setText(res.getBody()); + responses.put(tabHashCode, res); + responseBody.setText(res.getBody()); } } catch (KeyManagementException | IOException | NoSuchAlgorithmException e) { - bodyField.setText(e.getMessage()); + responseBody.setForeground(Color.red); + responseBody.setText(e.getMessage()); + if (responses.containsKey(tabHashCode)) { + responses.remove(tabHashCode); + showStatus(tabHashCode); + } } finally { - progressBar1.setVisible(false); + enableControl(true, tabHashCode); + showStatus(tabHashCode); } }).start(); } else { @@ -133,6 +183,55 @@ public class MainWindow extends JFrame { } } + private void enableControl(Boolean state, int hashCode) { + if (Objects.nonNull(state)) { + controlState.put(hashCode, state); + if (tabbedPane1.getSelectedComponent().hashCode() == hashCode) { + sendButton.setEnabled(state); + urlField.setEnabled(state); + methodBox.setEnabled(state); + progressBar1.setIndeterminate(!state); + } + } + } + + private void showStatus(int hashCode) { + if (controlState.get(hashCode) && responses.containsKey(hashCode) && + tabbedPane1.getSelectedComponent().hashCode() == hashCode) { + statusLabel.setForeground(Color.BLACK); + Response res = responses.get(hashCode); + final StringBuilder sb = new StringBuilder(); + if (res.getStatusCode() != -1) { + sb.append(res.getStatusCode()) + .append(" ") + .append(res.getStatus()) + .append(" (in ") + .append(res.getTime()) + .append(" ms)"); + if (res.getStatusCode() >= 100 && res.getStatusCode() < 200) { + statusLabel.setForeground(Color.decode(StatusColor.INFORMATION.getHex())); + } else if (res.getStatusCode() >= 200 && res.getStatusCode() < 300) { + statusLabel.setForeground(Color.decode(StatusColor.SUCCESS.getHex())); + } else if (res.getStatusCode() >= 300 && res.getStatusCode() < 400) { + statusLabel.setForeground(Color.decode(StatusColor.REDIRECTION.getHex())); + } else if (res.getStatusCode() >= 400 && res.getStatusCode() < 500) { + statusLabel.setForeground(Color.decode(StatusColor.ERROR_CLIENT.getHex())); + } else if (res.getStatusCode() >= 500) { + statusLabel.setForeground(Color.decode(StatusColor.ERROR_SERVER.getHex())); + } + } else { + sb.append("in ") + .append(res.getTime()) + .append(" ms"); + } + + statusLabel.setText(sb.toString()); + statusLabel.setVisible(true); + } else { + statusLabel.setVisible(false); + } + } + private Optional getSelectedTab() { Component c = tabbedPane1.getSelectedComponent(); if (c instanceof JSplitPane) { diff --git a/src/main/java/ovh/alexisdelhaie/endpoint/builder/TabBuilder.java b/src/main/java/ovh/alexisdelhaie/endpoint/builder/TabBuilder.java index d30fa97..881a393 100644 --- a/src/main/java/ovh/alexisdelhaie/endpoint/builder/TabBuilder.java +++ b/src/main/java/ovh/alexisdelhaie/endpoint/builder/TabBuilder.java @@ -1,30 +1,24 @@ package ovh.alexisdelhaie.endpoint.builder; -import ovh.alexisdelhaie.endpoint.utils.InsertToTableDialog; -import ovh.alexisdelhaie.endpoint.utils.KeyValuePair; +import ovh.alexisdelhaie.endpoint.utils.Tools; +import ovh.alexisdelhaie.endpoint.utils.adapter.CustomDeleteMouseAdapter; +import ovh.alexisdelhaie.endpoint.utils.adapter.CustomNewMouseAdapter; +import ovh.alexisdelhaie.endpoint.utils.adapter.DeleteParamMouseAdapter; +import ovh.alexisdelhaie.endpoint.utils.adapter.NewParamMouseAdapter; import javax.swing.*; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; import javax.swing.table.DefaultTableModel; -import javax.swing.table.TableColumn; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.io.IOException; -import java.security.KeyManagementException; -import java.security.NoSuchAlgorithmException; -import java.util.Arrays; import java.util.HashMap; -import java.util.Map; -import java.util.Optional; public class TabBuilder { - private static HashMap indexes = new HashMap<>(); + private static final HashMap indexes = new HashMap<>(); - public static void create(JTabbedPane tab, String label, HashMap urls) { - Component c = tab.add("", buildMainPanel()); + public static void create(JTabbedPane tab, String label, HashMap urls, JTextField urlField) { + Component c = tab.add("", buildMainPanel(urlField)); int index = tab.indexOfComponent(c); updateIndexes(index); tab.setTabComponentAt(index, buildTabPanel(tab, c, label, urls)); @@ -33,7 +27,13 @@ public class TabBuilder { private static void updateIndexes(int index) { indexes.put("main[" + index + "].responseTextArea", indexes.get("main[waiting].responseTextArea")); + indexes.put("main[" + index + "].body", indexes.get("main[waiting].body")); + indexes.put("main[" + index + "].params", indexes.get("main[waiting].params")); + indexes.put("main[" + index + "].headers", indexes.get("main[waiting].headers")); indexes.remove("main[waiting].responseTextArea"); + indexes.remove("main[waiting].body"); + indexes.remove("main[waiting].params"); + indexes.remove("main[waiting].headers"); } private static JPanel buildTabPanel(JTabbedPane tab, Component c, String label, HashMap urls) { @@ -68,7 +68,7 @@ public class TabBuilder { return b; } - private static JSplitPane buildMainPanel() { + private static JSplitPane buildMainPanel(JTextField urlField) { JTextArea t = new JTextArea(); t.setBackground(Color.WHITE); t.setEditable(false); @@ -76,73 +76,57 @@ public class TabBuilder { indexes.put("main[waiting].responseTextArea", t); return new JSplitPane( JSplitPane.VERTICAL_SPLIT, - buildParametersTabbedPane(), + buildParametersTabbedPane(urlField), sp ); } - private static JTabbedPane buildParametersTabbedPane() { + private static JTabbedPane buildParametersTabbedPane(JTextField urlField) { JTabbedPane p = new JTabbedPane(); - p.add("Params", buildParamsTab()); + p.add("Params", buildParamsTab(true, urlField)); p.add("Authorization", new JPanel()); - p.add("Headers", buildParamsTab()); - p.add("Body", new JTextArea()); + p.add("Headers", buildParamsTab(false, null)); + JTextArea body = new JTextArea(); + indexes.put("main[waiting].body", body); + p.add("Body", body); return p; } - private static JTable buildTable() { - JTable t = new JTable(); - TableColumn keyCol = new TableColumn(); - keyCol.setHeaderValue("Keys"); - TableColumn valCol = new TableColumn(); - valCol.setHeaderValue("Values"); - t.addColumn(keyCol); - t.addColumn(valCol); - return t; - } - public static JTextArea getResponseArea(int index) { return (JTextArea) indexes.get("main[" + index + "].responseTextArea"); } - private static JPanel buildParamsTab() { + public static JTextArea getBody(int index) { + return (JTextArea) indexes.get("main[" + index + "].body"); + } + + public static HashMap getParams(int index) { + JTable t = (JTable) indexes.get("main[" + index + "].params"); + return Tools.tableToHashMap(t); + } + + public static HashMap getHeaders(int index) { + JTable t = (JTable) indexes.get("main[" + index + "].headers"); + return Tools.tableToHashMap(t); + } + + private static JPanel buildParamsTab(boolean isParam, JTextField urlField) { String[] headers = {"Keys", "Values"}; - Object[][] datas = {}; - DefaultTableModel model = new DefaultTableModel(datas, headers); + DefaultTableModel model = new DefaultTableModel(new Object[][]{}, headers); JPanel p = new JPanel(); JTable t = new JTable(model); - JButton addButton = new JButton("Add new parameter"); - JButton delButton = new JButton("Delete parameter"); + indexes.put((isParam) ? "main[waiting].params" : "main[waiting].headers", t); + JButton addButton = new JButton("New"); + JButton delButton = new JButton("Remove"); delButton.setEnabled(false); - t.getSelectionModel().addListSelectionListener(new ListSelectionListener(){ - public void valueChanged(ListSelectionEvent event) { - delButton.setEnabled(t.getSelectedRows().length > 0); - } - }); - addButton.addMouseListener(new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - super.mouseClicked(e); - Optional result = InsertToTableDialog.showDialog("Enter value"); - if (result.isPresent()) { - DefaultTableModel m = (DefaultTableModel) t.getModel(); - m.addRow(new Object[]{result.get().getKey(), result.get().getValue()}); - } - } - }); - delButton.addMouseListener(new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - super.mouseClicked(e); - int n = t.getSelectedRows().length; - if (n > 0) { - DefaultTableModel m = (DefaultTableModel) t.getModel(); - for(int i = 0; i < n; i++) { - m.removeRow(t.getSelectedRow()); - } - } - } - }); + t.getSelectionModel().addListSelectionListener(event -> delButton.setEnabled(t.getSelectedRows().length > 0)); + if (isParam) { + addButton.addMouseListener(new NewParamMouseAdapter(t, urlField)); + delButton.addMouseListener(new DeleteParamMouseAdapter(t, urlField)); + } else { + addButton.addMouseListener(new CustomNewMouseAdapter(t)); + delButton.addMouseListener(new CustomDeleteMouseAdapter(t)); + } p.add(addButton); p.add(delButton); p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS)); diff --git a/src/main/java/ovh/alexisdelhaie/endpoint/configuration/AboutDialog.form b/src/main/java/ovh/alexisdelhaie/endpoint/configuration/AboutDialog.form new file mode 100644 index 0000000..4703c1d --- /dev/null +++ b/src/main/java/ovh/alexisdelhaie/endpoint/configuration/AboutDialog.form @@ -0,0 +1,63 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/main/java/ovh/alexisdelhaie/endpoint/configuration/AboutDialog.java b/src/main/java/ovh/alexisdelhaie/endpoint/configuration/AboutDialog.java new file mode 100644 index 0000000..d4dc42f --- /dev/null +++ b/src/main/java/ovh/alexisdelhaie/endpoint/configuration/AboutDialog.java @@ -0,0 +1,37 @@ +package ovh.alexisdelhaie.endpoint.configuration; + +import ovh.alexisdelhaie.endpoint.utils.Tools; + +import javax.swing.*; +import java.awt.*; + +public class AboutDialog extends JDialog { + + public static final int WIDTH = 450; + public static final int HEIGHT = 500; + + public static final String VERSION = "0.1.3"; + + private JPanel contentPane; + private JLabel version; + private JLabel javaVersion; + + private AboutDialog() { + setContentPane(contentPane); + setModal(true); + setTitle("About EndPoint"); + version.setText("Version: " + VERSION + " (NOT FINISHED)"); + javaVersion.setText("Software: Java " + System.getProperty("java.version") + " (GUI: Java Swing)"); + } + + public static void showDialog() { + AboutDialog dialog = new AboutDialog(); + dialog.setModal(true); + dialog.setMinimumSize(new Dimension(WIDTH, HEIGHT)); + dialog.setMaximumSize(new Dimension(WIDTH, HEIGHT)); + dialog.setResizable(false); + Tools.centerFrame(dialog); + dialog.setVisible(true); + } + +} diff --git a/src/main/java/ovh/alexisdelhaie/endpoint/configuration/ConfigurationDialog.form b/src/main/java/ovh/alexisdelhaie/endpoint/configuration/ConfigurationDialog.form new file mode 100644 index 0000000..f45007c --- /dev/null +++ b/src/main/java/ovh/alexisdelhaie/endpoint/configuration/ConfigurationDialog.form @@ -0,0 +1,175 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/ovh/alexisdelhaie/endpoint/configuration/ConfigurationDialog.java b/src/main/java/ovh/alexisdelhaie/endpoint/configuration/ConfigurationDialog.java new file mode 100644 index 0000000..50ad4c1 --- /dev/null +++ b/src/main/java/ovh/alexisdelhaie/endpoint/configuration/ConfigurationDialog.java @@ -0,0 +1,64 @@ +package ovh.alexisdelhaie.endpoint.configuration; + +import ovh.alexisdelhaie.endpoint.utils.Tools; + +import javax.swing.*; +import java.awt.*; + +public class ConfigurationDialog extends JDialog { + + public static final int WIDTH = 450; + public static final int HEIGHT = 700; + + private JPanel contentPane; + private JButton buttonOK; + private JCheckBox allowInvalidSsl; + private JCheckBox allowDowngrade; + private JComboBox httpVersion; + private JSpinner timeout; + private JButton aboutButton; + + private final ConfigurationProperties props; + + private ConfigurationDialog(ConfigurationProperties props) { + setContentPane(contentPane); + setModal(true); + getRootPane().setDefaultButton(buttonOK); + setTitle("Settings"); + this.props = props; + buttonOK.addActionListener(e -> onOK()); + aboutButton.addActionListener(e -> AboutDialog.showDialog()); + allowInvalidSsl.setSelected(this.props.getBooleanProperty("allowInvalidSsl", false)); + allowDowngrade.setSelected(this.props.getBooleanProperty("allowDowngrade", true)); + httpVersion.setSelectedItem(this.props.getStringProperty("httpVersion", "HTTP/1.0")); + timeout.setValue(this.props.getIntegerProperty("timeout", 10000)); + + allowInvalidSsl.addActionListener((e) -> { + this.props.setProperty("allowInvalidSsl", String.valueOf(allowInvalidSsl.isSelected())); + }); + allowDowngrade.addActionListener((e) -> { + this.props.setProperty("allowDowngrade", String.valueOf(allowDowngrade.isSelected())); + }); + httpVersion.addActionListener((e) -> { + this.props.setProperty("httpVersion", (String) httpVersion.getSelectedItem()); + }); + timeout.addChangeListener((e) -> { + this.props.setProperty("timeout", String.valueOf(timeout.getValue())); + }); + + } + + private void onOK() { + dispose(); + } + + public static void showDialog(ConfigurationProperties props) { + ConfigurationDialog dialog = new ConfigurationDialog(props); + dialog.setModal(true); + dialog.setMinimumSize(new Dimension(WIDTH, HEIGHT)); + dialog.setMaximumSize(new Dimension(WIDTH, HEIGHT)); + dialog.setResizable(false); + Tools.centerFrame(dialog); + dialog.setVisible(true); + } +} diff --git a/src/main/java/ovh/alexisdelhaie/endpoint/configuration/ConfigurationProperties.java b/src/main/java/ovh/alexisdelhaie/endpoint/configuration/ConfigurationProperties.java index 052170d..6616350 100644 --- a/src/main/java/ovh/alexisdelhaie/endpoint/configuration/ConfigurationProperties.java +++ b/src/main/java/ovh/alexisdelhaie/endpoint/configuration/ConfigurationProperties.java @@ -52,6 +52,13 @@ public class ConfigurationProperties { return defaultB; } + public int getIntegerProperty(String key, int defaultI) { + if (properties.containsKey(key)) { + return Integer.parseInt(properties.get(key)); + } + return defaultI; + } + private void save() { try { mapper.writeValue(new File(filepath), properties); diff --git a/src/main/java/ovh/alexisdelhaie/endpoint/http/HttpClient.java b/src/main/java/ovh/alexisdelhaie/endpoint/http/HttpClient.java index fe0e639..261d5bf 100644 --- a/src/main/java/ovh/alexisdelhaie/endpoint/http/HttpClient.java +++ b/src/main/java/ovh/alexisdelhaie/endpoint/http/HttpClient.java @@ -27,12 +27,16 @@ public class HttpClient { private final boolean allowInvalidSsl; private final boolean allowDowngrade; private final String httpVersion; + private final int timeout; + private boolean downgraded; public HttpClient(ConfigurationProperties props) { this.allowInvalidSsl = props.getBooleanProperty("allowInvalidSsl", DEFAULT_ALLOW_INVALID_SSL); this.allowDowngrade = props.getBooleanProperty("allowDowngrade", DEFAULT_ALLOW_DOWNGRADE); this.httpVersion = props.getStringProperty("httpVersion", DEFAULT_HTTP_VERSION); + this.timeout = props.getIntegerProperty("timeout", DEFAULT_TIMEOUT); + this.downgraded = false; } @@ -99,7 +103,7 @@ public class HttpClient { private Socket buildSocket(String host, int port) throws IOException { Socket s = new Socket(host, port); s.setKeepAlive(false); - s.setSoTimeout(DEFAULT_TIMEOUT); + s.setSoTimeout(timeout); return s; } @@ -124,7 +128,7 @@ public class HttpClient { SSLSocket s = (SSLSocket) factory.createSocket(host, port); s.setEnabledProtocols(new String[] { "SSLv3", "TLSv1", "TLSv1.1", "TLSv1.2" }); s.setKeepAlive(false); - s.setSoTimeout(DEFAULT_TIMEOUT); + s.setSoTimeout(timeout); if (allowDowngrade) { try { s.startHandshake(); diff --git a/src/main/java/ovh/alexisdelhaie/endpoint/utils/Tools.java b/src/main/java/ovh/alexisdelhaie/endpoint/utils/Tools.java index 8a64724..65d51f1 100644 --- a/src/main/java/ovh/alexisdelhaie/endpoint/utils/Tools.java +++ b/src/main/java/ovh/alexisdelhaie/endpoint/utils/Tools.java @@ -1,6 +1,9 @@ package ovh.alexisdelhaie.endpoint.utils; +import javax.swing.*; +import javax.swing.table.DefaultTableModel; import java.awt.*; +import java.util.HashMap; public class Tools { @@ -18,4 +21,15 @@ public class Tools { frame.setLocation(x, y); } + public static HashMap tableToHashMap(JTable table) { + HashMap result = new HashMap<>(); + DefaultTableModel m = (DefaultTableModel) table.getModel(); + for (int i = 0; i < m.getRowCount(); i++) { + String key = (String) m.getValueAt(i, 0); + String value = (String) m.getValueAt(i, 1); + result.put(key, value); + } + return result; + } + } diff --git a/src/main/java/ovh/alexisdelhaie/endpoint/utils/adapter/CustomDeleteMouseAdapter.java b/src/main/java/ovh/alexisdelhaie/endpoint/utils/adapter/CustomDeleteMouseAdapter.java new file mode 100644 index 0000000..3583dc9 --- /dev/null +++ b/src/main/java/ovh/alexisdelhaie/endpoint/utils/adapter/CustomDeleteMouseAdapter.java @@ -0,0 +1,34 @@ +package ovh.alexisdelhaie.endpoint.utils.adapter; + +import javax.swing.*; +import javax.swing.table.DefaultTableModel; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +public class CustomDeleteMouseAdapter extends MouseAdapter { + + protected final JTable table; + protected boolean valid = false; + + public CustomDeleteMouseAdapter(JTable table) { + this.table = table; + } + + @Override + public void mouseClicked(MouseEvent e) { + super.mouseClicked(e); + updateTable(); + } + + private void updateTable() { + int n = table.getSelectedRows().length; + if (n > 0) { + DefaultTableModel m = (DefaultTableModel) table.getModel(); + for(int i = 0; i < n; i++) { + m.removeRow(table.getSelectedRow()); + } + valid = true; + } + } + +} diff --git a/src/main/java/ovh/alexisdelhaie/endpoint/utils/adapter/CustomNewMouseAdapter.java b/src/main/java/ovh/alexisdelhaie/endpoint/utils/adapter/CustomNewMouseAdapter.java new file mode 100644 index 0000000..f2288ab --- /dev/null +++ b/src/main/java/ovh/alexisdelhaie/endpoint/utils/adapter/CustomNewMouseAdapter.java @@ -0,0 +1,36 @@ +package ovh.alexisdelhaie.endpoint.utils.adapter; + +import ovh.alexisdelhaie.endpoint.utils.InsertToTableDialog; +import ovh.alexisdelhaie.endpoint.utils.KeyValuePair; + +import javax.swing.*; +import javax.swing.table.DefaultTableModel; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.Optional; + +public class CustomNewMouseAdapter extends MouseAdapter { + + protected final JTable table; + protected boolean valid = false; + + public CustomNewMouseAdapter(JTable table) { + this.table = table; + } + + @Override + public void mouseClicked(MouseEvent e) { + super.mouseClicked(e); + updateTable(); + } + + private void updateTable() { + Optional result = InsertToTableDialog.showDialog("Enter value"); + if (result.isPresent()) { + DefaultTableModel m = (DefaultTableModel) table.getModel(); + m.addRow(new Object[]{result.get().getKey(), result.get().getValue()}); + valid = true; + } + } + +} diff --git a/src/main/java/ovh/alexisdelhaie/endpoint/utils/adapter/DeleteParamMouseAdapter.java b/src/main/java/ovh/alexisdelhaie/endpoint/utils/adapter/DeleteParamMouseAdapter.java new file mode 100644 index 0000000..d7e5080 --- /dev/null +++ b/src/main/java/ovh/alexisdelhaie/endpoint/utils/adapter/DeleteParamMouseAdapter.java @@ -0,0 +1,26 @@ +package ovh.alexisdelhaie.endpoint.utils.adapter; + +import ovh.alexisdelhaie.endpoint.url.URLGenerator; +import ovh.alexisdelhaie.endpoint.utils.Tools; + +import javax.swing.*; +import java.awt.event.MouseEvent; + +public class DeleteParamMouseAdapter extends CustomDeleteMouseAdapter { + + private final JTextField urlField; + + public DeleteParamMouseAdapter(JTable table, JTextField urlField) { + super(table); + this.urlField = urlField; + } + + @Override + public void mouseClicked(MouseEvent e) { + super.mouseClicked(e); + if (super.valid) { + urlField.setText(URLGenerator.processNewUrl(Tools.tableToHashMap(super.table), urlField.getText())); + } + } + +} diff --git a/src/main/java/ovh/alexisdelhaie/endpoint/utils/adapter/NewParamMouseAdapter.java b/src/main/java/ovh/alexisdelhaie/endpoint/utils/adapter/NewParamMouseAdapter.java new file mode 100644 index 0000000..e85992a --- /dev/null +++ b/src/main/java/ovh/alexisdelhaie/endpoint/utils/adapter/NewParamMouseAdapter.java @@ -0,0 +1,26 @@ +package ovh.alexisdelhaie.endpoint.utils.adapter; + +import ovh.alexisdelhaie.endpoint.url.URLGenerator; +import ovh.alexisdelhaie.endpoint.utils.Tools; + +import javax.swing.*; +import java.awt.event.MouseEvent; + +public class NewParamMouseAdapter extends CustomNewMouseAdapter { + + private final JTextField urlField; + + public NewParamMouseAdapter(JTable table, JTextField urlField) { + super(table); + this.urlField = urlField; + } + + @Override + public void mouseClicked(MouseEvent e) { + super.mouseClicked(e); + if (super.valid) { + urlField.setText(URLGenerator.processNewUrl(Tools.tableToHashMap(super.table), urlField.getText())); + } + } + +} diff --git a/src/main/resources/icon.png b/src/main/resources/icon.png new file mode 100644 index 0000000..0d216b3 Binary files /dev/null and b/src/main/resources/icon.png differ