/*
* 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.directory.studio.openldap.config.editor.dialogs;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.directory.api.ldap.model.constants.SchemaConstants;
import org.apache.directory.api.ldap.model.exception.LdapInvalidDnException;
import org.apache.directory.api.ldap.model.name.Dn;
import org.apache.directory.studio.common.ui.widgets.BaseWidgetUtils;
import org.apache.directory.studio.common.ui.widgets.WidgetModifyEvent;
import org.apache.directory.studio.common.ui.widgets.WidgetModifyListener;
import org.apache.directory.studio.ldapbrowser.common.widgets.search.EntryWidget;
import org.apache.directory.studio.ldapbrowser.common.widgets.search.FilterWidget;
import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.events.VerifyEvent;
import org.eclipse.swt.events.VerifyListener;
import org.eclipse.swt.graphics.Image;
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.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.Text;
import org.apache.directory.studio.openldap.common.ui.dialogs.AttributeDialog;
import org.apache.directory.studio.openldap.config.OpenLdapConfigurationPlugin;
import org.apache.directory.studio.openldap.config.OpenLdapConfigurationPluginConstants;
import org.apache.directory.studio.openldap.syncrepl.BindMethod;
import org.apache.directory.studio.openldap.syncrepl.Provider;
import org.apache.directory.studio.openldap.syncrepl.SaslMechanism;
import org.apache.directory.studio.openldap.syncrepl.Scope;
import org.apache.directory.studio.openldap.syncrepl.StartTls;
import org.apache.directory.studio.openldap.syncrepl.SyncRepl;
import org.apache.directory.studio.openldap.syncrepl.Type;
/**
* The ReplicationConsumerDialog is used to edit the configuration of a SyncRepl consumer.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class ReplicationConsumerDialog extends Dialog
{
/** The Simple Authentication tab item index */
private static final int SIMPLE_AUTHENTICATION_TAB_ITEM_INDEX = 0;
/** The SASL Authentication tab item index */
private static final int SASL_AUTHENTICATION_TAB_ITEM_INDEX = 1;
/** The SyncRepl value */
private SyncRepl syncRepl;
/** The connection */
private IBrowserConnection browserConnection;
private List<String> attributes = new ArrayList<String>();
// UI widgets
private Button okButton;
private ScrolledComposite scrolledComposite;
private Composite composite;
private Text replicaIdText;
private ComboViewer replicationTypeComboViewer;
private Button configureReplicationButton;
private Text hostText;
private Text portText;
private ComboViewer encryptionMethodComboViewer;
private Button configureStartTlsButton;
private TabFolder authenticationTabFolder;
private Text bindDnText;
private Text credentialsText;
private Button showCredentialsCheckbox;
private Label saslAuthenticationLabel;
private Button configureSaslAuthenticationButton;
private EntryWidget searchBaseDnEntryWidget;
private FilterWidget filterWidget;
private ComboViewer scopeComboViewer;
private TableViewer attributesTableViewer;
private Button addAttributeButton;
private Button editAttributeButton;
private Button deleteAttributeButton;
private Button attributesOnlyCheckbox;
// Listeners
private VerifyListener integerVerifyListener = new VerifyListener()
{
public void verifyText( VerifyEvent e )
{
if ( !e.text.matches( "[0-9]*" ) ) //$NON-NLS-1$
{
e.doit = false;
}
}
};
private ModifyListener replicatIdTextListener = new ModifyListener()
{
public void modifyText( ModifyEvent e )
{
String replicaId = replicaIdText.getText();
if ( ( replicaId != null ) && ( !"".equals( replicaId ) ) )
{
syncRepl.setRid( replicaId );
}
else
{
syncRepl.setRid( null );
}
updateOkButtonEnableState();
}
};
private ISelectionChangedListener replicationTypeComboViewerListener = new ISelectionChangedListener()
{
public void selectionChanged( SelectionChangedEvent event )
{
syncRepl.setType( getReplicationType() );
}
};
private SelectionListener configureReplicationButtonListener = new SelectionAdapter()
{
public void widgetSelected( SelectionEvent e )
{
ReplicationOptionsDialog dialog = new ReplicationOptionsDialog( getShell(), syncRepl, browserConnection );
if ( dialog.open() == ReplicationOptionsDialog.OK )
{
syncRepl = dialog.getSyncRepl();
refreshUI();
}
}
};
private ModifyListener hostTextListener = new ModifyListener()
{
public void modifyText( ModifyEvent e )
{
syncRepl.setProvider( getProvider() );
updateOkButtonEnableState();
}
};
private ModifyListener portTextListener = new ModifyListener()
{
public void modifyText( ModifyEvent e )
{
syncRepl.setProvider( getProvider() );
}
};
private ISelectionChangedListener encryptionMethodComboViewerListener = new ISelectionChangedListener()
{
public void selectionChanged( SelectionChangedEvent event )
{
syncRepl.setProvider( getProvider() );
// Getting the selected encryption method
EncryptionMethod encryptionMethod = getEncryptionMethod();
if ( ( encryptionMethod == EncryptionMethod.NO_ENCRYPTION )
|| ( encryptionMethod == EncryptionMethod.SSL_ENCRYPTION_LDAPS ) )
{
configureStartTlsButton.setEnabled( false );
}
else if ( encryptionMethod == EncryptionMethod.START_TLS_EXTENSION )
{
configureStartTlsButton.setEnabled( true );
}
}
};
private SelectionListener configureStartTlsButtonListener = new SelectionAdapter()
{
public void widgetSelected( SelectionEvent e )
{
// TODO
}
};
private SelectionListener authenticationTabFolderListener = new SelectionAdapter()
{
public void widgetSelected( SelectionEvent e )
{
// Simple Authentication
if ( authenticationTabFolder.getSelectionIndex() == SIMPLE_AUTHENTICATION_TAB_ITEM_INDEX )
{
syncRepl.setBindMethod( BindMethod.SIMPLE );
// Reseting SASL authentication parameters
syncRepl.setSaslMech( null );
syncRepl.setAuthcid( null );
syncRepl.setAuthzid( null );
syncRepl.setCredentials( null );
syncRepl.setRealm( null );
syncRepl.setSecProps( null );
}
// SASL Authentication
else if ( authenticationTabFolder.getSelectionIndex() == SASL_AUTHENTICATION_TAB_ITEM_INDEX )
{
syncRepl.setBindMethod( BindMethod.SASL );
// Reseting simple authentication parameters
syncRepl.setBindDn( null );
syncRepl.setCredentials( null );
}
refreshUI();
};
};
private ModifyListener bindDnTextListener = new ModifyListener()
{
public void modifyText( ModifyEvent e )
{
String bindDn = bindDnText.getText();
if ( ( bindDn != null ) && ( !"".equals( bindDn ) ) )
{
syncRepl.setBindDn( bindDn );
}
else
{
syncRepl.setBindDn( null );
}
}
};
private ModifyListener credentialsTextListener = new ModifyListener()
{
public void modifyText( ModifyEvent e )
{
String credentials = credentialsText.getText();
if ( ( credentials != null ) && ( !"".equals( credentials ) ) )
{
syncRepl.setCredentials( credentials );
}
else
{
syncRepl.setCredentials( null );
}
}
};
private SelectionListener showCredentialsCheckboxListener = new SelectionAdapter()
{
public void widgetSelected( SelectionEvent e )
{
if ( showCredentialsCheckbox.getSelection() )
{
credentialsText.setEchoChar( '\0' );
}
else
{
credentialsText.setEchoChar( '\u2022' );
}
}
};
private SelectionListener configureSaslAuthenticationButtonListener = new SelectionAdapter()
{
public void widgetSelected( SelectionEvent e )
{
ReplicationSaslDialog dialog = new ReplicationSaslDialog( getShell(), syncRepl, browserConnection );
if ( dialog.open() == ReplicationSaslDialog.OK )
{
syncRepl = dialog.getSyncRepl();
refreshUI();
}
}
};
private WidgetModifyListener searchBaseDnEntryWidgetListener = new WidgetModifyListener()
{
public void widgetModified( WidgetModifyEvent event )
{
Dn searchBaseDn = searchBaseDnEntryWidget.getDn();
if ( ( searchBaseDn != null ) && ( !Dn.EMPTY_DN.equals( searchBaseDn ) ) )
{
syncRepl.setSearchBase( searchBaseDn.getName() );
}
else
{
syncRepl.setSearchBase( null );
}
updateOkButtonEnableState();
}
};
private WidgetModifyListener filterWidgetListener = new WidgetModifyListener()
{
public void widgetModified( WidgetModifyEvent event )
{
String filter = filterWidget.getFilter();
if ( ( filter != null ) && ( !"".equals( filter ) ) )
{
syncRepl.setFilter( filter );
}
else
{
syncRepl.setFilter( null );
}
}
};
private ISelectionChangedListener scopeComboViewerListener = new ISelectionChangedListener()
{
public void selectionChanged( SelectionChangedEvent event )
{
syncRepl.setScope( getScope() );
}
};
private ISelectionChangedListener attributesTableViewerSelectionChangedListener = new ISelectionChangedListener()
{
public void selectionChanged( SelectionChangedEvent event )
{
updateAttributesTableButtonsState();
}
};
private IDoubleClickListener attributesTableViewerDoubleClickListener = new IDoubleClickListener()
{
public void doubleClick( DoubleClickEvent event )
{
editAttributeButtonAction();
}
};
private SelectionListener addAttributeButtonListener = new SelectionAdapter()
{
public void widgetSelected( SelectionEvent e )
{
addAttributeButtonAction();
}
};
private SelectionListener editAttributeButtonListener = new SelectionAdapter()
{
public void widgetSelected( SelectionEvent e )
{
editAttributeButtonAction();
}
};
private SelectionListener deleteAttributeButtonListener = new SelectionAdapter()
{
public void widgetSelected( SelectionEvent e )
{
deleteAttributeButtonAction();
}
};
private SelectionListener attributesOnlyCheckboxListener = new SelectionAdapter()
{
public void widgetSelected( SelectionEvent e )
{
syncRepl.setAttrsOnly( attributesOnlyCheckbox.getSelection() );
};
};
/**
* Creates a new instance of OverlayDialog.
*
* @param parentShell the parent shell
* @param index the index
* @param browserConnection the connection
*/
public ReplicationConsumerDialog( Shell parentShell, IBrowserConnection browserConnection )
{
super( parentShell );
super.setShellStyle( super.getShellStyle() | SWT.RESIZE );
this.browserConnection = browserConnection;
this.syncRepl = createDefaultSyncRepl();
}
/**
* Creates a new instance of OverlayDialog.
*
* @param parentShell the parent shell
* @param index the index
* @param browserConnection the connection
*/
public ReplicationConsumerDialog( Shell parentShell, SyncRepl syncRepl, IBrowserConnection browserConnection )
{
super( parentShell );
super.setShellStyle( super.getShellStyle() | SWT.RESIZE );
this.browserConnection = browserConnection;
if ( syncRepl != null )
{
this.syncRepl = syncRepl.copy();
}
else
{
this.syncRepl = createDefaultSyncRepl();
}
}
/**
* Creates a default SyncRepl configuration.
*
* @return a default SyncRepl configuration
*/
private SyncRepl createDefaultSyncRepl()
{
SyncRepl syncRepl = new SyncRepl();
return syncRepl;
}
/**
* @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
*/
protected void configureShell( Shell shell )
{
super.configureShell( shell );
shell.setText( "Replication Consumer" );
}
/**
* @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
*/
protected void createButtonsForButtonBar( Composite parent )
{
okButton = createButton( parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true );
createButton( parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false );
updateOkButtonEnableState();
}
/**
* {@inheritDoc}
*/
protected void okPressed()
{
super.okPressed();
}
/**
* @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
protected Control createDialogArea( Composite parent )
{
// Creating the scrolled composite
scrolledComposite = new ScrolledComposite( parent, SWT.H_SCROLL | SWT.V_SCROLL );
scrolledComposite.setExpandHorizontal( true );
scrolledComposite.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true ) );
// Creating the composite and attaching it to the scrolled composite
composite = new Composite( scrolledComposite, SWT.NONE );
composite.setLayout( new GridLayout() );
scrolledComposite.setContent( composite );
createReplicationConsumerGroup( composite );
createReplicationProviderGroup( composite );
createReplicationAuthenticationGroup( composite );
createReplicationDataGroup( composite );
refreshUI();
applyDialogFont( scrolledComposite );
composite.setSize( composite.computeSize( SWT.DEFAULT, SWT.DEFAULT ) );
return scrolledComposite;
}
/**
* Creates the replication consumer group.
*
* @param parent the parent composite
*/
private void createReplicationConsumerGroup( Composite parent )
{
// Replication Provider Group
Group group = BaseWidgetUtils.createGroup( parent, "Replication Consumer", 1 );
GridLayout groupGridLayout = new GridLayout( 2, false );
group.setLayout( groupGridLayout );
group.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
// Replica ID
BaseWidgetUtils.createLabel( group, "Replica ID:", 1 );
replicaIdText = BaseWidgetUtils.createText( group, "", 1 );
replicaIdText.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
// Replication Type
BaseWidgetUtils.createLabel( group, "Replication Type:", 1 );
replicationTypeComboViewer = new ComboViewer( group );
replicationTypeComboViewer.getControl().setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
replicationTypeComboViewer.setContentProvider( new ArrayContentProvider() );
replicationTypeComboViewer.setLabelProvider( new LabelProvider()
{
public String getText( Object element )
{
if ( element instanceof Type )
{
Type type = ( Type ) element;
switch ( type )
{
case REFRESH_AND_PERSIST:
return "Refresh And Persist";
case REFRESH_ONLY:
return "Refresh Only";
}
}
return super.getText( element );
}
} );
replicationTypeComboViewer.setInput( new Type[]
{ Type.REFRESH_AND_PERSIST, Type.REFRESH_ONLY } );
// Configure Replication Options Button
BaseWidgetUtils.createLabel( group, "", 1 );
configureReplicationButton = BaseWidgetUtils.createButton( group, "Configure Replication Options...", 1 );
configureReplicationButton.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false ) );
}
/**
* Creates the replication provider group.
*
* @param parent the parent composite
*/
private void createReplicationProviderGroup( Composite parent )
{
// Replication Provider Group
Group group = BaseWidgetUtils.createGroup( parent, "Replication Provider Connection", 1 );
GridLayout groupGridLayout = new GridLayout( 2, false );
group.setLayout( groupGridLayout );
group.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
// Host
BaseWidgetUtils.createLabel( group, "Provider Host:", 1 );
hostText = BaseWidgetUtils.createText( group, "", 1 );
hostText.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
// Port
BaseWidgetUtils.createLabel( group, "Provider Port:", 1 );
portText = BaseWidgetUtils.createText( group, "", 1 );
portText.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
// Encryption Method
BaseWidgetUtils.createLabel( group, "Encryption Method:", 1 );
encryptionMethodComboViewer = new ComboViewer( group );
encryptionMethodComboViewer.getControl().setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
encryptionMethodComboViewer.setContentProvider( new ArrayContentProvider() );
encryptionMethodComboViewer.setLabelProvider( new LabelProvider()
{
public String getText( Object element )
{
if ( element instanceof EncryptionMethod )
{
EncryptionMethod encryptionMethod = ( EncryptionMethod ) element;
switch ( encryptionMethod )
{
case NO_ENCRYPTION:
return "No Encryption";
case SSL_ENCRYPTION_LDAPS:
return "Use SSL Encryption (ldaps://)";
case START_TLS_EXTENSION:
return "Use Start TLS Extension";
}
}
return super.getText( element );
}
} );
encryptionMethodComboViewer.setInput( new EncryptionMethod[]
{
EncryptionMethod.NO_ENCRYPTION,
EncryptionMethod.SSL_ENCRYPTION_LDAPS,
EncryptionMethod.START_TLS_EXTENSION } );
// Configure Start TLS Button
BaseWidgetUtils.createLabel( group, "", 1 );
configureStartTlsButton = BaseWidgetUtils.createButton( group, "Configure Start TLS...", 1 );
configureStartTlsButton.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false ) );
configureStartTlsButton.setEnabled( false );
}
/**
* Creates the replication authentication group.
*
* @param parent the parent composite
*/
private void createReplicationAuthenticationGroup( Composite parent )
{
// Replication Provider Group
Group group = BaseWidgetUtils.createGroup( parent, "Authentication", 1 );
GridLayout groupGridLayout = new GridLayout( 2, false );
group.setLayout( groupGridLayout );
group.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
// Authentication
authenticationTabFolder = new TabFolder( group, SWT.TOP );
authenticationTabFolder.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true, 2, 1 ) );
// Simple Authentication Composite
Composite simpleAuthenticationComposite = new Composite( authenticationTabFolder, SWT.NONE );
simpleAuthenticationComposite.setLayout( new GridLayout( 2, false ) );
simpleAuthenticationComposite.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true ) );
// Bind DN Text
BaseWidgetUtils.createLabel( simpleAuthenticationComposite, "Bind DN:", 1 );
bindDnText = BaseWidgetUtils.createText( simpleAuthenticationComposite, "", 1 );
bindDnText.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
// Credentials Text
BaseWidgetUtils.createLabel( simpleAuthenticationComposite, "Credentials:", 1 );
credentialsText = BaseWidgetUtils.createText( simpleAuthenticationComposite, "", 1 );
credentialsText.setEchoChar( '\u2022' );
// Show Credentials Checkbox
BaseWidgetUtils.createLabel( simpleAuthenticationComposite, "", 1 );
showCredentialsCheckbox = BaseWidgetUtils.createCheckbox( simpleAuthenticationComposite, "Show Credentials", 1 );
// Simple Authentication TabItem
TabItem simpleAuthenticationTabItem = new TabItem( authenticationTabFolder, SWT.NONE,
SIMPLE_AUTHENTICATION_TAB_ITEM_INDEX );
simpleAuthenticationTabItem.setText( "Simple Authentication" );
simpleAuthenticationTabItem.setControl( simpleAuthenticationComposite );
// SASL Authentication Composite
Composite saslAuthenticationComposite = new Composite( authenticationTabFolder, SWT.NONE );
saslAuthenticationComposite.setLayout( new GridLayout() );
saslAuthenticationComposite.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true ) );
// SASL Authentication Wrapped Label
saslAuthenticationLabel = new Label( saslAuthenticationComposite, SWT.WRAP | SWT.CENTER );
saslAuthenticationLabel.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, true ) );
// Configure SASL Authentication Button
configureSaslAuthenticationButton = BaseWidgetUtils.createButton( saslAuthenticationComposite,
"Configure SASL Authentication...", 1 );
configureSaslAuthenticationButton.setLayoutData( new GridData( SWT.CENTER, SWT.BOTTOM, true, false ) );
// SASL Authentication TabItem
TabItem saslAuthenticationTabItem = new TabItem( authenticationTabFolder, SWT.NONE,
SASL_AUTHENTICATION_TAB_ITEM_INDEX );
saslAuthenticationTabItem.setText( "SASL Authentication" );
saslAuthenticationTabItem.setControl( saslAuthenticationComposite );
}
/**
* Creates the replication data group.
*
* @param parent the parent composite
*/
private void createReplicationDataGroup( Composite parent )
{
// Replication Data Group
Group group = BaseWidgetUtils.createGroup( parent, "Replication Data Configuration", 1 );
GridLayout groupGridLayout = new GridLayout( 3, false );
groupGridLayout.verticalSpacing = groupGridLayout.marginHeight = 0;
group.setLayout( groupGridLayout );
group.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
// Search Base DN Text
BaseWidgetUtils.createLabel( group, "Search Base DN:", 1 );
searchBaseDnEntryWidget = new EntryWidget( browserConnection, Dn.EMPTY_DN );
searchBaseDnEntryWidget.createWidget( group );
// Filter Text
BaseWidgetUtils.createLabel( group, "Filter:", 1 );
filterWidget = new FilterWidget();
filterWidget.setBrowserConnection( browserConnection );
filterWidget.createWidget( group );
// Scope Combo Viewer
BaseWidgetUtils.createLabel( group, "Scope:", 1 );
scopeComboViewer = new ComboViewer( group );
scopeComboViewer.getControl().setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false, 2, 1 ) );
scopeComboViewer.setContentProvider( new ArrayContentProvider() );
scopeComboViewer.setLabelProvider( new LabelProvider()
{
public String getText( Object element )
{
if ( element instanceof Scope )
{
Scope scope = ( Scope ) element;
switch ( scope )
{
case BASE:
return "Base";
case ONE:
return "One Level";
case SUB:
return "Subtree";
case SUBORD:
return "Subordinate Subtree";
}
}
return super.getText( element );
}
} );
scopeComboViewer.setInput( new Scope[]
{ Scope.SUB, Scope.SUBORD, Scope.ONE, Scope.BASE } );
// Attributes Table Viewer
BaseWidgetUtils.createLabel( group, "Attributes:", 1 );
Composite attributesTableComposite = new Composite( group, SWT.NONE );
attributesTableComposite.setLayout( new GridLayout( 2, false ) );
attributesTableComposite.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true, 2, 1 ) );
attributesTableViewer = new TableViewer( attributesTableComposite );
attributesTableViewer.getControl().setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true, 1, 3 ) );
attributesTableViewer.setContentProvider( new ArrayContentProvider() );
attributesTableViewer.setLabelProvider( new LabelProvider()
{
public String getText( Object element )
{
if ( SchemaConstants.ALL_OPERATIONAL_ATTRIBUTES.equals( element ) )
{
return SchemaConstants.ALL_OPERATIONAL_ATTRIBUTES + " " + "<all operational attributes>";
}
else if ( SchemaConstants.ALL_USER_ATTRIBUTES.equals( element ) )
{
return SchemaConstants.ALL_USER_ATTRIBUTES + " " + "<all user attributes>";
}
return super.getText( element );
};
public Image getImage( Object element )
{
return OpenLdapConfigurationPlugin.getDefault().getImage(
OpenLdapConfigurationPluginConstants.IMG_ATTRIBUTE );
}
} );
attributesTableViewer.setInput( attributes );
// Add Attribute Button
addAttributeButton = BaseWidgetUtils.createButton( attributesTableComposite, "Add...", 1 );
addAttributeButton.setLayoutData( createNewButtonGridData() );
// Edit Attribute Button
editAttributeButton = BaseWidgetUtils.createButton( attributesTableComposite, "Edit...", 1 );
editAttributeButton.setEnabled( false );
editAttributeButton.setLayoutData( createNewButtonGridData() );
// Delete Attribute Button
deleteAttributeButton = BaseWidgetUtils.createButton( attributesTableComposite, "Delete", 1 );
deleteAttributeButton.setEnabled( false );
deleteAttributeButton.setLayoutData( createNewButtonGridData() );
// Attributes Only Checkbox
BaseWidgetUtils.createLabel( group, "", 1 ); //$NON-NLS-1$
attributesOnlyCheckbox = BaseWidgetUtils.createCheckbox( group, "Attributes Only (no values)", 1 );
attributesOnlyCheckbox.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false, 2, 1 ) );
}
/**
* Updates the state of the attributes table buttons.
*/
private void updateAttributesTableButtonsState()
{
StructuredSelection selection = ( StructuredSelection ) attributesTableViewer.getSelection();
editAttributeButton.setEnabled( !selection.isEmpty() );
deleteAttributeButton.setEnabled( !selection.isEmpty() );
}
/**
* Action launched when the add attribute button is clicked.
*/
private void addAttributeButtonAction()
{
AttributeDialog dialog = new AttributeDialog( addAttributeButton.getShell(), browserConnection );
if ( dialog.open() == AttributeDialog.OK )
{
String attribute = dialog.getAttribute();
attributes.add( attribute );
syncRepl.setAttributes( attributes.toArray( new String[0] ) );
attributesTableViewer.refresh();
attributesTableViewer.setSelection( new StructuredSelection( attribute ) );
}
}
/**
* Action launched when the edit attribute button is clicked.
*/
private void editAttributeButtonAction()
{
StructuredSelection selection = ( StructuredSelection ) attributesTableViewer.getSelection();
if ( !selection.isEmpty() )
{
String selectedAttribute = ( String ) selection.getFirstElement();
AttributeDialog dialog = new AttributeDialog( editAttributeButton.getShell(), browserConnection,
selectedAttribute );
if ( dialog.open() == AttributeDialog.OK )
{
String attribute = dialog.getAttribute();
int selectedAttributeIndex = attributes.indexOf( selectedAttribute );
attributes.remove( selectedAttributeIndex );
attributes.add( selectedAttributeIndex, attribute );
syncRepl.setAttributes( attributes.toArray( new String[0] ) );
attributesTableViewer.refresh();
attributesTableViewer.setSelection( new StructuredSelection( attribute ) );
}
}
}
/**
* Action launched when the delete attribute button is clicked.
*/
private void deleteAttributeButtonAction()
{
StructuredSelection selection = ( StructuredSelection ) attributesTableViewer.getSelection();
if ( !selection.isEmpty() )
{
String selectedAttribute = ( String ) selection.getFirstElement();
attributes.remove( selectedAttribute );
syncRepl.setAttributes( attributes.toArray( new String[0] ) );
attributesTableViewer.refresh();
// updateAttributesTableButtonsState();
}
}
/**
* Create a new button grid data.
*
* @return the new button grid data
*/
private GridData createNewButtonGridData()
{
GridData gd = new GridData( SWT.FILL, SWT.BEGINNING, false, false );
gd.widthHint = IDialogConstants.BUTTON_WIDTH;
return gd;
}
private void refreshUI()
{
if ( syncRepl != null )
{
removeListeners();
//
// Replication Consumer
//
// Replica ID
String replicaId = syncRepl.getRid();
if ( replicaId != null )
{
replicaIdText.setText( replicaId );
}
else
{
replicaIdText.setText( "" );
}
// Replication Type
Type replicationType = syncRepl.getType();
if ( replicationType != null )
{
replicationTypeComboViewer.setSelection( new StructuredSelection( replicationType ) );
}
else
{
replicationTypeComboViewer.setSelection( new StructuredSelection( Type.REFRESH_AND_PERSIST ) );
}
//
// Replication Provider Connection
//
// Provider
Provider provider = syncRepl.getProvider();
if ( provider != null )
{
// Provider Host
String providerHost = provider.getHost();
if ( providerHost != null )
{
hostText.setText( providerHost );
}
else
{
hostText.setText( "" );
}
// Provider Port
int providerPort = provider.getPort();
if ( providerPort != Provider.NO_PORT )
{
portText.setText( "" + providerPort );
}
else
{
portText.setText( "" );
}
// Encryption Type
boolean isLdaps = provider.isLdaps();
StartTls startTls = syncRepl.getStartTls();
if ( isLdaps && ( startTls == null ) )
{
// SSL Encryption (LDAPS)
encryptionMethodComboViewer.setSelection( new StructuredSelection(
EncryptionMethod.SSL_ENCRYPTION_LDAPS ) );
}
else if ( !isLdaps && ( startTls != null ) )
{
// Start TLS
encryptionMethodComboViewer.setSelection( new StructuredSelection(
EncryptionMethod.START_TLS_EXTENSION ) );
}
else
{
// No Encryption Type
encryptionMethodComboViewer
.setSelection( new StructuredSelection( EncryptionMethod.NO_ENCRYPTION ) );
}
}
else
{
hostText.setText( "" );
portText.setText( "" );
encryptionMethodComboViewer.setSelection( new StructuredSelection( EncryptionMethod.NO_ENCRYPTION ) );
}
//
// Authentication
//
BindMethod bindMethod = syncRepl.getBindMethod();
if ( ( bindMethod == null ) || ( bindMethod == BindMethod.SIMPLE ) )
{
// Simple Authentication
authenticationTabFolder.setSelection( SIMPLE_AUTHENTICATION_TAB_ITEM_INDEX );
// Bind DN
String bindDn = syncRepl.getBindDn();
if ( bindDn != null )
{
bindDnText.setText( bindDn );
}
else
{
bindDnText.setText( "" );
}
// Credentials
String credentials = syncRepl.getCredentials();
if ( credentials != null )
{
credentialsText.setText( credentials );
}
else
{
credentialsText.setText( "" );
}
// SASL Authentication Label
saslAuthenticationLabel.setText( getSaslAuthenticationLabelText() );
}
else
{
// SASL Authentication
authenticationTabFolder.setSelection( SASL_AUTHENTICATION_TAB_ITEM_INDEX );
// SASL Authentication Label
saslAuthenticationLabel.setText( getSaslAuthenticationLabelText() );
saslAuthenticationLabel.update();
// Simple Authentication fields
bindDnText.setText( "" );
credentialsText.setText( "" );
}
//
// Replication Data Configuration
//
// Search Base DN
String searchBaseDn = syncRepl.getSearchBase();
if ( searchBaseDn != null )
{
try
{
searchBaseDnEntryWidget.setInput( browserConnection, new Dn( searchBaseDn ) );
}
catch ( LdapInvalidDnException e )
{
// Silent
searchBaseDnEntryWidget.setInput( browserConnection, Dn.EMPTY_DN );
}
}
else
{
searchBaseDnEntryWidget.setInput( browserConnection, Dn.EMPTY_DN );
}
// Filter
String filter = syncRepl.getFilter();
if ( filter != null )
{
filterWidget.setFilter( filter );
}
else
{
filterWidget.setFilter( "" );
}
// Scope
Scope scope = syncRepl.getScope();
if ( scope != null )
{
scopeComboViewer.setSelection( new StructuredSelection( scope ) );
}
else
{
scopeComboViewer.setSelection( new StructuredSelection( Scope.SUB ) );
}
// Attributes
String[] attributes = syncRepl.getAttributes();
this.attributes.clear();
if ( attributes != null )
{
this.attributes.addAll( Arrays.asList( attributes ) );
attributesTableViewer.refresh();
}
// Attributes Only
attributesOnlyCheckbox.setSelection( syncRepl.isAttrsOnly() );
addListeners();
}
}
/**
* Gets the SASL authentication label text.
*
* @return the text for the SASL authentication label
*/
private String getSaslAuthenticationLabelText()
{
// SASL Mechanism
String saslMechanismString = syncRepl.getSaslMech();
String saslMechanismTitle = "(none)";
try
{
SaslMechanism saslMechanism = SaslMechanism.parse( saslMechanismString );
saslMechanismTitle = saslMechanism.getTitle();
}
catch ( ParseException e )
{
// Silent
}
// Authentication ID
String authenticationId = syncRepl.getAuthcid();
if ( ( authenticationId != null ) && ( !"".equals( authenticationId ) ) )
{
return NLS.bind( "Authentication ID is ''{0}'', with ''{1}'' SASL mechanism.", authenticationId,
saslMechanismTitle );
}
// Authorization ID
String authorizationId = syncRepl.getAuthzid();
if ( ( authorizationId != null ) && ( !"".equals( authorizationId ) ) )
{
return NLS.bind( "Authorization ID is ''{0}'', with ''{1}'' SASL mechanism.", authorizationId,
saslMechanismTitle );
}
return "SASL Authentication isn't configured.";
}
/**
* Gets the replication type.
*
* @return the replication type
*/
private Type getReplicationType()
{
StructuredSelection selection = ( StructuredSelection ) replicationTypeComboViewer.getSelection();
if ( ( selection != null ) && ( !selection.isEmpty() ) )
{
return ( Type ) selection.getFirstElement();
}
return null;
}
/**
* Gets the provider.
*
* @return the provider
*/
private Provider getProvider()
{
Provider provider = new Provider();
// Host
String host = hostText.getText();
if ( ( host != null ) && ( !"".equals( host ) ) )
{
provider.setHost( host );
}
else
{
provider.setHost( null );
}
// Port
String portString = portText.getText();
if ( ( host != null ) && ( !"".equals( host ) ) )
{
try
{
provider.setPort( Integer.parseInt( portString ) );
}
catch ( NumberFormatException e )
{
// Silent
provider.setPort( Provider.NO_PORT );
}
}
else
{
provider.setPort( Provider.NO_PORT );
}
// Encryption Type
provider.setLdaps( EncryptionMethod.SSL_ENCRYPTION_LDAPS == getEncryptionMethod() );
return provider;
}
/**
* Gets the encryption method.
*
* @return the encryption method
*/
private EncryptionMethod getEncryptionMethod()
{
StructuredSelection selection = ( StructuredSelection ) encryptionMethodComboViewer.getSelection();
if ( ( selection != null ) && ( !selection.isEmpty() ) )
{
return ( EncryptionMethod ) selection.getFirstElement();
}
return null;
}
/**
* Gets the scope.
*
* @return the scope
*/
private Scope getScope()
{
StructuredSelection selection = ( StructuredSelection ) scopeComboViewer.getSelection();
if ( ( selection != null ) && ( !selection.isEmpty() ) )
{
return ( Scope ) selection.getFirstElement();
}
return null;
}
/**
* Adds listeners.
*/
private void addListeners()
{
replicaIdText.addModifyListener( replicatIdTextListener );
replicaIdText.addVerifyListener( integerVerifyListener );
replicationTypeComboViewer.addSelectionChangedListener( replicationTypeComboViewerListener );
configureReplicationButton.addSelectionListener( configureReplicationButtonListener );
hostText.addModifyListener( hostTextListener );
portText.addModifyListener( portTextListener );
portText.addVerifyListener( integerVerifyListener );
encryptionMethodComboViewer.addSelectionChangedListener( encryptionMethodComboViewerListener );
configureStartTlsButton.addSelectionListener( configureStartTlsButtonListener );
authenticationTabFolder.addSelectionListener( authenticationTabFolderListener );
bindDnText.addModifyListener( bindDnTextListener );
credentialsText.addModifyListener( credentialsTextListener );
showCredentialsCheckbox.addSelectionListener( showCredentialsCheckboxListener );
configureSaslAuthenticationButton.addSelectionListener( configureSaslAuthenticationButtonListener );
searchBaseDnEntryWidget.addWidgetModifyListener( searchBaseDnEntryWidgetListener );
filterWidget.addWidgetModifyListener( filterWidgetListener );
scopeComboViewer.addSelectionChangedListener( scopeComboViewerListener );
attributesTableViewer.addSelectionChangedListener( attributesTableViewerSelectionChangedListener );
attributesTableViewer.addDoubleClickListener( attributesTableViewerDoubleClickListener );
addAttributeButton.addSelectionListener( addAttributeButtonListener );
editAttributeButton.addSelectionListener( editAttributeButtonListener );
deleteAttributeButton.addSelectionListener( deleteAttributeButtonListener );
attributesOnlyCheckbox.addSelectionListener( attributesOnlyCheckboxListener );
}
/**
* Removes listeners.
*/
private void removeListeners()
{
replicaIdText.removeModifyListener( replicatIdTextListener );
replicaIdText.removeVerifyListener( integerVerifyListener );
replicationTypeComboViewer.removeSelectionChangedListener( replicationTypeComboViewerListener );
configureReplicationButton.removeSelectionListener( configureReplicationButtonListener );
hostText.removeModifyListener( hostTextListener );
portText.removeModifyListener( portTextListener );
portText.removeVerifyListener( integerVerifyListener );
encryptionMethodComboViewer.removeSelectionChangedListener( encryptionMethodComboViewerListener );
configureStartTlsButton.removeSelectionListener( configureStartTlsButtonListener );
authenticationTabFolder.removeSelectionListener( authenticationTabFolderListener );
bindDnText.removeModifyListener( bindDnTextListener );
credentialsText.removeModifyListener( credentialsTextListener );
showCredentialsCheckbox.removeSelectionListener( showCredentialsCheckboxListener );
configureSaslAuthenticationButton.removeSelectionListener( configureSaslAuthenticationButtonListener );
searchBaseDnEntryWidget.removeWidgetModifyListener( searchBaseDnEntryWidgetListener );
filterWidget.removeWidgetModifyListener( filterWidgetListener );
scopeComboViewer.removeSelectionChangedListener( scopeComboViewerListener );
attributesTableViewer.removeSelectionChangedListener( attributesTableViewerSelectionChangedListener );
attributesTableViewer.removeDoubleClickListener( attributesTableViewerDoubleClickListener );
addAttributeButton.removeSelectionListener( addAttributeButtonListener );
editAttributeButton.removeSelectionListener( editAttributeButtonListener );
deleteAttributeButton.removeSelectionListener( deleteAttributeButtonListener );
attributesOnlyCheckbox.removeSelectionListener( attributesOnlyCheckboxListener );
}
/**
* Updates the OK button 'enable' state.
*/
private void updateOkButtonEnableState()
{
// Replica ID
String replicaId = replicaIdText.getText();
if ( ( replicaId == null ) || "".equals( replicaId ) )
{
okButton.setEnabled( false );
return;
}
// Host
String host = hostText.getText();
if ( ( host == null ) || "".equals( host ) )
{
okButton.setEnabled( false );
return;
}
// Search Base DN
Dn searchBaseDn = searchBaseDnEntryWidget.getDn();
if ( ( searchBaseDn == null ) || Dn.EMPTY_DN.equals( searchBaseDn ) )
{
// TODO add another check
// The Search Base DN must be within the database naming context
okButton.setEnabled( false );
return;
}
okButton.setEnabled( true );
}
/**
* Gets the SyncRepl value.
*
* @return the SyncRepl value
*/
public SyncRepl getSyncRepl()
{
return syncRepl;
}
/**
* Enum used for the Encryption Method selected by the user.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
private enum EncryptionMethod
{
NO_ENCRYPTION,
SSL_ENCRYPTION_LDAPS,
START_TLS_EXTENSION
}
}