| /******************************************************************************* |
| * 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); |
| } |
| } |
| } |