/*
* 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.overlays;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.apache.directory.api.ldap.model.message.ResultCodeEnum;
import org.apache.directory.api.ldap.model.name.Dn;
import org.apache.directory.api.ldap.model.schema.AttributeType;
import org.apache.directory.api.ldap.model.schema.ObjectClass;
import org.apache.directory.studio.common.ui.widgets.BaseWidgetUtils;
import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.apache.directory.studio.openldap.common.ui.widgets.EntryWidget;
import org.apache.directory.studio.openldap.config.editor.dialogs.AbstractOverlayDialogConfigurationBlock;
import org.apache.directory.studio.openldap.config.editor.dialogs.OverlayDialog;
import org.apache.directory.studio.openldap.config.model.overlay.OlcMemberOf;
import org.apache.directory.studio.openldap.config.model.overlay.OlcMemberOfDanglingReferenceBehaviorEnum;
/**
* This class implements a block for the configuration of the Member Of overlay.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class MemberOfOverlayConfigurationBlock extends AbstractOverlayDialogConfigurationBlock<OlcMemberOf>
{
/** The connection's attribute types */
private List<String> connectionAttributeTypes;
/** The connection's objectClasses */
private List<String> connectionObjectClasses;
/** The list of result codes */
private List<ResultCodeEnum> resultCodes;
// UI widgets
private ComboViewer groupObjectClassComboViewer;
private ComboViewer groupAttributeTypeComboViewer;
private ComboViewer entryAttributeTypeComboViewer;
private EntryWidget modifierNameEntryWidget;
private ComboViewer danglingReferenceBehaviorComboViewer;
private ComboViewer danglingReferenceErrorCodeComboViewer;
private Button maintianReferentialIntegrityCheckbox;
/**
* Creates a new instance of MemberOfOverlayConfigurationBlock.
*
* @param dialog the dialog
* @param browserConnection the connection
*/
public MemberOfOverlayConfigurationBlock( OverlayDialog dialog, IBrowserConnection browserConnection )
{
super( dialog, browserConnection );
setOverlay( new OlcMemberOf() );
init();
}
/**
* Creates a new instance of MemberOfOverlayConfigurationBlock.
*
* @param dialog the dialog
* @param browserConnection the connection
* @param overlay the overlay
*/
public MemberOfOverlayConfigurationBlock( OverlayDialog dialog, IBrowserConnection browserConnection,
OlcMemberOf overlay )
{
super( dialog, browserConnection );
if ( overlay == null )
{
overlay = new OlcMemberOf();
}
setOverlay( overlay );
init();
}
/**
* Initializes the list of attribute types and object class.
*/
private void init()
{
initAttributeTypesAndObjectClassesLists();
initResultCodesList();
}
/**
* Initializes the lists of attribute types and object classes.
*/
private void initAttributeTypesAndObjectClassesLists()
{
connectionAttributeTypes = new ArrayList<String>();
connectionObjectClasses = new ArrayList<String>();
if ( browserConnection != null )
{
// Attribute Types
Collection<AttributeType> atds = browserConnection.getSchema().getAttributeTypeDescriptions();
for ( AttributeType atd : atds )
{
for ( String name : atd.getNames() )
{
connectionAttributeTypes.add( name );
}
}
// Object Classes
Collection<ObjectClass> ocds = browserConnection.getSchema().getObjectClassDescriptions();
for ( ObjectClass ocd : ocds )
{
for ( String name : ocd.getNames() )
{
connectionObjectClasses.add( name );
}
}
// Creating a case insensitive comparator
Comparator<String> ignoreCaseComparator = new Comparator<String>()
{
public int compare( String o1, String o2 )
{
return o1.compareToIgnoreCase( o2 );
}
};
// Sorting the lists
Collections.sort( connectionAttributeTypes, ignoreCaseComparator );
Collections.sort( connectionObjectClasses, ignoreCaseComparator );
}
}
/**
* Initializes the list of result codes.
*/
private void initResultCodesList()
{
// Initializing the list
resultCodes = new ArrayList<ResultCodeEnum>();
// Adding all result codes to the list
resultCodes.add( ResultCodeEnum.SUCCESS );
resultCodes.add( ResultCodeEnum.PARTIAL_RESULTS );
resultCodes.add( ResultCodeEnum.COMPARE_FALSE );
resultCodes.add( ResultCodeEnum.COMPARE_TRUE );
resultCodes.add( ResultCodeEnum.REFERRAL );
resultCodes.add( ResultCodeEnum.SASL_BIND_IN_PROGRESS );
resultCodes.add( ResultCodeEnum.AUTH_METHOD_NOT_SUPPORTED );
resultCodes.add( ResultCodeEnum.STRONG_AUTH_REQUIRED );
resultCodes.add( ResultCodeEnum.CONFIDENTIALITY_REQUIRED );
resultCodes.add( ResultCodeEnum.ALIAS_DEREFERENCING_PROBLEM );
resultCodes.add( ResultCodeEnum.INAPPROPRIATE_AUTHENTICATION );
resultCodes.add( ResultCodeEnum.INVALID_CREDENTIALS );
resultCodes.add( ResultCodeEnum.INSUFFICIENT_ACCESS_RIGHTS );
resultCodes.add( ResultCodeEnum.OPERATIONS_ERROR );
resultCodes.add( ResultCodeEnum.PROTOCOL_ERROR );
resultCodes.add( ResultCodeEnum.TIME_LIMIT_EXCEEDED );
resultCodes.add( ResultCodeEnum.SIZE_LIMIT_EXCEEDED );
resultCodes.add( ResultCodeEnum.ADMIN_LIMIT_EXCEEDED );
resultCodes.add( ResultCodeEnum.UNAVAILABLE_CRITICAL_EXTENSION );
resultCodes.add( ResultCodeEnum.BUSY );
resultCodes.add( ResultCodeEnum.UNAVAILABLE );
resultCodes.add( ResultCodeEnum.UNWILLING_TO_PERFORM );
resultCodes.add( ResultCodeEnum.LOOP_DETECT );
resultCodes.add( ResultCodeEnum.NO_SUCH_ATTRIBUTE );
resultCodes.add( ResultCodeEnum.UNDEFINED_ATTRIBUTE_TYPE );
resultCodes.add( ResultCodeEnum.INAPPROPRIATE_MATCHING );
resultCodes.add( ResultCodeEnum.CONSTRAINT_VIOLATION );
resultCodes.add( ResultCodeEnum.ATTRIBUTE_OR_VALUE_EXISTS );
resultCodes.add( ResultCodeEnum.INVALID_ATTRIBUTE_SYNTAX );
resultCodes.add( ResultCodeEnum.NO_SUCH_OBJECT );
resultCodes.add( ResultCodeEnum.ALIAS_PROBLEM );
resultCodes.add( ResultCodeEnum.INVALID_DN_SYNTAX );
resultCodes.add( ResultCodeEnum.NAMING_VIOLATION );
resultCodes.add( ResultCodeEnum.OBJECT_CLASS_VIOLATION );
resultCodes.add( ResultCodeEnum.NOT_ALLOWED_ON_NON_LEAF );
resultCodes.add( ResultCodeEnum.NOT_ALLOWED_ON_RDN );
resultCodes.add( ResultCodeEnum.ENTRY_ALREADY_EXISTS );
resultCodes.add( ResultCodeEnum.OBJECT_CLASS_MODS_PROHIBITED );
resultCodes.add( ResultCodeEnum.AFFECTS_MULTIPLE_DSAS );
resultCodes.add( ResultCodeEnum.OTHER );
resultCodes.add( ResultCodeEnum.CANCELED );
resultCodes.add( ResultCodeEnum.NO_SUCH_OPERATION );
resultCodes.add( ResultCodeEnum.TOO_LATE );
resultCodes.add( ResultCodeEnum.CANNOT_CANCEL );
resultCodes.add( ResultCodeEnum.UNKNOWN );
// Sorting the list
Collections.sort( resultCodes, new Comparator<ResultCodeEnum>()
{
public int compare( ResultCodeEnum o1, ResultCodeEnum o2 )
{
return Integer.compare( o1.getResultCode(), o2.getResultCode() );
}
} );
}
/**
* {@inheritDoc}
*/
public void createBlockContent( Composite parent )
{
Composite composite = BaseWidgetUtils.createColumnContainer( parent, 2, 1 );
// Group Object Class
BaseWidgetUtils.createLabel( composite, "Group Object Class:", 1 );
groupObjectClassComboViewer = new ComboViewer( new Combo( composite, SWT.DROP_DOWN ) );
groupObjectClassComboViewer.getControl().setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
groupObjectClassComboViewer.setContentProvider( new ArrayContentProvider() );
groupObjectClassComboViewer.setInput( connectionObjectClasses );
// Group Attribute Type
BaseWidgetUtils.createLabel( composite, "Group Attribute Type:", 1 );
groupAttributeTypeComboViewer = new ComboViewer( new Combo( composite, SWT.DROP_DOWN ) );
groupAttributeTypeComboViewer.getControl()
.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
groupAttributeTypeComboViewer.setContentProvider( new ArrayContentProvider() );
groupAttributeTypeComboViewer.setInput( connectionAttributeTypes );
// Entry Attribute Type
BaseWidgetUtils.createLabel( composite, "Entry Attribute Type:", 1 );
entryAttributeTypeComboViewer = new ComboViewer( new Combo( composite, SWT.DROP_DOWN ) );
entryAttributeTypeComboViewer.getControl()
.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
entryAttributeTypeComboViewer.setContentProvider( new ArrayContentProvider() );
entryAttributeTypeComboViewer.setInput( connectionAttributeTypes );
// Modifier Name
BaseWidgetUtils.createLabel( composite, "Modifier's Name:", 1 );
modifierNameEntryWidget = new EntryWidget( browserConnection );
modifierNameEntryWidget.createWidget( composite );
modifierNameEntryWidget.getControl().setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
// Dangling Reference Behavior
BaseWidgetUtils.createLabel( composite, "Dangling Ref. Behavior:", 1 );
danglingReferenceBehaviorComboViewer = new ComboViewer( composite );
danglingReferenceBehaviorComboViewer.getControl().setLayoutData(
new GridData( SWT.FILL, SWT.NONE, true, false ) );
danglingReferenceBehaviorComboViewer.setContentProvider( new ArrayContentProvider() );
danglingReferenceBehaviorComboViewer.setLabelProvider( new LabelProvider()
{
public String getText( Object element )
{
if ( element instanceof OlcMemberOfDanglingReferenceBehaviorEnum )
{
OlcMemberOfDanglingReferenceBehaviorEnum behavior = ( OlcMemberOfDanglingReferenceBehaviorEnum ) element;
switch ( behavior )
{
case IGNORE:
return "Ignore";
case DROP:
return "Drop";
case ERROR:
return "Error";
}
}
return super.getText( element );
};
} );
danglingReferenceBehaviorComboViewer.setInput( new OlcMemberOfDanglingReferenceBehaviorEnum[]
{
OlcMemberOfDanglingReferenceBehaviorEnum.IGNORE,
OlcMemberOfDanglingReferenceBehaviorEnum.DROP,
OlcMemberOfDanglingReferenceBehaviorEnum.ERROR
} );
// Dangling Reference Error Code
BaseWidgetUtils.createLabel( composite, "Dangling Ref. Error Code:", 1 );
danglingReferenceErrorCodeComboViewer = new ComboViewer( composite );
danglingReferenceErrorCodeComboViewer.getControl().setLayoutData(
new GridData( SWT.FILL, SWT.NONE, true, false ) );
danglingReferenceErrorCodeComboViewer.setContentProvider( new ArrayContentProvider() );
danglingReferenceErrorCodeComboViewer.setLabelProvider( new LabelProvider()
{
public String getText( Object element )
{
if ( element instanceof ResultCodeEnum )
{
ResultCodeEnum resultCode = ( ResultCodeEnum ) element;
return NLS.bind( "{0} ({1})", new Object[]
{ resultCode.getResultCode(), resultCode.getMessage() } );
}
return super.getText( element );
};
} );
danglingReferenceErrorCodeComboViewer.setInput( resultCodes );
// Maintain Referential Integrity
maintianReferentialIntegrityCheckbox = BaseWidgetUtils.createCheckbox( composite,
"Maintain Referential Integrity", 2 );
}
/**
* {@inheritDoc}
*/
public void refresh()
{
if ( overlay != null )
{
// Group Object Class
setComboViewerText( groupObjectClassComboViewer, overlay.getOlcMemberOfGroupOC() );
// Group Attribute Type
setComboViewerText( groupAttributeTypeComboViewer, overlay.getOlcMemberOfMemberAD() );
// Entry Attribute Type
setComboViewerText( entryAttributeTypeComboViewer, overlay.getOlcMemberOfMemberOfAD() );
// Modifier Name
Dn modifierName = overlay.getOlcMemberOfDN();
if ( modifierName != null )
{
modifierNameEntryWidget.setInput( modifierName );
}
else
{
modifierNameEntryWidget.setInput( Dn.EMPTY_DN );
}
// Dangling Reference Behavior
String danglingReferenceBehaviorString = overlay.getOlcMemberOfDangling();
if ( danglingReferenceBehaviorString != null )
{
OlcMemberOfDanglingReferenceBehaviorEnum danglingReferenceBehavior = OlcMemberOfDanglingReferenceBehaviorEnum
.fromString( danglingReferenceBehaviorString );
if ( danglingReferenceBehavior != null )
{
danglingReferenceBehaviorComboViewer.setSelection( new StructuredSelection(
danglingReferenceBehavior ) );
}
else
{
danglingReferenceBehaviorComboViewer.setSelection( new StructuredSelection(
OlcMemberOfDanglingReferenceBehaviorEnum.IGNORE ) );
}
}
else
{
danglingReferenceBehaviorComboViewer.setSelection( new StructuredSelection(
OlcMemberOfDanglingReferenceBehaviorEnum.IGNORE ) );
}
// Dangling Reference Error Code
String danglingReferenceErrorCode = overlay.getOlcMemberOfDanglingError();
if ( danglingReferenceErrorCode != null )
{
try
{
// Getting the error code as a ResultCodeEnum value
ResultCodeEnum resultCode = ResultCodeEnum.getResultCode( Integer
.parseInt( danglingReferenceErrorCode ) );
danglingReferenceErrorCodeComboViewer.setSelection( new StructuredSelection( resultCode ) );
}
catch ( NumberFormatException e )
{
// The error code is not an int value
danglingReferenceErrorCodeComboViewer.setSelection( new StructuredSelection(
ResultCodeEnum.CONSTRAINT_VIOLATION ) );
}
}
else
{
danglingReferenceErrorCodeComboViewer.setSelection( new StructuredSelection(
ResultCodeEnum.CONSTRAINT_VIOLATION ) );
}
// Maintain Referential Integrity
Boolean maintainReferentialIntegrity = overlay.getOlcMemberOfRefInt();
if ( maintainReferentialIntegrity != null )
{
maintianReferentialIntegrityCheckbox.setSelection( maintainReferentialIntegrity );
}
else
{
maintianReferentialIntegrityCheckbox.setSelection( false );
}
}
}
/**
* {@inheritDoc}
*/
public void save()
{
if ( overlay != null )
{
// Group Object Class
String groupObjectClass = getComboViewerText( groupObjectClassComboViewer );
if ( ( groupObjectClass != null ) && ( !groupObjectClass.isEmpty() ) )
{
overlay.setOlcMemberOfGroupOC( groupObjectClass );
}
else
{
overlay.setOlcMemberOfGroupOC( null );
}
// Group Attribute Type
String groupAttributeType = getComboViewerText( groupAttributeTypeComboViewer );
if ( ( groupAttributeType != null ) && ( !groupAttributeType.isEmpty() ) )
{
overlay.setOlcMemberOfMemberAD( groupAttributeType );
}
else
{
overlay.setOlcMemberOfMemberAD( null );
}
// Entry Attribute Type
String entryAttributeType = getComboViewerText( entryAttributeTypeComboViewer );
if ( ( entryAttributeType != null ) && ( !entryAttributeType.isEmpty() ) )
{
overlay.setOlcMemberOfMemberOfAD( entryAttributeType );
}
else
{
overlay.setOlcMemberOfMemberOfAD( null );
}
// Modifier Name
Dn modifierName = modifierNameEntryWidget.getDn();
if ( ( modifierName != null ) && ( !Dn.EMPTY_DN.equals( modifierName ) ) )
{
overlay.setOlcMemberOfDN( modifierName );
}
else
{
overlay.setOlcMemberOfDN( null );
}
// Dangling Reference Behavior
OlcMemberOfDanglingReferenceBehaviorEnum danglingReferenceBehavior = getSelectedDanglingReferenceBehavior();
if ( danglingReferenceBehavior != null )
{
overlay.setOlcMemberOfDangling( danglingReferenceBehavior.toString() );
}
else
{
overlay.setOlcMemberOfDangling( null );
}
// Dangling Reference Error Code
ResultCodeEnum danglingReferenceErrorCode = getSelectedDanglingReferenceErrorCode();
if ( ( danglingReferenceErrorCode != null )
&& ( !ResultCodeEnum.CONSTRAINT_VIOLATION.equals( danglingReferenceErrorCode ) ) )
{
overlay.setOlcMemberOfDanglingError( danglingReferenceErrorCode.getResultCode() + "" );
}
else
{
overlay.setOlcMemberOfDanglingError( null );
}
// Maintain Referential Integrity
overlay.setOlcMemberOfRefInt( maintianReferentialIntegrityCheckbox.getSelection() );
}
}
/**
* Gets the text selection of the combo viewer.
*
* @param viewer the viewer
* @return the text selection of the viewer
*/
private String getComboViewerText( ComboViewer viewer )
{
return viewer.getCombo().getText();
}
/**
* Sets the text selection of the combo viewer.
*
* @param viewer the viewer
* @param text the text
*/
private void setComboViewerText( ComboViewer viewer, String text )
{
if ( text != null )
{
viewer.getCombo().setText( text );
}
else
{
viewer.getCombo().setText( "" );
}
}
/**
* Gets the selected dangling reference behavior.
*
* @return the selected dangling reference behavior
*/
private OlcMemberOfDanglingReferenceBehaviorEnum getSelectedDanglingReferenceBehavior()
{
StructuredSelection selection = ( StructuredSelection ) danglingReferenceBehaviorComboViewer.getSelection();
if ( ( selection != null ) && ( !selection.isEmpty() ) )
{
Object firstElement = selection.getFirstElement();
if ( firstElement instanceof OlcMemberOfDanglingReferenceBehaviorEnum )
{
return ( OlcMemberOfDanglingReferenceBehaviorEnum ) firstElement;
}
else
{
return null;
}
}
return null;
}
/**
* Gets the selected dangling reference error code.
*
* @return the selected dangling reference error code
*/
private ResultCodeEnum getSelectedDanglingReferenceErrorCode()
{
StructuredSelection selection = ( StructuredSelection ) danglingReferenceErrorCodeComboViewer.getSelection();
if ( ( selection != null ) && ( !selection.isEmpty() ) )
{
Object firstElement = selection.getFirstElement();
if ( firstElement instanceof ResultCodeEnum )
{
return ( ResultCodeEnum ) firstElement;
}
else
{
return null;
}
}
return null;
}
}