/* * SoapUI, Copyright (C) 2004-2016 SmartBear Software * * Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent * versions of the EUPL (the "Licence"); * You may not use this work except in compliance with the Licence. * You may obtain a copy of the Licence at: * * http://ec.europa.eu/idabc/eupl * * Unless required by applicable law or agreed to in writing, software distributed under the Licence is * distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the Licence for the specific language governing permissions and limitations * under the Licence. */ package com.eviware.soapui.support.editor.inspectors.auth; import com.eviware.soapui.config.TimeUnitConfig; import com.eviware.soapui.impl.rest.OAuth2Profile; import org.apache.commons.lang.WordUtils; import javax.swing.ButtonGroup; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JTextField; import java.awt.BorderLayout; import java.awt.Color; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; class ExpirationTimeChooser extends JPanel { static final String SERVER_EXPIRATION_RADIO_NAME = "serverExpirationRadio"; static final String MANUAL_EXPIRATION_RADIO_NAME = "manualExpirationRadio"; static final String TIME_FIELD_NAME = "timeField"; static final String TIME_UNIT_COMBO_NAME = "timeUnitCombo"; private static final String[] TIME_UNIT_OPTIONS = new String[]{"Seconds", "Minutes", "Hours"}; private static final int TIME_FIELD_CHARACTER_LIMIT = 9; private JRadioButton serverExpirationTimeOption; private JRadioButton manualExpirationTimeOption; private JTextField timeTextField; private JComboBox timeUnitCombo; private OAuth2Profile profile; ExpirationTimeChooser(OAuth2Profile profile) { this.profile = profile; setLayout(new BorderLayout(0, 0)); initializeRadioButtons(); JPanel timeSelectionPanel = createTimeSelectionPanel(); JPanel northPanel = new JPanel(new GridLayout(3, 1, 0, 0)); northPanel.add(serverExpirationTimeOption); northPanel.add(manualExpirationTimeOption); northPanel.add(timeSelectionPanel); add(northPanel, BorderLayout.NORTH); JPanel centerPanel = new JPanel(new BorderLayout(0, 0)); JLabel label = new JLabel("<html>Here you can set an expiry time if the OAuth 2 server doesn't,<br/>so that the token retrieval can be automated.</html>"); label.setForeground(new Color(143, 143, 143)); centerPanel.add(label, BorderLayout.NORTH); add(centerPanel, BorderLayout.CENTER); // JLabel helpLink = UISupport.createLabelLink( "http://www.soapui.org", "Learn how to use the token expiration time " ); // add( helpLink, BorderLayout.SOUTH ); } public String getAccessTokenExpirationTime() { return timeTextField.getText(); } public TimeUnitConfig.Enum getAccessTokenExpirationTimeUnit() { String timeUnitString = timeUnitCombo.getSelectedItem().toString().toUpperCase(); return TimeUnitConfig.Enum.forString(timeUnitString); } public boolean manualExpirationTimeIsSelected() { return manualExpirationTimeOption.isSelected(); } private JPanel createTimeSelectionPanel() { JPanel timeSelectionPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 3, 0)); boolean enableManualTimeControls = profile.useManualAccessTokenExpirationTime(); timeTextField = createTimeTextField(enableManualTimeControls); timeUnitCombo = createTimeUnitCombo(enableManualTimeControls); timeSelectionPanel.add(timeTextField); timeSelectionPanel.add(timeUnitCombo); return timeSelectionPanel; } private JTextField createTimeTextField(boolean enableManualTimeControls) { JTextField timeTextField = new JTextField(5); timeTextField.setName(TIME_FIELD_NAME); timeTextField.setHorizontalAlignment(JTextField.RIGHT); timeTextField.setEnabled(enableManualTimeControls); String manualAccessTokenExpirationTime = profile.getManualAccessTokenExpirationTime(); if (manualAccessTokenExpirationTime == null) { timeTextField.setText(""); } else { timeTextField.setText(manualAccessTokenExpirationTime); } return timeTextField; } private JComboBox createTimeUnitCombo(boolean enableManualTimeControls) { JComboBox timeUnitCombo = new JComboBox(TIME_UNIT_OPTIONS); timeUnitCombo.setName(TIME_UNIT_COMBO_NAME); timeUnitCombo.setEnabled(enableManualTimeControls); TimeUnitConfig.Enum timeUnit = profile.getManualAccessTokenExpirationTimeUnit(); timeUnitCombo.setSelectedItem(WordUtils.capitalize(timeUnit.toString().toLowerCase())); return timeUnitCombo; } private void initializeRadioButtons() { long serverIssuedExpirationTime = profile.getAccessTokenExpirationTime(); String serverIssuedExpirationTimeLabel; if (serverIssuedExpirationTime > 0) { serverIssuedExpirationTimeLabel = getMostLegibleTimeString(serverIssuedExpirationTime); } else { serverIssuedExpirationTimeLabel = "No expiration."; } serverExpirationTimeOption = new JRadioButton("Use expiration time from authorization server: " + serverIssuedExpirationTimeLabel); serverExpirationTimeOption.setName(SERVER_EXPIRATION_RADIO_NAME); ActionListener checkBoxMonitor = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { timeTextField.setEnabled(manualExpirationTimeOption.isSelected()); timeUnitCombo.setEnabled(manualExpirationTimeOption.isSelected()); } }; serverExpirationTimeOption.addActionListener(checkBoxMonitor); manualExpirationTimeOption = new JRadioButton("Custom"); manualExpirationTimeOption.setName(MANUAL_EXPIRATION_RADIO_NAME); manualExpirationTimeOption.addActionListener(checkBoxMonitor); ButtonGroup buttonGroup = new ButtonGroup(); buttonGroup.add(serverExpirationTimeOption); buttonGroup.add(manualExpirationTimeOption); if (profile.useManualAccessTokenExpirationTime()) { manualExpirationTimeOption.setSelected(true); } else { serverExpirationTimeOption.setSelected(true); } } private String getMostLegibleTimeString(long seconds) { if (seconds % 3600 == 0) { return seconds / 3600 + " hour(s)"; } else if (seconds % 60 == 0) { return seconds / 60 + " minute(s)"; } else { return seconds + " second(s)"; } } }