package org.wiztools.restclient.ui.resheader; import java.awt.Component; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.net.HttpCookie; import java.util.Arrays; import java.util.List; import javax.annotation.PostConstruct; import javax.inject.Inject; import javax.swing.*; import org.wiztools.commons.CollectionsUtil; import org.wiztools.commons.MultiValueMap; import org.wiztools.commons.MultiValueMapArrayList; import org.wiztools.restclient.ui.RESTView; import org.wiztools.restclient.ui.UIUtil; /** * * @author subwiz */ public class ResHeaderPanelImpl extends JPanel implements ResHeaderPanel { @Inject private RESTView view; private JTable jt_res_headers = new JTable(); private ResponseHeaderTableModel resHeaderTableModel = new ResponseHeaderTableModel(); @PostConstruct protected void init() { setLayout(new GridLayout()); // Header Tab: Other Headers JPanel jp_headers = new JPanel(); jp_headers.setLayout(new GridLayout(1, 1)); jt_res_headers.addMouseListener(new MouseAdapter() { private JPopupMenu popup = new JPopupMenu(); private JMenuItem jmi_copy = new JMenuItem("Copy Selected Header(s)"); private JMenuItem jmi_copy_all = new JMenuItem("Copy All Headers"); private JMenuItem jmi_copy_cookies = new JMenuItem("Copy Cookie Name-Value Pairs"); { jmi_copy.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { final int[] rows = jt_res_headers.getSelectedRows(); if(rows.length == 0) { view.setStatusMessage("No header(s) selected"); return; } Arrays.sort(rows); StringBuilder sb = new StringBuilder(); for(final int row: rows) { final String key = (String) jt_res_headers.getValueAt(row, 0); final String value = (String) jt_res_headers.getValueAt(row, 1); sb.append(key).append(": ").append(value).append("\r\n"); } UIUtil.clipboardCopy(sb.toString()); view.setStatusMessage("Copied selected headers to clipboard"); } }); popup.add(jmi_copy); } { jmi_copy_all.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { final int totalRows = jt_res_headers.getRowCount(); StringBuilder sb = new StringBuilder(); for(int i=0; i<totalRows; i++) { final String key = (String) jt_res_headers.getValueAt(i, 0); final String value = (String) jt_res_headers.getValueAt(i, 1); sb.append(key).append(": ").append(value).append("\r\n"); } UIUtil.clipboardCopy(sb.toString()); view.setStatusMessage("Copied ALL headers to clipboard"); } }); popup.add(jmi_copy_all); } { jmi_copy_cookies.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { final int totalRows = jt_res_headers.getRowCount(); StringBuilder sb = new StringBuilder(); int cookieCount = 0; for(int i=0; i<totalRows; i++) { final String key = (String) jt_res_headers.getValueAt(i, 0); final String value = (String) jt_res_headers.getValueAt(i, 1); final String headerLine = key + ": " + value; // Verify if Cookie header: if(headerLine.toLowerCase().startsWith("set-cookie")) { List<HttpCookie> cookies = HttpCookie.parse(headerLine); for(HttpCookie cookie: cookies) { sb.append(cookie.getName()) .append(": ") .append(cookie.getValue()) .append("\r\n"); // Increment count: cookieCount++; } } } if(sb.length() > 0) { UIUtil.clipboardCopy(sb.toString()); view.setStatusMessage(cookieCount + " cookie(s) copied to clipboard"); } else { view.setStatusMessage("No cookie header(s) found"); } } }); popup.add(jmi_copy_cookies); } @Override public void mousePressed(MouseEvent e) { showPopup(e); } @Override public void mouseReleased(MouseEvent e) { showPopup(e); } private void showPopup(MouseEvent e) { if(jt_res_headers.getSelectedRowCount() == 0) { jmi_copy.setEnabled(false); } else { jmi_copy.setEnabled(true); } if (e.isPopupTrigger()) { popup.show(e.getComponent(), e.getX(), e.getY()); } } }); jt_res_headers.setModel(resHeaderTableModel); JScrollPane jsp = new JScrollPane(jt_res_headers); Dimension d = jsp.getPreferredSize(); d.height = d.height / 2; jsp.setPreferredSize(d); jp_headers.add(jsp); add(jp_headers); } @Override public MultiValueMap<String, String> getHeaders() { final String[][] arr = ((ResponseHeaderTableModel)jt_res_headers.getModel()).getHeaders(); if(arr == null) { return CollectionsUtil.EMPTY_MULTI_VALUE_MAP; } MultiValueMap<String, String> out = new MultiValueMapArrayList<String, String>(); for(int i=0; i<arr.length; i++) { out.put(arr[i][0], arr[i][1]); } return out; } @Override public void setHeaders(MultiValueMap<String, String> headers) { resHeaderTableModel.setHeaders(headers); } @Override public Component getComponent() { return this; } @Override public void clear() { ResponseHeaderTableModel model = (ResponseHeaderTableModel)jt_res_headers.getModel(); model.setHeaders(null); } }