blob: 4999809703089f9832c5bbc3ba3c5babf6dc3118 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.chemistry.opencmis.workbench;
import java.awt.Container;
import java.awt.Dimension;
import java.util.Locale;
import java.util.Map;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.SpringLayout;
import javax.swing.SwingConstants;
import org.apache.chemistry.opencmis.commons.enums.BindingType;
import org.apache.chemistry.opencmis.workbench.model.ClientSession;
public class BasicLoginTab extends AbstractSpringLoginTab {
private static final long serialVersionUID = 1L;
public static final String SYSPROP_URL = ClientSession.WORKBENCH_PREFIX + "url";
public static final String SYSPROP_BINDING = ClientSession.WORKBENCH_PREFIX + "binding";
public static final String SYSPROP_AUTHENTICATION = ClientSession.WORKBENCH_PREFIX + "authentication";
public static final String SYSPROP_COMPRESSION = ClientSession.WORKBENCH_PREFIX + "compression";
public static final String SYSPROP_CLIENTCOMPRESSION = ClientSession.WORKBENCH_PREFIX + "clientcompression";
public static final String SYSPROP_COOKIES = ClientSession.WORKBENCH_PREFIX + "cookies";
public static final String SYSPROP_CONN_TIMEOUT = ClientSession.WORKBENCH_PREFIX + "connecttimeout";
public static final String SYSPROP_READ_TIMEOUT = ClientSession.WORKBENCH_PREFIX + "readtimeout";
public static final String SYSPROP_USER = ClientSession.WORKBENCH_PREFIX + "user";
public static final String SYSPROP_PASSWORD = ClientSession.WORKBENCH_PREFIX + "password";
public static final String SYSPROP_CSRF_HEADER = ClientSession.WORKBENCH_PREFIX + "csrfheader";
private JTextField urlField;
private JRadioButton bindingAtomButton;
private JRadioButton bindingWebServicesButton;
private JRadioButton bindingBrowserButton;
private JTextField usernameField;
private JPasswordField passwordField;
private JRadioButton authenticationNoneButton;
private JRadioButton authenticationStandardButton;
private JRadioButton authenticationNTLMButton;
private JRadioButton authenticationOAuthButton;
private JRadioButton compressionOnButton;
private JRadioButton compressionOffButton;
private JRadioButton clientCompressionOnButton;
private JRadioButton clientCompressionOffButton;
private JRadioButton cookiesOnButton;
private JRadioButton cookiesOffButton;
private JTextField csrfHeaderField;
private JFormattedTextField connectTimeoutField;
private JFormattedTextField readTimeoutField;
public BasicLoginTab() {
super();
createGUI();
}
private void createGUI() {
setLayout(new SpringLayout());
urlField = createTextField(this, "URL:",
"<html>Enter the URL of the CMIS endpoint. It depends on the selected binding. ");
urlField.setText(System.getProperty(SYSPROP_URL, "").trim());
createBindingButtons(this);
usernameField = createTextField(this, "Username:", "Enter the user name.");
usernameField.setText(System.getProperty(SYSPROP_USER, ""));
passwordField = createPasswordField(this, "Password:", "Enter the users password.");
passwordField.setText(System.getProperty(SYSPROP_PASSWORD, ""));
createAuthenticationButtons(this);
createCompressionButtons(this);
createClientCompressionButtons(this);
createCookieButtons(this);
csrfHeaderField = createTextField(this, "CSRF Header:", "<html>Enter <b>CSRF header</b> name.<br>"
+ "If the server needs a CSRF header, enter the name of the header, otherwise leave this field blank.");
csrfHeaderField.setText(System.getProperty(SYSPROP_CSRF_HEADER, ""));
connectTimeoutField = createIntegerField(this, "Connect timeout (secs):",
"<html>Enter the <b>connect timeout</b> in seconds.<br>This is the time the client waits to connect to the server.");
try {
connectTimeoutField.setValue(Long.parseLong(System.getProperty(SYSPROP_CONN_TIMEOUT, "30")));
} catch (NumberFormatException e) {
connectTimeoutField.setValue(30);
}
readTimeoutField = createIntegerField(this, "Read timeout (secs):",
"<html>Enter the <b>read timeout</b> in seconds.<br>This is the time the client waits for a response from the server.");
try {
readTimeoutField.setValue(Long.parseLong(System.getProperty(SYSPROP_READ_TIMEOUT, "600")));
} catch (NumberFormatException e) {
readTimeoutField.setValue(600);
}
makeCompactGrid(11);
}
private void createBindingButtons(Container pane) {
JPanel bindingContainer = new JPanel();
bindingContainer.setLayout(new BoxLayout(bindingContainer, BoxLayout.LINE_AXIS));
char bc = System.getProperty(SYSPROP_BINDING, "atom").toLowerCase(Locale.ENGLISH).charAt(0);
boolean atom = (bc == 'a');
boolean ws = (bc == 'w');
boolean browser = (bc == 'b');
bindingAtomButton = new JRadioButton("AtomPub", atom);
bindingWebServicesButton = new JRadioButton("Web Services", ws);
bindingBrowserButton = new JRadioButton("Browser", browser);
ButtonGroup bindingGroup = new ButtonGroup();
bindingGroup.add(bindingAtomButton);
bindingGroup.add(bindingWebServicesButton);
bindingGroup.add(bindingBrowserButton);
bindingContainer.add(bindingAtomButton);
bindingContainer.add(Box.createRigidArea(WorkbenchScale.scaleDimension(new Dimension(10, 0))));
bindingContainer.add(bindingWebServicesButton);
bindingContainer.add(Box.createRigidArea(WorkbenchScale.scaleDimension(new Dimension(10, 0))));
bindingContainer.add(bindingBrowserButton);
JLabel bindingLabel = new JLabel("Binding:", SwingConstants.TRAILING);
pane.add(bindingLabel);
pane.add(createHelp("<html>Select the CMIS binding.<br>"
+ "The <b>Browser binding</b> is the fastest binding and should be used for CMIS 1.1 repositories.<br>"
+ "The <b>AtomPub binding</b> is the second fastest binding and should be used for CMIS 1.0 repositories.<br>"
+ "The <b>Web Services binding</b> is the last restort and should be avoided, if possible."));
pane.add(bindingContainer);
}
private void createAuthenticationButtons(Container pane) {
JPanel authenticationContainer = new JPanel();
authenticationContainer.setLayout(new BoxLayout(authenticationContainer, BoxLayout.LINE_AXIS));
boolean standard = (System.getProperty(SYSPROP_AUTHENTICATION, "standard").toLowerCase(Locale.ENGLISH)
.equals("standard"));
boolean ntlm = (System.getProperty(SYSPROP_AUTHENTICATION, "").toLowerCase(Locale.ENGLISH).equals("ntlm"));
boolean oauth = (System.getProperty(SYSPROP_AUTHENTICATION, "").toLowerCase(Locale.ENGLISH).equals("oauth"));
boolean none = !standard && !ntlm;
authenticationNoneButton = new JRadioButton("None", none);
authenticationStandardButton = new JRadioButton("Standard", standard);
authenticationNTLMButton = new JRadioButton("NTLM", ntlm);
authenticationOAuthButton = new JRadioButton("OAuth 2.0 (Bearer Token)", oauth);
ButtonGroup authenticationGroup = new ButtonGroup();
authenticationGroup.add(authenticationNoneButton);
authenticationGroup.add(authenticationStandardButton);
authenticationGroup.add(authenticationNTLMButton);
authenticationGroup.add(authenticationOAuthButton);
authenticationContainer.add(authenticationNoneButton);
authenticationContainer.add(Box.createRigidArea(WorkbenchScale.scaleDimension(new Dimension(10, 0))));
authenticationContainer.add(authenticationStandardButton);
authenticationContainer.add(Box.createRigidArea(WorkbenchScale.scaleDimension(new Dimension(10, 0))));
authenticationContainer.add(authenticationNTLMButton);
authenticationContainer.add(Box.createRigidArea(WorkbenchScale.scaleDimension(new Dimension(10, 0))));
authenticationContainer.add(authenticationOAuthButton);
JLabel authenticatioLabel = new JLabel("Authentication:", SwingConstants.TRAILING);
pane.add(authenticatioLabel);
pane.add(createHelp("<html>Select the authentication method.<br>"
+ "The <b>Standard authentication</b> is Basic Auth and should work with most repositories.<br>"
+ "The <b>NTLM authentication</b> should be used with caution! It's very likely that some CMIS operations will fail.<br>"
+ "The <b>OAuth authentication</b> requires a bearer token in the username field. The token will not be refreshed when it expires."
+ "Use the OAuthAuthenticationProvider for full OAuth support."));
pane.add(authenticationContainer);
}
private void createCompressionButtons(Container pane) {
JPanel compressionContainer = new JPanel();
compressionContainer.setLayout(new BoxLayout(compressionContainer, BoxLayout.LINE_AXIS));
boolean compression = !(System.getProperty(SYSPROP_COMPRESSION, "on").equalsIgnoreCase("off"));
compressionOnButton = new JRadioButton("On", compression);
compressionOffButton = new JRadioButton("Off", !compression);
ButtonGroup compressionGroup = new ButtonGroup();
compressionGroup.add(compressionOnButton);
compressionGroup.add(compressionOffButton);
compressionContainer.add(compressionOnButton);
compressionContainer.add(Box.createRigidArea(WorkbenchScale.scaleDimension(new Dimension(10, 0))));
compressionContainer.add(compressionOffButton);
JLabel compressionLabel = new JLabel("Compression:", SwingConstants.TRAILING);
pane.add(compressionLabel);
pane.add(createHelp("<html>Turn <b>server compression</b> on or off.<br>"
+ "It is save to turn server compression always on. The client will still work if the server doesn't support it."));
pane.add(compressionContainer);
}
private void createClientCompressionButtons(Container pane) {
JPanel clientCompressionContainer = new JPanel();
clientCompressionContainer.setLayout(new BoxLayout(clientCompressionContainer, BoxLayout.LINE_AXIS));
boolean clientCompression = (System.getProperty(SYSPROP_CLIENTCOMPRESSION, "off").equalsIgnoreCase("on"));
clientCompressionOnButton = new JRadioButton("On", clientCompression);
clientCompressionOffButton = new JRadioButton("Off", !clientCompression);
ButtonGroup clientCompressionGroup = new ButtonGroup();
clientCompressionGroup.add(clientCompressionOnButton);
clientCompressionGroup.add(clientCompressionOffButton);
clientCompressionContainer.add(clientCompressionOnButton);
clientCompressionContainer.add(Box.createRigidArea(WorkbenchScale.scaleDimension(new Dimension(10, 0))));
clientCompressionContainer.add(clientCompressionOffButton);
JLabel clientCompressionLabel = new JLabel("Client Compression:", SwingConstants.TRAILING);
pane.add(clientCompressionLabel);
pane.add(createHelp("<html>Turn <b>client compression</b> on or off.<br>"
+ "If the server doesn't support client compression, the communication will fail."));
pane.add(clientCompressionContainer);
}
private void createCookieButtons(Container pane) {
JPanel cookiesContainer = new JPanel();
cookiesContainer.setLayout(new BoxLayout(cookiesContainer, BoxLayout.LINE_AXIS));
boolean cookies = (System.getProperty(SYSPROP_COOKIES, "on").equalsIgnoreCase("on"));
cookiesOnButton = new JRadioButton("On", cookies);
cookiesOffButton = new JRadioButton("Off", !cookies);
ButtonGroup cookiesGroup = new ButtonGroup();
cookiesGroup.add(cookiesOnButton);
cookiesGroup.add(cookiesOffButton);
cookiesContainer.add(cookiesOnButton);
cookiesContainer.add(Box.createRigidArea(WorkbenchScale.scaleDimension(new Dimension(10, 0))));
cookiesContainer.add(cookiesOffButton);
JLabel cookiesLabel = new JLabel("Cookies:", SwingConstants.TRAILING);
pane.add(cookiesLabel);
pane.add(createHelp("<html>Turn <b>cookies</b> on or off.<br>"
+ "It is recommended to turn cookies always on. Nothing bad happens if the server doesn't need or support cookies."));
pane.add(cookiesContainer);
}
@Override
public String getTabTitle() {
return "Basic";
}
@Override
public Map<String, String> getSessionParameters() {
String url = urlField.getText().trim();
BindingType binding = BindingType.ATOMPUB;
if (bindingWebServicesButton.isSelected()) {
binding = BindingType.WEBSERVICES;
} else if (bindingBrowserButton.isSelected()) {
binding = BindingType.BROWSER;
}
String username = usernameField.getText();
String password = new String(passwordField.getPassword());
ClientSession.Authentication authentication = ClientSession.Authentication.NONE;
if (authenticationStandardButton.isSelected()) {
authentication = ClientSession.Authentication.STANDARD;
} else if (authenticationNTLMButton.isSelected()) {
authentication = ClientSession.Authentication.NTLM;
} else if (authenticationOAuthButton.isSelected()) {
authentication = ClientSession.Authentication.OAUTH_BEARER;
}
long connectTimeout = 0;
if (connectTimeoutField.getValue() instanceof Number) {
connectTimeout = ((Number) connectTimeoutField.getValue()).longValue() * 1000;
if (connectTimeout < 0) {
connectTimeoutField.setValue(0);
connectTimeout = 0;
}
}
long readTimeout = 0;
if (readTimeoutField.getValue() instanceof Number) {
readTimeout = ((Number) readTimeoutField.getValue()).longValue() * 1000;
if (readTimeout < 0) {
readTimeoutField.setValue(0);
readTimeout = 0;
}
}
return ClientSession.createSessionParameters(url, binding, username, password, authentication,
compressionOnButton.isSelected(), clientCompressionOnButton.isSelected(), cookiesOnButton.isSelected(),
csrfHeaderField.getText(), connectTimeout, readTimeout);
}
@Override
public boolean transferSessionParametersToExpertTab() {
return true;
}
}