You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by pa...@apache.org on 2011/12/22 09:43:13 UTC

svn commit: r1222102 - in /directory/studio/trunk/plugins/connection.ui: resources/icons/ src/main/java/org/apache/directory/studio/connection/ui/ src/main/java/org/apache/directory/studio/connection/ui/widgets/ src/main/java/org/apache/directory/studi...

Author: pamarcelot
Date: Thu Dec 22 08:43:12 2011
New Revision: 1222102

URL: http://svn.apache.org/viewvc?rev=1222102&view=rev
Log:
Fix for DIRSTUDIO-694 (Add ability to export certificates in the 'Certificate Validation' preference page)

Added:
    directory/studio/trunk/plugins/connection.ui/resources/icons/certificate_export_wizard.gif   (with props)
    directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/wizards/ExportCertificateWizard.java
    directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/wizards/ExportCertificateWizardPage.java
Modified:
    directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/ConnectionUIConstants.java
    directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/widgets/CertificateListComposite.java
    directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/widgets/messages.properties
    directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/widgets/messages_de.properties
    directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/widgets/messages_fr.properties
    directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/wizards/messages.properties
    directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/wizards/messages_de.properties
    directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/wizards/messages_fr.properties

Added: directory/studio/trunk/plugins/connection.ui/resources/icons/certificate_export_wizard.gif
URL: http://svn.apache.org/viewvc/directory/studio/trunk/plugins/connection.ui/resources/icons/certificate_export_wizard.gif?rev=1222102&view=auto
==============================================================================
Binary file - no diff available.

Propchange: directory/studio/trunk/plugins/connection.ui/resources/icons/certificate_export_wizard.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Modified: directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/ConnectionUIConstants.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/ConnectionUIConstants.java?rev=1222102&r1=1222101&r2=1222102&view=diff
==============================================================================
--- directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/ConnectionUIConstants.java (original)
+++ directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/ConnectionUIConstants.java Thu Dec 22 08:43:12 2011
@@ -93,6 +93,9 @@ public final class ConnectionUIConstants
     /** The collapse all image */
     public static final String IMG_COLLAPSEALL = "resources/icons/collapseall.gif"; //$NON-NLS-1$
 
+    /** The export certificate wizard image */
+    public static final String IMG_CERTIFICATE_EXPORT_WIZARD = "resources/icons/certificate_export_wizard.gif"; //$NON-NLS-1$
+
     public static final String TYPENAME = ConnectionUIPlugin.getDefault().getPluginProperties()
         .getString( "ConnectionTransfert_Typename" ); //$NON-NLS-1$
 

Modified: directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/widgets/CertificateListComposite.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/widgets/CertificateListComposite.java?rev=1222102&r1=1222101&r2=1222102&view=diff
==============================================================================
--- directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/widgets/CertificateListComposite.java (original)
+++ directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/widgets/CertificateListComposite.java Thu Dec 22 08:43:12 2011
@@ -34,6 +34,7 @@ import org.apache.directory.studio.conne
 import org.apache.directory.studio.connection.ui.ConnectionUIConstants;
 import org.apache.directory.studio.connection.ui.ConnectionUIPlugin;
 import org.apache.directory.studio.connection.ui.dialogs.CertificateInfoDialog;
+import org.apache.directory.studio.connection.ui.wizards.ExportCertificateWizard;
 import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.jface.viewers.DoubleClickEvent;
 import org.eclipse.jface.viewers.IDoubleClickListener;
@@ -45,6 +46,7 @@ import org.eclipse.jface.viewers.Selecti
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.wizard.WizardDialog;
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionAdapter;
@@ -71,6 +73,7 @@ public class CertificateListComposite ex
     private Button viewButton;
     private Button addButton;
     private Button removeButton;
+    private Button exportButton;
 
 
     /**
@@ -111,8 +114,9 @@ public class CertificateListComposite ex
         {
             public void selectionChanged( SelectionChangedEvent event )
             {
-                viewButton.setEnabled( !event.getSelection().isEmpty() );
+                viewButton.setEnabled( ( ( IStructuredSelection ) event.getSelection() ).size() == 1 );
                 removeButton.setEnabled( !event.getSelection().isEmpty() );
+                exportButton.setEnabled( ( ( IStructuredSelection ) event.getSelection() ).size() == 1 );
             }
         } );
         tableViewer.addDoubleClickListener( new IDoubleClickListener()
@@ -207,6 +211,21 @@ public class CertificateListComposite ex
                 tableViewer.refresh();
             }
         } );
+
+        exportButton = BaseWidgetUtils.createButton( buttonContainer, Messages
+            .getString( "CertificateListComposite.ExportButton" ), 1 ); //$NON-NLS-1$
+        exportButton.setEnabled( false );
+        exportButton.addSelectionListener( new SelectionAdapter()
+        {
+            public void widgetSelected( SelectionEvent e )
+            {
+                X509Certificate certificate = ( X509Certificate ) ( ( IStructuredSelection ) tableViewer.getSelection() )
+                    .getFirstElement();
+
+                WizardDialog dialog = new WizardDialog( getShell(), new ExportCertificateWizard( certificate ) );
+                dialog.open();
+            }
+        } );
     }
 
 

Modified: directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/widgets/messages.properties
URL: http://svn.apache.org/viewvc/directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/widgets/messages.properties?rev=1222102&r1=1222101&r2=1222102&view=diff
==============================================================================
--- directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/widgets/messages.properties (original)
+++ directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/widgets/messages.properties Thu Dec 22 08:43:12 2011
@@ -107,6 +107,7 @@ CertificateListComposite.UntitledCertifi
 CertificateListComposite.LoadCertificate        = Load Certificate
 CertificateListComposite.ErrorDialogTitle       = Error
 CertificateListComposite.ErrorDialogMessage     = An error occurred while adding the certificate: {0}
+CertificateListComposite.ExportButton 			= Export...
 
 NetworkParameterPage.CheckNetworkParameter        = Check Network Parameter
 NetworkParameterPage.ConnectionEstablished        = The connection was established successfully.

Modified: directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/widgets/messages_de.properties
URL: http://svn.apache.org/viewvc/directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/widgets/messages_de.properties?rev=1222102&r1=1222101&r2=1222102&view=diff
==============================================================================
--- directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/widgets/messages_de.properties (original)
+++ directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/widgets/messages_de.properties Thu Dec 22 08:43:12 2011
@@ -106,6 +106,7 @@ CertificateListComposite.UntitledCertifi
 CertificateInfoComposite.LoadCertificate        = Zertifikat laden
 CertificateInfoComposite.ErrorDialogTitle       = Fehler
 CertificateInfoComposite.ErrorDialogMessage     = TODO:An error occurred while adding the certificate: {0}
+CertificateListComposite.ExportButton 			= Exportieren...
 
 NetworkParameterPage.CheckNetworkParameter        = Netzwerkparameter \u00FCberpr\u00FCfen
 NetworkParameterPage.ConnectionEstablished        = Die Verbindung wurde erfolgreich aufgebaut.

Modified: directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/widgets/messages_fr.properties
URL: http://svn.apache.org/viewvc/directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/widgets/messages_fr.properties?rev=1222102&r1=1222101&r2=1222102&view=diff
==============================================================================
--- directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/widgets/messages_fr.properties (original)
+++ directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/widgets/messages_fr.properties Thu Dec 22 08:43:12 2011
@@ -105,6 +105,7 @@ CertificateListComposite.UntitledCertifi
 CertificateListComposite.LoadCertificate        = Charger un certificat
 CertificateListComposite.ErrorDialogTitle       = Erreur
 CertificateListComposite.ErrorDialogMessage     = Une erreur est survenue lors de l'ajout du certificat : {0}
+CertificateListComposite.ExportButton 			= Exporter...
 
 NetworkParameterPage.CheckNetworkParameter        = V\u00E9rifier les param\u00E8tres r\u00E9seau
 NetworkParameterPage.ConnectionEstablished        = La connexion a \u00E9t\u00E9 \u00E9tablie avec succ\u00E8s

Added: directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/wizards/ExportCertificateWizard.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/wizards/ExportCertificateWizard.java?rev=1222102&view=auto
==============================================================================
--- directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/wizards/ExportCertificateWizard.java (added)
+++ directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/wizards/ExportCertificateWizard.java Thu Dec 22 08:43:12 2011
@@ -0,0 +1,214 @@
+/*
+ *  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.connection.ui.wizards;
+
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.nio.charset.Charset;
+import java.security.cert.CertificateEncodingException;
+import java.security.cert.X509Certificate;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.io.FileUtils;
+import org.apache.directory.studio.connection.ui.wizards.ExportCertificateWizardPage.CertificateExportFormat;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.ui.IWorkbench;
+
+
+/**
+ * The ExportCertificateWizard is used to export a certificate.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class ExportCertificateWizard extends Wizard
+{
+    /** The certificate */
+    private X509Certificate certificate;
+
+    /** The wizard page */
+    private ExportCertificateWizardPage page;
+
+
+    /**
+     * Creates a new instance of ExportCertificateWizard.
+     * 
+     * @param certificate the certificate
+     */
+    public ExportCertificateWizard( X509Certificate certificate )
+    {
+        this.certificate = certificate;
+        setWindowTitle( Messages.getString( "ExportCertificateWizard.ExportCertificate" ) ); //$NON-NLS-1$
+        setNeedsProgressMonitor( false );
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public void init( IWorkbench workbench, IStructuredSelection selection )
+    {
+        // Nothing to do
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public void addPages()
+    {
+        page = new ExportCertificateWizardPage();
+        addPage( page );
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean performFinish()
+    {
+        // Getting the export format
+        CertificateExportFormat format = page.getCertificateExportFormat();
+
+        try
+        {
+            switch ( format )
+            {
+                case DER:
+                    return exportAsDerFormat();
+                case PEM:
+                    return exportAsPemFormat();
+            }
+        }
+        catch ( Exception e )
+        {
+            MessageDialog.openError( getShell(),
+                Messages.getString( "ExportCertificateWizard.ErrorDialogTitle" ), //$NON-NLS-1$
+                NLS.bind( Messages.getString( "ExportCertificateWizard.ErrorDialogMessage" ),
+                    e.getMessage() ) );
+            return false;
+        }
+
+        return false;
+    }
+
+
+    /**
+     * Exports the certificate as DER format.
+     *
+     * @return <code>true</code> if the export is successful
+     * @throws CertificateEncodingException
+     * @throws IOException
+     */
+    private boolean exportAsDerFormat() throws CertificateEncodingException, IOException
+    {
+        // Getting the export file
+        File exportFile = page.getExportFile();
+
+        // Exporting the certificate
+        FileUtils.writeByteArrayToFile( exportFile, certificate.getEncoded() );
+
+        return true;
+    }
+
+
+    /**
+     * Exports the certificate as PEM format.
+     *
+     * @return <code>true</code> if the export is successful
+     * @throws CertificateEncodingException
+     * @throws IOException
+     */
+    private boolean exportAsPemFormat() throws CertificateEncodingException, IOException
+    {
+        // Getting the export file
+        File exportFile = page.getExportFile();
+
+        // Exporting the certificate
+        FileOutputStream fos = new FileOutputStream( exportFile );
+        OutputStreamWriter osw = new OutputStreamWriter( fos, Charset.forName( "UTF-8" ) ); //$NON-NLS-1$
+        osw.write( "-----BEGIN CERTIFICATE-----\n" ); //$NON-NLS-1$
+        osw.write( stripLineToNChars( new String( Base64.encodeBase64( certificate.getEncoded() ),
+            Charset.forName( "UTF-8" ) ), 64 ) ); //$NON-NLS-1$
+        osw.write( "\n-----END CERTIFICATE-----\n" ); //$NON-NLS-1$
+        osw.flush();
+        fos.close();
+
+        return true;
+    }
+
+
+    /**
+     * Strips the String every n specified characters
+     * 
+     * @param str the string to strip
+     * @param nbChars the number of characters
+     * @return the stripped String
+     */
+    public static String stripLineToNChars( String str, int nbChars )
+    {
+        int strLength = str.length();
+
+        if ( strLength <= nbChars )
+        {
+            return str;
+        }
+
+        // We will first compute the new size of the result
+        // It's at least nbChars chars plus one for \n
+        int charsPerLine = nbChars;
+
+        int remaining = ( strLength - nbChars ) % charsPerLine;
+
+        int nbLines = 1 + ( ( strLength - nbChars ) / charsPerLine ) + ( remaining == 0 ? 0 : 1 );
+
+        int nbCharsTotal = strLength + nbLines + nbLines - 2;
+
+        char[] buffer = new char[nbCharsTotal];
+        char[] orig = str.toCharArray();
+
+        int posSrc = 0;
+        int posDst = 0;
+
+        System.arraycopy( orig, posSrc, buffer, posDst, nbChars );
+        posSrc += nbChars;
+        posDst += nbChars;
+
+        for ( int i = 0; i < nbLines - 2; i++ )
+        {
+            buffer[posDst++] = '\n';
+
+            System.arraycopy( orig, posSrc, buffer, posDst, charsPerLine );
+            posSrc += charsPerLine;
+            posDst += charsPerLine;
+        }
+
+        buffer[posDst++] = '\n';
+        System.arraycopy( orig, posSrc, buffer, posDst, remaining == 0 ? charsPerLine : remaining );
+
+        return new String( buffer );
+    }
+}

Added: directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/wizards/ExportCertificateWizardPage.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/wizards/ExportCertificateWizardPage.java?rev=1222102&view=auto
==============================================================================
--- directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/wizards/ExportCertificateWizardPage.java (added)
+++ directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/wizards/ExportCertificateWizardPage.java Thu Dec 22 08:43:12 2011
@@ -0,0 +1,274 @@
+/*
+ *  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.connection.ui.wizards;
+
+
+import java.io.File;
+
+import org.apache.directory.studio.common.ui.widgets.BaseWidgetUtils;
+import org.apache.directory.studio.connection.ui.ConnectionUIConstants;
+import org.apache.directory.studio.connection.ui.ConnectionUIPlugin;
+import org.eclipse.jface.dialogs.DialogPage;
+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.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+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.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+
+
+/**
+ * This class implements the Export Certificate wizard page.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class ExportCertificateWizardPage extends WizardPage
+{
+    // UI widgets
+    private Text fileText;
+    private Button browseButton;
+    private Button overwriteFileButton;
+    private ComboViewer formatComboViewer;
+
+
+    /**
+     * Creates a new instance of NewConnectionWizard.
+     * 
+     * @param page the page
+     * @param wizard the wizard
+     */
+    public ExportCertificateWizardPage()
+    {
+        super( "ExportCertificateWizardPage" );
+        setTitle( Messages.getString( "ExportCertificateWizardPage.ExportCertificate" ) ); //$NON-NLS-1$
+        setDescription( Messages.getString( "ExportCertificateWizardPage.PleaseSelectFileAndFormat" ) ); //$NON-NLS-1$ 
+        setImageDescriptor( ConnectionUIPlugin.getDefault().getImageDescriptor(
+            ConnectionUIConstants.IMG_CERTIFICATE_EXPORT_WIZARD ) );
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public void createControl( Composite parent )
+    {
+        // Creating the composite
+        Composite composite = BaseWidgetUtils.createColumnContainer( parent, 1, 1 );
+        composite.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
+
+        // Creating the file's group widget
+        Group fileGroup = BaseWidgetUtils.createGroup( composite,
+            Messages.getString( "ExportCertificateWizardPage.File" ), 1 ); //$NON-NLS-1$
+        fileGroup.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
+        Composite fileComposite = BaseWidgetUtils.createColumnContainer( fileGroup, 2, 1 );
+        fileComposite.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
+
+        // Creating the file's text widget
+        fileText = BaseWidgetUtils.createText( fileComposite, "", 1 );
+        fileText.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false ) );
+        fileText.addModifyListener( new ModifyListener()
+        {
+            public void modifyText( ModifyEvent e )
+            {
+                validate();
+            }
+        } );
+
+        // Creating the file's 'Browse' button widget
+        browseButton = BaseWidgetUtils.createButton( fileComposite,
+            Messages.getString( "ExportCertificateWizardPage.Browse" ), 1 ); //$NON-NLS-1$
+        browseButton.addSelectionListener( new SelectionAdapter()
+        {
+            /**
+             * {@inheritDoc}
+             */
+            public void widgetSelected( SelectionEvent e )
+            {
+                chooseExportFile();
+                validate();
+            }
+        } );
+
+        // Creating the file's 'Overwrite' button widget
+        overwriteFileButton = BaseWidgetUtils.createCheckbox( fileComposite,
+            Messages.getString( "ExportCertificateWizardPage.OverwriteExistingFile" ), 2 ); //$NON-NLS-1$
+        overwriteFileButton.addSelectionListener( new SelectionAdapter()
+        {
+            public void widgetSelected( SelectionEvent event )
+            {
+                validate();
+            }
+        } );
+
+        // Creating the format's group widget
+        Group formatGroup = BaseWidgetUtils.createGroup( composite,
+            Messages.getString( "ExportCertificateWizardPage.Format" ), 1 ); //$NON-NLS-1$
+        formatGroup.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
+
+        // Creating the format's combo viewer widget
+        formatComboViewer = new ComboViewer( formatGroup );
+        formatComboViewer.setContentProvider( new ArrayContentProvider() );
+        formatComboViewer.setLabelProvider( new LabelProvider()
+        {
+            public String getText( Object element )
+            {
+                if ( element instanceof CertificateExportFormat )
+                {
+                    CertificateExportFormat format = ( CertificateExportFormat ) element;
+
+                    switch ( format )
+                    {
+                        case DER:
+                            return "X509 Certificat DER";
+                        case PEM:
+                            return "X509 Certificat PEM";
+                    }
+                }
+
+                return super.getText( element );
+            }
+        } );
+        formatComboViewer.setInput( new CertificateExportFormat[]
+            { CertificateExportFormat.DER, CertificateExportFormat.PEM } );
+        formatComboViewer.setSelection( new StructuredSelection( CertificateExportFormat.DER ) );
+        formatComboViewer.getControl().setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
+
+        displayErrorMessage( null );
+        setPageComplete( false );
+
+        setControl( composite );
+    }
+
+
+    /**
+     * Validates the page.
+     */
+    private void validate()
+    {
+        File file = new File( fileText.getText() );
+        if ( file.isDirectory() )
+        {
+            displayErrorMessage( Messages.getString( "ExportCertificateWizardPage.ErrorFileNotAFile" ) ); //$NON-NLS-1$
+            return;
+        }
+        else if ( file.exists() && !overwriteFileButton.getSelection() )
+        {
+            displayErrorMessage( Messages.getString( "ExportCertificateWizardPage.ErrorFileAlreadyExists" ) ); //$NON-NLS-1$
+            return;
+        }
+        else if ( file.exists() && !file.canWrite() )
+        {
+            displayErrorMessage( Messages.getString( "ExportCertificateWizardPage.ErrorFileNotWritable" ) ); //$NON-NLS-1$
+            return;
+        }
+        else if ( file.getParentFile() == null )
+        {
+            displayErrorMessage( Messages.getString( "ExportCertificateWizardPage.ErrorFileDirectoryNotWritable" ) ); //$NON-NLS-1$
+            return;
+        }
+
+        displayErrorMessage( null );
+    }
+
+
+    /**
+     * Displays an error message and set the page status as incomplete
+     * if the message is not null.
+     *
+     * @param message the message to display
+     */
+    protected void displayErrorMessage( String message )
+    {
+        setMessage( null, DialogPage.NONE );
+        setErrorMessage( message );
+        setPageComplete( message == null );
+    }
+
+
+    /**
+     * This method is called when the 'browse' button is selected.
+     */
+    private void chooseExportFile()
+    {
+        FileDialog dialog = new FileDialog( PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), SWT.SAVE );
+        dialog.setText( Messages.getString( "ExportCertificateWizardPage.ChooseFile" ) ); //$NON-NLS-1$
+        if ( !"".equals( fileText.getText() ) ) //$NON-NLS-1$
+        {
+            dialog.setFilterPath( fileText.getText() );
+        }
+
+        String selectedFile = dialog.open();
+        if ( selectedFile != null )
+        {
+            fileText.setText( selectedFile );
+        }
+    }
+
+
+    /**
+     * Returns the export file.
+     *
+     * @return the export file
+     */
+    public File getExportFile()
+    {
+        return new File( fileText.getText() );
+    }
+
+
+    /**
+     * Gets the certificate export format.
+     *
+     * @return the certificate export format
+     */
+    public CertificateExportFormat getCertificateExportFormat()
+    {
+        StructuredSelection selection = ( StructuredSelection ) formatComboViewer.getSelection();
+        if ( !selection.isEmpty() )
+        {
+            return ( CertificateExportFormat ) selection.getFirstElement();
+        }
+
+        // Default format
+        return CertificateExportFormat.DER;
+    }
+
+    /**
+     * This enum represents the various certificate export formats.
+     *
+     * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+     */
+    enum CertificateExportFormat
+    {
+        DER, PEM
+    }
+}
\ No newline at end of file

Modified: directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/wizards/messages.properties
URL: http://svn.apache.org/viewvc/directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/wizards/messages.properties?rev=1222102&r1=1222101&r2=1222102&view=diff
==============================================================================
--- directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/wizards/messages.properties (original)
+++ directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/wizards/messages.properties Thu Dec 22 08:43:12 2011
@@ -16,3 +16,19 @@
 # under the License.
 
 NewConnectionWizard.NewLdapConnection=New LDAP Connection
+
+ExportCertificateWizard.ErrorDialogTitle=Error
+ExportCertificateWizard.ErrorDialogMessage=An error occurred while exporting the certificate: {0}
+ExportCertificateWizard.ExportCertificate=Export Certificate
+
+ExportCertificateWizardPage.Browse=Bro&wse...
+ExportCertificateWizardPage.ChooseFile=Choose a file
+ExportCertificateWizardPage.ErrorFileAlreadyExists=Selected file already exists. Select option 'Overwrite existing file' if you want to overwrite the file.
+ExportCertificateWizardPage.ErrorFileDirectoryNotWritable=Selected file directory is not writeable.
+ExportCertificateWizardPage.ErrorFileNotAFile=Selected file is not a file.
+ExportCertificateWizardPage.ErrorFileNotWritable=Selected file is not writeable.
+ExportCertificateWizardPage.ExportCertificate=Export Certificate
+ExportCertificateWizardPage.File=File
+ExportCertificateWizardPage.Format=Format
+ExportCertificateWizardPage.OverwriteExistingFile=O&verwrite existing file
+ExportCertificateWizardPage.PleaseSelectFileAndFormat=Please select the file and format you want to export the certificate to.
\ No newline at end of file

Modified: directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/wizards/messages_de.properties
URL: http://svn.apache.org/viewvc/directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/wizards/messages_de.properties?rev=1222102&r1=1222101&r2=1222102&view=diff
==============================================================================
--- directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/wizards/messages_de.properties (original)
+++ directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/wizards/messages_de.properties Thu Dec 22 08:43:12 2011
@@ -16,3 +16,19 @@
 # under the License.
 
 NewConnectionWizard.NewLdapConnection=Neue LDAP Verbindung
+
+ExportCertificateWizard.ErrorDialogTitle=Fehler
+ExportCertificateWizard.ErrorDialogMessage=TODO:An error occurred while exporting the certificate: {0}
+ExportCertificateWizard.ExportCertificate=Zertifikat exportieren
+
+ExportCertificateWizardPage.Browse=Bro&wsen...
+ExportCertificateWizardPage.ChooseFile=Datei ausw\u00E4hlen
+ExportCertificateWizardPage.ErrorFileAlreadyExists=Die Datei existiert bereits. W\u00E4hle Option 'Bestehende Datei \u00FCberschreiben', wenn die Datei \u00FCberschrieben werden soll.
+ExportCertificateWizardPage.ErrorFileDirectoryNotWritable=Verzeichnis der ausgew\u00E4hlten Datei ist nicht beschreibbar.
+ExportCertificateWizardPage.ErrorFileNotAFile=Ausgew\u00E4hlte Datei ist keine Datei.
+ExportCertificateWizardPage.ErrorFileNotWritable=Ausgew\u00E4hlte Datei ist nicht beschreibbar.
+ExportCertificateWizardPage.ExportCertificate=TODO:Export Certificate
+ExportCertificateWizardPage.File=Datei
+ExportCertificateWizardPage.Format=Format
+ExportCertificateWizardPage.OverwriteExistingFile=Bestehende Datei &\u00FCberschreiben
+ExportCertificateWizardPage.PleaseSelectFileAndFormat=TODO:Please select the file and format you want to export the certificate to.

Modified: directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/wizards/messages_fr.properties
URL: http://svn.apache.org/viewvc/directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/wizards/messages_fr.properties?rev=1222102&r1=1222101&r2=1222102&view=diff
==============================================================================
--- directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/wizards/messages_fr.properties (original)
+++ directory/studio/trunk/plugins/connection.ui/src/main/java/org/apache/directory/studio/connection/ui/wizards/messages_fr.properties Thu Dec 22 08:43:12 2011
@@ -16,3 +16,19 @@
 # under the License.
 
 NewConnectionWizard.NewLdapConnection=Nouvelle connexion LDAP
+
+ExportCertificateWizard.ErrorDialogTitle=Erreur
+ExportCertificateWizard.ErrorDialogMessage=Une erreur est survenue lors de l'export du certificat : {0}
+ExportCertificateWizard.ExportCertificate=Exporter le certificat
+
+ExportCertificateWizardPage.Browse=Parco&urir...
+ExportCertificateWizardPage.ChooseFile=Choisir un fichier
+ExportCertificateWizardPage.ErrorFileAlreadyExists=Le fichier s\u00E9lectionn\u00E9 existe d\u00E9j\u00E0. Choisissez l'option 'Ecraser le fichier existant' si vous voulez remplacer ce fichier.
+ExportCertificateWizardPage.ErrorFileDirectoryNotWritable=Le r\u00E9pertoire s\u00E9lectionn\u00E9 n'est pas accessible en \u00E9criture.
+ExportCertificateWizardPage.ErrorFileNotAFile=L'\u00E9l\u00E9ment s\u00E9lectionn\u00E9 n'est pas un fichier.
+ExportCertificateWizardPage.ErrorFileNotWritable=Le fichier s\u00E9lectionn\u00E9 n'est pas accessible en \u00E9criture.
+ExportCertificateWizardPage.ExportCertificate=Exporter le certificat
+ExportCertificateWizardPage.File=Fichier
+ExportCertificateWizardPage.Format=Format
+ExportCertificateWizardPage.OverwriteExistingFile=Ecraser le fichier existant
+ExportCertificateWizardPage.PleaseSelectFileAndFormat=Veuillez s\u00E9lectionner le fichier et le format dans lequel vous souhaitez exporter le certificat.