/* * 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.databases; import java.util.ArrayList; import java.util.List; import org.apache.directory.api.util.Strings; import org.apache.directory.studio.common.ui.CommonUIConstants; import org.apache.directory.studio.common.ui.widgets.BaseWidgetUtils; import org.apache.directory.studio.common.ui.widgets.TableWidget; import org.apache.directory.studio.common.ui.widgets.WidgetModifyEvent; import org.apache.directory.studio.common.ui.widgets.WidgetModifyListener; import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection; import org.apache.directory.studio.openldap.config.editor.wrappers.DbIndexDecorator; import org.apache.directory.studio.openldap.config.editor.wrappers.DbIndexWrapper; import org.apache.directory.studio.openldap.config.model.database.OlcMdbConfig; import org.apache.directory.studio.openldap.common.ui.widgets.BooleanWithDefaultWidget; import org.apache.directory.studio.openldap.common.ui.widgets.DirectoryBrowserWidget; import org.apache.directory.studio.openldap.common.ui.widgets.UnixPermissionsWidget; import org.eclipse.jface.resource.FontDescriptor; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.Section; /** * This class implements a block for Memory-Mapped DB Specific Details. The GUI will * look like : * * <pre> * .--------------------------------------------------------------------. * | Database Specific Settings | * +--------------------------------------------------------------------+ * | .----------------------------------------------------------------. | * | |v MDB Configuration | | * | +----------------------------------------------------------------+ | * | | Directory : [////////////////////////////[v] (Browse) | | * | | Mode : [--------(0000) ] (Edit Permissions) | | * | +----------------------------------------------------------------+ | * | | * | v Database indices | * | +----------------------------------------------+ | * | | indice 1 | (Add) | * | | indice 2 | (Edit) | * | | ... | (Delete) | * | +----------------------------------------------+ | * | | * | v Database Limits | * | Maximum Readers : [ ] | * | Maximum Size : [ ] | * | Maximum Entry Size : [ ] | (2.4.41) * | Search Stack Depth : [ ] | * | Checkpoint Interval : [ ] | * | | * | v Database Options | * | Disable Synchronous Database Writes : [----------] | * | Environment Flags : | (2.4.33) * | +----------------------------------------------+ | * | | Flag 1 | (Add) | * | | Flag 2 | (Edit) | * | | ... | (Delete) | * | +----------------------------------------------+ | * +--------------------------------------------------------------------+ * </pre> * * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> */ public class MdbDatabaseSpecificDetailsBlock extends AbstractDatabaseSpecificDetailsBlock<OlcMdbConfig> { // UI Widgets /** The olcDbDirectory attribute (String) */ private DirectoryBrowserWidget directoryBrowserWidget; /** The olcDbCheckpoint attribute (String) */ private Text checkpointText; /** The olcDbEnvFlags attribute (String, multi-values) */ private Text envFlagsText; /** The olcDbIndex attribute (String, multi-values) */ private TableWidget<DbIndexWrapper> indicesWidget; /** The olcMaxEntrySize attribute (Integer) No yet available (2.4.41) */ private Text maxEntrySizeText; /** The olcDbMaxReaders attribute (Integer) */ private Text maxReadersText; /** The olcMaxSize attribute (Long) */ private Text maxSizeText; /** The olcDbMode attribute (String) */ private UnixPermissionsWidget modeUnixPermissionsWidget; /** The olcDbNoSync attribute (Boolean) */ private BooleanWithDefaultWidget disableSynchronousDatabaseWritesBooleanWithDefaultWidget; /** The olcDbSearchStack attribute( Integer) */ private Text searchStackDepthText; /** * The olcAllows listener */ private WidgetModifyListener indexesListener = new WidgetModifyListener() { public void widgetModified( WidgetModifyEvent e ) { List<String> indices = new ArrayList<String>(); for ( DbIndexWrapper dbIndex : indicesWidget.getElements() ) { indices.add( dbIndex.toString() ); } database.setOlcDbIndex( indices ); } }; /** * Creates a new instance of MdbDatabaseSpecificDetailsBlock. * * @param databaseDetailsPage the database details page * @param database the database * @param browserConnection the connection */ public MdbDatabaseSpecificDetailsBlock( DatabasesDetailsPage detailsPage, OlcMdbConfig database, IBrowserConnection browserConnection ) { super( detailsPage, database, browserConnection ); } /** * {@inheritDoc} */ public Composite createBlockContent( Composite parent, FormToolkit toolkit ) { // Composite Composite composite = toolkit.createComposite( parent ); composite.setLayout( new GridLayout() ); composite.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) ); createDatabaseConfigurationSection( composite, toolkit ); createDatabaseIndexesSection( composite, toolkit ); createDatabaseLimitsSection( composite, toolkit ); createDatabaseOptionsSection( composite, toolkit ); return composite; } /** * Creates the database configuration section. We manage the following configuration elements : * <ul> * <li>Directory : the directory on disk where the file will be stored</li> * <li>mode : the file mode for this directory</li> * </ul> * It covers the following attributes : * <ul> * <li>olcDbDirectory</li> * <li>olcDbMode</li> * </ul> * * <pre> * .------------------------------------------------------------------. * |v MDB Configuration | * +------------------------------------------------------------------+ * | Directory : [///////////////////////////////] (Browse) | * | Mode : [///////////////////////////////] (Edit Permissions) | * +------------------------------------------------------------------+ * </pre * @param parent the parent composite * @param toolkit the toolkit */ private void createDatabaseConfigurationSection( Composite parent, FormToolkit toolkit ) { // Database Configuration Section Section databaseConfigurationSection = toolkit.createSection( parent, Section.TWISTIE ); databaseConfigurationSection.setText( Messages.getString( "OpenLDAPMDBConfiguration.Section" ) ); databaseConfigurationSection.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) ); Composite databaseConfigurationComposite = toolkit.createComposite( databaseConfigurationSection ); toolkit.paintBordersFor( databaseConfigurationComposite ); databaseConfigurationComposite.setLayout( new GridLayout( 2, false ) ); databaseConfigurationSection.setClient( databaseConfigurationComposite ); // Directory Text. This is a MUST attribute (it will be red and bold) Label olcDirectory = toolkit.createLabel( databaseConfigurationComposite, Messages.getString( "OpenLDAPMDBConfiguration.Directory" ) ); olcDirectory.setForeground( CommonUIConstants.RED_COLOR ); FontDescriptor boldDescriptor = FontDescriptor.createFrom( olcDirectory.getFont() ).setStyle( SWT.BOLD ); Font boldFont = boldDescriptor.createFont( olcDirectory.getDisplay() ); olcDirectory.setFont( boldFont ); Composite directoryComposite = toolkit.createComposite( databaseConfigurationComposite ); GridLayout directoryCompositeGridLayout = new GridLayout( 2, false ); directoryCompositeGridLayout.marginHeight = directoryCompositeGridLayout.marginWidth = 0; directoryCompositeGridLayout.verticalSpacing = 0; directoryComposite.setLayout( directoryCompositeGridLayout ); directoryComposite.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) ); directoryBrowserWidget = new DirectoryBrowserWidget( "" ); directoryBrowserWidget.createWidget( directoryComposite, toolkit ); // Mode Text toolkit.createLabel( databaseConfigurationComposite, Messages.getString( "OpenLDAPMDBConfiguration.Mode" ) ); modeUnixPermissionsWidget = new UnixPermissionsWidget(); modeUnixPermissionsWidget.create( databaseConfigurationComposite, toolkit ); modeUnixPermissionsWidget.getControl().setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) ); } /** * Creates the database indexes section. * It covers the following attribute : * <ul> * <li>olcDbIndex</li> * </ul> * * @param parent the parent composite * @param toolkit the toolkit */ private void createDatabaseIndexesSection( Composite parent, FormToolkit toolkit ) { // Database Indices Section Section databaseIndexesSection = toolkit.createSection( parent, Section.TWISTIE ); databaseIndexesSection.setText( Messages.getString( "OpenLDAPMDBConfiguration.IndicesSection" ) ); databaseIndexesSection.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) ); Composite databaseIndexesComposite = toolkit.createComposite( databaseIndexesSection ); toolkit.paintBordersFor( databaseIndexesComposite ); databaseIndexesComposite.setLayout( new GridLayout( 2, false ) ); databaseIndexesSection.setClient( databaseIndexesComposite ); // Indices Widget indicesWidget = new TableWidget<DbIndexWrapper>( new DbIndexDecorator( null, browserConnection ) ); indicesWidget.createWidgetWithEdit( databaseIndexesComposite, toolkit ); indicesWidget.getControl().setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false, 2, 1 ) ); indicesWidget.addWidgetModifyListener( indexesListener ); } /** * Creates the database limits section. * It covers the following attributes : * <ul> * <li>olcDbCheckpoint</li> * <li>olcDbMaxEntrySize (for OpenLDAP 2.4.41)</li> * <li>olcDbMaxReaders</li> * <li>olcDbMaxSize</li> * <li>olcDbSearchStack</li> * </ul> * * @param parent the parent composite * @param toolkit the toolkit */ private void createDatabaseLimitsSection( Composite parent, FormToolkit toolkit ) { // Database Limits Section Section databaseLimitsSection = toolkit.createSection( parent, Section.TWISTIE ); databaseLimitsSection.setText( "Database Limits" ); databaseLimitsSection.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) ); Composite databaseLimitsComposite = toolkit.createComposite( databaseLimitsSection ); toolkit.paintBordersFor( databaseLimitsComposite ); databaseLimitsComposite.setLayout( new GridLayout( 2, false ) ); databaseLimitsSection.setClient( databaseLimitsComposite ); // Max Readers Text toolkit.createLabel( databaseLimitsComposite, "Maximum Readers:" ); maxReadersText = BaseWidgetUtils.createIntegerText( toolkit, databaseLimitsComposite ); maxReadersText.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) ); // Max Size Text toolkit.createLabel( databaseLimitsComposite, "Maximum Size:" ); maxSizeText = BaseWidgetUtils.createIntegerText( toolkit, databaseLimitsComposite ); maxSizeText.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) ); if ( browserConnection.getSchema().hasAttributeTypeDescription( "olcDbMaxEntrySize" ) ) { // Max Entry Size Text toolkit.createLabel( databaseLimitsComposite, "Maximum Entry Size:" ); maxEntrySizeText = BaseWidgetUtils.createIntegerText( toolkit, databaseLimitsComposite ); maxEntrySizeText.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) ); } // Search Stack Depth Text toolkit.createLabel( databaseLimitsComposite, "Search Stack Depth:" ); searchStackDepthText = BaseWidgetUtils.createIntegerText( toolkit, databaseLimitsComposite ); searchStackDepthText.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) ); // Checkpoint Text toolkit.createLabel( databaseLimitsComposite, "Checkpoint Interval:" ); checkpointText = toolkit.createText( databaseLimitsComposite, "" ); checkpointText.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) ); } /** * Creates the database options section. * It covers the following attributes : * <ul> * <li>olcDbNoSync</li> * <li>olcDbEnvFlags (for OpenLDAP 2.4.33)</li> * </ul> * * @param parent the parent composite * @param toolkit the toolkit */ private void createDatabaseOptionsSection( Composite parent, FormToolkit toolkit ) { // Database Options Section Section databaseOptionsSection = toolkit.createSection( parent, Section.TWISTIE ); databaseOptionsSection.setText( "Database Options" ); databaseOptionsSection.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) ); Composite databaseOptionsComposite = toolkit.createComposite( databaseOptionsSection ); toolkit.paintBordersFor( databaseOptionsComposite ); databaseOptionsComposite.setLayout( new GridLayout( 2, false ) ); databaseOptionsSection.setClient( databaseOptionsComposite ); // Disable Synchronous Database Writes Widget toolkit.createLabel( databaseOptionsComposite, "Disable Synchronous Database Writes:" ); disableSynchronousDatabaseWritesBooleanWithDefaultWidget = new BooleanWithDefaultWidget( false ); disableSynchronousDatabaseWritesBooleanWithDefaultWidget.create( databaseOptionsComposite, toolkit ); disableSynchronousDatabaseWritesBooleanWithDefaultWidget.getControl().setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) ); // Env flags here... } /** * {@inheritDoc} */ public void refresh() { removeListeners(); if ( database != null ) { // Directory Text String directory = database.getOlcDbDirectory(); directoryBrowserWidget.setDirectoryPath( ( directory == null ) ? "" : directory ); // Mode Text String mode = database.getOlcDbMode(); modeUnixPermissionsWidget.setValue( mode ); // Indices Text List<DbIndexWrapper> dbIndexWrappers = new ArrayList<DbIndexWrapper>(); for ( String index : database.getOlcDbIndex() ) { dbIndexWrappers.add( new DbIndexWrapper( index ) ); } indicesWidget.setElements( dbIndexWrappers ); // Max Readers Text Integer maxReaders = database.getOlcDbMaxReaders(); maxReadersText.setText( ( maxReaders == null ) ? "" : maxReaders.toString() ); //$NON-NLS-1$ // Max Size Text Long maxSize = database.getOlcDbMaxSize(); maxSizeText.setText( ( maxSize == null ) ? "" : maxSize.toString() ); //$NON-NLS-1$ // Search Stack Depth Text Integer searchStackDepth = database.getOlcDbSearchStack(); searchStackDepthText.setText( ( searchStackDepth == null ) ? "" : searchStackDepth.toString() ); //$NON-NLS-1$ // Checkpoint Text String checkpoint = database.getOlcDbCheckpoint(); checkpointText.setText( ( checkpoint == null ) ? "" : checkpoint ); //$NON-NLS-1$ // Disable Synchronous Database Writes Widget disableSynchronousDatabaseWritesBooleanWithDefaultWidget.setValue( database.getOlcDbNoSync() ); // MaxEntrySize Text if ( browserConnection.getSchema().hasAttributeTypeDescription( "olcDbMaxEntrySize" ) ) { // Max Entry Size Text Integer maxEntrySize = database.getOlcDbMaxEntrySize(); if ( maxEntrySize != null ) { maxEntrySizeText.setText( maxEntrySize.toString() ); } } } addListeners(); } /** * Adds the listeners. */ private void addListeners() { directoryBrowserWidget.addWidgetModifyListener( dirtyWidgetModifyListener ); modeUnixPermissionsWidget.addWidgetModifyListener( dirtyWidgetModifyListener ); indicesWidget.addWidgetModifyListener( dirtyWidgetModifyListener ); maxReadersText.addModifyListener( dirtyModifyListener ); maxSizeText.addModifyListener( dirtyModifyListener ); if ( browserConnection.getSchema().hasAttributeTypeDescription( "olcDbMaxEntrySize" ) ) { maxEntrySizeText.addModifyListener( dirtyModifyListener ); } searchStackDepthText.addModifyListener( dirtyModifyListener ); checkpointText.addModifyListener( dirtyModifyListener ); disableSynchronousDatabaseWritesBooleanWithDefaultWidget.addWidgetModifyListener( dirtyWidgetModifyListener ); } /** * Removes the listeners */ private void removeListeners() { directoryBrowserWidget.removeWidgetModifyListener( dirtyWidgetModifyListener ); modeUnixPermissionsWidget.removeWidgetModifyListener( dirtyWidgetModifyListener ); indicesWidget.removeWidgetModifyListener( dirtyWidgetModifyListener ); maxReadersText.removeModifyListener( dirtyModifyListener ); maxSizeText.removeModifyListener( dirtyModifyListener ); if ( browserConnection.getSchema().hasAttributeTypeDescription( "olcDbMaxEntrySize" ) ) { maxEntrySizeText.removeModifyListener( dirtyModifyListener ); } searchStackDepthText.removeModifyListener( dirtyModifyListener ); checkpointText.removeModifyListener( dirtyModifyListener ); disableSynchronousDatabaseWritesBooleanWithDefaultWidget.removeWidgetModifyListener( dirtyWidgetModifyListener ); } /** * {@inheritDoc} */ public void commit( boolean onSave ) { // Directory String directory = directoryBrowserWidget.getDirectoryPath(); if ( Strings.isEmpty( directory ) ) { database.setOlcDbDirectory( null ); } else { database.setOlcDbDirectory( directory ); } directoryBrowserWidget.saveDialogSettings(); // Mode database.setOlcDbMode( modeUnixPermissionsWidget.getValue() ); // Indices database.clearOlcDbIndex(); for ( DbIndexWrapper dbIndexWrapper : indicesWidget.getElements() ) { database.addOlcDbIndex( dbIndexWrapper.toString() ); } // Max readers try { database.setOlcDbMaxReaders( Integer.parseInt( maxReadersText.getText() ) ); } catch ( NumberFormatException e ) { database.setOlcDbMaxReaders( null ); } // Max Size try { database.setOlcDbMaxSize( Long.parseLong( maxSizeText.getText() ) ); } catch ( NumberFormatException e ) { database.setOlcDbMaxSize( null ); } // Max Entry Size if ( browserConnection.getSchema().hasAttributeTypeDescription( "olcDbMaxEntrySize" ) ) { try { database.setOlcDbMaxEntrySize( Integer.parseInt( maxEntrySizeText.getText() ) ); } catch ( NumberFormatException e ) { database.setOlcDbMaxEntrySize( null ); } } // Search Stack Depth try { database.setOlcDbSearchStack( Integer.parseInt( searchStackDepthText.getText() ) ); } catch ( NumberFormatException e ) { database.setOlcDbSearchStack( null ); } // Checkpoint Interval database.setOlcDbCheckpoint( checkpointText.getText() ); // Disable Synchronous Database Writes database.setOlcDbNoSync( disableSynchronousDatabaseWritesBooleanWithDefaultWidget.getValue() ); } }