Skip to content

Commit

Permalink
Merge pull request #132 from fiord/feature/update_bulksender
Browse files Browse the repository at this point in the history
bulksenderにパラメータ機能を追加
  • Loading branch information
funa-tk authored Jul 28, 2022
2 parents 1b3dff2 + e30668f commit 0769650
Show file tree
Hide file tree
Showing 6 changed files with 561 additions and 21 deletions.
92 changes: 72 additions & 20 deletions src/main/java/core/packetproxy/gui/GUIBulkSender.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CountDownLatch;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComponent;
Expand All @@ -33,23 +35,23 @@
import packetproxy.model.OneShotPacket;
import packetproxy.model.Packet;
import packetproxy.model.Packets;
import packetproxy.model.RegexParam;

public class GUIBulkSender
{
public class GUIBulkSender {
private static GUIBulkSender instance;
private static JFrame owner;

public static JFrame getOwner() {
return owner;
}

public static GUIBulkSender getInstance() throws Exception
{
public static GUIBulkSender getInstance() throws Exception {
if (instance == null) {
instance = new GUIBulkSender();
}
return instance;
}

private Map<Integer, OneShotPacket> sendPackets;
private Map<Integer, Integer> sendPacketIds;
private Map<Integer, OneShotPacket> recvPackets;
Expand Down Expand Up @@ -102,25 +104,76 @@ private JComponent createSendPanel() throws Exception {
@Override
public void actionPerformed(ActionEvent e) {
try {
List<RegexParam> regexParams = sendTable.getRegexParams();
recvTable.clear();
recvPackets.clear();
OneShotPacket[] oneshots = (OneShotPacket[]) sendPackets.values().toArray(new OneShotPacket[0]);
ResendController.getInstance().resend(new ResendWorker(oneshots) {
@Override
protected void process(List<OneShotPacket> oneshots) {
try {
for (OneShotPacket oneshot: oneshots) {
recvPackets.put(oneshot.getId(), oneshot);
recvTable.add(oneshot);
Packet packet = Packets.getInstance().query(sendPacketIds.get(oneshot.getId()));
packet.setResend();
Packets.getInstance().update(packet);

if (regexParams.size() == 0) { // parallel
ResendController.getInstance().resend(new ResendWorker(oneshots) {
@Override
protected void process(List<OneShotPacket> oneshots) {
try {
for (OneShotPacket oneshot : oneshots) {
recvPackets.put(oneshot.getId(), oneshot);
recvTable.add(oneshot);
Packet packet = Packets.getInstance().query(sendPacketIds.get(oneshot.getId()));
packet.setResend();
Packets.getInstance().update(packet);
}
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
});
} else { // sequential
new Thread() {
public void run() {
try {
for (int i = 0; i < oneshots.length; i++) {
int idx = i;
OneShotPacket oneshot = oneshots[i];
CountDownLatch latch = new CountDownLatch(1);
// modify packet
for (RegexParam regexParam : regexParams) {
if (regexParam.getValue() != "") {
oneshot = regexParam.applyToPacket(oneshot);
}
}
final OneShotPacket sendOneshot = oneshot;
ResendController.getInstance().resend(new ResendWorker(sendOneshot, 1) {
@Override
protected void process(List<OneShotPacket> oneshots) {
try {
for (OneShotPacket oneshot : oneshots) {
recvPackets.put(oneshot.getId(), oneshot);
recvTable.add(oneshot);
Packet packet = Packets.getInstance()
.query(sendPacketIds.get(oneshot.getId()));
packet.setResend();
Packets.getInstance().update(packet);
// pickup regex value
regexParams.stream().filter(v -> {
return v.getPacketId() == idx;
}).forEach(v -> {
regexParams.get(regexParams.indexOf(v))
.setValue(oneshot);
});
latch.countDown();
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
latch.await();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
} catch (Exception e1) {
e1.printStackTrace();
}
Expand All @@ -145,7 +198,6 @@ public void actionPerformed(ActionEvent e) {
}
});


JPanel buttonPanel = new JPanel();
buttonPanel.add(sendButton);
buttonPanel.add(clearButton);
Expand Down Expand Up @@ -183,4 +235,4 @@ private JComponent createRecvPanel() throws Exception {
return split_panel;
}

}
}
1 change: 1 addition & 0 deletions src/main/java/core/packetproxy/gui/GUIBulkSenderData.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;


public class GUIBulkSenderData {

//private JFrame owner;
Expand Down
74 changes: 73 additions & 1 deletion src/main/java/core/packetproxy/gui/GUIBulkSenderTable.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,30 @@

import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.KeyStroke;
import javax.swing.event.ListSelectionEvent;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

import packetproxy.common.Utils;
import packetproxy.model.OneShotPacket;
import packetproxy.model.OptionTableModel;
import packetproxy.model.RegexParam;
import packetproxy.util.PacketProxyUtility;

public class GUIBulkSenderTable
{
Expand All @@ -38,11 +51,25 @@ public class GUIBulkSenderTable
boolean updating = false;
private Type type;
private Consumer<Integer> onSelected;
private List<RegexParam> regexParams;

public enum Type { CLIENT, SERVER };
public GUIBulkSenderTable(Type type, Consumer<Integer> onSelected) {
this.type = type;
this.onSelected = onSelected;
this.regexParams = new ArrayList<>();
}

private JMenuItem createMenuItem(String name, int key, KeyStroke hotkey, ActionListener l) {
JMenuItem out = new JMenuItem (name);
if (key >= 0) {
out.setMnemonic(key);
}
if (hotkey != null) {
out.setAccelerator(hotkey);
}
out.addActionListener(l);
return out;
}

public JComponent createPanel() throws Exception {
Expand Down Expand Up @@ -106,6 +133,46 @@ public void keyPressed(KeyEvent e) {
}
});

if (this.type == Type.CLIENT) {
JMenuItem paramsMenu = createMenuItem("use params", -1, null, new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
try {
PacketProxyUtility.getInstance().packetProxyLog("TODO");
JFrame owner = GUIMain.getInstance();
int packetId = getSelectedPacketId();
GUIRegexParamsTableDialog dlg = new GUIRegexParamsTableDialog(owner, regexParams, packetId);
regexParams = dlg.showDialog();
} catch (Exception e) {
e.printStackTrace();
}
}
});

JPopupMenu menu = new JPopupMenu();
menu.add(paramsMenu);

table.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent event) {
if (Utils.isWindows() && event.isPopupTrigger()) {
menu.show(event.getComponent(), event.getX(), event.getY());
}
}

@Override
public void mousePressed(MouseEvent event) {
try {
if (event.isPopupTrigger()) {
menu.show(event.getComponent(), event.getX(), event.getY());
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
}


table.getSelectionModel().addListSelectionListener(new javax.swing.event.ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
Expand Down Expand Up @@ -135,6 +202,7 @@ public void add(OneShotPacket oneshot) throws Exception {

public void clear() {
tableModel.setRowCount(0);
regexParams.clear();
}

private Object[] makeRowDataFromPacket(OneShotPacket oneshot) throws Exception {
Expand All @@ -150,4 +218,8 @@ private Object[] makeRowDataFromPacket(OneShotPacket oneshot) throws Exception {
};
}
}

public List<RegexParam> getRegexParams() {
return this.regexParams;
}
}
106 changes: 106 additions & 0 deletions src/main/java/core/packetproxy/gui/GUIRegexParamDialog.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
package packetproxy.gui;

import java.awt.Container;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

import packetproxy.common.I18nString;
import packetproxy.model.RegexParam;

public class GUIRegexParamDialog extends JDialog {
private JButton button_cancel = new JButton(I18nString.get("Cancel"));
private JButton button_set = new JButton(I18nString.get("Save"));
private JTextField regex = new JTextField();
private JTextField name = new JTextField();
private int height = 500;
private int width = 500;
private RegexParam regexParam = null;

private JComponent label_and_object(String label_name, JComponent object) {
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
JLabel label = new JLabel(label_name);
label.setPreferredSize(new Dimension(150, label.getMaximumSize().height));
panel.add(label);
object.setMaximumSize(new Dimension(Short.MAX_VALUE, label.getMaximumSize().height * 2));
panel.add(object);
return panel;
}

private JComponent buttons() {
JPanel panel_button = new JPanel();
panel_button.setLayout(new BoxLayout(panel_button, BoxLayout.X_AXIS));
panel_button.setMaximumSize(new Dimension(Short.MAX_VALUE, button_set.getMaximumSize().height));
panel_button.add(button_cancel);
panel_button.add(button_set);
return panel_button;
}

public RegexParam showDialog(RegexParam regexParam) throws Exception {
this.regexParam = regexParam;
regex.setText(regexParam.getRegex());
name.setText(regexParam.getName());
setModal(true);
setVisible(true);
return this.regexParam;
}

public RegexParam showDialog() {
setModal(true);
setVisible(true);
return regexParam;
}

private JComponent createNameSetting() {
return label_and_object("Param Name:", name);
}

private JComponent createRegexString() {
return label_and_object("regex to pickup", regex);
}

public GUIRegexParamDialog(JFrame owner) throws Exception {
super(owner);
setTitle("RegexParam setting");

Rectangle rect = owner.getBounds();
setBounds(rect.x + rect.width / 2 - width / 2, rect.y + rect.height / 2 - height / 2, width, height);

Container c = getContentPane();
JPanel panel = new JPanel();
panel.add(createNameSetting());
panel.add(createRegexString());
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

panel.add(buttons());

c.add(panel);

button_cancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
regexParam = null;
dispose();
}
});

button_set.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
regexParam = new RegexParam(regexParam.getPacketId(), name.getText(), regex.getText());
dispose();
}
});
}
}
Loading

0 comments on commit 0769650

Please sign in to comment.