Java tutorial
/******************************************************************************* * Copyright (C) 2007 The University of Manchester * * Modifications to the initial code base are copyright of their * respective authors, or their employers as appropriate. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 ******************************************************************************/ package net.sf.taverna.t2.workbench.ui.impl; import static java.awt.BorderLayout.CENTER; import static java.awt.BorderLayout.NORTH; import static java.awt.Color.LIGHT_GRAY; import static java.awt.Color.WHITE; import static java.awt.FlowLayout.LEFT; import static java.awt.Font.BOLD; import static java.awt.GridBagConstraints.FIRST_LINE_START; import static java.awt.GridBagConstraints.HORIZONTAL; import static java.awt.GridBagConstraints.LINE_START; import static java.awt.GridBagConstraints.NONE; import static java.awt.GridBagConstraints.WEST; import static java.awt.event.KeyEvent.VK_ENTER; import static java.awt.event.KeyEvent.VK_TAB; import static javax.swing.JOptionPane.ERROR_MESSAGE; import static javax.swing.JOptionPane.showMessageDialog; import static javax.swing.SwingConstants.BOTTOM; import static javax.swing.SwingConstants.TOP; import static javax.swing.event.HyperlinkEvent.EventType.ACTIVATED; import static net.sf.taverna.t2.workbench.icons.WorkbenchIcons.tavernaCogs32x32Icon; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Desktop; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.Frame; import java.awt.Graphics; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.net.ConnectException; import java.net.MalformedURLException; import java.net.SocketTimeoutException; import java.net.URI; import java.net.URL; import java.net.URLConnection; import java.net.URLEncoder; import java.util.Properties; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JEditorPane; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.border.Border; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; import javax.swing.text.Document; import javax.swing.text.html.HTMLEditorKit; import javax.swing.text.html.StyleSheet; import net.sf.taverna.t2.lang.ui.DialogTextArea; import net.sf.taverna.t2.workbench.helper.HelpEnabledDialog; import org.apache.commons.io.FileUtils; import org.apache.log4j.Logger; /** * User registration form. * * @author Alex Nenadic */ @SuppressWarnings("serial") public class UserRegistrationForm extends HelpEnabledDialog { private static final String FAILED = "User registration failed: "; private static final String REGISTRATION_FAILED_MSG = "User registration failed. Please try again later."; private static final String REGISTRATION_URL = "http://www.mygrid.org.uk/taverna/registration/"; public static final String TAVERNA_VERSION_PROPERTY_NAME = "Taverna version"; public static final String FIRST_NAME_PROPERTY_NAME = "First name"; public static final String LAST_NAME_PROPERTY_NAME = "Last name"; public static final String EMAIL_ADDRESS_PROPERTY_NAME = "Email address"; public static final String INSTITUTION_OR_COMPANY_PROPERTY_NAME = "Institution or company name"; public static final String INDUSTRY_PROPERTY_NAME = "Industry"; public static final String FIELD_PROPERTY_NAME = "Field of investigation"; public static final String PURPOSE_PROPERTY_NAME = "Purpose of using Taverna"; public static final String KEEP_ME_INFORMED_PROPERTY_NAME = "Keep me informed by email"; public static final String TAVERNA_REGISTRATION_POST_PARAMETER_NAME = "taverna_registration"; public static final String TAVERNA_VERSION_POST_PARAMETER_NAME = "taverna_version"; public static final String FIRST_NAME_POST_PARAMETER_NAME = "first_name"; public static final String LAST_NAME_POST_PARAMETER_NAME = "last_name"; public static final String EMAIL_ADDRESS_POST_PARAMETER_NAME = "email"; public static final String INSTITUTION_OR_COMPANY_POST_PARAMETER_NAME = "institution_or_company"; public static final String INDUSTRY_TYPE_POST_PARAMETER_NAME = "industry_type"; public static final String FIELD_POST_PARAMETER_NAME = "field"; public static final String PURPOSE_POST_PARAMETER_NAME = "purpose"; public static final String KEEP_ME_INFORMED_POST_PARAMETER_PROPERTY_NAME = "keep_me_informed"; private static String TRUE = Boolean.TRUE.toString(); private static String FALSE = Boolean.FALSE.toString(); private static final String WELCOME = "Welcome to the Taverna User Registration Form"; private static final String PLEASE_FILL_IN_THIS_REGISTRATION_FORM = "Please fill in this registration form to let us know that you are using Taverna"; private static final String WE_DO = "Note that by registering:\n" + " \u25CF We do not have access to your data\n" + " \u25CF We do not have access to your service usage\n" + " \u25CF You will not be monitored\n" + " \u25CF We do record the information you provide\n" + " at registration time"; private static final String WHY_REGISTER = "By registering you will:\n" + " \u25CF Allow us to support you better; future plans will be\n" + " directed towards solutions Taverna users require\n" + " \u25CF Help sustain Taverna development; our continued\n" + " funding relies on us showing usage\n" + " \u25CF (Optionally) Hear about news and product updates"; private static final String FIRST_NAME = "*First name:"; private static final String LAST_NAME = "*Last name:"; private static final String EMAIL_ADDRESS = "*Email address:"; private static final String KEEP_ME_INFORMED = "Keep me informed of news and product updates via email"; private static final String INSTITUTION_COMPANY_NAME = "*Institution/Company name:"; private static final String FIELD_OF_INVESTIGATION = " Field of investigation:\n" + " (e.g. bioinformatics)"; private static final String WHY_YOU_INTEND_TO_USE_TAVERNA = " A brief description of how you intend\n" + " to use Taverna: (e.g. genome analysis\n" + " for bacterial strain identification)"; private static String[] industryTypes = { "", "Academia - Life Sciences", "Academia - Social Sciences", "Academia - Physical Sciences", "Academia - Environmental Sciences", "Academia - Other", "Industry - Biotechnology", "Industry - Pharmaceutical", "Industry - Engineering", "Industry - Other", "Healthcare Services", "Goverment and Public Sector", "Other" }; private static final String I_AGREE_TO_THE_TERMS_AND_CONDITIONS = "I agree to the terms and conditions of registration at"; private static final String TERMS_AND_CONDITIONS_URL = "http://www.taverna.org.uk/legal/terms"; private Logger logger = Logger.getLogger(UserRegistrationForm.class); private UserRegistrationData previousRegistrationData; private JTextField firstNameTextField; private JTextField lastNameTextField; private JTextField emailTextField; private JCheckBox keepMeInformedCheckBox; private JTextField institutionOrCompanyTextField; private JComboBox<String> industryTypeTextField; private JTextField fieldTextField; private JTextArea purposeTextArea; private JCheckBox termsAndConditionsCheckBox; private final File registrationDataFile; private final File remindMeLaterFile; private final File doNotRegisterMeFile; private final String appName; public UserRegistrationForm(String appName, File registrationDataFile, File doNotRegisterMeFile, File remindMeLaterFile) { super((Frame) null, "Taverna User Registration", true); this.appName = appName; this.registrationDataFile = registrationDataFile; this.doNotRegisterMeFile = doNotRegisterMeFile; this.remindMeLaterFile = remindMeLaterFile; initComponents(); } public UserRegistrationForm(String appName, File previousRegistrationDataFile, File registrationDataFile, File doNotRegisterMeFile, File remindMeLaterFile) { super((Frame) null, "Taverna User Registration", true); this.appName = appName; this.registrationDataFile = registrationDataFile; this.doNotRegisterMeFile = doNotRegisterMeFile; this.remindMeLaterFile = remindMeLaterFile; previousRegistrationData = loadUserRegistrationData(previousRegistrationDataFile); initComponents(); } // For testing only // public static void main(String[] args) throws ClassNotFoundException, // InstantiationException, IllegalAccessException, // UnsupportedLookAndFeelException{ // WorkbenchImpl.setLookAndFeel(); // UserRegistrationForm form = new UserRegistrationForm(); // form.setVisible(true); // } private void initComponents() { JPanel mainPanel = new JPanel(new GridBagLayout()); // Base font for all components on the form Font baseFont = new JLabel("base font").getFont().deriveFont(11f); // Title panel JPanel titlePanel = new JPanel(new FlowLayout(LEFT)); titlePanel.setBackground(WHITE); // titlePanel.setBorder(new EmptyBorder(10, 10, 10, 10)); JLabel titleLabel = new JLabel(WELCOME); titleLabel.setFont(baseFont.deriveFont(BOLD, 13.5f)); // titleLabel.setBorder(new EmptyBorder(10, 10, 0, 10)); JLabel titleIcon = new JLabel(tavernaCogs32x32Icon); // titleIcon.setBorder(new EmptyBorder(10, 10, 10, 10)); DialogTextArea titleMessage = new DialogTextArea(PLEASE_FILL_IN_THIS_REGISTRATION_FORM); titleMessage.setMargin(new Insets(0, 20, 0, 10)); titleMessage.setFont(baseFont); titleMessage.setEditable(false); titleMessage.setFocusable(false); // titlePanel.setBorder( new EmptyBorder(10, 10, 0, 10)); JPanel messagePanel = new JPanel(new BorderLayout()); messagePanel.add(titleLabel, NORTH); messagePanel.add(titleMessage, CENTER); messagePanel.setBackground(WHITE); titlePanel.add(titleIcon); titlePanel.add(messagePanel); addDivider(titlePanel, BOTTOM, true); GridBagConstraints gbc = new GridBagConstraints(); gbc.weightx = 1.0; gbc.weighty = 0.0; gbc.gridx = 0; gbc.gridy = 0; gbc.fill = HORIZONTAL; gbc.anchor = WEST; gbc.gridwidth = 2; // gbc.insets = new Insets(5, 10, 0, 0); mainPanel.add(titlePanel, gbc); // Registration messages gbc.weightx = 0.0; gbc.weighty = 0.0; gbc.gridx = 0; gbc.gridy = 1; gbc.fill = NONE; gbc.anchor = WEST; gbc.gridwidth = 2; // gbc.insets = new Insets(5, 0, 0, 10); DialogTextArea registrationMessage1 = new DialogTextArea(WHY_REGISTER); registrationMessage1.setMargin(new Insets(0, 10, 0, 0)); registrationMessage1.setFont(baseFont); registrationMessage1.setEditable(false); registrationMessage1.setFocusable(false); registrationMessage1.setBackground(getBackground()); DialogTextArea registrationMessage2 = new DialogTextArea(WE_DO); registrationMessage2.setMargin(new Insets(0, 10, 0, 10)); registrationMessage2.setFont(baseFont); registrationMessage2.setEditable(false); registrationMessage2.setFocusable(false); registrationMessage2.setBackground(getBackground()); JPanel registrationMessagePanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); registrationMessagePanel.add(registrationMessage1); registrationMessagePanel.add(registrationMessage2); addDivider(registrationMessagePanel, BOTTOM, true); mainPanel.add(registrationMessagePanel, gbc); // Mandatory label // JLabel mandatoryLabel = new JLabel("* Mandatory fields"); // mandatoryLabel.setFont(baseFont); // gbc.weightx = 0.0; // gbc.weighty = 0.0; // gbc.gridx = 0; // gbc.gridy = 3; // gbc.fill = NONE; // gbc.anchor = GridBagConstraints.EAST; // gbc.gridwidth = 2; // gbc.insets = new Insets(0, 10, 0, 20); // mainPanel.add(mandatoryLabel, gbc); // First name JLabel firstNameLabel = new JLabel(FIRST_NAME); firstNameLabel.setFont(baseFont); gbc.weightx = 0.0; gbc.weighty = 0.0; gbc.gridx = 0; gbc.gridy = 4; gbc.fill = NONE; gbc.anchor = WEST; gbc.gridwidth = 1; gbc.insets = new Insets(0, 10, 0, 10); mainPanel.add(firstNameLabel, gbc); firstNameTextField = new JTextField(); firstNameTextField.setFont(baseFont); if (previousRegistrationData != null) firstNameTextField.setText(previousRegistrationData.getFirstName()); gbc.weightx = 1.0; gbc.weighty = 0.0; gbc.gridx = 1; gbc.gridy = 4; gbc.fill = HORIZONTAL; gbc.anchor = WEST; gbc.gridwidth = 1; gbc.insets = new Insets(5, 10, 0, 10); mainPanel.add(firstNameTextField, gbc); // Last name JLabel lastNameLabel = new JLabel(LAST_NAME); lastNameLabel.setFont(baseFont); gbc.weightx = 0.0; gbc.weighty = 0.0; gbc.gridx = 0; gbc.gridy = 5; gbc.fill = NONE; gbc.anchor = WEST; gbc.gridwidth = 1; gbc.insets = new Insets(0, 10, 0, 10); mainPanel.add(lastNameLabel, gbc); lastNameTextField = new JTextField(); lastNameTextField.setFont(baseFont); if (previousRegistrationData != null) lastNameTextField.setText(previousRegistrationData.getLastName()); gbc.weightx = 1.0; gbc.weighty = 0.0; gbc.gridx = 1; gbc.gridy = 5; gbc.fill = HORIZONTAL; gbc.anchor = WEST; gbc.gridwidth = 1; gbc.insets = new Insets(5, 10, 0, 10); mainPanel.add(lastNameTextField, gbc); // Email address JLabel emailLabel = new JLabel(EMAIL_ADDRESS); emailLabel.setFont(baseFont); gbc.weightx = 0.0; gbc.weighty = 0.0; gbc.gridx = 0; gbc.gridy = 6; gbc.fill = NONE; gbc.anchor = WEST; gbc.gridwidth = 1; gbc.insets = new Insets(5, 10, 0, 10); mainPanel.add(emailLabel, gbc); emailTextField = new JTextField(); emailTextField.setFont(baseFont); if (previousRegistrationData != null) emailTextField.setText(previousRegistrationData.getEmailAddress()); gbc.weightx = 1.0; gbc.weighty = 0.0; gbc.gridx = 1; gbc.gridy = 6; gbc.fill = HORIZONTAL; gbc.anchor = WEST; gbc.gridwidth = 1; gbc.insets = new Insets(5, 10, 0, 10); mainPanel.add(emailTextField, gbc); // Keep me informed keepMeInformedCheckBox = new JCheckBox(KEEP_ME_INFORMED); keepMeInformedCheckBox.setFont(baseFont); if (previousRegistrationData != null) keepMeInformedCheckBox.setSelected(previousRegistrationData.getKeepMeInformed()); keepMeInformedCheckBox.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent evt) { if (evt.getKeyCode() == VK_ENTER) { evt.consume(); keepMeInformedCheckBox.setSelected(!keepMeInformedCheckBox.isSelected()); } } }); gbc.weightx = 0.0; gbc.weighty = 0.0; gbc.gridx = 1; gbc.gridy = 7; gbc.fill = NONE; gbc.anchor = WEST; gbc.gridwidth = 2; gbc.insets = new Insets(5, 10, 0, 10); mainPanel.add(keepMeInformedCheckBox, gbc); // Institution name JLabel institutionLabel = new JLabel(INSTITUTION_COMPANY_NAME); institutionLabel.setFont(baseFont); gbc.weightx = 0.0; gbc.weighty = 0.0; gbc.gridx = 0; gbc.gridy = 8; gbc.fill = NONE; gbc.anchor = WEST; gbc.gridwidth = 1; gbc.insets = new Insets(5, 10, 0, 10); mainPanel.add(institutionLabel, gbc); institutionOrCompanyTextField = new JTextField(); institutionOrCompanyTextField.setFont(baseFont); if (previousRegistrationData != null) institutionOrCompanyTextField.setText(previousRegistrationData.getInstitutionOrCompanyName()); gbc.weightx = 1.0; gbc.weighty = 0.0; gbc.gridx = 1; gbc.gridy = 8; gbc.fill = HORIZONTAL; gbc.anchor = WEST; gbc.gridwidth = 1; gbc.insets = new Insets(5, 10, 0, 10); mainPanel.add(institutionOrCompanyTextField, gbc); // Industry type JLabel industryLabel = new JLabel(" Industry type:"); industryLabel.setFont(baseFont); gbc.weightx = 0.0; gbc.weighty = 0.0; gbc.gridx = 0; gbc.gridy = 9; gbc.fill = NONE; gbc.anchor = WEST; gbc.gridwidth = 1; gbc.insets = new Insets(5, 10, 0, 10); mainPanel.add(industryLabel, gbc); industryTypeTextField = new JComboBox<>(industryTypes); industryTypeTextField.setFont(baseFont); if (previousRegistrationData != null) industryTypeTextField.setSelectedItem(previousRegistrationData.getIndustry()); gbc.weightx = 1.0; gbc.weighty = 0.0; gbc.gridx = 1; gbc.gridy = 9; gbc.fill = HORIZONTAL; gbc.anchor = WEST; gbc.gridwidth = 1; gbc.insets = new Insets(5, 10, 0, 10); mainPanel.add(industryTypeTextField, gbc); // Field of investigation JTextArea fieldLabel = new JTextArea(FIELD_OF_INVESTIGATION); fieldLabel.setFont(baseFont); fieldLabel.setEditable(false); fieldLabel.setFocusable(false); fieldLabel.setBackground(getBackground()); gbc.weightx = 0.0; gbc.weighty = 0.0; gbc.gridx = 0; gbc.gridy = 10; gbc.fill = NONE; gbc.anchor = LINE_START; gbc.gridwidth = 1; gbc.insets = new Insets(5, 10, 0, 10); mainPanel.add(fieldLabel, gbc); fieldTextField = new JTextField(); fieldTextField.setFont(baseFont); if (previousRegistrationData != null) fieldTextField.setText(previousRegistrationData.getField()); gbc.weightx = 1.0; gbc.weighty = 0.0; gbc.gridx = 1; gbc.gridy = 10; gbc.fill = HORIZONTAL; gbc.anchor = FIRST_LINE_START; gbc.gridwidth = 1; gbc.insets = new Insets(5, 10, 0, 10); mainPanel.add(fieldTextField, gbc); // Purpose of using Taverna JTextArea purposeLabel = new JTextArea(WHY_YOU_INTEND_TO_USE_TAVERNA); purposeLabel.setFont(baseFont); purposeLabel.setEditable(false); purposeLabel.setFocusable(false); purposeLabel.setBackground(getBackground()); gbc.weightx = 0.0; gbc.weighty = 0.0; gbc.gridx = 0; gbc.gridy = 11; gbc.fill = NONE; gbc.anchor = LINE_START; gbc.gridwidth = 1; gbc.insets = new Insets(5, 10, 0, 10); mainPanel.add(purposeLabel, gbc); purposeTextArea = new JTextArea(4, 30); purposeTextArea.setFont(baseFont); purposeTextArea.setLineWrap(true); purposeTextArea.setAutoscrolls(true); if (previousRegistrationData != null) purposeTextArea.setText(previousRegistrationData.getPurposeOfUsingTaverna()); purposeTextArea.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent evt) { if (evt.getKeyCode() == VK_TAB) { if (evt.getModifiers() > 0) purposeTextArea.transferFocusBackward(); else purposeTextArea.transferFocus(); evt.consume(); } } }); JScrollPane purposeScrollPane = new JScrollPane(purposeTextArea); gbc.weightx = 1.0; gbc.weighty = 0.0; gbc.gridx = 1; gbc.gridy = 11; gbc.fill = HORIZONTAL; gbc.anchor = FIRST_LINE_START; gbc.gridwidth = 1; gbc.insets = new Insets(5, 10, 0, 10); mainPanel.add(purposeScrollPane, gbc); // Terms and conditions termsAndConditionsCheckBox = new JCheckBox(I_AGREE_TO_THE_TERMS_AND_CONDITIONS); termsAndConditionsCheckBox.setFont(baseFont); termsAndConditionsCheckBox.setBorder(null); termsAndConditionsCheckBox.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent evt) { if (evt.getKeyCode() == VK_ENTER) { evt.consume(); termsAndConditionsCheckBox.setSelected(!termsAndConditionsCheckBox.isSelected()); } } }); // gbc.weightx = 0.0; // gbc.weighty = 0.0; // gbc.gridx = 0; // gbc.gridy = 12; // gbc.fill = NONE; // gbc.anchor = WEST; // gbc.gridwidth = 2; // gbc.insets = new Insets(10, 10, 0, 0); // mainPanel.add(termsAndConditionsCheckBox, gbc); // Terms and conditions link JEditorPane termsAndConditionsURL = new JEditorPane(); termsAndConditionsURL.setEditable(false); termsAndConditionsURL.setBackground(getBackground()); termsAndConditionsURL.setFocusable(false); HTMLEditorKit kit = new HTMLEditorKit(); termsAndConditionsURL.setEditorKit(kit); StyleSheet styleSheet = kit.getStyleSheet(); // styleSheet.addRule("body {font-family:"+baseFont.getFamily()+"; font-size:"+baseFont.getSize()+";}"); // // base font looks bigger when rendered as HTML styleSheet.addRule("body {font-family:" + baseFont.getFamily() + "; font-size:9px;}"); Document doc = kit.createDefaultDocument(); termsAndConditionsURL.setDocument(doc); termsAndConditionsURL.setText("<html><body><a href=\"" + TERMS_AND_CONDITIONS_URL + "\">" + TERMS_AND_CONDITIONS_URL + "</a></body></html>"); termsAndConditionsURL.addHyperlinkListener(new HyperlinkListener() { @Override public void hyperlinkUpdate(HyperlinkEvent he) { if (he.getEventType() == ACTIVATED) followHyperlinkToTandCs(); } }); gbc.weightx = 0.0; gbc.weighty = 0.0; gbc.gridx = 0; gbc.gridy = 13; gbc.fill = NONE; gbc.anchor = WEST; gbc.gridwidth = 2; gbc.insets = new Insets(5, 10, 0, 10); JPanel termsAndConditionsPanel = new JPanel(new FlowLayout(LEFT)); termsAndConditionsPanel.add(termsAndConditionsCheckBox); termsAndConditionsPanel.add(termsAndConditionsURL); mainPanel.add(termsAndConditionsPanel, gbc); // Button panel JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); JButton registerButton = new JButton("Register"); registerButton.setFont(baseFont); registerButton.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent evt) { if (evt.getKeyCode() == VK_ENTER) { evt.consume(); register(); } } }); registerButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { register(); } }); JButton doNotRegisterButton = new JButton("Do not ask me again"); doNotRegisterButton.setFont(baseFont); doNotRegisterButton.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent evt) { if (evt.getKeyCode() == VK_ENTER) { evt.consume(); doNotRegister(); } } }); doNotRegisterButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { doNotRegister(); } }); JButton remindMeLaterButton = new JButton("Remind me later"); // in 2 weeks remindMeLaterButton.setFont(baseFont); remindMeLaterButton.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent evt) { if (evt.getKeyCode() == VK_ENTER) { evt.consume(); remindMeLater(); } } }); remindMeLaterButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { remindMeLater(); } }); buttonPanel.add(registerButton); buttonPanel.add(remindMeLaterButton); buttonPanel.add(doNotRegisterButton); addDivider(buttonPanel, TOP, true); gbc.gridx = 0; gbc.gridy = 14; gbc.fill = HORIZONTAL; gbc.anchor = GridBagConstraints.CENTER; gbc.insets = new Insets(5, 10, 0, 10); gbc.gridwidth = 2; mainPanel.add(buttonPanel, gbc); getContentPane().setLayout(new BorderLayout()); getContentPane().add(mainPanel, CENTER); pack(); setResizable(false); // Center the dialog on the screen (we do not have the parent) Dimension dimension = getToolkit().getScreenSize(); Rectangle abounds = getBounds(); setLocation((dimension.width - abounds.width) / 2, (dimension.height - abounds.height) / 2); setSize(getPreferredSize()); } protected void remindMeLater() { try { FileUtils.touch(remindMeLaterFile); } catch (IOException ioex) { logger.error("Failed to touch the 'Remind me later' file at user registration.", ioex); } closeDialog(); } protected void doNotRegister() { try { FileUtils.touch(doNotRegisterMeFile); if (remindMeLaterFile.exists()) remindMeLaterFile.delete(); } catch (IOException ioex) { logger.error("Failed to touch the 'Do not register me' file at user registration.", ioex); } closeDialog(); } private void register() { if (!validateForm()) return; UserRegistrationData regData = new UserRegistrationData(); regData.setTavernaVersion(appName); regData.setFirstName(firstNameTextField.getText()); regData.setLastName(lastNameTextField.getText()); regData.setEmailAddress(emailTextField.getText()); regData.setKeepMeInformed(keepMeInformedCheckBox.isSelected()); regData.setInstitutionOrCompanyName(institutionOrCompanyTextField.getText()); regData.setIndustry(industryTypeTextField.getSelectedItem().toString()); regData.setField(fieldTextField.getText()); regData.setPurposeOfUsingTaverna(purposeTextArea.getText()); if (postUserRegistrationDataToServer(regData)) { saveUserRegistrationData(regData, registrationDataFile); if (remindMeLaterFile.exists()) remindMeLaterFile.delete(); closeDialog(); } } private boolean validateForm() { String errorMessage = ""; if (firstNameTextField.getText().isEmpty()) errorMessage += "Please provide your first name.<br>"; if (lastNameTextField.getText().isEmpty()) errorMessage += "Please provide your last name.<br>"; if (emailTextField.getText().isEmpty()) errorMessage += "Please provide your email address.<br>"; if (institutionOrCompanyTextField.getText().isEmpty()) errorMessage += "Please provide your institution or company name."; if (!errorMessage.isEmpty()) { showMessageDialog(this, new JLabel("<html><body>" + errorMessage + "</body></html>"), "Error in form", ERROR_MESSAGE); return false; } if (!termsAndConditionsCheckBox.isSelected()) { showMessageDialog(this, new JLabel("You must agree to the terms and conditions."), "Error in form", ERROR_MESSAGE); return false; } return true; } public UserRegistrationData loadUserRegistrationData(File propertiesFile) { UserRegistrationData regData = new UserRegistrationData(); Properties props = new Properties(); // Try to retrieve data from file try { props.load(new FileInputStream(propertiesFile)); } catch (IOException e) { logger.error("Failed to load old user registration data from " + propertiesFile.getAbsolutePath(), e); return null; } regData.setTavernaVersion(props.getProperty(TAVERNA_VERSION_PROPERTY_NAME)); regData.setFirstName(props.getProperty(FIRST_NAME_PROPERTY_NAME)); regData.setLastName(props.getProperty(LAST_NAME_PROPERTY_NAME)); regData.setEmailAddress(props.getProperty(EMAIL_ADDRESS_PROPERTY_NAME)); regData.setKeepMeInformed(props.getProperty(KEEP_ME_INFORMED_PROPERTY_NAME).equals(TRUE)); regData.setInstitutionOrCompanyName(props.getProperty(INSTITUTION_OR_COMPANY_PROPERTY_NAME)); regData.setIndustry(props.getProperty(INDUSTRY_PROPERTY_NAME)); regData.setField(props.getProperty(FIELD_PROPERTY_NAME)); regData.setPurposeOfUsingTaverna(props.getProperty(PURPOSE_PROPERTY_NAME)); return regData; } private void enc(StringBuilder buffer, String name, Object value) throws UnsupportedEncodingException { if (buffer.length() != 0) buffer.append('&'); buffer.append(URLEncoder.encode(name, "UTF-8")); buffer.append('='); buffer.append(URLEncoder.encode(value.toString(), "UTF-8")); } /** * Post registration data to our server. */ private boolean postUserRegistrationDataToServer(UserRegistrationData regData) { StringBuilder parameters = new StringBuilder(); /* * The 'submit' parameter - to let the server-side script know we are * submitting the user's registration form - all other requests will be * silently ignored */ try { // value does not matter enc(parameters, TAVERNA_REGISTRATION_POST_PARAMETER_NAME, "submit"); enc(parameters, TAVERNA_VERSION_POST_PARAMETER_NAME, regData.getTavernaVersion()); enc(parameters, FIRST_NAME_POST_PARAMETER_NAME, regData.getFirstName()); enc(parameters, LAST_NAME_POST_PARAMETER_NAME, regData.getLastName()); enc(parameters, EMAIL_ADDRESS_POST_PARAMETER_NAME, regData.getEmailAddress()); enc(parameters, KEEP_ME_INFORMED_POST_PARAMETER_PROPERTY_NAME, regData.getKeepMeInformed()); enc(parameters, INSTITUTION_OR_COMPANY_POST_PARAMETER_NAME, regData.getInstitutionOrCompanyName()); enc(parameters, INDUSTRY_TYPE_POST_PARAMETER_NAME, regData.getIndustry()); enc(parameters, FIELD_POST_PARAMETER_NAME, regData.getField()); enc(parameters, PURPOSE_POST_PARAMETER_NAME, regData.getPurposeOfUsingTaverna()); } catch (UnsupportedEncodingException ueex) { logger.error(FAILED + "Could not url encode post parameters", ueex); showMessageDialog(null, REGISTRATION_FAILED_MSG, "Error encoding registration data", ERROR_MESSAGE); return false; } String server = REGISTRATION_URL; logger.info("Posting user registartion to " + server + " with parameters: " + parameters); String response = ""; String failure; try { URL url = new URL(server); URLConnection conn = url.openConnection(); /* * Set timeout to e.g. 7 seconds, otherwise we might hang too long * if server is not responding and it will block Taverna */ conn.setConnectTimeout(7000); // Set connection parameters conn.setDoInput(true); conn.setDoOutput(true); conn.setUseCaches(false); // Make server believe we are HTML form data... conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); // Write out the bytes of the content string to the stream. try (DataOutputStream out = new DataOutputStream(conn.getOutputStream())) { out.writeBytes(parameters.toString()); out.flush(); } // Read response from the input stream. try (BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()))) { String temp; while ((temp = in.readLine()) != null) response += temp + "\n"; // Remove the last \n character if (!response.isEmpty()) response = response.substring(0, response.length() - 1); } if (response.equals("Registration successful!")) return true; logger.error(FAILED + "Response form server was: " + response); failure = "Error saving registration data on the server"; } catch (ConnectException ceex) { /* * the connection was refused remotely (e.g. no process is listening * on the remote address/port). */ logger.error(FAILED + "Registration server is not listening of the specified url.", ceex); failure = "Registration server is not listening at the specified url"; } catch (SocketTimeoutException stex) { // timeout has occurred on a socket read or accept. logger.error(FAILED + "Socket timeout occurred.", stex); failure = "Registration server timeout"; } catch (MalformedURLException muex) { logger.error(FAILED + "Registartion server's url is malformed.", muex); failure = "Error with registration server's url"; } catch (IOException ioex) { logger.error( FAILED + "Failed to open url connection to registration server or writing/reading to/from it.", ioex); failure = "Error opening connection to the registration server"; } showMessageDialog(null, REGISTRATION_FAILED_MSG, failure, ERROR_MESSAGE); return false; } private void saveUserRegistrationData(UserRegistrationData regData, File propertiesFile) { Properties props = new Properties(); props.setProperty(TAVERNA_VERSION_PROPERTY_NAME, regData.getTavernaVersion()); props.setProperty(FIRST_NAME_PROPERTY_NAME, regData.getFirstName()); props.setProperty(LAST_NAME_PROPERTY_NAME, regData.getLastName()); props.setProperty(EMAIL_ADDRESS_PROPERTY_NAME, regData.getEmailAddress()); props.setProperty(KEEP_ME_INFORMED_PROPERTY_NAME, regData.getKeepMeInformed() ? TRUE : FALSE); props.setProperty(INSTITUTION_OR_COMPANY_PROPERTY_NAME, regData.getInstitutionOrCompanyName()); props.setProperty(INDUSTRY_PROPERTY_NAME, regData.getIndustry()); props.setProperty(FIELD_PROPERTY_NAME, regData.getPurposeOfUsingTaverna()); props.setProperty(PURPOSE_PROPERTY_NAME, regData.getPurposeOfUsingTaverna()); // Write the properties file. try { props.store(new FileOutputStream(propertiesFile), null); } catch (Exception e) { logger.error("Failed to save user registration data locally on disk."); } } private void closeDialog() { setVisible(false); dispose(); } /** * Adds a light gray or etched border to the top or bottom of a JComponent. * * @author David Withers * @param component */ protected void addDivider(JComponent component, final int position, final boolean etched) { component.setBorder(new Border() { private final Color borderColor = new Color(.6f, .6f, .6f); @Override public Insets getBorderInsets(Component c) { if (position == TOP) return new Insets(5, 0, 0, 0); else return new Insets(0, 0, 5, 0); } @Override public boolean isBorderOpaque() { return false; } @Override public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { if (position == TOP) { if (etched) { g.setColor(borderColor); g.drawLine(x, y, x + width, y); g.setColor(WHITE); g.drawLine(x, y + 1, x + width, y + 1); } else { g.setColor(LIGHT_GRAY); g.drawLine(x, y, x + width, y); } } else { if (etched) { g.setColor(borderColor); g.drawLine(x, y + height - 2, x + width, y + height - 2); g.setColor(WHITE); g.drawLine(x, y + height - 1, x + width, y + height - 1); } else { g.setColor(LIGHT_GRAY); g.drawLine(x, y + height - 1, x + width, y + height - 1); } } } }); } private void followHyperlinkToTandCs() { // Open a Web browser try { Desktop.getDesktop().browse(new URI(TERMS_AND_CONDITIONS_URL)); } catch (Exception ex) { logger.error("User registration: Failed to launch browser to show terms and conditions at " + TERMS_AND_CONDITIONS_URL); } } }