You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by se...@apache.org on 2007/10/20 15:00:58 UTC

svn commit: r586706 - in /directory/studio/trunk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core: internal/model/ jobs/ model/

Author: seelmann
Date: Sat Oct 20 06:00:57 2007
New Revision: 586706

URL: http://svn.apache.org/viewvc?rev=586706&view=rev
Log:
DIRSTUDIO-123: Moved import ldif code from BrowserConnection to ImportLdifJob.

Removed:
    directory/studio/trunk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/internal/model/ConnectionModifyHandler.java
Modified:
    directory/studio/trunk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/internal/model/BrowserConnection.java
    directory/studio/trunk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/internal/model/DummyConnection.java
    directory/studio/trunk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ExecuteLdifJob.java
    directory/studio/trunk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ImportLdifJob.java
    directory/studio/trunk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/IBrowserConnection.java

Modified: directory/studio/trunk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/internal/model/BrowserConnection.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/internal/model/BrowserConnection.java?rev=586706&r1=586705&r2=586706&view=diff
==============================================================================
--- directory/studio/trunk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/internal/model/BrowserConnection.java (original)
+++ directory/studio/trunk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/internal/model/BrowserConnection.java Sat Oct 20 06:00:57 2007
@@ -22,7 +22,6 @@
 
 
 import java.io.Serializable;
-import java.io.Writer;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -86,7 +85,7 @@
 
     transient JNDIConnectionProvider connectionProvider;
     
-    transient ConnectionModifyHandler modifyHandler;
+    transient ModificationLogger modificationLogger;
 
     transient ConnectionSearchHandler searchHandler;
 
@@ -130,7 +129,7 @@
         this.entryToChildrenInfoMap = new HashMap<IEntry, ChildrenInfo>();
 
         this.connectionProvider = new JNDIConnectionProvider( connection );
-        this.modifyHandler = new ConnectionModifyHandler( this );
+        this.modificationLogger = new ModificationLogger( this );
         this.searchHandler = new ConnectionSearchHandler( this );
         
         ConnectionEventRegistry.addConnectionUpdateListener( this, ConnectionCorePlugin.getDefault().getEventRunner() );
@@ -293,7 +292,6 @@
         entryToChildrenInfoMap.clear();
         entryToChildrenFilterMap.clear();
 
-        modifyHandler.connectionClosed();
         searchHandler.connectionClosed();
 
         rootDSE = null;
@@ -738,7 +736,7 @@
 
     public ModificationLogger getModificationLogger()
     {
-        return modifyHandler.getModificationLogger();
+        return modificationLogger;
     }
 
 
@@ -843,13 +841,6 @@
         {
             this.entryToChildrenInfoMap.put( entry, si );
         }
-    }
-
-
-    public void importLdif( LdifEnumeration enumeration, Writer logWriter, boolean continueOnError,
-        StudioProgressMonitor monitor )
-    {
-        modifyHandler.importLdif( enumeration, logWriter, continueOnError, monitor );
     }
 
 

Modified: directory/studio/trunk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/internal/model/DummyConnection.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/internal/model/DummyConnection.java?rev=586706&r1=586705&r2=586706&view=diff
==============================================================================
--- directory/studio/trunk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/internal/model/DummyConnection.java (original)
+++ directory/studio/trunk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/internal/model/DummyConnection.java Sat Oct 20 06:00:57 2007
@@ -21,19 +21,15 @@
 package org.apache.directory.studio.ldapbrowser.core.internal.model;
 
 
-import java.io.Writer;
-
 import org.apache.directory.studio.connection.core.Connection;
 import org.apache.directory.studio.connection.core.StudioProgressMonitor;
 import org.apache.directory.studio.ldapbrowser.core.BookmarkManager;
 import org.apache.directory.studio.ldapbrowser.core.SearchManager;
 import org.apache.directory.studio.ldapbrowser.core.model.DN;
-import org.apache.directory.studio.ldapbrowser.core.model.IAttribute;
 import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection;
 import org.apache.directory.studio.ldapbrowser.core.model.IEntry;
 import org.apache.directory.studio.ldapbrowser.core.model.IRootDSE;
 import org.apache.directory.studio.ldapbrowser.core.model.ISearch;
-import org.apache.directory.studio.ldapbrowser.core.model.IValue;
 import org.apache.directory.studio.ldapbrowser.core.model.SearchParameter;
 import org.apache.directory.studio.ldapbrowser.core.model.URL;
 import org.apache.directory.studio.ldapbrowser.core.model.ldif.LdifEnumeration;
@@ -129,13 +125,6 @@
     public int getTimeLimit()
     {
         return 0;
-    }
-
-
-    public void importLdif( LdifEnumeration enumeration, Writer logWriter, boolean continueOnError,
-        StudioProgressMonitor monitor )
-    {
-
     }
 
 

Modified: directory/studio/trunk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ExecuteLdifJob.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ExecuteLdifJob.java?rev=586706&r1=586705&r2=586706&view=diff
==============================================================================
--- directory/studio/trunk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ExecuteLdifJob.java (original)
+++ directory/studio/trunk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ExecuteLdifJob.java Sat Oct 20 06:00:57 2007
@@ -36,19 +36,35 @@
 import org.apache.directory.studio.ldapbrowser.core.model.ldif.parser.LdifParser;
 
 
+/**
+ * Job to execute an LDIF.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
 public class ExecuteLdifJob extends AbstractEclipseJob
 {
 
-    private IBrowserConnection connection;
+    /** The browser connection. */
+    private IBrowserConnection browserConnection;
 
+    /** The LDIF to execute. */
     private String ldif;
 
+    /** The continue on error flag. */
     private boolean continueOnError;
 
 
-    public ExecuteLdifJob( IBrowserConnection connection, String ldif, boolean continueOnError )
+    /**
+     * Creates a new instance of ExecuteLdifJob.
+     * 
+     * @param browserConnection the browser connection
+     * @param ldif the LDIF to execute
+     * @param continueOnError the continue on error flag
+     */
+    public ExecuteLdifJob( IBrowserConnection browserConnection, String ldif, boolean continueOnError )
     {
-        this.connection = connection;
+        this.browserConnection = browserConnection;
         this.ldif = ldif;
         this.continueOnError = continueOnError;
 
@@ -56,24 +72,32 @@
     }
 
 
+    /**
+     * @see org.apache.directory.studio.ldapbrowser.core.jobs.AbstractEclipseJob#getConnections()
+     */
     protected Connection[] getConnections()
     {
         return new Connection[]
-            { connection.getConnection() };
+            { browserConnection.getConnection() };
     }
 
 
+    /**
+     * @see org.apache.directory.studio.ldapbrowser.core.jobs.AbstractEclipseJob#getLockedObjects()
+     */
     protected Object[] getLockedObjects()
     {
-        List l = new ArrayList();
-        l.add( connection.getUrl() + "_" + DigestUtils.shaHex( ldif ) );
+        List<Object> l = new ArrayList<Object>();
+        l.add( browserConnection.getUrl() + "_" + DigestUtils.shaHex( ldif ) );
         return l.toArray();
     }
 
 
+    /**
+     * @see org.apache.directory.studio.ldapbrowser.core.jobs.AbstractEclipseJob#executeAsyncJob(org.apache.directory.studio.connection.core.StudioProgressMonitor)
+     */
     protected void executeAsyncJob( StudioProgressMonitor monitor )
     {
-
         monitor.beginTask( BrowserCoreMessages.jobs__execute_ldif_task, 2 );
         monitor.reportProgress( " " ); //$NON-NLS-1$
         monitor.worked( 1 );
@@ -101,7 +125,7 @@
                 }
             };
 
-            connection.importLdif( enumeration, logWriter, continueOnError, monitor );
+            ImportLdifJob.importLdif( browserConnection, enumeration, logWriter, continueOnError, monitor );
 
             logWriter.close();
             ldifReader.close();
@@ -113,6 +137,9 @@
     }
 
 
+    /**
+     * @see org.apache.directory.studio.ldapbrowser.core.jobs.AbstractEclipseJob#getErrorMessage()
+     */
     protected String getErrorMessage()
     {
         return BrowserCoreMessages.jobs__execute_ldif_error;

Modified: directory/studio/trunk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ImportLdifJob.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ImportLdifJob.java?rev=586706&r1=586705&r2=586706&view=diff
==============================================================================
--- directory/studio/trunk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ImportLdifJob.java (original)
+++ directory/studio/trunk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ImportLdifJob.java Sat Oct 20 06:00:57 2007
@@ -29,36 +29,84 @@
 import java.io.IOException;
 import java.io.Reader;
 import java.io.Writer;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
+import javax.naming.directory.Attribute;
+import javax.naming.directory.Attributes;
+import javax.naming.directory.BasicAttribute;
+import javax.naming.directory.BasicAttributes;
+import javax.naming.directory.DirContext;
+import javax.naming.directory.ModificationItem;
+import javax.naming.ldap.Control;
+
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.directory.studio.connection.core.Connection;
 import org.apache.directory.studio.connection.core.StudioProgressMonitor;
+import org.apache.directory.studio.ldapbrowser.core.BrowserCoreConstants;
 import org.apache.directory.studio.ldapbrowser.core.BrowserCoreMessages;
 import org.apache.directory.studio.ldapbrowser.core.events.BulkModificationEvent;
 import org.apache.directory.studio.ldapbrowser.core.events.EventRegistry;
+import org.apache.directory.studio.ldapbrowser.core.internal.model.ConnectionException;
+import org.apache.directory.studio.ldapbrowser.core.internal.model.JNDIControl;
+import org.apache.directory.studio.ldapbrowser.core.model.DN;
 import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection;
+import org.apache.directory.studio.ldapbrowser.core.model.IEntry;
 import org.apache.directory.studio.ldapbrowser.core.model.ModelModificationException;
+import org.apache.directory.studio.ldapbrowser.core.model.NameException;
 import org.apache.directory.studio.ldapbrowser.core.model.ldif.LdifEnumeration;
+import org.apache.directory.studio.ldapbrowser.core.model.ldif.container.LdifChangeAddRecord;
+import org.apache.directory.studio.ldapbrowser.core.model.ldif.container.LdifChangeDeleteRecord;
+import org.apache.directory.studio.ldapbrowser.core.model.ldif.container.LdifChangeModDnRecord;
+import org.apache.directory.studio.ldapbrowser.core.model.ldif.container.LdifChangeModifyRecord;
+import org.apache.directory.studio.ldapbrowser.core.model.ldif.container.LdifChangeRecord;
+import org.apache.directory.studio.ldapbrowser.core.model.ldif.container.LdifContainer;
+import org.apache.directory.studio.ldapbrowser.core.model.ldif.container.LdifContentRecord;
+import org.apache.directory.studio.ldapbrowser.core.model.ldif.container.LdifModSpec;
+import org.apache.directory.studio.ldapbrowser.core.model.ldif.container.LdifRecord;
+import org.apache.directory.studio.ldapbrowser.core.model.ldif.lines.LdifAttrValLine;
+import org.apache.directory.studio.ldapbrowser.core.model.ldif.lines.LdifCommentLine;
+import org.apache.directory.studio.ldapbrowser.core.model.ldif.lines.LdifControlLine;
+import org.apache.directory.studio.ldapbrowser.core.model.ldif.lines.LdifModSpecTypeLine;
 import org.apache.directory.studio.ldapbrowser.core.model.ldif.parser.LdifParser;
 
 
+/**
+ * Job used to import an LDIF file.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
 public class ImportLdifJob extends AbstractNotificationJob
 {
 
-    private IBrowserConnection connection;
+    /** The browser connection. */
+    private IBrowserConnection browserConnection;
 
+    /** The LDIF file. */
     private File ldifFile;
 
+    /** The log file. */
     private File logFile;
 
+    /** The continue on error flag. */
     private boolean continueOnError;
 
 
-    public ImportLdifJob( IBrowserConnection connection, File ldifFile, File logFile, boolean continueOnError )
+    /**
+     * Creates a new instance of ImportLdifJob.
+     * 
+     * @param browserConnection the browser connection
+     * @param ldifFile the LDIF file
+     * @param logFile the log file
+     * @param continueOnError the continue on error flag
+     */
+    public ImportLdifJob( IBrowserConnection browserConnection, File ldifFile, File logFile, boolean continueOnError )
     {
-        this.connection = connection;
+        this.browserConnection = browserConnection;
         this.ldifFile = ldifFile;
         this.logFile = logFile;
         this.continueOnError = continueOnError;
@@ -67,30 +115,45 @@
     }
 
 
+    /**
+     * Creates a new instance of ImportLdifJob.
+     * 
+     * @param connection the connection
+     * @param ldifFile the LDIF file
+     * @param continueOnError the continue on error
+     */
     public ImportLdifJob( IBrowserConnection connection, File ldifFile, boolean continueOnError )
     {
         this( connection, ldifFile, null, continueOnError );
     }
 
 
+    /**
+     * @see org.apache.directory.studio.ldapbrowser.core.jobs.AbstractEclipseJob#getConnections()
+     */
     protected Connection[] getConnections()
     {
         return new Connection[]
-            { connection.getConnection() };
+            { browserConnection.getConnection() };
     }
 
 
+    /**
+     * @see org.apache.directory.studio.ldapbrowser.core.jobs.AbstractEclipseJob#getLockedObjects()
+     */
     protected Object[] getLockedObjects()
     {
-        List l = new ArrayList();
-        l.add( connection.getUrl() + "_" + DigestUtils.shaHex( ldifFile.toString() ) );
+        List<Object> l = new ArrayList<Object>();
+        l.add( browserConnection.getUrl() + "_" + DigestUtils.shaHex( ldifFile.toString() ) );
         return l.toArray();
     }
 
 
+    /**
+     * @see org.apache.directory.studio.ldapbrowser.core.jobs.AbstractNotificationJob#executeNotificationJob(org.apache.directory.studio.connection.core.StudioProgressMonitor)
+     */
     protected void executeNotificationJob( StudioProgressMonitor monitor ) throws ModelModificationException
     {
-
         monitor.beginTask( BrowserCoreMessages.jobs__import_ldif_task, 2 );
         monitor.reportProgress( " " ); //$NON-NLS-1$
         monitor.worked( 1 );
@@ -126,7 +189,7 @@
                 };
             }
 
-            connection.importLdif( enumeration, logWriter, continueOnError, monitor );
+            importLdif( browserConnection, enumeration, logWriter, continueOnError, monitor );
 
             logWriter.close();
             ldifReader.close();
@@ -138,15 +201,367 @@
     }
 
 
+    /**
+     * @see org.apache.directory.studio.ldapbrowser.core.jobs.AbstractEclipseJob#getErrorMessage()
+     */
     protected String getErrorMessage()
     {
         return BrowserCoreMessages.jobs__import_ldif_error;
     }
 
 
+    /**
+     * @see org.apache.directory.studio.ldapbrowser.core.jobs.AbstractNotificationJob#runNotification()
+     */
     protected void runNotification()
     {
-        EventRegistry.fireEntryUpdated( new BulkModificationEvent( connection ), this );
+        EventRegistry.fireEntryUpdated( new BulkModificationEvent( browserConnection ), this );
+    }
+
+
+    /**
+     * Imports the LDIF enumeration
+     * 
+     * @param browserConnection the browser connection
+     * @param enumeration the LDIF enumeration
+     * @param logWriter the log writer
+     * @param continueOnError the continue on error flag
+     * @param monitor the progress monitor
+     */
+    static void importLdif( IBrowserConnection browserConnection, LdifEnumeration enumeration, Writer logWriter,
+        boolean continueOnError, StudioProgressMonitor monitor )
+    {
+        int importedCount = 0;
+        int errorCount = 0;
+        try
+        {
+            while ( !monitor.isCanceled() && enumeration.hasNext( monitor ) )
+            {
+                LdifContainer container = enumeration.next( monitor );
+
+                if ( container instanceof LdifRecord )
+                {
+                    LdifRecord record = ( LdifRecord ) container;
+                    try
+                    {
+                        importLdifRecord( browserConnection, record, monitor );
+                        logModification( browserConnection, logWriter, record, monitor );
+                        importedCount++;
+
+                        // update cache and adjust attribute/children initialization flags
+                        DN dn = new DN( record.getDnLine().getValueAsString() );
+                        IEntry entry = browserConnection.getEntryFromCache( dn );
+                        DN parentDn = dn.getParentDn();
+                        IEntry parentEntry = parentDn != null ? browserConnection.getEntryFromCache( parentDn ) : null;
+
+                        if ( record instanceof LdifChangeDeleteRecord )
+                        {
+                            if ( entry != null )
+                            {
+                                entry.setAttributesInitialized( false );
+                                browserConnection.uncacheEntryRecursive( entry );
+                            }
+                            if ( parentEntry != null )
+                            {
+                                parentEntry.setChildrenInitialized( false );
+                            }
+                        }
+                        else if ( record instanceof LdifChangeModDnRecord )
+                        {
+                            if ( entry != null )
+                            {
+                                entry.setAttributesInitialized( false );
+                                browserConnection.uncacheEntryRecursive( entry );
+                            }
+                            if ( parentEntry != null )
+                            {
+                                parentEntry.setChildrenInitialized( false );
+                            }
+                            LdifChangeModDnRecord modDnRecord = ( LdifChangeModDnRecord ) record;
+                            if ( modDnRecord.getNewsuperiorLine() != null )
+                            {
+                                DN newSuperiorDn = new DN( modDnRecord.getNewsuperiorLine().getValueAsString() );
+                                IEntry newSuperiorEntry = browserConnection.getEntryFromCache( newSuperiorDn );
+                                if ( newSuperiorEntry != null )
+                                {
+                                    newSuperiorEntry.setChildrenInitialized( false );
+                                }
+                            }
+                        }
+                        else if ( record instanceof LdifChangeAddRecord || record instanceof LdifContentRecord )
+                        {
+                            if ( parentEntry != null )
+                            {
+                                parentEntry.setChildrenInitialized( false );
+                            }
+                        }
+                        else
+                        {
+                            if ( entry != null )
+                            {
+                                entry.setAttributesInitialized( false );
+                            }
+                        }
+                    }
+                    catch ( Exception e )
+                    {
+                        logModificationError( browserConnection, logWriter, record, e, monitor );
+                        errorCount++;
+
+                        if ( !continueOnError )
+                        {
+                            monitor.reportError( e );
+                            return;
+                        }
+                    }
+
+                    monitor.reportProgress( BrowserCoreMessages.bind(
+                        BrowserCoreMessages.ldif__imported_n_entries_m_errors, new String[]
+                            { "" + importedCount, "" + errorCount } ) ); //$NON-NLS-1$ //$NON-NLS-2$
+                }
+                else
+                {
+                    logWriter.write( container.toRawString() );
+                }
+            }
+
+            if ( errorCount > 0 )
+            {
+                monitor.reportError( BrowserCoreMessages.bind( BrowserCoreMessages.ldif__n_errors_see_logfile,
+                    new String[]
+                        { "" + errorCount } ) ); //$NON-NLS-1$
+            }
+        }
+        catch ( Exception e )
+        {
+            monitor.reportError( e );
+        }
+    }
+
+
+    /**
+     * Imports the LDIF record.
+     * 
+     * @param browserConnection the browser connection
+     * @param record the LDIF record
+     * @param monitor the progress monitor
+     * 
+     * @throws ConnectionException the connection exception
+     */
+    static void importLdifRecord( IBrowserConnection browserConnection, LdifRecord record, StudioProgressMonitor monitor )
+        throws ConnectionException
+    {
+        if ( !record.isValid() )
+        {
+            throw new ConnectionException( BrowserCoreMessages.model__invalid_record );
+        }
+
+        String dn = record.getDnLine().getValueAsString();
+
+        if ( record instanceof LdifContentRecord )
+        {
+            LdifContentRecord attrValRecord = ( LdifContentRecord ) record;
+            LdifAttrValLine[] attrVals = attrValRecord.getAttrVals();
+            Attributes jndiAttributes = new BasicAttributes();
+            for ( int ii = 0; ii < attrVals.length; ii++ )
+            {
+                String attributeName = attrVals[ii].getUnfoldedAttributeDescription();
+                Object realValue = attrVals[ii].getValueAsObject();
+
+                if ( jndiAttributes.get( attributeName ) != null )
+                {
+                    jndiAttributes.get( attributeName ).add( realValue );
+                }
+                else
+                {
+                    jndiAttributes.put( attributeName, realValue );
+                }
+            }
+
+            browserConnection.getConnection().getJNDIConnectionWrapper().createEntry( dn, jndiAttributes,
+                getControls( attrValRecord ), monitor );
+        }
+        else if ( record instanceof LdifChangeAddRecord )
+        {
+            LdifChangeAddRecord changeAddRecord = ( LdifChangeAddRecord ) record;
+            LdifAttrValLine[] attrVals = changeAddRecord.getAttrVals();
+            Attributes jndiAttributes = new BasicAttributes();
+            for ( int ii = 0; ii < attrVals.length; ii++ )
+            {
+                String attributeName = attrVals[ii].getUnfoldedAttributeDescription();
+                Object realValue = attrVals[ii].getValueAsObject();
+
+                if ( jndiAttributes.get( attributeName ) != null )
+                {
+                    jndiAttributes.get( attributeName ).add( realValue );
+                }
+                else
+                {
+                    jndiAttributes.put( attributeName, realValue );
+                }
+            }
+
+            browserConnection.getConnection().getJNDIConnectionWrapper().createEntry( dn, jndiAttributes,
+                getControls( changeAddRecord ), monitor );
+        }
+        else if ( record instanceof LdifChangeDeleteRecord )
+        {
+            LdifChangeDeleteRecord changeDeleteRecord = ( LdifChangeDeleteRecord ) record;
+            browserConnection.getConnection().getJNDIConnectionWrapper().deleteEntry( dn,
+                getControls( changeDeleteRecord ), monitor );
+        }
+        else if ( record instanceof LdifChangeModifyRecord )
+        {
+            LdifChangeModifyRecord modifyRecord = ( LdifChangeModifyRecord ) record;
+            LdifModSpec[] modSpecs = modifyRecord.getModSpecs();
+            ModificationItem[] mis = new ModificationItem[modSpecs.length];
+            for ( int ii = 0; ii < modSpecs.length; ii++ )
+            {
+                LdifModSpecTypeLine modSpecType = modSpecs[ii].getModSpecType();
+                LdifAttrValLine[] attrVals = modSpecs[ii].getAttrVals();
+
+                Attribute attribute = new BasicAttribute( modSpecType.getUnfoldedAttributeDescription() );
+                for ( int x = 0; x < attrVals.length; x++ )
+                {
+                    attribute.add( attrVals[x].getValueAsObject() );
+                }
+
+                if ( modSpecType.isAdd() )
+                {
+                    mis[ii] = new ModificationItem( DirContext.ADD_ATTRIBUTE, attribute );
+                }
+                else if ( modSpecType.isDelete() )
+                {
+                    mis[ii] = new ModificationItem( DirContext.REMOVE_ATTRIBUTE, attribute );
+                }
+                else if ( modSpecType.isReplace() )
+                {
+                    mis[ii] = new ModificationItem( DirContext.REPLACE_ATTRIBUTE, attribute );
+                }
+            }
+
+            browserConnection.getConnection().getJNDIConnectionWrapper().modifyAttributes( dn, mis,
+                getControls( modifyRecord ), monitor );
+        }
+        else if ( record instanceof LdifChangeModDnRecord )
+        {
+            LdifChangeModDnRecord modDnRecord = ( LdifChangeModDnRecord ) record;
+            if ( modDnRecord.getNewrdnLine() != null && modDnRecord.getDeloldrdnLine() != null )
+            {
+                String newRdn = modDnRecord.getNewrdnLine().getValueAsString();
+                boolean deleteOldRdn = modDnRecord.getDeloldrdnLine().isDeleteOldRdn();
+
+                try
+                {
+                    DN newDn;
+                    if ( modDnRecord.getNewsuperiorLine() != null )
+                        newDn = new DN( newRdn, modDnRecord.getNewsuperiorLine().getValueAsString() );
+                    else
+                    {
+                        DN dnObject = new DN( dn );
+                        newDn = new DN( newRdn.toString(), dnObject.getParentDn().toString() );
+                    }
+
+                    browserConnection.getConnection().getJNDIConnectionWrapper().rename( dn, newDn.toString(),
+                        deleteOldRdn, getControls( modDnRecord ), monitor );
+                }
+                catch ( NameException ne )
+                {
+                    throw new ConnectionException( ne );
+                }
+            }
+        }
+    }
+
+
+    /**
+     * Gets the controls.
+     * 
+     * @param record the LDIF record
+     * 
+     * @return the controls
+     */
+    private static Control[] getControls( LdifRecord record )
+    {
+        Control[] controls = null;
+        if ( record instanceof LdifChangeRecord )
+        {
+            LdifChangeRecord changeRecord = ( LdifChangeRecord ) record;
+            LdifControlLine[] controlLines = changeRecord.getControls();
+            controls = new Control[controlLines.length];
+            for ( int i = 0; i < controlLines.length; i++ )
+            {
+                LdifControlLine line = controlLines[i];
+                // TODO: encoded control value
+                controls[i] = new JNDIControl( line.getUnfoldedOid(), line.isCritical(), null );
+            }
+        }
+        return controls;
     }
 
+
+    /**
+     * Log a modification error to the given writer.
+     * 
+     * @param browserConnection the browser connection
+     * @param logWriter the log writer
+     * @param record the record
+     * @param exception the exception
+     * @param monitor the progress monitor
+     */
+    private static void logModificationError( IBrowserConnection browserConnection, Writer logWriter,
+        LdifRecord record, Exception exception, StudioProgressMonitor monitor )
+    {
+        try
+        {
+            DateFormat df = new SimpleDateFormat( BrowserCoreConstants.DATEFORMAT );
+
+            String errorComment = "#!ERROR " + exception.getMessage(); //$NON-NLS-1$
+            errorComment = errorComment.replaceAll( "\r", " " ); //$NON-NLS-1$ //$NON-NLS-2$
+            errorComment = errorComment.replaceAll( "\n", " " ); //$NON-NLS-1$ //$NON-NLS-2$
+            LdifCommentLine errorCommentLine = LdifCommentLine.create( errorComment );
+
+            logWriter.write( LdifCommentLine.create( "#!RESULT ERROR" ).toFormattedString() ); //$NON-NLS-1$
+            logWriter
+                .write( LdifCommentLine
+                    .create(
+                        "#!CONNECTION ldap://" + browserConnection.getConnection().getHost() + ":" + browserConnection.getConnection().getPort() ).toFormattedString() ); //$NON-NLS-1$ //$NON-NLS-2$
+            logWriter.write( LdifCommentLine.create( "#!DATE " + df.format( new Date() ) ).toFormattedString() ); //$NON-NLS-1$
+            logWriter.write( errorCommentLine.toFormattedString() );
+            logWriter.write( record.toFormattedString() );
+        }
+        catch ( IOException ioe )
+        {
+            monitor.reportError( BrowserCoreMessages.model__error_logging_modification, ioe );
+        }
+    }
+
+
+    /**
+     * Log a modification to the given writer.
+     * 
+     * @param browserConnection the browser connection
+     * @param logWriter the log writer
+     * @param record the record
+     * @param monitor the progress monitor
+     */
+    private static void logModification( IBrowserConnection browserConnection, Writer logWriter, LdifRecord record,
+        StudioProgressMonitor monitor )
+    {
+        try
+        {
+            DateFormat df = new SimpleDateFormat( BrowserCoreConstants.DATEFORMAT );
+            logWriter.write( LdifCommentLine.create( "#!RESULT OK" ).toFormattedString() ); //$NON-NLS-1$
+            logWriter
+                .write( LdifCommentLine
+                    .create(
+                        "#!CONNECTION ldap://" + browserConnection.getConnection().getHost() + ":" + browserConnection.getConnection().getPort() ).toFormattedString() ); //$NON-NLS-1$ //$NON-NLS-2$
+            logWriter.write( LdifCommentLine.create( "#!DATE " + df.format( new Date() ) ).toFormattedString() ); //$NON-NLS-1$
+            logWriter.write( record.toFormattedString() );
+        }
+        catch ( IOException ioe )
+        {
+            monitor.reportError( BrowserCoreMessages.model__error_logging_modification, ioe );
+        }
+    }
 }

Modified: directory/studio/trunk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/IBrowserConnection.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/IBrowserConnection.java?rev=586706&r1=586705&r2=586706&view=diff
==============================================================================
--- directory/studio/trunk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/IBrowserConnection.java (original)
+++ directory/studio/trunk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/IBrowserConnection.java Sat Oct 20 06:00:57 2007
@@ -22,13 +22,10 @@
 
 
 import java.io.Serializable;
-import java.io.Writer;
 
 import org.apache.directory.studio.connection.core.Connection;
 import org.apache.directory.studio.connection.core.ConnectionPropertyPageProvider;
 import org.apache.directory.studio.connection.core.StudioProgressMonitor;
-import org.apache.directory.studio.connection.core.ConnectionParameter.AuthenticationMethod;
-import org.apache.directory.studio.connection.core.ConnectionParameter.EncryptionMethod;
 import org.apache.directory.studio.ldapbrowser.core.BookmarkManager;
 import org.apache.directory.studio.ldapbrowser.core.SearchManager;
 import org.apache.directory.studio.ldapbrowser.core.internal.model.ConnectionException;
@@ -152,10 +149,6 @@
 
 
     public abstract void search( ISearch searchRequest, StudioProgressMonitor monitor );
-
-
-    public abstract void importLdif( LdifEnumeration enumeration, Writer logWriter, boolean continueOnError,
-        StudioProgressMonitor monitor );
 
 
     public abstract LdifEnumeration exportLdif( SearchParameter searchParameter, StudioProgressMonitor pm )