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 @@
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