/*******************************************************************************
* Copyright (c) 2012 AGETO Service GmbH and others.
* All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html.
*
* Contributors:
* Andreas Mihm - rework new admin ui
*******************************************************************************/
package org.eclipse.gyrex.admin.ui.http.jetty.internal;
import java.util.Collection;
import org.eclipse.gyrex.admin.ui.internal.application.AdminUiUtil;
import org.eclipse.gyrex.admin.ui.internal.helper.SwtUtil;
import org.eclipse.gyrex.admin.ui.internal.widgets.Infobox;
import org.eclipse.gyrex.admin.ui.internal.widgets.NonBlockingMessageDialogs;
import org.eclipse.gyrex.http.jetty.admin.ChannelDescriptor;
import org.eclipse.gyrex.http.jetty.admin.ICertificate;
import org.eclipse.gyrex.http.jetty.admin.IJettyManager;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.ListViewer;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.window.Window;
import org.eclipse.rap.rwt.widgets.DialogCallback;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.List;
import org.apache.commons.lang.text.StrBuilder;
/**
*
*/
public class CertificatesArea {
static class CertificatesLabelProvider extends LabelProvider {
/** serialVersionUID */
private static final long serialVersionUID = 1L;
@Override
public String getText(final Object element) {
if (element instanceof ICertificate) {
final ICertificate cert = (ICertificate) element;
return String.format("%s (%s)", cert.getId(), cert.getInfo());
}
return super.getText(element);
}
}
private ISelectionChangedListener updateButtonsListener;
private Button addButton;
private Button removeButton;
private ListViewer certificatesList;
private Composite pageComposite;
public void activate() {
if (certificatesList != null) {
certificatesList.setInput(getJettyManager());
updateButtonsListener = new ISelectionChangedListener() {
@Override
public void selectionChanged(final SelectionChangedEvent event) {
updateButtons();
}
};
certificatesList.addSelectionChangedListener(updateButtonsListener);
} else {
}
}
void addButtonPressed() {
final ImportCertificateDialog dialog = new ImportCertificateDialog(SwtUtil.getShell(addButton), getJettyManager());
dialog.openNonBlocking(new DialogCallback() {
/** serialVersionUID */
private static final long serialVersionUID = 1L;
@Override
public void dialogClosed(final int returnCode) {
if (returnCode == Window.OK) {
refresh();
}
}
});
}
private Button createButton(final Composite buttons, final String buttonLabel) {
final Button b = new Button(buttons, SWT.NONE);
b.setText(buttonLabel);
b.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
return b;
}
public void createChannelsControls(final Composite parent) {
pageComposite = parent;
final Infobox infobox = new Infobox(pageComposite);
infobox.setLayoutData(AdminUiUtil.createHorzFillData());
infobox.addHeading("Certificates");
infobox.addParagraph("In this section you can define SSL Certificates, which can be assigned to Jetty channels to support SSL encryption.");
final Composite description = new Composite(pageComposite, SWT.NONE);
final GridData gd = AdminUiUtil.createFillData();
gd.verticalIndent = 10;
description.setLayoutData(gd);
description.setLayout(AdminUiUtil.createGridLayoutWithoutMargin(2, false));
certificatesList = new ListViewer(description, SWT.SINGLE | SWT.BORDER);
final List list = certificatesList.getList();
list.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).create());
certificatesList.setContentProvider(new ArrayContentProvider());
certificatesList.setLabelProvider(new CertificatesLabelProvider());
certificatesList.setContentProvider(new CertificatesContentProvider());
final Composite buttons = new Composite(description, SWT.NONE);
buttons.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true));
buttons.setLayout(new GridLayout());
addButton = createButton(buttons, "Add");
addButton.addSelectionListener(new SelectionAdapter() {
/** serialVersionUID */
private static final long serialVersionUID = 1L;
@Override
public void widgetSelected(final SelectionEvent event) {
addButtonPressed();
}
});
removeButton = createButton(buttons, "Remove");
removeButton.setEnabled(false);
removeButton.addSelectionListener(new SelectionAdapter() {
/** serialVersionUID */
private static final long serialVersionUID = 1L;
@Override
public void widgetSelected(final SelectionEvent event) {
removeButtonPressed();
}
});
}
public void deactivate() {
// remove data inputs form controls
if (certificatesList != null) {
if (updateButtonsListener != null) {
certificatesList.removeSelectionChangedListener(updateButtonsListener);
updateButtonsListener = null;
}
if (!certificatesList.getList().isDisposed()) {
certificatesList.setInput(null);
}
}
}
private IJettyManager getJettyManager() {
return JettyConfigActivator.getInstance().getJettyManager();
}
private ICertificate getSelectedCertificate() {
final IStructuredSelection selection = (IStructuredSelection) certificatesList.getSelection();
if (!selection.isEmpty() && selection.getFirstElement() instanceof ICertificate) {
return (ICertificate) selection.getFirstElement();
}
return null;
}
public void refresh() {
certificatesList.refresh();
updateButtons();
}
void removeButtonPressed() {
final ICertificate certificate = getSelectedCertificate();
if (certificate == null) {
return;
}
// we also validate that the certificate is not used anymore
final String certificateId = certificate.getId();
final IJettyManager jettyManager = getJettyManager();
final Collection<ChannelDescriptor> channels = jettyManager.getChannelsUsingCertificate(certificateId);
if (!channels.isEmpty()) {
final StrBuilder errorMessage = new StrBuilder();
errorMessage.appendln("Certificate is still in use and cannot be removed.");
errorMessage.appendln("");
errorMessage.appendln("Used by:");
for (final ChannelDescriptor channelDescriptor : channels) {
errorMessage.append(" * ").appendln(channelDescriptor.getId());
}
NonBlockingMessageDialogs.openError(SwtUtil.getShell(pageComposite), "Still In Use", errorMessage.toString(), new DialogCallback() {
/** serialVersionUID */
private static final long serialVersionUID = 1L;
@Override
public void dialogClosed(final int returnCode) {
if (returnCode != Window.OK) {
return;
}
}
});
return;
}
NonBlockingMessageDialogs.openQuestion(SwtUtil.getShell(pageComposite), "Remove selected Certificate", String.format("Do you really want to delete certificate %s?", certificate.getId()), new DialogCallback() {
/** serialVersionUID */
private static final long serialVersionUID = 1L;
@Override
public void dialogClosed(final int returnCode) {
if (returnCode != Window.OK) {
return;
}
getJettyManager().removeCertificate(certificate.getId());
refresh();
}
});
}
void updateButtons() {
final int selectedElementsCount = ((IStructuredSelection) certificatesList.getSelection()).size();
if (selectedElementsCount == 0) {
addButton.setEnabled(true);
removeButton.setEnabled(false);
return;
}
addButton.setEnabled(selectedElementsCount == 1);
removeButton.setEnabled(selectedElementsCount == 1);
}
}