package org.wiztools.restclient.ui;
import java.awt.Component;
import java.awt.Desktop;
import java.awt.Toolkit;
import java.awt.event.*;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.inject.Singleton;
import javax.swing.*;
import javax.swing.event.MenuEvent;
import javax.swing.event.MenuListener;
import org.simplericity.macify.eawt.Application;
import org.simplericity.macify.eawt.ApplicationEvent;
import org.simplericity.macify.eawt.ApplicationListener;
import org.simplericity.macify.eawt.DefaultApplication;
import org.wiztools.commons.FileUtil;
import org.wiztools.commons.StringUtil;
import org.wiztools.filechooser.FileChooser;
import org.wiztools.filechooser.FileChooserResponse;
import org.wiztools.filechooser.FileFilter;
import org.wiztools.restclient.FileType;
import org.wiztools.restclient.IGlobalOptions;
import org.wiztools.restclient.MessageI18N;
import org.wiztools.restclient.RCConstants;
import org.wiztools.restclient.ServiceLocator;
import org.wiztools.restclient.XMLException;
import org.wiztools.restclient.bean.Request;
import org.wiztools.restclient.bean.Response;
import org.wiztools.restclient.server.TraceServer;
import org.wiztools.restclient.ui.history.HistoryManager;
import org.wiztools.restclient.ui.option.OptionsDialog;
import org.wiztools.restclient.ui.update.AppUpdateRunner;
import org.wiztools.restclient.util.Util;
import org.wiztools.restclient.util.XMLUtil;
/**
*
* @author subwiz
*/
@Singleton
class RESTMain implements RESTUserInterface {
private static final Logger LOG = Logger.getLogger(RESTMain.class.getName());
private final Application application = new DefaultApplication();
@Inject private RESTViewImpl view;
@Inject private AboutDialog aboutDialog;
@Inject private OptionsDialog optionsDialog;
@Inject private PasswordGenDialog passwordGenDialog;
@Inject private IGlobalOptions options;
@Inject private HistoryManager historyManager;
private URLEncodeDecodeDialog urlEncodeDecodeDialog;
// Requests and responses are generally saved in different dirs
private final FileChooser jfc_request = UIUtil.getNewFileChooser();
private final FileChooser jfc_response = UIUtil.getNewFileChooser();
private final FileChooser jfc_generic = UIUtil.getNewFileChooser();
private final FileChooser jfc_archive = UIUtil.getNewFileChooser();
private final FileChooser jfc_history = UIUtil.getNewFileChooser();
@Inject private RecentFilesHelper recentFilesHelper;
private static final String URL_BOOK = "http://www.amazon.com/dp/B00KEADQF2";
private static final String URL_FB = "http://www.facebook.com/wiztools.org";
private static final String URL_ISSUE = "https://github.com/wiztools/rest-client/issues";
private final JFrame frame;
public RESTMain(){
// Macify:
application.addAboutMenuItem();
application.addApplicationListener(new RCApplicationListener());
application.addPreferencesMenuItem();
// Application logic:
frame = new JFrame(RCConstants.TITLE + RCConstants.VERSION);
}
@Override
public RESTViewImpl getView(){
return view;
}
@Override
public JFrame getFrame(){
return this.frame;
}
private void createMenu(){
// File menu
JMenu jm_file = new JMenu("File");
jm_file.setMnemonic(KeyEvent.VK_F);
JMenuItem jmi_open_req = new JMenuItem("Open Request", RCFileView.REQUEST_ICON);
jmi_open_req.setMnemonic(KeyEvent.VK_O);
jmi_open_req.setAccelerator(KeyStroke.getKeyStroke(
KeyEvent.VK_O, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
jmi_open_req.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
jmi_open_reqAction();
}
});
jm_file.add(jmi_open_req);
JMenuItem jmi_open_res = new JMenuItem("Open Response", RCFileView.RESPONSE_ICON);
jmi_open_res.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
jmi_open_resAction();
}
});
jm_file.add(jmi_open_res);
JMenuItem jmi_open_archive = new JMenuItem("Open Req-Res Archive", RCFileView.ARCHIVE_ICON);
jmi_open_archive.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
jmi_open_archiveAction();
}
});
jm_file.add(jmi_open_archive);
final JMenu jm_open_recent = new JMenu("Open recent");
jm_open_recent.addMenuListener(new MenuListener() {
@Override
public void menuSelected(MenuEvent me) {
List<File> recentFiles = recentFilesHelper.getRecentFiles();
jm_open_recent.removeAll();
for(final File f: recentFiles) {
JMenuItem jmi = new JMenuItem(f.getName());
jmi.setToolTipText(f.getAbsolutePath());
jmi.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
FileOpenUtil.open(view, f);
}
});
jm_open_recent.add(jmi);
}
// Add clear option:
if(!recentFilesHelper.isEmpty()) {
jm_open_recent.addSeparator();
JMenuItem jmi = new JMenuItem("Clear");
jmi.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
recentFilesHelper.clear();
}
});
jm_open_recent.add(jmi);
}
}
@Override
public void menuDeselected(MenuEvent me) {
// do nothing
}
@Override
public void menuCanceled(MenuEvent me) {
// do nothing
}
});
jm_file.add(jm_open_recent);
jm_file.addSeparator();
JMenuItem jmi_save_req = new JMenuItem("Save Request", RCFileView.REQUEST_ICON);
jmi_save_req.setMnemonic(KeyEvent.VK_Q);
jmi_save_req.setAccelerator(KeyStroke.getKeyStroke(
KeyEvent.VK_S, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
jmi_save_req.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
actionSave(FileChooserType.SAVE_REQUEST);
}
});
jm_file.add(jmi_save_req);
JMenuItem jmi_save_res = new JMenuItem("Save Response", RCFileView.RESPONSE_ICON);
jmi_save_res.setMnemonic(KeyEvent.VK_S);
jmi_save_res.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
actionSave(FileChooserType.SAVE_RESPONSE);
}
});
jm_file.add(jmi_save_res);
JMenuItem jmi_save_res_body = new JMenuItem("Save Response Body", RCFileView.FILE_ICON);
// jmi_save_res_body.setMnemonic(' ');
jmi_save_res_body.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
actionSave(FileChooserType.SAVE_RESPONSE_BODY);
}
});
jm_file.add(jmi_save_res_body);
JMenuItem jmi_save_archive = new JMenuItem("Save Req-Res Archive", RCFileView.ARCHIVE_ICON);
jmi_save_archive.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
actionSave(FileChooserType.SAVE_ARCHIVE);
}
});
jm_file.add(jmi_save_archive);
if(!application.isMac()) { // Shown only for non-Mac platform!
jm_file.addSeparator();
JMenuItem jmi_exit = new JMenuItem("Exit", UIUtil.getIconFromClasspath(RCFileView.iconBasePath + "fv_exit.png"));
jmi_exit.setMnemonic(KeyEvent.VK_X);
jmi_exit.setAccelerator(KeyStroke.getKeyStroke(
KeyEvent.VK_Q, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
jmi_exit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
shutdownCall();
}
});
jm_file.add(jmi_exit);
}
// Edit menu
JMenu jm_edit = new JMenu("Edit");
jm_edit.setMnemonic(KeyEvent.VK_E);
JMenuItem jmi_clear_res = new JMenuItem("Clear Response");
jmi_clear_res.setMnemonic(KeyEvent.VK_C);
jmi_clear_res.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
view.clearUIResponse();
}
});
jm_edit.add(jmi_clear_res);
JMenuItem jmi_reset_all = new JMenuItem("Reset All");
jmi_reset_all.setMnemonic('a');
jmi_reset_all.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
view.clearUIResponse();
view.clearUIRequest();
}
});
jm_edit.add(jmi_reset_all);
jm_edit.addSeparator();
JMenuItem jmi_reset_to_last = new JMenuItem("Reset to Last Request-Response");
jmi_reset_to_last.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(view.getLastRequest() != null && view.getLastResponse() != null){
view.setUIToLastRequestResponse();
}
else{
JOptionPane.showMessageDialog(frame,
"No Last Request-Response Available",
"No Last Request-Response Available",
JOptionPane.INFORMATION_MESSAGE);
}
}
});
jm_edit.add(jmi_reset_to_last);
// History Menu
JMenu jm_history = new JMenu("History");
final JMenuItem jmi_back = new JMenuItem("Back");
jmi_back.setAccelerator(KeyStroke.getKeyStroke(
KeyEvent.VK_LEFT, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
jmi_back.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// Verify if most recent history needs to be shown:
if(historyManager.isMostRecent()) {
try {
Request reqFromUi = view.getRequestFromUI();
if(!reqFromUi.equals(historyManager.current())) {
view.setUIFromRequest(historyManager.current());
return;
}
}
catch(IllegalStateException ex) {
if(historyManager.current() != null) {
view.setUIFromRequest(historyManager.current());
return;
}
}
}
// Normal logic, cursor-1 history:
if(!historyManager.isOldest()) {
Request request = historyManager.back();
if(request != null) {
view.setUIFromRequest(request);
}
}
else {
view.setStatusMessage("Already in oldest");
}
}
});
jm_history.add(jmi_back);
final JMenuItem jmi_forward = new JMenuItem("Forward");
jmi_forward.setAccelerator(KeyStroke.getKeyStroke(
KeyEvent.VK_RIGHT, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
jmi_forward.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(!historyManager.isMostRecent()) {
Request request = historyManager.forward();
if(request != null) {
view.setUIFromRequest(request);
}
}
else {
view.setStatusMessage("Already in latest");
}
}
});
jm_history.add(jmi_forward);
jm_history.addSeparator();
JMenuItem jmi_clear_history = new JMenuItem("Clear History");
jmi_clear_history.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
historyManager.clear();
view.setStatusMessage("History cleared");
}
});
jm_history.add(jmi_clear_history);
jm_history.addSeparator();
JMenuItem jmi_save_history = new JMenuItem("Save History");
jmi_save_history.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(historyManager.isEmpty()) {
JOptionPane.showMessageDialog(frame, "History is empty!");
return;
}
final File f = FileType.getWithExtension(
getSaveFile(FileChooserType.SAVE_HISTORY),
FileType.HISTORY);
if(f != null) {
try {
historyManager.save(f);
view.setStatusMessage("Saved history file: " + f.getName());
}
catch(IOException ex) {
view.showError(Util.getStackTrace(ex));
}
}
}
});
jm_history.add(jmi_save_history);
JMenuItem jmi_load_history = new JMenuItem("Load History");
jmi_load_history.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(!historyManager.isEmpty()) {
final int confirm = JOptionPane.showConfirmDialog(null,
"Overwrite existing history?",
"Existing history will be overwritten. Proceed?", JOptionPane.YES_NO_OPTION);
if(confirm == JOptionPane.NO_OPTION || confirm == JOptionPane.CLOSED_OPTION) {
return;
}
}
final File f = getOpenFile(FileChooserType.OPEN_HISTORY);
if(f != null) {
try {
historyManager.clear();
historyManager.load(f);
}
catch(IOException ex) {
view.showError(ex);
}
catch(XMLException ex) {
view.showError(ex);
}
}
}
});
jm_history.add(jmi_load_history);
// Enable disable history controls based on cursor positions:
jm_history.addMenuListener(new MenuListener() {
@Override
public void menuSelected(MenuEvent e) {
if(historyManager.isOldest()) {
jmi_back.setEnabled(false);
}
else {
jmi_back.setEnabled(true);
}
if(historyManager.isMostRecent()) {
jmi_forward.setEnabled(false);
}
else {
jmi_forward.setEnabled(true);
}
}
@Override
public void menuDeselected(MenuEvent e) {
//
}
@Override
public void menuCanceled(MenuEvent e) {
//
}
});
// Tools menu
JMenu jm_tools = new JMenu("Tools");
jm_tools.setMnemonic('o');
{ // URL Encode Decoder:
JMenuItem jmi_url_encode = new JMenuItem("URL Encoder/Decoder");
jmi_url_encode.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(urlEncodeDecodeDialog == null) {
urlEncodeDecodeDialog = new URLEncodeDecodeDialog(frame);
}
urlEncodeDecodeDialog.setVisible(true);
}
});
jm_tools.add(jmi_url_encode);
}
{ // Password Encoder Decoder:
JMenuItem jmi_pwd_gen = new JMenuItem("Password Encoder/Decoder");
jmi_pwd_gen.setMnemonic('p');
jmi_pwd_gen.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
passwordGenDialog.setVisible(true);
}
});
jm_tools.add(jmi_pwd_gen);
}
jm_tools.addSeparator();
// Trace Server
JMenuItem jmi_server_start = new JMenuItem("Start Trace Server @ port " + TraceServer.PORT);
jmi_server_start.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
try{
TraceServer.start();
view.setStatusMessage("Trace Server started.");
}
catch(Exception ex){
view.showError(Util.getStackTrace(ex));
}
}
});
jm_tools.add(jmi_server_start);
JMenuItem jmi_server_stop = new JMenuItem("Stop Trace Server");
jmi_server_stop.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
try{
if(TraceServer.isRunning()){
TraceServer.stop();
view.setStatusMessage("Trace Server stopped.");
}
}
catch(Exception ex){
view.showError(Util.getStackTrace(ex));
}
}
});
jm_tools.add(jmi_server_stop);
JMenuItem jmi_server_fill_url = new JMenuItem("Insert Trace Server URL");
jmi_server_fill_url.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
String url = view.getUrl();
if(url != null){
int ret = JOptionPane.showConfirmDialog(frame,
"URL field not empty. Overwrite?",
"Request URL not empty",
JOptionPane.YES_NO_OPTION);
if(ret == JOptionPane.NO_OPTION){
return;
}
}
view.setUrl("http://localhost:" + TraceServer.PORT + "/");
}
});
jm_tools.add(jmi_server_fill_url);
if(!application.isMac()) { // Add Options menu only for non-Mac platform!
jm_tools.addSeparator();
JMenuItem jmi_options = new JMenuItem("Options");
jmi_options.setMnemonic('o');
jmi_options.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
showOptionsDialog();
}
});
jm_tools.add(jmi_options);
}
// Menu-bar
JMenuBar jmb = new JMenuBar();
jmb.add(jm_file);
jmb.add(jm_edit);
jmb.add(jm_history);
jmb.add(jm_tools);
// Help menu
JMenu jm_help = new JMenu("Help");
jm_help.setMnemonic(KeyEvent.VK_H);
{ // RESTClient Book
JMenuItem jmi_url = new JMenuItem("RESTClient Book (Kindle)");
jmi_url.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
openUrl(URL_BOOK);
}
});
jm_help.add(jmi_url);
}
{ // FB
JMenuItem jmi_url = new JMenuItem("Follow in Facebook");
jmi_url.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
openUrl(URL_FB);
}
});
jm_help.add(jmi_url);
}
{ // Issue
JMenuItem jmi_url = new JMenuItem("Report Issue / Request Enhancement");
jmi_url.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
openUrl(URL_ISSUE);
}
});
jm_help.add(jmi_url);
}
// Help > About:
if(!application.isMac()) { // show About for only non-Mac platform!
// Add separator before the About menu-item:
jm_help.addSeparator();
// About menu:
JMenuItem jmi_about = new JMenuItem("About");
jmi_about.setMnemonic('a');
jmi_about.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
showAboutDialog();
}
});
jm_help.add(jmi_about);
}
// Add Help menu to Menubar:
jmb.add(jm_help);
frame.setJMenuBar(jmb);
}
private void initJFC() {
// JFileChooser: Initialize
jfc_request.addChoosableFileFilter(new RCFileFilter(FileType.REQUEST_EXT));
jfc_response.addChoosableFileFilter(new RCFileFilter(FileType.RESPONSE_EXT));
jfc_archive.addChoosableFileFilter(new RCFileFilter(FileType.ARCHIVE_EXT));
// init last dir:
{ // request jfc:
final String lastDir = options.getProperty(UIUtil.LAST_CWD_REQ);
if(StringUtil.isNotEmpty(lastDir)) {
jfc_request.setCurrentDirectory(new File(lastDir));
}
}
{ // response jfc:
final String lastDir = options.getProperty(UIUtil.LAST_CWD_RES);
if(StringUtil.isNotEmpty(lastDir)) {
jfc_response.setCurrentDirectory(new File(lastDir));
}
}
{ // archive jfc:
final String lastDir = options.getProperty(UIUtil.LAST_CWD_ARC);
if(StringUtil.isNotEmpty(lastDir)) {
jfc_archive.setCurrentDirectory(new File(lastDir));
}
}
{ // history jfc:
final String lastDir = options.getProperty(UIUtil.LAST_CWD_HIS);
if(StringUtil.isNotEmpty(lastDir)) {
jfc_history.setCurrentDirectory(new File(lastDir));
}
}
}
@PostConstruct
public void show() {
initJFC();
frame.setContentPane(view.getContainer());
createMenu();
ImageIcon icon =
UIUtil.getIconFromClasspath("org/wiztools/restclient/logo_30.png");
frame.setIconImage(icon.getImage());
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent event){
shutdownCall();
}
});
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
// Update check:
new Thread(ServiceLocator.getInstance(AppUpdateRunner.class)).start();
}
private void openUrl(String url) {
Desktop dt = Desktop.isDesktopSupported()? Desktop.getDesktop(): null;
if(dt != null && dt.isSupported(Desktop.Action.BROWSE)) {
try {
dt.browse(new URI(url));
}
catch (URISyntaxException ex) {
assert true: "Will never come here!";
}
catch(IOException ex) {
LOG.log(Level.WARNING, null, ex);
showUrlDialog(url);
}
}
else {
showUrlDialog(url);
}
}
private void showUrlDialog(final String url) {
JOptionPane.showMessageDialog(frame,
"Visit this URL: " + url, // Message
"Visit URL", // Title
JOptionPane.INFORMATION_MESSAGE);
}
private void showOptionsDialog(){
optionsDialog.setVisible(true);
}
private void saveLastDir(final FileChooserType type, final File dir) {
switch(type) {
case OPEN_REQUEST:
case SAVE_REQUEST:
options.setProperty(UIUtil.LAST_CWD_REQ, dir.getPath());
break;
case OPEN_RESPONSE:
case SAVE_RESPONSE:
options.setProperty(UIUtil.LAST_CWD_RES, dir.getPath());
break;
case OPEN_ARCHIVE:
case SAVE_ARCHIVE:
options.setProperty(UIUtil.LAST_CWD_ARC, dir.getPath());
break;
case OPEN_HISTORY:
case SAVE_HISTORY:
options.setProperty(UIUtil.LAST_CWD_HIS, dir.getPath());
break;
}
}
@Override
public File getOpenFile(final FileChooserType type){
return getOpenFile(type, frame);
}
@Override
public File getOpenFile(final FileChooserType type, final Component parent){
String title = null;
FileChooser jfc = null;
if(type == FileChooserType.OPEN_REQUEST){
jfc = jfc_request;
title = "Open Request";
}
else if(type == FileChooserType.OPEN_RESPONSE){
jfc = jfc_response;
title = "Open Response";
}
else if(type == FileChooserType.OPEN_ARCHIVE){
jfc = jfc_archive;
title = "Open Req-Res Archive";
}
else if(type == FileChooserType.OPEN_REQUEST_BODY){
jfc = jfc_generic;
title = "Open Request Body";
}
else if(type == FileChooserType.OPEN_HISTORY) {
jfc = jfc_history;
title = "Open History";
}
else if(type == FileChooserType.OPEN_TEST_SCRIPT){
jfc = jfc_generic;
title = "Open Test Script";
}
else if(type == FileChooserType.OPEN_GENERIC){
jfc = jfc_generic;
title = "Open";
}
jfc.setDialogTitle(title);
FileChooserResponse status = jfc.showOpenDialog(parent);
if(status == FileChooserResponse.APPROVE_OPTION){
File f = jfc.getSelectedFile();
saveLastDir(type, f.getParentFile());
return f;
}
return null;
}
private void jmi_open_reqAction(){
File f = getOpenFile(FileChooserType.OPEN_REQUEST);
if(f != null){
FileOpenUtil.openRequest(view, f);
recentFilesHelper.openedFile(f);
}
}
private void jmi_open_resAction(){
File f = getOpenFile(FileChooserType.OPEN_RESPONSE);
if(f != null){
FileOpenUtil.openResponse(view, f);
recentFilesHelper.openedFile(f);
}
}
private void jmi_open_archiveAction(){
File f = getOpenFile(FileChooserType.OPEN_ARCHIVE);
if(f != null){
FileOpenUtil.openArchive(view, f);
recentFilesHelper.openedFile(f);
}
}
// This method is invoked from SU.invokeLater
@Override
public File getSaveFile(final FileChooserType type){
FileChooser jfc = null;
String title = null;
if(type == FileChooserType.SAVE_REQUEST){
jfc = jfc_request;
title = "Save Request";
}
else if(type == FileChooserType.SAVE_RESPONSE){
jfc = jfc_response;
title = "Save Response";
}
else if(type == FileChooserType.SAVE_RESPONSE_BODY){
jfc = jfc_generic;
title = "Save Response Body";
}
else if(type == FileChooserType.SAVE_ARCHIVE){
jfc = jfc_archive;
title = "Save Req-Res Archive";
}
else if(type == FileChooserType.SAVE_HISTORY) {
jfc = jfc_history;
title = "Save History";
}
jfc.setDialogTitle(title);
FileChooserResponse status = jfc.showSaveDialog(frame);
if(status == FileChooserResponse.APPROVE_OPTION){
File f = jfc.getSelectedFile();
if(f == null){
return null;
}
String ext = null;
switch(type){
case SAVE_REQUEST:
ext = FileType.REQUEST_EXT;
break;
case SAVE_RESPONSE:
ext = FileType.RESPONSE_EXT;
break;
case SAVE_ARCHIVE:
ext = FileType.ARCHIVE_EXT;
break;
default:
break;
}
if(ext != null){
String path = f.getAbsolutePath();
path = path.toLowerCase();
// Add our extension only if the selected filter is ours
FileFilter ff = jfc.getFileFilter();
RCFileFilter rcFileFilter = null;
if(ff instanceof RCFileFilter){
rcFileFilter = (RCFileFilter)ff;
}
if((rcFileFilter != null) &&
(rcFileFilter.getFileTypeExt().equals(ext)) &&
!path.endsWith(ext)){
f = new File(f.getAbsolutePath() + ext);
jfc.setSelectedFile(f);
view.setStatusMessage("Adding default extension: " + ext);
}
}
if(f.exists()){
int yesNo = JOptionPane.showConfirmDialog(frame,
"File exists. Overwrite?",
"File exists",
JOptionPane.YES_NO_OPTION);
if(yesNo == JOptionPane.YES_OPTION){
saveLastDir(type, f.getParentFile());
return f;
}
else{
JOptionPane.showMessageDialog(frame,
"File not saved!",
"Not saved",
JOptionPane.INFORMATION_MESSAGE);
}
}
else{ // If the file is new one
saveLastDir(type, f.getParentFile());
return f;
}
}
return null;
}
private static final String[] DO_SAVE_UI_REQUEST = new String[]{"Request", "completed Request"};
private static final String[] DO_SAVE_UI_RESPONSE = new String[]{"Response", "received Response"};
private static final String[] DO_SAVE_UI_ARCHIVE = new String[]{"Request/Response", "completed Request-Response"};
private boolean doSaveEvenIfUIChanged(final String[] parameters){
final String message = MessageI18N.getMessage(
"yes-no.cant.save.req-res", parameters);
int optionChoosen = JOptionPane.showConfirmDialog(view.getContainer(),
message,
"UI Parameters Changed!",
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.INFORMATION_MESSAGE);
if(optionChoosen != JOptionPane.OK_OPTION){
return false;
}
return true;
}
private void actionSave(final FileChooserType type){
if(type == FileChooserType.SAVE_REQUEST){
Request request = view.getLastRequest();
if(request == null){
JOptionPane.showMessageDialog(view.getContainer(),
"No last request available.",
"No Request",
JOptionPane.ERROR_MESSAGE);
return;
}
try {
Request uiRequest = view.getRequestFromUI();
if(!request.equals(uiRequest)){
if(!doSaveEvenIfUIChanged(DO_SAVE_UI_REQUEST)){
return;
}
}
File f = getSaveFile(FileChooserType.SAVE_REQUEST);
if(f != null){
try{
XMLUtil.writeRequestXML(request, f);
recentFilesHelper.openedFile(f);
}
catch(IOException ex){
view.showError(Util.getStackTrace(ex));
}
catch(XMLException ex){
view.showError(Util.getStackTrace(ex));
}
}
}
catch(IllegalStateException ex) {
view.showError(Util.getStackTrace(ex));
}
}
else if(type == FileChooserType.SAVE_RESPONSE){
Response response = view.getLastResponse();
if(response == null){
JOptionPane.showMessageDialog(view.getContainer(),
"No last response available.",
"No Response",
JOptionPane.ERROR_MESSAGE);
return;
}
Response uiResponse = view.getResponseFromUI();
if(!response.equals(uiResponse)){
if(!doSaveEvenIfUIChanged(DO_SAVE_UI_RESPONSE)){
return;
}
}
File f = getSaveFile(FileChooserType.SAVE_RESPONSE);
if(f != null){
try{
XMLUtil.writeResponseXML(response, f);
recentFilesHelper.openedFile(f);
}
catch(IOException ex){
view.showError(Util.getStackTrace(ex));
}
catch(XMLException ex){
view.showError(Util.getStackTrace(ex));
}
}
}
else if(type == FileChooserType.SAVE_RESPONSE_BODY){
Response response = view.getLastResponse();
if(response == null){
JOptionPane.showMessageDialog(view.getContainer(),
"No last response available.",
"No Response",
JOptionPane.ERROR_MESSAGE);
return;
}
if(response.getResponseBody() == null) {
JOptionPane.showMessageDialog(view.getContainer(),
"Last response does not have body.",
"No Body in Response",
JOptionPane.ERROR_MESSAGE);
return;
}
File f = getSaveFile(FileChooserType.SAVE_RESPONSE_BODY);
if(f != null){
try{
FileUtil.writeBytes(f, response.getResponseBody());
}
catch(IOException ex){
view.showError(Util.getStackTrace(ex));
}
}
}
else if(type == FileChooserType.SAVE_ARCHIVE){
Request request = view.getLastRequest();
Response response = view.getLastResponse();
if(request == null || response == null){
JOptionPane.showMessageDialog(view.getContainer(),
"No last request/response available.",
"No Request/Response",
JOptionPane.ERROR_MESSAGE);
return;
}
try {
Request uiRequest = view.getRequestFromUI();
Response uiResponse = view.getResponseFromUI();
if((!request.equals(uiRequest)) || (!response.equals(uiResponse))){
if(!doSaveEvenIfUIChanged(DO_SAVE_UI_ARCHIVE)){
return;
}
}
File f = getSaveFile(FileChooserType.SAVE_ARCHIVE);
if(f != null){
Exception e = null;
try{
Util.createReqResArchive(request, response, f);
recentFilesHelper.openedFile(f);
}
catch(IOException ex){
e = ex;
}
catch(XMLException ex){
e = ex;
}
if(e != null){
view.showError(Util.getStackTrace(e));
}
}
}
catch(IllegalStateException ex) {
view.showError(Util.getStackTrace(ex));
}
}
}
private void shutdownCall() {
recentFilesHelper.store();
System.out.println("Exiting...");
System.exit(0);
}
/**
* show about dialog
*/
public void showAboutDialog() {
aboutDialog.setVisible(true);
}
public class RCApplicationListener implements ApplicationListener {
@Override
public void handleAbout(ApplicationEvent ae) {
showAboutDialog();
ae.setHandled(true);
}
@Override
public void handleOpenApplication(ApplicationEvent ae) {
// do nothing!
}
@Override
public void handleOpenFile(ApplicationEvent ae) {
final String fileName = ae.getFilename();
final File f = new File(fileName);
FileOpenUtil.open(view, f);
ae.setHandled(true);
}
@Override
public void handlePreferences(ApplicationEvent ae) {
showOptionsDialog();
ae.setHandled(true);
}
@Override
public void handlePrintFile(ApplicationEvent ae) {
JOptionPane.showMessageDialog(frame, "Sorry, printing not implemented");
}
@Override
public void handleQuit(ApplicationEvent ae) {
shutdownCall();
}
@Override
public void handleReOpenApplication(ApplicationEvent ae) {
frame.setVisible(true);
ae.setHandled(true);
}
}
}