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 2018/11/25 14:13:22 UTC

[directory-studio] branch remove-jndi-provider-and-jndi-layer updated (95f1339 -> a4347ea)

This is an automated email from the ASF dual-hosted git repository.

seelmann pushed a change to branch remove-jndi-provider-and-jndi-layer
in repository https://gitbox.apache.org/repos/asf/directory-studio.git.


    from 95f1339  Migrate modifyEntry to LDAP API
     new b109eed  Migrate search results to LDAP API
     new a4347ea  Relax check for open connections after test

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../jobs/LoadConfigurationRunnable.java            |  24 +-
 .../studio/connection/core/IJndiLogger.java        |  13 --
 .../core/io/StudioNamingEnumeration.java           |   4 +-
 .../core/io/api/CursorStudioNamingEnumeration.java |  25 +--
 .../core/io/{jndi => api}/StudioSearchResult.java  |  39 +++-
 .../core/io/jndi/LdifModificationLogger.java       |  13 +-
 .../connection/core/io/jndi/LdifSearchLogger.java  |  61 -----
 .../ldapbrowser/core/jobs/CopyEntriesRunnable.java |  59 ++---
 .../core/jobs/DeleteEntriesRunnable.java           |   7 +-
 .../ldapbrowser/core/jobs/ExportDsmlRunnable.java  |  27 +--
 .../ldapbrowser/core/jobs/ExportLdifRunnable.java  |  28 +--
 .../core/jobs/ReloadSchemaRunnable.java            |  44 ++--
 .../ldapbrowser/core/jobs/SearchRunnable.java      |  56 +++--
 .../config/model/io/ConfigurationReader.java       |  16 +-
 .../model/io/ApacheDsSchemaConnector.java          | 245 ++++++++++-----------
 .../model/io/GenericSchemaConnector.java           |  79 +++----
 .../core/ConnectionWrapperTestBase.java            |  44 ++--
 .../core/DirectoryApiConnectionWrapperTest.java    |   8 +-
 .../studio/test/integration/ui/SearchTest.java     |   2 +-
 .../test/integration/ui/bots/utils/Assertions.java |  17 +-
 20 files changed, 316 insertions(+), 495 deletions(-)
 rename plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/{jndi => api}/StudioSearchResult.java (74%)


[directory-studio] 01/02: Migrate search results to LDAP API

Posted by se...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

seelmann pushed a commit to branch remove-jndi-provider-and-jndi-layer
in repository https://gitbox.apache.org/repos/asf/directory-studio.git

commit b109eed14a20fa41462983cecdbe1e6ef4915b2b
Author: Stefan Seelmann <ma...@stefan-seelmann.de>
AuthorDate: Sun Nov 25 14:51:03 2018 +0100

    Migrate search results to LDAP API
---
 .../jobs/LoadConfigurationRunnable.java            |  24 +-
 .../studio/connection/core/IJndiLogger.java        |  13 --
 .../core/io/StudioNamingEnumeration.java           |   4 +-
 .../core/io/api/CursorStudioNamingEnumeration.java |  25 +--
 .../core/io/{jndi => api}/StudioSearchResult.java  |  39 +++-
 .../core/io/jndi/LdifModificationLogger.java       |  13 +-
 .../connection/core/io/jndi/LdifSearchLogger.java  |  61 -----
 .../ldapbrowser/core/jobs/CopyEntriesRunnable.java |  59 ++---
 .../core/jobs/DeleteEntriesRunnable.java           |   7 +-
 .../ldapbrowser/core/jobs/ExportDsmlRunnable.java  |  27 +--
 .../ldapbrowser/core/jobs/ExportLdifRunnable.java  |  28 +--
 .../core/jobs/ReloadSchemaRunnable.java            |  44 ++--
 .../ldapbrowser/core/jobs/SearchRunnable.java      |  56 +++--
 .../config/model/io/ConfigurationReader.java       |  16 +-
 .../model/io/ApacheDsSchemaConnector.java          | 245 ++++++++++-----------
 .../model/io/GenericSchemaConnector.java           |  79 +++----
 .../core/ConnectionWrapperTestBase.java            |  44 ++--
 .../core/DirectoryApiConnectionWrapperTest.java    |   8 +-
 18 files changed, 299 insertions(+), 493 deletions(-)

diff --git a/plugins/apacheds.configuration/src/main/java/org/apache/directory/studio/apacheds/configuration/jobs/LoadConfigurationRunnable.java b/plugins/apacheds.configuration/src/main/java/org/apache/directory/studio/apacheds/configuration/jobs/LoadConfigurationRunnable.java
index 23651f6..94279f3 100644
--- a/plugins/apacheds.configuration/src/main/java/org/apache/directory/studio/apacheds/configuration/jobs/LoadConfigurationRunnable.java
+++ b/plugins/apacheds.configuration/src/main/java/org/apache/directory/studio/apacheds/configuration/jobs/LoadConfigurationRunnable.java
@@ -28,26 +28,22 @@ import java.net.URL;
 import java.util.ArrayList;
 import java.util.List;
 
-import javax.naming.directory.SearchResult;
-
 import org.apache.directory.api.ldap.model.constants.LdapConstants;
 import org.apache.directory.api.ldap.model.constants.SchemaConstants;
-import org.apache.directory.api.ldap.model.entry.AttributeUtils;
-import org.apache.directory.api.ldap.model.entry.DefaultEntry;
 import org.apache.directory.api.ldap.model.entry.Entry;
 import org.apache.directory.api.ldap.model.exception.LdapException;
 import org.apache.directory.api.ldap.model.exception.LdapNoSuchObjectException;
 import org.apache.directory.api.ldap.model.message.SearchScope;
 import org.apache.directory.api.ldap.model.name.Dn;
 import org.apache.directory.api.ldap.model.schema.SchemaManager;
-import org.apache.directory.server.config.ConfigPartitionReader;
 import org.apache.directory.server.config.ConfigPartitionInitializer;
+import org.apache.directory.server.config.ConfigPartitionReader;
 import org.apache.directory.server.config.ReadOnlyConfigurationPartition;
 import org.apache.directory.server.config.beans.ConfigBean;
+import org.apache.directory.server.constants.ServerDNConstants;
 import org.apache.directory.server.core.api.CacheService;
 import org.apache.directory.server.core.api.DnFactory;
 import org.apache.directory.server.core.api.InstanceLayout;
-import org.apache.directory.server.constants.ServerDNConstants;
 import org.apache.directory.server.core.partition.impl.btree.AbstractBTreePartition;
 import org.apache.directory.server.core.partition.ldif.LdifPartition;
 import org.apache.directory.studio.apacheds.configuration.ApacheDS2ConfigurationPlugin;
@@ -63,6 +59,7 @@ import org.apache.directory.studio.connection.core.ConnectionCorePlugin;
 import org.apache.directory.studio.connection.core.IConnectionListener;
 import org.apache.directory.studio.connection.core.event.ConnectionEventRegistry;
 import org.apache.directory.studio.connection.core.io.StudioNamingEnumeration;
+import org.apache.directory.studio.connection.core.io.api.StudioSearchResult;
 import org.apache.directory.studio.ldapbrowser.core.BrowserCorePlugin;
 import org.apache.directory.studio.ldapbrowser.core.jobs.SearchRunnable;
 import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection;
@@ -366,11 +363,10 @@ public class LoadConfigurationRunnable implements StudioRunnableWithProgress
             if ( enumeration.hasMore() )
             {
                 // Creating the 'ou=config' base entry
-                SearchResult searchResult = ( SearchResult ) enumeration.next();
-                configEntry = new DefaultEntry( schemaManager, AttributeUtils.toEntry(
-                    searchResult.getAttributes(), new Dn( searchResult.getNameInNamespace() ) ) );
+                StudioSearchResult searchResult = enumeration.next();
+                configEntry = searchResult.getEntry();
             }
-            
+
             enumeration.close();
 
             // Verifying we found the 'ou=config' base entry
@@ -415,13 +411,9 @@ public class LoadConfigurationRunnable implements StudioRunnableWithProgress
 
                 while ( childrenEnumeration.hasMore() )
                 {
-                    // Creating the child entry
-                    SearchResult searchResult = ( SearchResult ) childrenEnumeration.next();
-                    Entry childEntry = new DefaultEntry( schemaManager, AttributeUtils.toEntry(
-                        searchResult.getAttributes(), new Dn( searchResult.getNameInNamespace() ) ) );
-
                     // Adding the children to the list of entries
-                    entries.add( childEntry );
+                    StudioSearchResult searchResult = childrenEnumeration.next();
+                    entries.add( searchResult.getEntry() );
                 }
                 
                 childrenEnumeration.close();
diff --git a/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/IJndiLogger.java b/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/IJndiLogger.java
index 6b9c9b7..38dc284 100644
--- a/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/IJndiLogger.java
+++ b/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/IJndiLogger.java
@@ -32,7 +32,6 @@ import org.apache.directory.api.ldap.model.message.Referral;
 import org.apache.directory.api.ldap.model.name.Dn;
 import org.apache.directory.studio.connection.core.Connection.AliasDereferencingMethod;
 import org.apache.directory.studio.connection.core.io.jndi.ReferralsInfo;
-import org.apache.directory.studio.connection.core.io.jndi.StudioSearchResult;
 
 
 /**
@@ -161,18 +160,6 @@ public interface IJndiLogger
 
 
     /**
-     * Logs a search result entry.
-     *
-     * @param connection the connection
-     * @param studioSearchResult the search result
-     * @param requestNum the request number
-     * @param the naming exception if an error occurred, null otherwise
-     */
-    void logSearchResultEntry( Connection connection, StudioSearchResult studioSearchResult, long requestNum,
-        NamingException namingException );
-
-
-    /**
      * Logs a search result reference.
      *
      * @param connection the connection
diff --git a/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/StudioNamingEnumeration.java b/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/StudioNamingEnumeration.java
index 4f645fa..f9f299f 100644
--- a/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/StudioNamingEnumeration.java
+++ b/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/StudioNamingEnumeration.java
@@ -22,10 +22,10 @@ package org.apache.directory.studio.connection.core.io;
 
 import javax.naming.NamingEnumeration;
 import javax.naming.NamingException;
-import javax.naming.directory.SearchResult;
 import javax.naming.ldap.Control;
 
 import org.apache.directory.studio.connection.core.Connection;
+import org.apache.directory.studio.connection.core.io.api.StudioSearchResult;
 
 
 /**
@@ -33,7 +33,7 @@ import org.apache.directory.studio.connection.core.Connection;
  *
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  */
-public interface StudioNamingEnumeration extends NamingEnumeration<SearchResult>
+public interface StudioNamingEnumeration extends NamingEnumeration<StudioSearchResult>
 {
     /**
      * Gets the connection.
diff --git a/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/api/CursorStudioNamingEnumeration.java b/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/api/CursorStudioNamingEnumeration.java
index 1802a27..abeff03 100644
--- a/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/api/CursorStudioNamingEnumeration.java
+++ b/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/api/CursorStudioNamingEnumeration.java
@@ -27,9 +27,7 @@ import java.util.List;
 import java.util.Map;
 
 import javax.naming.NamingException;
-import javax.naming.directory.BasicAttributes;
 import javax.naming.directory.SearchControls;
-import javax.naming.directory.SearchResult;
 import javax.naming.ldap.BasicControl;
 import javax.naming.ldap.Control;
 import javax.naming.ldap.PagedResultsResponseControl;
@@ -39,12 +37,13 @@ import org.apache.directory.api.ldap.codec.api.LdapApiService;
 import org.apache.directory.api.ldap.codec.api.LdapApiServiceFactory;
 import org.apache.directory.api.ldap.model.cursor.CursorException;
 import org.apache.directory.api.ldap.model.cursor.SearchCursor;
-import org.apache.directory.api.ldap.model.entry.AttributeUtils;
+import org.apache.directory.api.ldap.model.entry.DefaultEntry;
 import org.apache.directory.api.ldap.model.exception.LdapException;
 import org.apache.directory.api.ldap.model.message.Referral;
 import org.apache.directory.api.ldap.model.message.Response;
 import org.apache.directory.api.ldap.model.message.SearchResultDone;
 import org.apache.directory.api.ldap.model.message.SearchResultEntry;
+import org.apache.directory.api.ldap.model.message.SearchResultEntryImpl;
 import org.apache.directory.api.ldap.model.message.SearchResultReference;
 import org.apache.directory.api.ldap.model.url.LdapUrl;
 import org.apache.directory.studio.common.core.jobs.StudioProgressMonitor;
@@ -53,12 +52,10 @@ import org.apache.directory.studio.connection.core.Connection.AliasDereferencing
 import org.apache.directory.studio.connection.core.Connection.ReferralHandlingMethod;
 import org.apache.directory.studio.connection.core.ConnectionCorePlugin;
 import org.apache.directory.studio.connection.core.IJndiLogger;
-import org.apache.directory.studio.connection.core.Utils;
 import org.apache.directory.studio.connection.core.io.AbstractStudioNamingEnumeration;
 import org.apache.directory.studio.connection.core.io.ConnectionWrapperUtils;
 import org.apache.directory.studio.connection.core.io.StudioNamingEnumeration;
 import org.apache.directory.studio.connection.core.io.jndi.ReferralsInfo;
-import org.apache.directory.studio.connection.core.io.jndi.StudioSearchResult;
 
 
 /**
@@ -277,12 +274,7 @@ public class CursorStudioNamingEnumeration extends AbstractStudioNamingEnumerati
             if ( currentSearchResultEntry != null )
             {
                 resultEntryCounter++;
-                SearchResult sr = new SearchResult( currentSearchResultEntry.getObjectName().toString(), null,
-                    Utils.toAttributes( currentSearchResultEntry.getEntry() ) );
-                sr.setNameInNamespace( currentSearchResultEntry.getObjectName().toString() );
-
-                // Converting the SearchResult to a StudioSearchResult
-                StudioSearchResult ssr = new StudioSearchResult( sr, connection, false, null );
+                StudioSearchResult ssr = new StudioSearchResult( currentSearchResultEntry, connection, false, null );
                 return ssr;
             }
 
@@ -297,18 +289,19 @@ public class CursorStudioNamingEnumeration extends AbstractStudioNamingEnumerati
                     LdapUrl url = new LdapUrl( currentReferralUrlsList.remove( 0 ) );
 
                     // Building the search result
-                    SearchResult searchResult = new SearchResult( url.getDn().getName(), null, new BasicAttributes(),
-                        false );
-                    searchResult.setNameInNamespace( url.getDn().getName() );
+                    SearchResultEntry sre = new SearchResultEntryImpl();
+                    sre.setEntry( new DefaultEntry() );
+                    sre.setObjectName( url.getDn() );
 
-                    return new StudioSearchResult( searchResult, null, false, url );
+                    return new StudioSearchResult( sre, null, false, url );
                 }
             }
             // Are we following referrals automatically?
             else if ( referralsHandlingMethod == ReferralHandlingMethod.FOLLOW )
             {
                 resultEntryCounter++;
-                return new StudioSearchResult( cursorNamingEnumeration.next(), connection, true, null );
+                return new StudioSearchResult( cursorNamingEnumeration.next().getSearchResultEntry(), connection,
+                    true, null );
             }
 
             return null;
diff --git a/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/jndi/StudioSearchResult.java b/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/api/StudioSearchResult.java
similarity index 74%
rename from plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/jndi/StudioSearchResult.java
rename to plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/api/StudioSearchResult.java
index 17b0542..6f733a3 100644
--- a/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/jndi/StudioSearchResult.java
+++ b/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/api/StudioSearchResult.java
@@ -17,11 +17,14 @@
  *  under the License.
  *
  */
-package org.apache.directory.studio.connection.core.io.jndi;
+package org.apache.directory.studio.connection.core.io.api;
 
 
 import javax.naming.directory.SearchResult;
 
+import org.apache.directory.api.ldap.model.entry.Entry;
+import org.apache.directory.api.ldap.model.message.SearchResultEntry;
+import org.apache.directory.api.ldap.model.name.Dn;
 import org.apache.directory.api.ldap.model.url.LdapUrl;
 import org.apache.directory.studio.connection.core.Connection;
 
@@ -32,41 +35,55 @@ import org.apache.directory.studio.connection.core.Connection;
  *
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  */
-public class StudioSearchResult extends SearchResult
+public class StudioSearchResult
 {
 
-    private static final long serialVersionUID = 1L;
+    private final SearchResultEntry searchResultEntry;
 
     /** The connection. */
     private Connection connection;
 
     /** The is continued search result flag */
-    private boolean isContinuedSearchResult;
+    private final boolean isContinuedSearchResult;
 
     /** The URL with information on how to continue the search. */
-    private LdapUrl searchContinuationUrl;
+    private final LdapUrl searchContinuationUrl;
 
 
     /**
      * Creates a new instance of StudioSearchResult.
      * 
-     * @param searchResult the original search result
+     * @param searchResultEntry the original search result
      * @param connection the connection
      * @param isContinuedSearchResult if the search result is a result from a continued search
      * @param searchContinuationUrl the URL with information on how to continue the search
      */
-    public StudioSearchResult( SearchResult searchResult, Connection connection, boolean isContinuedSearchResult,
-        LdapUrl searchContinuationUrl )
+    public StudioSearchResult( SearchResultEntry searchResultEntry, Connection connection,
+        boolean isContinuedSearchResult, LdapUrl searchContinuationUrl )
     {
-        super( searchResult.getName(), searchResult.getClassName(), searchResult.getObject(), searchResult
-            .getAttributes(), searchResult.isRelative() );
-        super.setNameInNamespace( searchResult.getNameInNamespace() );
+        this.searchResultEntry = searchResultEntry;
         this.connection = connection;
         this.isContinuedSearchResult = isContinuedSearchResult;
         this.searchContinuationUrl = searchContinuationUrl;
     }
 
 
+    SearchResultEntry getSearchResultEntry()
+    {
+        return searchResultEntry;
+    }
+
+    
+    public Dn getDn() {
+        return getEntry().getDn();
+    }
+
+    public Entry getEntry()
+    {
+        return searchResultEntry.getEntry();
+    }
+
+
     /**
      * Gets the connection.
      * 
diff --git a/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/jndi/LdifModificationLogger.java b/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/jndi/LdifModificationLogger.java
index 739b83d..0096bd5 100644
--- a/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/jndi/LdifModificationLogger.java
+++ b/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/jndi/LdifModificationLogger.java
@@ -43,6 +43,7 @@ import javax.naming.NamingException;
 import javax.naming.directory.SearchControls;
 import javax.naming.ldap.Control;
 
+import org.apache.directory.api.ldap.model.entry.Attribute;
 import org.apache.directory.api.ldap.model.entry.Entry;
 import org.apache.directory.api.ldap.model.entry.Modification;
 import org.apache.directory.api.ldap.model.entry.Value;
@@ -276,7 +277,7 @@ public class LdifModificationLogger implements IJndiLogger
         LdifChangeAddRecord record = new LdifChangeAddRecord( LdifDnLine.create( entry.getDn().getName() ) );
         addControlLines( record, controls );
         record.setChangeType( LdifChangeTypeLine.createAdd() );
-        for ( org.apache.directory.api.ldap.model.entry.Attribute attribute : entry )
+        for ( Attribute attribute : entry )
         {
             String attributeName = attribute.getUpId();
             for ( Value value : attribute )
@@ -429,16 +430,6 @@ public class LdifModificationLogger implements IJndiLogger
     /**
      * {@inheritDoc}
      */
-    public void logSearchResultEntry( Connection connection, StudioSearchResult studioSearchResult, long requestNum,
-        NamingException ex )
-    {
-        // don't log searches 
-    }
-
-
-    /**
-     * {@inheritDoc}
-     */
     public void logSearchResultReference( Connection connection, Referral referral,
         ReferralsInfo referralsInfo, long requestNum, NamingException ex )
     {
diff --git a/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/jndi/LdifSearchLogger.java b/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/jndi/LdifSearchLogger.java
index b0a61d9..2b66c26 100644
--- a/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/jndi/LdifSearchLogger.java
+++ b/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/jndi/LdifSearchLogger.java
@@ -38,10 +38,7 @@ import java.util.logging.Level;
 import java.util.logging.LogRecord;
 import java.util.logging.Logger;
 
-import javax.naming.NamingEnumeration;
 import javax.naming.NamingException;
-import javax.naming.directory.Attribute;
-import javax.naming.directory.Attributes;
 import javax.naming.directory.SearchControls;
 import javax.naming.ldap.Control;
 
@@ -59,10 +56,7 @@ import org.apache.directory.studio.connection.core.ConnectionManager;
 import org.apache.directory.studio.connection.core.IJndiLogger;
 import org.apache.directory.studio.connection.core.Utils;
 import org.apache.directory.studio.ldifparser.LdifFormatParameters;
-import org.apache.directory.studio.ldifparser.model.container.LdifContentRecord;
-import org.apache.directory.studio.ldifparser.model.lines.LdifAttrValLine;
 import org.apache.directory.studio.ldifparser.model.lines.LdifCommentLine;
-import org.apache.directory.studio.ldifparser.model.lines.LdifDnLine;
 import org.apache.directory.studio.ldifparser.model.lines.LdifLineBase;
 import org.apache.directory.studio.ldifparser.model.lines.LdifSepLine;
 import org.eclipse.core.runtime.Preferences.IPropertyChangeListener;
@@ -359,61 +353,6 @@ public class LdifSearchLogger implements IJndiLogger
     /**
      * {@inheritDoc}
      */
-    public void logSearchResultEntry( Connection connection, StudioSearchResult studioSearchResult, long requestNum,
-        NamingException ex )
-    {
-        if ( !isSearchResultEntryLogEnabled() )
-        {
-            return;
-        }
-
-        try
-        {
-            String formattedString;
-            if ( studioSearchResult != null )
-            {
-                String dn = studioSearchResult.getNameInNamespace();
-                Attributes attributes = studioSearchResult.getAttributes();
-
-                LdifContentRecord record = new LdifContentRecord( LdifDnLine.create( dn ) );
-                NamingEnumeration<? extends Attribute> attributeEnumeration = attributes.getAll();
-                while ( attributeEnumeration.hasMore() )
-                {
-                    Attribute attribute = attributeEnumeration.next();
-                    String attributeName = attribute.getID();
-                    NamingEnumeration<?> valueEnumeration = attribute.getAll();
-                    while ( valueEnumeration.hasMore() )
-                    {
-                        Object o = valueEnumeration.next();
-                        if ( o instanceof String )
-                        {
-                            record.addAttrVal( LdifAttrValLine.create( attributeName, ( String ) o ) );
-                        }
-                        if ( o instanceof byte[] )
-                        {
-                            record.addAttrVal( LdifAttrValLine.create( attributeName, ( byte[] ) o ) );
-                        }
-                    }
-                }
-                record.finish( LdifSepLine.create() );
-                formattedString = record.toFormattedString( LdifFormatParameters.DEFAULT );
-            }
-            else
-            {
-                formattedString = LdifFormatParameters.DEFAULT.getLineSeparator();
-            }
-
-            log( formattedString, "SEARCH RESULT ENTRY (" + requestNum + ")", ex, connection ); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-        catch ( NamingException e )
-        {
-        }
-    }
-
-
-    /**
-     * {@inheritDoc}
-     */
     public void logSearchResultReference( Connection connection, Referral referral,
         ReferralsInfo referralsInfo, long requestNum, NamingException ex )
     {
diff --git a/plugins/ldapbrowser.core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/CopyEntriesRunnable.java b/plugins/ldapbrowser.core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/CopyEntriesRunnable.java
index edb69c0..9fa895d 100644
--- a/plugins/ldapbrowser.core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/CopyEntriesRunnable.java
+++ b/plugins/ldapbrowser.core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/CopyEntriesRunnable.java
@@ -24,23 +24,18 @@ package org.apache.directory.studio.ldapbrowser.core.jobs;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.List;
 
 import javax.naming.NameAlreadyBoundException;
 import javax.naming.NamingEnumeration;
-import javax.naming.directory.Attribute;
-import javax.naming.directory.Attributes;
-import javax.naming.directory.BasicAttribute;
 import javax.naming.directory.SearchControls;
-import javax.naming.directory.SearchResult;
 import javax.naming.ldap.Control;
 import javax.naming.ldap.ManageReferralControl;
 
 import org.apache.directory.api.ldap.model.constants.SchemaConstants;
-import org.apache.directory.api.ldap.model.entry.AttributeUtils;
 import org.apache.directory.api.ldap.model.entry.Entry;
 import org.apache.directory.api.ldap.model.entry.Modification;
+import org.apache.directory.api.ldap.model.exception.LdapException;
 import org.apache.directory.api.ldap.model.message.SearchScope;
 import org.apache.directory.api.ldap.model.name.Ava;
 import org.apache.directory.api.ldap.model.name.Dn;
@@ -49,6 +44,7 @@ import org.apache.directory.studio.common.core.jobs.StudioProgressMonitor;
 import org.apache.directory.studio.connection.core.Connection;
 import org.apache.directory.studio.connection.core.Connection.AliasDereferencingMethod;
 import org.apache.directory.studio.connection.core.Connection.ReferralHandlingMethod;
+import org.apache.directory.studio.connection.core.io.api.StudioSearchResult;
 import org.apache.directory.studio.connection.core.jobs.StudioConnectionBulkRunnableWithProgress;
 import org.apache.directory.studio.ldapbrowser.core.BrowserCoreMessages;
 import org.apache.directory.studio.ldapbrowser.core.events.BulkModificationEvent;
@@ -57,7 +53,6 @@ import org.apache.directory.studio.ldapbrowser.core.jobs.EntryExistsCopyStrategy
 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.ISearch;
-import org.apache.directory.studio.ldapbrowser.core.utils.JNDIUtils;
 import org.apache.directory.studio.ldapbrowser.core.utils.ModelConverter;
 
 
@@ -236,7 +231,7 @@ public class CopyEntriesRunnable implements StudioConnectionBulkRunnableWithProg
                 { new ManageReferralControl( false ) };
         }
 
-        NamingEnumeration<SearchResult> result = entryToCopy
+        NamingEnumeration<StudioSearchResult> result = entryToCopy
             .getBrowserConnection()
             .getConnection()
             .getConnectionWrapper()
@@ -276,7 +271,7 @@ public class CopyEntriesRunnable implements StudioConnectionBulkRunnableWithProg
      * 
      * @return the number of copied entries
      */
-    static int copyEntryRecursive( IBrowserConnection sourceBrowserConnection, NamingEnumeration<SearchResult> entries,
+    static int copyEntryRecursive( IBrowserConnection sourceBrowserConnection, NamingEnumeration<StudioSearchResult> entries,
         IBrowserConnection targetBrowserConnection, Dn parentDn, Rdn forceNewRdn, int scope,
         int numberOfCopiedEntries, EntryExistsCopyStrategyDialog dialog, StudioProgressMonitor dummyMonitor,
         StudioProgressMonitor monitor )
@@ -286,12 +281,12 @@ public class CopyEntriesRunnable implements StudioConnectionBulkRunnableWithProg
             while ( !monitor.isCanceled() && entries.hasMore() )
             {
                 // get next entry to copy
-                SearchResult sr = entries.next();
-                Dn oldLdapDn = JNDIUtils.getDn( sr );
+                Entry entry = entries.next().getEntry();
+                Dn oldLdapDn = entry.getDn();
                 Rdn oldRdn = oldLdapDn.getRdn();
 
                 // reuse attributes of the entry to copy
-                Attributes newAttributes = sr.getAttributes();
+//                Attributes newAttributes = sr.getAttributes();
 
                 // compose new Dn
                 Rdn newRdn = oldLdapDn.getRdn();
@@ -302,19 +297,17 @@ public class CopyEntriesRunnable implements StudioConnectionBulkRunnableWithProg
                 Dn newLdapDn = parentDn.add( newRdn );
 
                 // apply new Rdn to the attributes
-                applyNewRdn( newAttributes, oldRdn, newRdn );
+                applyNewRdn( entry, oldRdn, newRdn );
 
                 // ManageDsaIT control
                 Control[] controls = null;
-                if ( newAttributes.get( SchemaConstants.OBJECT_CLASS_AT ) != null
-                    && newAttributes.get( SchemaConstants.OBJECT_CLASS_AT ).contains( SchemaConstants.REFERRAL_OC ) )
+                if ( entry.hasObjectClass( SchemaConstants.REFERRAL_OC ) )
                 {
                     controls = new Control[]
                         { new ManageReferralControl( false ) };
                 }
 
                 // create entry
-                Entry entry = AttributeUtils.toEntry( newAttributes, newLdapDn );
                 targetBrowserConnection.getConnection().getConnectionWrapper()
                     .createEntry( entry, controls, dummyMonitor, null );
 
@@ -364,13 +357,12 @@ public class CopyEntriesRunnable implements StudioConnectionBulkRunnableWithProg
                                     Rdn renamedRdn = dialog.getRdn();
 
                                     // apply renamed Rdn to the attributes
-                                    applyNewRdn( newAttributes, newRdn, renamedRdn );
+                                    applyNewRdn( entry, newRdn, renamedRdn );
 
                                     // compose new Dn
                                     newLdapDn = parentDn.add( renamedRdn );
 
                                     // create entry
-                                    entry = AttributeUtils.toEntry( newAttributes, newLdapDn );
                                     targetBrowserConnection.getConnection().getConnectionWrapper()
                                         .createEntry( entry, null, dummyMonitor, null );
 
@@ -406,7 +398,7 @@ public class CopyEntriesRunnable implements StudioConnectionBulkRunnableWithProg
                         searchControls.setReturningAttributes( new String[]
                             { SchemaConstants.ALL_USER_ATTRIBUTES, SchemaConstants.REF_AT } );
                         searchControls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
-                        NamingEnumeration<SearchResult> childEntries = sourceBrowserConnection
+                        NamingEnumeration<StudioSearchResult> childEntries = sourceBrowserConnection
                             .getConnection()
                             .getConnectionWrapper()
                             .search( oldLdapDn.getName(), ISearch.FILTER_TRUE, searchControls,
@@ -433,37 +425,18 @@ public class CopyEntriesRunnable implements StudioConnectionBulkRunnableWithProg
     }
 
 
-    private static void applyNewRdn( Attributes attributes, Rdn oldRdn, Rdn newRdn )
+    private static void applyNewRdn( Entry entry, Rdn oldRdn, Rdn newRdn ) throws LdapException
     {
         // remove old Rdn attributes and values
-        for ( Iterator<Ava> it = oldRdn.iterator(); it.hasNext(); )
+        for ( Ava atav : oldRdn )
         {
-            Ava atav = it.next();
-            Attribute attribute = attributes.get( atav.getType() );
-            if ( attribute != null )
-            {
-                attribute.remove( atav.getValue().getNormalized() );
-                if ( attribute.size() == 0 )
-                {
-                    attributes.remove( atav.getType() );
-                }
-            }
+            entry.remove( atav.getAttributeType(), atav.getValue() );
         }
 
         // add new Rdn attributes and values
-        for ( Iterator<Ava> it = newRdn.iterator(); it.hasNext(); )
+        for ( Ava atav : newRdn )
         {
-            Ava atav = it.next();
-            Attribute attribute = attributes.get( atav.getType() );
-            if ( attribute == null )
-            {
-                attribute = new BasicAttribute( atav.getType() );
-                attributes.put( attribute );
-            }
-            if ( !attribute.contains( atav.getValue().getNormalized() ) )
-            {
-                attribute.add( atav.getValue().getNormalized() );
-            }
+            entry.add( atav.getAttributeType(), atav.getValue() );
         }
     }
 }
diff --git a/plugins/ldapbrowser.core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/DeleteEntriesRunnable.java b/plugins/ldapbrowser.core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/DeleteEntriesRunnable.java
index 8953543..ac13db7 100644
--- a/plugins/ldapbrowser.core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/DeleteEntriesRunnable.java
+++ b/plugins/ldapbrowser.core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/DeleteEntriesRunnable.java
@@ -32,7 +32,6 @@ import java.util.Set;
 import javax.naming.ContextNotEmptyException;
 import javax.naming.NamingEnumeration;
 import javax.naming.directory.SearchControls;
-import javax.naming.directory.SearchResult;
 import javax.naming.ldap.BasicControl;
 import javax.naming.ldap.Control;
 import javax.naming.ldap.ManageReferralControl;
@@ -43,6 +42,7 @@ import org.apache.directory.studio.connection.core.Connection;
 import org.apache.directory.studio.connection.core.Connection.AliasDereferencingMethod;
 import org.apache.directory.studio.connection.core.Connection.ReferralHandlingMethod;
 import org.apache.directory.studio.connection.core.StudioControl;
+import org.apache.directory.studio.connection.core.io.api.StudioSearchResult;
 import org.apache.directory.studio.connection.core.jobs.StudioConnectionBulkRunnableWithProgress;
 import org.apache.directory.studio.ldapbrowser.core.BrowserCoreMessages;
 import org.apache.directory.studio.ldapbrowser.core.events.BulkModificationEvent;
@@ -295,7 +295,7 @@ public class DeleteEntriesRunnable implements StudioConnectionBulkRunnableWithPr
                 searchControls.setCountLimit( 1000 );
                 searchControls.setReturningAttributes( new String[0] );
                 searchControls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
-                NamingEnumeration<SearchResult> result = browserConnection
+                NamingEnumeration<StudioSearchResult> result = browserConnection
                     .getConnection()
                     .getConnectionWrapper()
                     .search( dn.getName(), ISearch.FILTER_TRUE, searchControls, aliasDereferencingMethod,
@@ -306,8 +306,7 @@ public class DeleteEntriesRunnable implements StudioConnectionBulkRunnableWithPr
                     // delete all child entries
                     while ( !dummyMonitor.isCanceled() && !dummyMonitor.errorsReported() && result.hasMore() )
                     {
-                        SearchResult sr = result.next();
-                        Dn childDn = JNDIUtils.getDn( sr );
+                        Dn childDn = result.next().getDn();
 
                         numberOfDeletedEntries = optimisticDeleteEntryRecursive( browserConnection, childDn, false,
                             false, numberOfDeletedEntries, dummyMonitor, monitor );
diff --git a/plugins/ldapbrowser.core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ExportDsmlRunnable.java b/plugins/ldapbrowser.core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ExportDsmlRunnable.java
index eda846f..d6efc80 100644
--- a/plugins/ldapbrowser.core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ExportDsmlRunnable.java
+++ b/plugins/ldapbrowser.core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ExportDsmlRunnable.java
@@ -34,17 +34,16 @@ import javax.naming.directory.SearchResult;
 
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.directory.api.dsmlv2.DsmlDecorator;
+import org.apache.directory.api.dsmlv2.request.AddRequestDsml;
+import org.apache.directory.api.dsmlv2.request.BatchRequestDsml;
 import org.apache.directory.api.dsmlv2.response.BatchResponseDsml;
 import org.apache.directory.api.dsmlv2.response.SearchResponseDsml;
 import org.apache.directory.api.dsmlv2.response.SearchResultDoneDsml;
 import org.apache.directory.api.dsmlv2.response.SearchResultEntryDsml;
 import org.apache.directory.api.dsmlv2.response.SearchResultReferenceDsml;
-import org.apache.directory.api.dsmlv2.request.AddRequestDsml;
-import org.apache.directory.api.dsmlv2.request.BatchRequestDsml;
 import org.apache.directory.api.ldap.codec.api.LdapApiService;
 import org.apache.directory.api.ldap.codec.api.LdapApiServiceFactory;
 import org.apache.directory.api.ldap.model.entry.Attribute;
-import org.apache.directory.api.ldap.model.entry.AttributeUtils;
 import org.apache.directory.api.ldap.model.entry.Entry;
 import org.apache.directory.api.ldap.model.entry.Value;
 import org.apache.directory.api.ldap.model.exception.LdapException;
@@ -55,7 +54,6 @@ import org.apache.directory.api.ldap.model.message.Response;
 import org.apache.directory.api.ldap.model.message.ResultCodeEnum;
 import org.apache.directory.api.ldap.model.message.SearchResultDone;
 import org.apache.directory.api.ldap.model.message.SearchResultDoneImpl;
-import org.apache.directory.api.ldap.model.name.Dn;
 import org.apache.directory.api.ldap.model.url.LdapUrl;
 import org.apache.directory.studio.common.core.jobs.StudioProgressMonitor;
 import org.apache.directory.studio.connection.core.Connection;
@@ -287,8 +285,8 @@ public class ExportDsmlRunnable implements StudioConnectionRunnableWithProgress
                 // Creating and adding a search result entry or reference for each result
                 while ( ne.hasMore() )
                 {
-                    SearchResult searchResult = ne.next();
-                    sr.addResponse( convertSearchResultToDsml( searchResult ) );
+                    Entry entry = ne.next().getEntry();
+                    sr.addResponse( convertSearchResultToDsml( entry ) );
 
                     count++;
                     monitor.reportProgress( BrowserCoreMessages.bind( BrowserCoreMessages.jobs__export_progress,
@@ -338,16 +336,13 @@ public class ExportDsmlRunnable implements StudioConnectionRunnableWithProgress
     /**
      * Converts the given {@link SearchResult} to a {@link SearchResultEntryDsml}.
      *
-     * @param searchResult the search result
+     * @param entry2 the search result
      * @return the associated search result entry DSML
      * @throws org.apache.directory.api.ldap.model.exception.LdapException
      */
-    private static DsmlDecorator<? extends Response> convertSearchResultToDsml( SearchResult searchResult )
+    private static DsmlDecorator<? extends Response> convertSearchResultToDsml( Entry entry )
         throws LdapException
     {
-        Entry entry = AttributeUtils.toEntry( searchResult.getAttributes(),
-            new Dn( searchResult.getNameInNamespace() ) );
-
         if ( isReferral( entry ) )
         {
             // The search result is a referral
@@ -442,8 +437,8 @@ public class ExportDsmlRunnable implements StudioConnectionRunnableWithProgress
                 // Creating and adding an add request for each result
                 while ( ne.hasMore() )
                 {
-                    SearchResult searchResult = ne.next();
-                    AddRequestDsml arDsml = convertToAddRequestDsml( searchResult );
+                    Entry entry = ne.next().getEntry();
+                    AddRequestDsml arDsml = convertToAddRequestDsml( entry );
                     batchRequest.addRequest( arDsml );
 
                     count++;
@@ -474,18 +469,16 @@ public class ExportDsmlRunnable implements StudioConnectionRunnableWithProgress
     /**
      * Converts the given {@link SearchResult} to an {@link AddRequestDsml}.
      *
-     * @param searchResult
+     * @param entry2
      *      the {@link SearchResult}
      * @return
      *      the associated {@link AddRequestDsml}
      * @throws LdapException
      */
-    private AddRequestDsml convertToAddRequestDsml( SearchResult searchResult )
+    private AddRequestDsml convertToAddRequestDsml( Entry entry )
         throws LdapException
     {
         AddRequestDsml ar = new AddRequestDsml( codec );
-        Entry entry = AttributeUtils.toEntry( searchResult.getAttributes(),
-            new Dn( searchResult.getNameInNamespace() ) );
         ar.setEntry( entry );
 
         return ar;
diff --git a/plugins/ldapbrowser.core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ExportLdifRunnable.java b/plugins/ldapbrowser.core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ExportLdifRunnable.java
index af6ce11..34fe79c 100644
--- a/plugins/ldapbrowser.core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ExportLdifRunnable.java
+++ b/plugins/ldapbrowser.core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ExportLdifRunnable.java
@@ -27,14 +27,14 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
-import javax.naming.NamingEnumeration;
 import javax.naming.NamingException;
-import javax.naming.directory.Attribute;
-import javax.naming.directory.SearchResult;
 import javax.naming.ldap.Control;
 import javax.naming.ldap.PagedResultsResponseControl;
 
 import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.directory.api.ldap.model.entry.Attribute;
+import org.apache.directory.api.ldap.model.entry.Entry;
+import org.apache.directory.api.ldap.model.entry.Value;
 import org.apache.directory.api.ldap.model.exception.LdapInvalidDnException;
 import org.apache.directory.api.ldap.model.name.Dn;
 import org.apache.directory.studio.common.core.jobs.StudioProgressMonitor;
@@ -310,26 +310,22 @@ public class ExportLdifRunnable implements StudioConnectionRunnableWithProgress
 
         public LdifContainer next() throws NamingException, LdapInvalidDnException
         {
-            SearchResult sr = enumeration.next();
-            Dn dn = JNDIUtils.getDn( sr );
+            Entry entry = enumeration.next().getEntry();
+            Dn dn = entry.getDn();
             LdifContentRecord record = LdifContentRecord.create( dn.getName() );
 
-            NamingEnumeration<? extends Attribute> attributeEnumeration = sr.getAttributes().getAll();
-            while ( attributeEnumeration.hasMore() )
+            for ( Attribute attribute : entry )
             {
-                Attribute attribute = attributeEnumeration.next();
-                String attributeName = attribute.getID();
-                NamingEnumeration<?> valueEnumeration = attribute.getAll();
-                while ( valueEnumeration.hasMore() )
+                String attributeName = attribute.getUpId();
+                for ( Value value : attribute )
                 {
-                    Object o = valueEnumeration.next();
-                    if ( o instanceof String )
+                    if ( value.isHumanReadable() )
                     {
-                        record.addAttrVal( LdifAttrValLine.create( attributeName, ( String ) o ) );
+                        record.addAttrVal( LdifAttrValLine.create( attributeName, value.getValue() ) );
                     }
-                    if ( o instanceof byte[] )
+                    else
                     {
-                        record.addAttrVal( LdifAttrValLine.create( attributeName, ( byte[] ) o ) );
+                        record.addAttrVal( LdifAttrValLine.create( attributeName, value.getBytes() ) );
                     }
                 }
             }
diff --git a/plugins/ldapbrowser.core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ReloadSchemaRunnable.java b/plugins/ldapbrowser.core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ReloadSchemaRunnable.java
index 18b9446..9d81503 100644
--- a/plugins/ldapbrowser.core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ReloadSchemaRunnable.java
+++ b/plugins/ldapbrowser.core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ReloadSchemaRunnable.java
@@ -22,14 +22,14 @@ package org.apache.directory.studio.ldapbrowser.core.jobs;
 
 
 import javax.naming.NamingEnumeration;
-import javax.naming.directory.Attribute;
-import javax.naming.directory.SearchResult;
 
 import org.apache.directory.api.ldap.model.constants.SchemaConstants;
+import org.apache.directory.api.ldap.model.entry.Entry;
 import org.apache.directory.api.ldap.model.message.SearchScope;
 import org.apache.directory.api.ldap.model.name.Dn;
 import org.apache.directory.studio.common.core.jobs.StudioProgressMonitor;
 import org.apache.directory.studio.connection.core.Connection;
+import org.apache.directory.studio.connection.core.io.api.StudioSearchResult;
 import org.apache.directory.studio.connection.core.jobs.StudioConnectionBulkRunnableWithProgress;
 import org.apache.directory.studio.ldapbrowser.core.BrowserCoreMessages;
 import org.apache.directory.studio.ldapbrowser.core.events.BrowserConnectionUpdateEvent;
@@ -211,25 +211,20 @@ public class ReloadSchemaRunnable implements StudioConnectionBulkRunnableWithPro
             sp.setScope( SearchScope.OBJECT );
             sp.setReturningAttributes( new String[]
                 { SchemaConstants.CREATE_TIMESTAMP_AT, SchemaConstants.MODIFY_TIMESTAMP_AT } );
-            NamingEnumeration<SearchResult> enumeration = SearchRunnable.search( browserConnection, sp, monitor );
+            NamingEnumeration<StudioSearchResult> enumeration = SearchRunnable.search( browserConnection, sp, monitor );
             while ( enumeration != null && enumeration.hasMore() )
             {
                 String createTimestamp = null;
                 String modifyTimestamp = null;
 
-                SearchResult sr = enumeration.next();
-                NamingEnumeration<? extends Attribute> attributes = sr.getAttributes().getAll();
-                while ( attributes.hasMore() )
+                Entry entry = enumeration.next().getEntry();
+                if ( entry.hasObjectClass( SchemaConstants.MODIFY_TIMESTAMP_AT ) )
                 {
-                    Attribute attribute = attributes.next();
-                    if ( attribute.getID().equalsIgnoreCase( SchemaConstants.MODIFY_TIMESTAMP_AT ) )
-                    {
-                        modifyTimestamp = ( String ) attribute.get();
-                    }
-                    if ( attribute.getID().equalsIgnoreCase( SchemaConstants.CREATE_TIMESTAMP_AT ) )
-                    {
-                        createTimestamp = ( String ) attribute.get();
-                    }
+                    modifyTimestamp = entry.get( SchemaConstants.MODIFY_TIMESTAMP_AT ).getString();
+                }
+                if ( entry.hasObjectClass( SchemaConstants.CREATE_TIMESTAMP_AT ) )
+                {
+                    createTimestamp = entry.get( SchemaConstants.CREATE_TIMESTAMP_AT ).getString();
                 }
 
                 String schemaTimestamp = modifyTimestamp != null ? modifyTimestamp : createTimestamp;
@@ -261,22 +256,17 @@ public class ReloadSchemaRunnable implements StudioConnectionBulkRunnableWithPro
             sp.setScope( SearchScope.OBJECT );
             sp.setReturningAttributes( new String[]
                 { SchemaConstants.SUBSCHEMA_SUBENTRY_AT } );
-            NamingEnumeration<SearchResult> enumeration = SearchRunnable.search( browserConnection, sp, monitor );
+            NamingEnumeration<StudioSearchResult> enumeration = SearchRunnable.search( browserConnection, sp, monitor );
             while ( enumeration != null && enumeration.hasMore() )
             {
-                SearchResult sr = enumeration.next();
-                NamingEnumeration<? extends Attribute> attributes = sr.getAttributes().getAll();
-                while ( attributes.hasMore() )
+                Entry entry = enumeration.next().getEntry();
+                if ( entry.containsAttribute( SchemaConstants.SUBSCHEMA_SUBENTRY_AT ) )
                 {
-                    Attribute attribute = attributes.next();
-                    if ( attribute.getID().equalsIgnoreCase( SchemaConstants.SUBSCHEMA_SUBENTRY_AT ) )
+                    String value = entry.get( SchemaConstants.SUBSCHEMA_SUBENTRY_AT ).getString();
+                    if ( Dn.isValid( value ) )
                     {
-                        String value = ( String ) attribute.get();
-                        if ( Dn.isValid( value ) )
-                        {
-                            Dn dn = new Dn( value );
-                            return dn;
-                        }
+                        Dn dn = new Dn( value );
+                        return dn;
                     }
                 }
             }
diff --git a/plugins/ldapbrowser.core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/SearchRunnable.java b/plugins/ldapbrowser.core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/SearchRunnable.java
index 092a27d..a9a94b0 100644
--- a/plugins/ldapbrowser.core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/SearchRunnable.java
+++ b/plugins/ldapbrowser.core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/SearchRunnable.java
@@ -29,16 +29,14 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
 
-import javax.naming.NamingEnumeration;
 import javax.naming.NamingException;
-import javax.naming.directory.Attribute;
 import javax.naming.directory.SearchControls;
-import javax.naming.directory.SearchResult;
 import javax.naming.ldap.BasicControl;
 import javax.naming.ldap.Control;
 import javax.naming.ldap.PagedResultsResponseControl;
 
 import org.apache.directory.api.ldap.model.constants.SchemaConstants;
+import org.apache.directory.api.ldap.model.entry.Attribute;
 import org.apache.directory.api.ldap.model.message.SearchScope;
 import org.apache.directory.api.ldap.model.name.Dn;
 import org.apache.directory.api.ldap.model.url.LdapUrl;
@@ -50,7 +48,7 @@ import org.apache.directory.studio.connection.core.Connection.ReferralHandlingMe
 import org.apache.directory.studio.connection.core.StudioControl;
 import org.apache.directory.studio.connection.core.StudioPagedResultsControl;
 import org.apache.directory.studio.connection.core.io.StudioNamingEnumeration;
-import org.apache.directory.studio.connection.core.io.jndi.StudioSearchResult;
+import org.apache.directory.studio.connection.core.io.api.StudioSearchResult;
 import org.apache.directory.studio.connection.core.jobs.StudioConnectionBulkRunnableWithProgress;
 import org.apache.directory.studio.ldapbrowser.core.BrowserCoreMessages;
 import org.apache.directory.studio.ldapbrowser.core.BrowserCorePlugin;
@@ -320,13 +318,13 @@ public class SearchRunnable implements StudioConnectionBulkRunnableWithProgress
                     // iterate through the search result
                     while ( !monitor.isCanceled() && enumeration != null && enumeration.hasMore() )
                     {
-                        StudioSearchResult sr = ( StudioSearchResult ) enumeration.next();
+                        StudioSearchResult sr = enumeration.next();
                         boolean isContinuedSearchResult = sr.isContinuedSearchResult();
                         LdapUrl searchContinuationUrl = sr.getSearchContinuationUrl();
 
                         if ( searchContinuationUrl == null )
                         {
-                            Dn dn = JNDIUtils.getDn( sr );
+                            Dn dn = sr.getDn();
                             IEntry entry = null;
 
                             Connection resultConnection = sr.getConnection();
@@ -697,18 +695,14 @@ public class SearchRunnable implements StudioConnectionBulkRunnableWithProgress
      * @param sr the the JNDI search result
      * @param searchParameter the search parameters
      */
-    private static void initFlags( IEntry entry, SearchResult sr, SearchParameter searchParameter )
+    private static void initFlags( IEntry entry, StudioSearchResult sr, SearchParameter searchParameter )
         throws NamingException
     {
-        NamingEnumeration<? extends Attribute> attributeEnumeration = sr.getAttributes().getAll();
-        while ( attributeEnumeration.hasMore() )
+        for ( Attribute attribute : sr.getEntry() )
         {
-            Attribute attribute = attributeEnumeration.next();
-
             if ( attribute != null )
             {
-                String attributeDescription = attribute.getID();
-                NamingEnumeration<?> valueEnumeration = attribute.getAll();
+                String attributeDescription = attribute.getUpId();
                 if ( SchemaConstants.OBJECT_CLASS_AT.equalsIgnoreCase( attributeDescription ) )
                 {
                     if ( entry.getAttribute( attributeDescription ) != null )
@@ -718,12 +712,11 @@ public class SearchRunnable implements StudioConnectionBulkRunnableWithProgress
                     entry.addAttribute( new org.apache.directory.studio.ldapbrowser.core.model.impl.Attribute( entry,
                         attributeDescription ) );
                 }
-                while ( valueEnumeration.hasMore() )
+                for ( org.apache.directory.api.ldap.model.entry.Value valueObject : attribute )
                 {
-                    Object o = valueEnumeration.next();
-                    if ( o instanceof String )
+                    if ( valueObject.isHumanReadable() )
                     {
-                        String value = ( String ) o;
+                        String value = valueObject.getValue();
 
                         if ( searchParameter.isInitHasChildrenFlag() )
                         {
@@ -789,7 +782,7 @@ public class SearchRunnable implements StudioConnectionBulkRunnableWithProgress
      * @param sr the JNDI search result
      * @param searchParameter the search parameters
      */
-    private static void fillAttributes( IEntry entry, SearchResult sr, SearchParameter searchParameter )
+    private static void fillAttributes( IEntry entry, StudioSearchResult sr, SearchParameter searchParameter )
         throws NamingException
     {
         if ( searchParameter.getReturningAttributes() == null || searchParameter.getReturningAttributes().length > 0 )
@@ -852,11 +845,9 @@ public class SearchRunnable implements StudioConnectionBulkRunnableWithProgress
             }
 
             // additional clear old attributes if the record contains the attribute
-            NamingEnumeration<? extends Attribute> attributeEnumeration = sr.getAttributes().getAll();
-            while ( attributeEnumeration.hasMore() )
+            for ( Attribute attribute : sr.getEntry() )
             {
-                Attribute attribute = attributeEnumeration.next();
-                String attributeDescription = attribute.getID();
+                String attributeDescription = attribute.getUpId();
                 IAttribute oldAttribute = entry.getAttribute( attributeDescription );
                 if ( oldAttribute != null )
                 {
@@ -865,13 +856,11 @@ public class SearchRunnable implements StudioConnectionBulkRunnableWithProgress
             }
 
             // set new attributes and values
-            attributeEnumeration = sr.getAttributes().getAll();
-            while ( attributeEnumeration.hasMore() )
+            for ( Attribute attribute : sr.getEntry() )
             {
-                Attribute attribute = attributeEnumeration.next();
-                String attributeDescription = attribute.getID();
+                String attributeDescription = attribute.getUpId();
 
-                if ( attribute.getAll().hasMore() )
+                if ( attribute.iterator().hasNext() )
                 {
                     IAttribute studioAttribute = null;
                     if ( entry.getAttribute( attributeDescription ) == null )
@@ -885,11 +874,16 @@ public class SearchRunnable implements StudioConnectionBulkRunnableWithProgress
                         studioAttribute = entry.getAttribute( attributeDescription );
                     }
 
-                    NamingEnumeration<?> valueEnumeration = attribute.getAll();
-                    while ( valueEnumeration.hasMore() )
+                    for ( org.apache.directory.api.ldap.model.entry.Value value : attribute )
                     {
-                        Object value = valueEnumeration.next();
-                        studioAttribute.addValue( new Value( studioAttribute, value ) );
+                        if ( value.isHumanReadable() )
+                        {
+                            studioAttribute.addValue( new Value( studioAttribute, value.getValue() ) );
+                        }
+                        else
+                        {
+                            studioAttribute.addValue( new Value( studioAttribute, value.getBytes() ) );
+                        }
                     }
                 }
             }
diff --git a/plugins/openldap.config.editor/src/main/java/org/apache/directory/studio/openldap/config/model/io/ConfigurationReader.java b/plugins/openldap.config.editor/src/main/java/org/apache/directory/studio/openldap/config/model/io/ConfigurationReader.java
index a198197..456596d 100644
--- a/plugins/openldap.config.editor/src/main/java/org/apache/directory/studio/openldap/config/model/io/ConfigurationReader.java
+++ b/plugins/openldap.config.editor/src/main/java/org/apache/directory/studio/openldap/config/model/io/ConfigurationReader.java
@@ -36,13 +36,9 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import javax.naming.directory.SearchResult;
-
 import org.apache.directory.api.ldap.model.constants.LdapConstants;
 import org.apache.directory.api.ldap.model.constants.SchemaConstants;
 import org.apache.directory.api.ldap.model.entry.Attribute;
-import org.apache.directory.api.ldap.model.entry.AttributeUtils;
-import org.apache.directory.api.ldap.model.entry.DefaultEntry;
 import org.apache.directory.api.ldap.model.entry.Entry;
 import org.apache.directory.api.ldap.model.entry.Value;
 import org.apache.directory.api.ldap.model.exception.LdapInvalidDnException;
@@ -55,6 +51,7 @@ import org.apache.directory.api.ldap.util.tree.DnNode;
 import org.apache.directory.studio.common.core.jobs.StudioProgressMonitor;
 import org.apache.directory.studio.connection.core.Connection;
 import org.apache.directory.studio.connection.core.io.StudioNamingEnumeration;
+import org.apache.directory.studio.connection.core.io.api.StudioSearchResult;
 import org.apache.directory.studio.ldapbrowser.core.BrowserCorePlugin;
 import org.apache.directory.studio.ldapbrowser.core.jobs.SearchRunnable;
 import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection;
@@ -492,9 +489,8 @@ public class ConfigurationReader
         if ( enumeration.hasMore() )
         {
             // Creating the base entry
-            SearchResult searchResult =  enumeration.next();
-            configEntry = new DefaultEntry( schemaManager, AttributeUtils.toEntry( searchResult.getAttributes(),
-                new Dn( searchResult.getNameInNamespace() ) ) );
+            StudioSearchResult searchResult =  enumeration.next();
+            configEntry = searchResult.getEntry();
         }
         enumeration.close();
 
@@ -538,10 +534,8 @@ public class ConfigurationReader
             while ( childrenEnumeration.hasMore() )
             {
                 // Creating the child entry
-                SearchResult searchResult =  childrenEnumeration.next();
-                Entry childEntry = new DefaultEntry( schemaManager, AttributeUtils.toEntry(
-                    searchResult.getAttributes(),
-                    new Dn( searchResult.getNameInNamespace() ) ) );
+                StudioSearchResult searchResult =  childrenEnumeration.next();
+                Entry childEntry = searchResult.getEntry();
 
                 // Adding the children to the list of entries
                 entries.add( childEntry );
diff --git a/plugins/schemaeditor/src/main/java/org/apache/directory/studio/schemaeditor/model/io/ApacheDsSchemaConnector.java b/plugins/schemaeditor/src/main/java/org/apache/directory/studio/schemaeditor/model/io/ApacheDsSchemaConnector.java
index 523f6af..d40f2a3 100644
--- a/plugins/schemaeditor/src/main/java/org/apache/directory/studio/schemaeditor/model/io/ApacheDsSchemaConnector.java
+++ b/plugins/schemaeditor/src/main/java/org/apache/directory/studio/schemaeditor/model/io/ApacheDsSchemaConnector.java
@@ -22,16 +22,20 @@ package org.apache.directory.studio.schemaeditor.model.io;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.StreamSupport;
 
 import javax.naming.NamingEnumeration;
 import javax.naming.NamingException;
-import javax.naming.directory.Attribute;
 import javax.naming.directory.SearchControls;
-import javax.naming.directory.SearchResult;
 
 import org.apache.directory.api.ldap.model.constants.LdapConstants;
 import org.apache.directory.api.ldap.model.constants.MetaSchemaConstants;
 import org.apache.directory.api.ldap.model.constants.SchemaConstants;
+import org.apache.directory.api.ldap.model.entry.Attribute;
+import org.apache.directory.api.ldap.model.entry.Entry;
+import org.apache.directory.api.ldap.model.entry.Value;
+import org.apache.directory.api.ldap.model.exception.LdapInvalidAttributeValueException;
 import org.apache.directory.api.ldap.model.schema.AttributeType;
 import org.apache.directory.api.ldap.model.schema.LdapSyntax;
 import org.apache.directory.api.ldap.model.schema.MatchingRule;
@@ -43,6 +47,7 @@ import org.apache.directory.api.ldap.model.schema.UsageEnum;
 import org.apache.directory.studio.common.core.jobs.StudioProgressMonitor;
 import org.apache.directory.studio.connection.core.Connection;
 import org.apache.directory.studio.connection.core.io.ConnectionWrapper;
+import org.apache.directory.studio.connection.core.io.api.StudioSearchResult;
 import org.apache.directory.studio.schemaeditor.model.Project;
 import org.apache.directory.studio.schemaeditor.model.Schema;
 
@@ -79,7 +84,7 @@ public class ApacheDsSchemaConnector extends AbstractSchemaConnector implements
         SearchControls constraintSearch = new SearchControls();
         constraintSearch.setSearchScope( SearchControls.ONELEVEL_SCOPE );
 
-        NamingEnumeration<SearchResult> answer = wrapper
+        NamingEnumeration<StudioSearchResult> answer = wrapper
             .search( SchemaConstants.OU_SCHEMA, "(objectclass=metaSchema)", constraintSearch, DEREF_ALIAS_METHOD, //$NON-NLS-1$ //$NON-NLS-2$
                 HANDLE_REFERALS_METHOD, null, monitor, null );
         
@@ -89,20 +94,18 @@ public class ApacheDsSchemaConnector extends AbstractSchemaConnector implements
             {
                 while ( answer.hasMore() )
                 {
-                    SearchResult searchResult = answer.next();
+                    StudioSearchResult searchResult = answer.next();
 
                     // Getting the 'cn' Attribute
-                    Attribute cnAttribute = searchResult.getAttributes().get( SchemaConstants.CN_AT );
+                    Attribute cnAttribute = searchResult.getEntry()
+                        .get( SchemaConstants.CN_AT );
 
                     // Looping on the values
-                    NamingEnumeration<?> ne = cnAttribute.getAll();
-                    
-                    if ( ne != null )
+                    if ( cnAttribute != null )
                     {
-                        while ( ne.hasMore() )
+                        for ( Value cnValue : cnAttribute )
                         {
-                            String cnValue = (String)ne.next();
-                            Schema schema = getSchema( wrapper, cnValue, monitor );
+                            Schema schema = getSchema( wrapper, cnValue.getValue(), monitor );
                             schema.setProject( project );
                             schemas.add( schema );
                         }
@@ -131,7 +134,7 @@ public class ApacheDsSchemaConnector extends AbstractSchemaConnector implements
         constraintSearch.setReturningAttributes( new String[]
             { SchemaConstants.ALL_OPERATIONAL_ATTRIBUTES } );
 
-        NamingEnumeration<SearchResult> answer = wrapper.search( "", LdapConstants.OBJECT_CLASS_STAR, constraintSearch, //$NON-NLS-1$ //$NON-NLS-2$
+        NamingEnumeration<StudioSearchResult> answer = wrapper.search( "", LdapConstants.OBJECT_CLASS_STAR, constraintSearch, //$NON-NLS-1$ //$NON-NLS-2$
             DEREF_ALIAS_METHOD, HANDLE_REFERALS_METHOD, null, monitor, null );
 
         if ( answer != null )
@@ -140,9 +143,9 @@ public class ApacheDsSchemaConnector extends AbstractSchemaConnector implements
             {
                 if ( answer.hasMore() )
                 {
-                    SearchResult searchResult = answer.next();
+                    Entry entry = answer.next().getEntry();
 
-                    Attribute vendorNameAttribute = searchResult.getAttributes().get( SchemaConstants.VENDOR_NAME_AT );
+                    Attribute vendorNameAttribute = entry.get( SchemaConstants.VENDOR_NAME_AT );
                     
                     if ( vendorNameAttribute == null )
                     {
@@ -157,9 +160,9 @@ public class ApacheDsSchemaConnector extends AbstractSchemaConnector implements
                     String vendorName = null;
                     try
                     {
-                        vendorName = ( String ) vendorNameAttribute.get();
+                        vendorName = vendorNameAttribute.getString();
                     }
-                    catch ( NamingException e )
+                    catch ( LdapInvalidAttributeValueException e )
                     {
                         return false;
                     }
@@ -189,7 +192,7 @@ public class ApacheDsSchemaConnector extends AbstractSchemaConnector implements
         SearchControls constraintSearch = new SearchControls();
         constraintSearch.setSearchScope( SearchControls.SUBTREE_SCOPE );
 
-        NamingEnumeration<SearchResult> answer = wrapper.search( "cn=" + name + ", ou=schema", LdapConstants.OBJECT_CLASS_STAR, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+        NamingEnumeration<StudioSearchResult> answer = wrapper.search( "cn=" + name + ", ou=schema", LdapConstants.OBJECT_CLASS_STAR, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
             constraintSearch, DEREF_ALIAS_METHOD, HANDLE_REFERALS_METHOD, null, monitor, null );
         
         if ( answer != null )
@@ -198,30 +201,30 @@ public class ApacheDsSchemaConnector extends AbstractSchemaConnector implements
             {
                 while ( answer.hasMore() )
                 {
-                    SearchResult searchResult = answer.next();
+                    Entry entry = answer.next().getEntry();
                     
-                    switch ( getNodeType( searchResult ) )
+                    switch ( getNodeType( entry ) )
                     {
                         case ATTRIBUTE_TYPE:
-                            AttributeType at = createAttributeType( searchResult );
+                            AttributeType at = createAttributeType( entry );
                             at.setSchemaName( name );
                             schema.addAttributeType( at );
                             break;
                             
                         case OBJECT_CLASS:
-                            MutableObjectClass oc = createObjectClass( searchResult );
+                            MutableObjectClass oc = createObjectClass( entry );
                             oc.setSchemaName( name );
                             schema.addObjectClass( oc );
                             break;
                             
                         case MATCHING_RULE:
-                            MatchingRule mr = createMatchingRule( searchResult );
+                            MatchingRule mr = createMatchingRule( entry );
                             mr.setSchemaName( name );
                             schema.addMatchingRule( mr );
                             break;
                             
                         case SYNTAX:
-                            LdapSyntax syntax = createSyntax( searchResult );
+                            LdapSyntax syntax = createSyntax( entry );
                             syntax.setSchemaName( name );
                             schema.addSyntax( syntax );
                             break;
@@ -231,7 +234,7 @@ public class ApacheDsSchemaConnector extends AbstractSchemaConnector implements
                     }
                 }
             }
-            catch ( NamingException e )
+            catch ( LdapInvalidAttributeValueException e )
             {
                 monitor.reportError( e );
             }
@@ -244,68 +247,59 @@ public class ApacheDsSchemaConnector extends AbstractSchemaConnector implements
     /**
      * Gets the Type of node of the given SearchResult.
      * 
-     * @param sr the SearchResult to be identified
+     * @param entry the SearchResult to be identified
      * @return the Type of node
      * @throws NamingException if an error occurrs when reading the SearchResult
      */
-    private static SchemaNodeTypes getNodeType( SearchResult sr ) throws NamingException
+    private static SchemaNodeTypes getNodeType( Entry entry ) throws NamingException
     {
-        // Getting the 'ObjectClass' Attribute
-        Attribute objectClassAttribute = sr.getAttributes().get( SchemaConstants.OBJECT_CLASS_AT );
-
-        // Looping on the values
-        NamingEnumeration<?> ne = objectClassAttribute.getAll();
-        
-        while ( ne.hasMore() )
+        if ( entry.hasObjectClass( SchemaConstants.META_ATTRIBUTE_TYPE_OC ) )
         {
-            String value = ( String ) ne.next();
-            
-            if ( SchemaConstants.META_ATTRIBUTE_TYPE_OC.equalsIgnoreCase( value ) )
-            {
-                return SchemaNodeTypes.ATTRIBUTE_TYPE;
-            }
-            else if ( SchemaConstants.META_OBJECT_CLASS_OC.equalsIgnoreCase( value ) )
-            {
-                return SchemaNodeTypes.OBJECT_CLASS;
-            }
-            else if ( SchemaConstants.META_MATCHING_RULE_OC.equalsIgnoreCase( value ) )
-            {
-                return SchemaNodeTypes.MATCHING_RULE;
-            }
-            else if ( SchemaConstants.META_SYNTAX_OC.equalsIgnoreCase( value ) )
-            {
-                return SchemaNodeTypes.SYNTAX;
-            }
+            return SchemaNodeTypes.ATTRIBUTE_TYPE;
+        }
+        else if ( entry.hasObjectClass( SchemaConstants.META_OBJECT_CLASS_OC ) )
+        {
+            return SchemaNodeTypes.OBJECT_CLASS;
+        }
+        else if ( entry.hasObjectClass( SchemaConstants.META_MATCHING_RULE_OC ) )
+        {
+            return SchemaNodeTypes.MATCHING_RULE;
+        }
+        else if ( entry.hasObjectClass( SchemaConstants.META_SYNTAX_OC ) )
+        {
+            return SchemaNodeTypes.SYNTAX;
+        }
+        else
+        {
+            return SchemaNodeTypes.UNKNOWN;
         }
-
-        return SchemaNodeTypes.UNKNOWN;
     }
 
 
     /**
      * Create the AttributeTypeImpl associated with the given SearchResult.
      * 
-     * @param sr the SearchResult
+     * @param entry the search result entry
      * @return the AttributeTypeImpl associated with the SearchResult, or null if no
      * AttributeTypeImpl could be created
-     * @throws NamingException
+     * @throws LdapInvalidAttributeValueException
      */
-    private static AttributeType createAttributeType( SearchResult sr ) throws NamingException
+    private static AttributeType createAttributeType( Entry entry ) throws LdapInvalidAttributeValueException
     {
-        MutableAttributeType at = new MutableAttributeType( getStringValue( sr, MetaSchemaConstants.M_OID_AT ) );
-        at.setNames( getStringValues( sr, MetaSchemaConstants.M_NAME_AT ) );
-        at.setDescription( getStringValue( sr, MetaSchemaConstants.M_DESCRIPTION_AT ) );
-        at.setObsolete( getBooleanValue( sr, MetaSchemaConstants.M_OBSOLETE_AT ) );
-        at.setSuperiorOid( getStringValue( sr, MetaSchemaConstants.M_SUP_ATTRIBUTE_TYPE_AT ) );
-        at.setUsage( getUsage( sr ) );
-        at.setSyntaxOid( getStringValue( sr, MetaSchemaConstants.M_SYNTAX_AT ) );
-        at.setSyntaxLength( getSyntaxLength( sr ) );
-        at.setCollective( getBooleanValue( sr, MetaSchemaConstants.M_COLLECTIVE_AT ) );
-        at.setSingleValued( getBooleanValue( sr, MetaSchemaConstants.M_SINGLE_VALUE_AT ) );
-        at.setUserModifiable( getBooleanValue( sr, MetaSchemaConstants.M_NO_USER_MODIFICATION_AT ) );
-        at.setEqualityOid( getStringValue( sr, MetaSchemaConstants.M_EQUALITY_AT ) );
-        at.setOrderingOid( getStringValue( sr, MetaSchemaConstants.M_ORDERING_AT ) );
-        at.setSubstringOid( getStringValue( sr, MetaSchemaConstants.M_SUBSTR_AT ) );
+        MutableAttributeType at = new MutableAttributeType( getStringValue( entry, MetaSchemaConstants.M_OID_AT ) );
+        at.setNames( getStringValues( entry, MetaSchemaConstants.M_NAME_AT ) );
+        at.setDescription( getStringValue( entry, MetaSchemaConstants.M_DESCRIPTION_AT ) );
+        at.setObsolete( getBooleanValue( entry, MetaSchemaConstants.M_OBSOLETE_AT ) );
+        at.setSuperiorOid( getStringValue( entry, MetaSchemaConstants.M_SUP_ATTRIBUTE_TYPE_AT ) );
+        at.setUsage( getUsage( entry ) );
+        at.setSyntaxOid( getStringValue( entry, MetaSchemaConstants.M_SYNTAX_AT ) );
+        at.setSyntaxLength( getSyntaxLength( entry ) );
+        at.setCollective( getBooleanValue( entry, MetaSchemaConstants.M_COLLECTIVE_AT ) );
+        at.setSingleValued( getBooleanValue( entry, MetaSchemaConstants.M_SINGLE_VALUE_AT ) );
+        at.setUserModifiable( getBooleanValue( entry, MetaSchemaConstants.M_NO_USER_MODIFICATION_AT ) );
+        at.setEqualityOid( getStringValue( entry, MetaSchemaConstants.M_EQUALITY_AT ) );
+        at.setOrderingOid( getStringValue( entry, MetaSchemaConstants.M_ORDERING_AT ) );
+        at.setSubstringOid( getStringValue( entry, MetaSchemaConstants.M_SUBSTR_AT ) );
         
         return at;
     }
@@ -317,9 +311,9 @@ public class ApacheDsSchemaConnector extends AbstractSchemaConnector implements
      * @param sr the SearchResult
      * @return the ObjectClassImpl associated with the SearchResult, or null if no
      * ObjectClassImpl could be created
-     * @throws NamingException
+     * @throws LdapInvalidAttributeValueException
      */
-    private static MutableObjectClass createObjectClass( SearchResult sr ) throws NamingException
+    private static MutableObjectClass createObjectClass( Entry sr ) throws LdapInvalidAttributeValueException
     {
         MutableObjectClass oc = new MutableObjectClass( getStringValue( sr, MetaSchemaConstants.M_OID_AT ) );
         oc.setNames( getStringValues( sr, MetaSchemaConstants.M_NAME_AT ) );
@@ -337,18 +331,18 @@ public class ApacheDsSchemaConnector extends AbstractSchemaConnector implements
     /**
      * Create the MatchingRule associated with the given SearchResult.
      * 
-     * @param sr the SearchResult
+     * @param entry the SearchResult
      * @return the MatchingRule associated with the SearchResult, or null if no
      * ObjectClass could be created
-     * @throws NamingException
+     * @throws LdapInvalidAttributeValueException 
      */
-    private static MatchingRule createMatchingRule( SearchResult sr ) throws NamingException
+    private static MatchingRule createMatchingRule( Entry entry ) throws LdapInvalidAttributeValueException
     {
-        MutableMatchingRule mr = new MutableMatchingRule( getStringValue( sr, MetaSchemaConstants.M_OID_AT ) );
-        mr.setNames( getStringValues( sr, MetaSchemaConstants.M_NAME_AT ) );
-        mr.setDescription( getStringValue( sr, MetaSchemaConstants.M_DESCRIPTION_AT ) );
-        mr.setObsolete( getBooleanValue( sr, MetaSchemaConstants.M_OBSOLETE_AT ) );
-        mr.setSyntaxOid( getStringValue( sr, MetaSchemaConstants.M_SYNTAX_AT ) );
+        MutableMatchingRule mr = new MutableMatchingRule( getStringValue( entry, MetaSchemaConstants.M_OID_AT ) );
+        mr.setNames( getStringValues( entry, MetaSchemaConstants.M_NAME_AT ) );
+        mr.setDescription( getStringValue( entry, MetaSchemaConstants.M_DESCRIPTION_AT ) );
+        mr.setObsolete( getBooleanValue( entry, MetaSchemaConstants.M_OBSOLETE_AT ) );
+        mr.setSyntaxOid( getStringValue( entry, MetaSchemaConstants.M_SYNTAX_AT ) );
         
         return mr;
     }
@@ -357,18 +351,18 @@ public class ApacheDsSchemaConnector extends AbstractSchemaConnector implements
     /**
      * Create the MatchingRule associated with the given SearchResult.
      * 
-     * @param sr the SearchResult
+     * @param entry the SearchResult
      * @return the MatchingRule associated with the SearchResult, or null if no
      * ObjectClass could be created
-     * @throws NamingException
+     * @throws LdapInvalidAttributeValueException
      */
-    private static LdapSyntax createSyntax( SearchResult sr ) throws NamingException
+    private static LdapSyntax createSyntax( Entry entry ) throws LdapInvalidAttributeValueException
     {
-        LdapSyntax syntax = new LdapSyntax( getStringValue( sr, MetaSchemaConstants.M_OID_AT ) );
-        syntax.setNames( getStringValues( sr, MetaSchemaConstants.M_NAME_AT ) );
-        syntax.setDescription( getStringValue( sr, MetaSchemaConstants.M_DESCRIPTION_AT ) );
-        syntax.setObsolete( getBooleanValue( sr, MetaSchemaConstants.M_OBSOLETE_AT ) );
-        syntax.setHumanReadable( isHumanReadable( sr ) );
+        LdapSyntax syntax = new LdapSyntax( getStringValue( entry, MetaSchemaConstants.M_OID_AT ) );
+        syntax.setNames( getStringValues( entry, MetaSchemaConstants.M_NAME_AT ) );
+        syntax.setDescription( getStringValue( entry, MetaSchemaConstants.M_DESCRIPTION_AT ) );
+        syntax.setObsolete( getBooleanValue( entry, MetaSchemaConstants.M_OBSOLETE_AT ) );
+        syntax.setHumanReadable( isHumanReadable( entry ) );
         
         return syntax;
     }
@@ -381,9 +375,9 @@ public class ApacheDsSchemaConnector extends AbstractSchemaConnector implements
      * @return the usage of the attribute type
      * @throws NamingException if an error occurs when searching in the SearchResult
      */
-    private static UsageEnum getUsage( SearchResult sr ) throws NamingException
+    private static UsageEnum getUsage( Entry entry ) throws LdapInvalidAttributeValueException
     {
-        Attribute at = sr.getAttributes().get( MetaSchemaConstants.M_USAGE_AT );
+        Attribute at = entry.get( MetaSchemaConstants.M_USAGE_AT );
 
         if ( at == null )
         {
@@ -393,7 +387,7 @@ public class ApacheDsSchemaConnector extends AbstractSchemaConnector implements
         {
             try
             {
-                return UsageEnum.getUsage( ( String ) at.get() );
+                return UsageEnum.getUsage( at.getString() );
             }
             catch ( IllegalArgumentException e )
             {
@@ -410,13 +404,13 @@ public class ApacheDsSchemaConnector extends AbstractSchemaConnector implements
     /**
      * Gets the syntax length of the attribute type contained a SearchResult.
      *
-     * @param sr the SearchResult
+     * @param entry the SearchResult
      * @return the syntax length of the attribute type, or -1 if no syntax length was found
-     * @throws NamingException if an error occurs when searching in the SearchResult
+     * @throws LdapInvalidAttributeValueException if an error occurs when searching in the SearchResult
      */
-    private static int getSyntaxLength( SearchResult sr ) throws NamingException
+    private static int getSyntaxLength( Entry entry ) throws LdapInvalidAttributeValueException
     {
-        Attribute at = sr.getAttributes().get( MetaSchemaConstants.M_LENGTH_AT );
+        Attribute at = entry.get( MetaSchemaConstants.M_LENGTH_AT );
 
         if ( at == null )
         {
@@ -426,7 +420,7 @@ public class ApacheDsSchemaConnector extends AbstractSchemaConnector implements
         {
             try
             {
-                return Integer.parseInt( ( String ) at.get() );
+                return Integer.parseInt( at.getString() );
             }
             catch ( NumberFormatException e )
             {
@@ -442,11 +436,11 @@ public class ApacheDsSchemaConnector extends AbstractSchemaConnector implements
      * @param sr the SearchResult
      * @param schemaElement The Schema Element we are looking for
      * @return The String value if found
-     * @throws NamingException if an error occurs when searching in the SearchResult
+     * @throws LdapInvalidAttributeValueException 
      */
-    private static String getStringValue( SearchResult sr, String schemaElement ) throws NamingException
+    private static String getStringValue( Entry entry, String schemaElement ) throws LdapInvalidAttributeValueException
     {
-        Attribute at = sr.getAttributes().get( schemaElement );
+        Attribute at = entry.get( schemaElement );
 
         if ( at == null )
         {
@@ -454,7 +448,7 @@ public class ApacheDsSchemaConnector extends AbstractSchemaConnector implements
         }
         else
         {
-            return ( String ) at.get();
+            return at.getString();
         }
     }
 
@@ -462,14 +456,14 @@ public class ApacheDsSchemaConnector extends AbstractSchemaConnector implements
     /**
      * Gets the Boolean value for a Schema element of an attribute type contained in a SearchResult.
      *
-     * @param sr the SearchResult
+     * @param entry the SearchResult
      * @param schemaElement The Schema Element we are looking for
      * @return The boolean value if found
-     * @throws NamingException if an error occurs when searching in the SearchResult
+     * @throws LdapInvalidAttributeValueException 
      */
-    private static boolean getBooleanValue( SearchResult sr, String schemaElement ) throws NamingException
+    private static boolean getBooleanValue( Entry entry, String schemaElement ) throws LdapInvalidAttributeValueException
     {
-        Attribute at = sr.getAttributes().get( schemaElement );
+        Attribute at = entry.get( schemaElement );
 
         if ( at == null )
         {
@@ -477,7 +471,7 @@ public class ApacheDsSchemaConnector extends AbstractSchemaConnector implements
         }
         else
         {
-            return Boolean.parseBoolean( ( String ) at.get() );
+            return Boolean.parseBoolean( at.getString() );
         }
     }
 
@@ -485,42 +479,29 @@ public class ApacheDsSchemaConnector extends AbstractSchemaConnector implements
     /**
      * Gets the list of values for a schema element of an object class contained in a SearchResult.
      *
-     * @param sr the SearchResult
+     * @param entry the SearchResult
      * @param schemaElement The Schema Element we are looking for
      * @return the optional attribute types of the attribute type, or an empty array if no optional attribute type was found
      * @throws NamingException
      *      if an error occurrs when searching in the SearchResult
      */
-    private static List<String> getStringValues( SearchResult sr, String schemaElement ) throws NamingException
+    private static List<String> getStringValues( Entry entry, String schemaElement )
     {
-        List<String> names = new ArrayList<String>();
-
-        Attribute at = sr.getAttributes().get( schemaElement );
-        
-        if ( at != null )
-        {
-            NamingEnumeration<?> ne = at.getAll();
-            
-            while ( ne.hasMore() )
-            {
-                names.add( ( String ) ne.next() );
-            }
-        }
-
-        return names;
+        Attribute at = entry.get( schemaElement );
+        return StreamSupport.stream( at.spliterator(), false ).map( Value::getValue ).collect( Collectors.toList() );
     }
 
 
     /**
      * Gets the type of the object class contained a SearchResult.
      *
-     * @param sr the SearchResult
+     * @param entry the SearchResult
      * @return the type of the object class
-     * @throws NamingException if an error occurrs when searching in the SearchResult
+     * @throws LdapInvalidAttributeValueException 
      */
-    private static ObjectClassTypeEnum getType( SearchResult sr ) throws NamingException
+    private static ObjectClassTypeEnum getType( Entry entry ) throws LdapInvalidAttributeValueException
     {
-        Attribute at = sr.getAttributes().get( MetaSchemaConstants.M_TYPE_OBJECT_CLASS_AT );
+        Attribute at = entry.get( MetaSchemaConstants.M_TYPE_OBJECT_CLASS_AT );
 
         if ( at == null )
         {
@@ -530,7 +511,7 @@ public class ApacheDsSchemaConnector extends AbstractSchemaConnector implements
         {
             try
             {
-                return ObjectClassTypeEnum.getClassType( ( String ) at.get() );
+                return ObjectClassTypeEnum.getClassType( at.getString() );
             }
             catch ( IllegalArgumentException e )
             {
@@ -547,13 +528,13 @@ public class ApacheDsSchemaConnector extends AbstractSchemaConnector implements
     /**
      * Gets whether or not the schema object contained a SearchResult is obsolete.
      *
-     * @param sr the SearchResult
+     * @param entry the SearchResult
      * @return true if the schema object is obsolete, false if not
-     * @throws NamingException if an error occurs when searching in the SearchResult
+     * @throws LdapInvalidAttributeValueException 
      */
-    private static boolean isHumanReadable( SearchResult sr ) throws NamingException
+    private static boolean isHumanReadable( Entry entry ) throws LdapInvalidAttributeValueException
     {
-        Attribute at = sr.getAttributes().get( MetaSchemaConstants.X_NOT_HUMAN_READABLE_AT );
+        Attribute at = entry.get( MetaSchemaConstants.X_NOT_HUMAN_READABLE_AT );
 
         if ( at == null )
         {
@@ -561,7 +542,7 @@ public class ApacheDsSchemaConnector extends AbstractSchemaConnector implements
         }
         else
         {
-            return !Boolean.parseBoolean( ( String ) at.get() );
+            return !Boolean.parseBoolean( at.getString() );
         }
     }
 
diff --git a/plugins/schemaeditor/src/main/java/org/apache/directory/studio/schemaeditor/model/io/GenericSchemaConnector.java b/plugins/schemaeditor/src/main/java/org/apache/directory/studio/schemaeditor/model/io/GenericSchemaConnector.java
index d4e3d6a..c64f086 100644
--- a/plugins/schemaeditor/src/main/java/org/apache/directory/studio/schemaeditor/model/io/GenericSchemaConnector.java
+++ b/plugins/schemaeditor/src/main/java/org/apache/directory/studio/schemaeditor/model/io/GenericSchemaConnector.java
@@ -26,12 +26,14 @@ import java.util.List;
 
 import javax.naming.NamingEnumeration;
 import javax.naming.NamingException;
-import javax.naming.directory.Attribute;
 import javax.naming.directory.SearchControls;
-import javax.naming.directory.SearchResult;
 
 import org.apache.directory.api.ldap.model.constants.LdapConstants;
 import org.apache.directory.api.ldap.model.constants.SchemaConstants;
+import org.apache.directory.api.ldap.model.entry.Attribute;
+import org.apache.directory.api.ldap.model.entry.Entry;
+import org.apache.directory.api.ldap.model.entry.Value;
+import org.apache.directory.api.ldap.model.exception.LdapInvalidAttributeValueException;
 import org.apache.directory.api.ldap.model.schema.AttributeType;
 import org.apache.directory.api.ldap.model.schema.LdapSyntax;
 import org.apache.directory.api.ldap.model.schema.MatchingRule;
@@ -47,6 +49,7 @@ import org.apache.directory.studio.common.core.jobs.StudioProgressMonitor;
 import org.apache.directory.studio.connection.core.Connection;
 import org.apache.directory.studio.connection.core.Utils;
 import org.apache.directory.studio.connection.core.io.ConnectionWrapper;
+import org.apache.directory.studio.connection.core.io.api.StudioSearchResult;
 import org.apache.directory.studio.schemaeditor.PluginUtils;
 import org.apache.directory.studio.schemaeditor.model.Project;
 import org.apache.directory.studio.schemaeditor.model.Schema;
@@ -88,7 +91,7 @@ public class GenericSchemaConnector extends AbstractSchemaConnector implements S
                 SchemaConstants.SYNTAX_CHECKERS_AT
         } );
         String schemaDn = getSubschemaSubentry( wrapper, monitor );
-        NamingEnumeration<SearchResult> answer = wrapper.search( schemaDn, "(objectclass=subschema)", constraintSearch, //$NON-NLS-1$
+        NamingEnumeration<StudioSearchResult> answer = wrapper.search( schemaDn, "(objectclass=subschema)", constraintSearch, //$NON-NLS-1$
             DEREF_ALIAS_METHOD, HANDLE_REFERALS_METHOD, null, monitor, null );
         
         if ( answer != null )
@@ -103,7 +106,7 @@ public class GenericSchemaConnector extends AbstractSchemaConnector implements S
                     schema.setProject( project );
                     schemas.add( schema );
 
-                    getSchema( schema, wrapper, answer.next(), monitor );
+                    getSchema( schema, wrapper, answer.next().getEntry(), monitor );
                 }
             }
             catch ( SchemaConnectorException e )
@@ -136,7 +139,7 @@ public class GenericSchemaConnector extends AbstractSchemaConnector implements S
         constraintSearch.setReturningAttributes( new String[]
             { "subschemaSubentry" } ); //$NON-NLS-1$
 
-        NamingEnumeration<SearchResult> answer = wrapper.search( "", LdapConstants.OBJECT_CLASS_STAR, constraintSearch, //$NON-NLS-1$ //$NON-NLS-2$
+        NamingEnumeration<StudioSearchResult> answer = wrapper.search( "", LdapConstants.OBJECT_CLASS_STAR, constraintSearch, //$NON-NLS-1$ //$NON-NLS-2$
             DEREF_ALIAS_METHOD, HANDLE_REFERALS_METHOD, null, monitor, null );
 
         if ( answer != null )
@@ -145,9 +148,9 @@ public class GenericSchemaConnector extends AbstractSchemaConnector implements S
             {
                 if ( answer.hasMore() )
                 {
-                    SearchResult searchResult = answer.next();
+                    Entry searchResult = answer.next().getEntry();
 
-                    Attribute subschemaSubentryAttribute = searchResult.getAttributes().get( "subschemaSubentry" ); //$NON-NLS-1$
+                    Attribute subschemaSubentryAttribute = searchResult.get( "subschemaSubentry" ); //$NON-NLS-1$
                     if ( subschemaSubentryAttribute == null )
                     {
                         return null;
@@ -162,9 +165,9 @@ public class GenericSchemaConnector extends AbstractSchemaConnector implements S
                     
                     try
                     {
-                        subschemaSubentry = ( String ) subschemaSubentryAttribute.get();
+                        subschemaSubentry = subschemaSubentryAttribute.getString();
                     }
-                    catch ( NamingException e )
+                    catch ( LdapInvalidAttributeValueException e )
                     {
                         return null;
                     }
@@ -182,30 +185,23 @@ public class GenericSchemaConnector extends AbstractSchemaConnector implements S
     }
 
 
-    private static void getSchema( Schema schema, ConnectionWrapper wrapper, SearchResult searchResult,
+    private static void getSchema( Schema schema, ConnectionWrapper wrapper, Entry entry,
         StudioProgressMonitor monitor ) throws NamingException, SchemaConnectorException
     {
         // The counter for parser exceptions
         int parseErrorCount = 0;
 
-        Attribute attributeTypesAttribute = searchResult.getAttributes().get( SchemaConstants.ATTRIBUTE_TYPES_AT );
-        
+        Attribute attributeTypesAttribute = entry.get( SchemaConstants.ATTRIBUTE_TYPES_AT );
         if ( attributeTypesAttribute != null )
         {
-            NamingEnumeration<?> ne = attributeTypesAttribute.getAll();
-            
-            if ( ne != null )
-            {
-                while ( ne.hasMoreElements() )
+                for ( Value value : attributeTypesAttribute )
                 {
-                    String value = ( String ) ne.nextElement();
-
                     try
                     {
                         AttributeTypeDescriptionSchemaParser parser = new AttributeTypeDescriptionSchemaParser();
                         parser.setQuirksMode( true );
 
-                        AttributeType atd = parser.parse( value );
+                        AttributeType atd = parser.parse( value.getValue() );
 
                         MutableAttributeType impl = new MutableAttributeType( atd.getOid() );
                         impl.setNames( atd.getNames().toArray( new String[0] ) );
@@ -237,27 +233,19 @@ public class GenericSchemaConnector extends AbstractSchemaConnector implements S
                         PluginUtils.logError( "Unable to parse the attribute type.", e ); //$NON-NLS-1$
                         parseErrorCount++;
                     }
-                }
             }
         }
 
-        Attribute objectClassesAttribute = searchResult.getAttributes().get( SchemaConstants.OBJECT_CLASSES_AT );
-        
+        Attribute objectClassesAttribute = entry.get( SchemaConstants.OBJECT_CLASSES_AT );
         if ( objectClassesAttribute != null )
         {
-            NamingEnumeration<?> ne = objectClassesAttribute.getAll();
-            
-            if ( ne != null )
-            {
-                while ( ne.hasMoreElements() )
+                for ( Value value : objectClassesAttribute )
                 {
-                    String value = ( String ) ne.nextElement();
-
                     try
                     {
                         ObjectClassDescriptionSchemaParser parser = new ObjectClassDescriptionSchemaParser();
                         parser.setQuirksMode( true );
-                        ObjectClass ocd = parser.parse( value );
+                        ObjectClass ocd = parser.parse( value.getValue() );
 
                         MutableObjectClass impl = new MutableObjectClass( ocd.getOid() );
                         impl.setNames( ocd.getNames().toArray( new String[0] ) );
@@ -278,26 +266,18 @@ public class GenericSchemaConnector extends AbstractSchemaConnector implements S
                         parseErrorCount++;
                     }
                 }
-            }
         }
 
-        Attribute ldapSyntaxesAttribute = searchResult.getAttributes().get( SchemaConstants.LDAP_SYNTAXES_AT );
-        
+        Attribute ldapSyntaxesAttribute = entry.get( SchemaConstants.LDAP_SYNTAXES_AT );
         if ( ldapSyntaxesAttribute != null )
         {
-            NamingEnumeration<?> ne = ldapSyntaxesAttribute.getAll();
-            
-            if ( ne != null )
-            {
-                while ( ne.hasMoreElements() )
+                for ( Value value : ldapSyntaxesAttribute )
                 {
-                    String value = ( String ) ne.nextElement();
-
                     try
                     {
                         LdapSyntaxDescriptionSchemaParser parser = new LdapSyntaxDescriptionSchemaParser();
                         parser.setQuirksMode( true );
-                        LdapSyntax lsd = parser.parse( value );
+                        LdapSyntax lsd = parser.parse( value.getValue() );
 
                         LdapSyntax impl = new LdapSyntax( lsd.getOid() );
                         impl.setDescription( lsd.getDescription() );
@@ -316,7 +296,6 @@ public class GenericSchemaConnector extends AbstractSchemaConnector implements S
                         parseErrorCount++;
                     }
                 }
-            }
         }
 
         // if online: assume all received syntaxes in attributes are valid -> create dummy syntaxes if missing
@@ -336,23 +315,16 @@ public class GenericSchemaConnector extends AbstractSchemaConnector implements S
             }
         }
 
-        Attribute matchingRulesAttribute = searchResult.getAttributes().get( SchemaConstants.MATCHING_RULES_AT );
-        
+        Attribute matchingRulesAttribute = entry.get( SchemaConstants.MATCHING_RULES_AT );
         if ( matchingRulesAttribute != null )
         {
-            NamingEnumeration<?> ne = matchingRulesAttribute.getAll();
-            
-            if ( ne != null )
-            {
-                while ( ne.hasMoreElements() )
+                for ( Value value : matchingRulesAttribute )
                 {
-                    String value = ( String ) ne.nextElement();
-
                     try
                     {
                         MatchingRuleDescriptionSchemaParser parser = new MatchingRuleDescriptionSchemaParser();
                         parser.setQuirksMode( true );
-                        MatchingRule mrd = parser.parse( value );
+                        MatchingRule mrd = parser.parse( value.getValue() );
 
                         MutableMatchingRule impl = new MutableMatchingRule( mrd.getOid() );
                         impl.setDescription( mrd.getDescription() );
@@ -370,7 +342,6 @@ public class GenericSchemaConnector extends AbstractSchemaConnector implements S
                         parseErrorCount++;
                     }
                 }
-            }
         }
 
         // if online: assume all received matching rules in attributes are valid -> create dummy matching rules if missing
diff --git a/tests/test.integration.core/src/main/java/org/apache/directory/studio/test/integration/core/ConnectionWrapperTestBase.java b/tests/test.integration.core/src/main/java/org/apache/directory/studio/test/integration/core/ConnectionWrapperTestBase.java
index 8aaad17..5a28292 100644
--- a/tests/test.integration.core/src/main/java/org/apache/directory/studio/test/integration/core/ConnectionWrapperTestBase.java
+++ b/tests/test.integration.core/src/main/java/org/apache/directory/studio/test/integration/core/ConnectionWrapperTestBase.java
@@ -44,12 +44,8 @@ import java.util.function.Function;
 import javax.naming.LinkLoopException;
 import javax.naming.NamingEnumeration;
 import javax.naming.NamingException;
-import javax.naming.directory.DirContext;
-import javax.naming.directory.ModificationItem;
 import javax.naming.directory.SearchControls;
-import javax.naming.directory.SearchResult;
 
-import org.apache.directory.api.ldap.model.entry.AttributeUtils;
 import org.apache.directory.api.ldap.model.entry.DefaultAttribute;
 import org.apache.directory.api.ldap.model.entry.DefaultEntry;
 import org.apache.directory.api.ldap.model.entry.DefaultModification;
@@ -73,6 +69,7 @@ import org.apache.directory.studio.connection.core.ConnectionParameter.Authentic
 import org.apache.directory.studio.connection.core.ConnectionParameter.EncryptionMethod;
 import org.apache.directory.studio.connection.core.IReferralHandler;
 import org.apache.directory.studio.connection.core.io.ConnectionWrapper;
+import org.apache.directory.studio.connection.core.io.api.StudioSearchResult;
 import org.apache.mina.util.AvailablePortFinder;
 import org.eclipse.core.runtime.NullProgressMonitor;
 import org.junit.After;
@@ -296,15 +293,14 @@ public abstract class ConnectionWrapperTestBase extends AbstractLdapTestUnit
     {
         StudioProgressMonitor monitor = getProgressMonitor();
         SearchControls searchControls = new SearchControls();
-        NamingEnumeration<SearchResult> result = getConnectionWrapper( monitor ).search( "ou=system", "(objectClass=*)",
+        NamingEnumeration<StudioSearchResult> result = getConnectionWrapper( monitor ).search( "ou=system", "(objectClass=*)",
             searchControls, AliasDereferencingMethod.NEVER, ReferralHandlingMethod.IGNORE, null, monitor, null );
 
         assertFalse( monitor.isCanceled() );
         assertFalse( monitor.errorsReported() );
         assertNotNull( result );
         assertTrue( result.hasMore() );
-        SearchResult entry = result.next();
-        assertNotNull( entry );
+        assertNotNull( result.next() );
     }
 
 
@@ -317,16 +313,16 @@ public abstract class ConnectionWrapperTestBase extends AbstractLdapTestUnit
         StudioProgressMonitor monitor = getProgressMonitor();
         SearchControls searchControls = new SearchControls();
         searchControls.setSearchScope( SearchControls.OBJECT_SCOPE );
-        NamingEnumeration<SearchResult> result = getConnectionWrapper( monitor ).search( "uid=admin,ou=system",
+        NamingEnumeration<StudioSearchResult> result = getConnectionWrapper( monitor ).search( "uid=admin,ou=system",
             "(objectClass=*)",
             searchControls, AliasDereferencingMethod.NEVER, ReferralHandlingMethod.IGNORE, null, monitor, null );
 
         assertNotNull( result );
         assertTrue( result.hasMore() );
-        SearchResult entry = result.next();
+        StudioSearchResult entry = result.next();
         assertNotNull( entry );
 
-        Object userCertificateValue = entry.getAttributes().get( "userCertificate" ).get();
+        Object userCertificateValue = entry.getEntry().get( "userCertificate" ).getBytes();
         assertEquals( byte[].class, userCertificateValue.getClass() );
 
         CertificateFactory cf = CertificateFactory.getInstance( "X.509" ); //$NON-NLS-1$
@@ -342,7 +338,7 @@ public abstract class ConnectionWrapperTestBase extends AbstractLdapTestUnit
     {
         StudioProgressMonitor monitor = getProgressMonitor();
         SearchControls searchControls = new SearchControls();
-        NamingEnumeration<SearchResult> result = getConnectionWrapper( monitor ).search(
+        NamingEnumeration<StudioSearchResult> result = getConnectionWrapper( monitor ).search(
             "cn=referral1,ou=referrals,ou=system", "(objectClass=*)", searchControls, AliasDereferencingMethod.NEVER,
             ReferralHandlingMethod.FOLLOW, null, monitor, null );
 
@@ -350,7 +346,7 @@ public abstract class ConnectionWrapperTestBase extends AbstractLdapTestUnit
         assertFalse( monitor.errorsReported() );
         assertNotNull( result );
 
-        List<String> dns = consume( result, sr -> sr.getNameInNamespace() );
+        List<String> dns = consume( result, sr -> sr.getDn().getName() );
         assertEquals( 1, dns.size() );
         assertEquals( "uid=user.1,ou=users,ou=system", dns.get( 0 ) );
     }
@@ -362,7 +358,7 @@ public abstract class ConnectionWrapperTestBase extends AbstractLdapTestUnit
         StudioProgressMonitor monitor = getProgressMonitor();
         SearchControls searchControls = new SearchControls();
         searchControls.setSearchScope( SearchControls.SUBTREE_SCOPE );
-        NamingEnumeration<SearchResult> result = getConnectionWrapper( monitor ).search(
+        NamingEnumeration<StudioSearchResult> result = getConnectionWrapper( monitor ).search(
             "cn=referral2,ou=referrals,ou=system", "(objectClass=*)", searchControls, AliasDereferencingMethod.NEVER,
             ReferralHandlingMethod.FOLLOW, null, monitor, null );
 
@@ -370,7 +366,7 @@ public abstract class ConnectionWrapperTestBase extends AbstractLdapTestUnit
         assertFalse( monitor.errorsReported() );
         assertNotNull( result );
 
-        List<String> dns = consume( result, sr -> sr.getNameInNamespace() );
+        List<String> dns = consume( result, sr -> sr.getDn().getName() );
         assertEquals( 2, dns.size() );
         assertThat( dns, hasItems( "ou=users,ou=system", "uid=user.1,ou=users,ou=system" ) );
     }
@@ -382,7 +378,7 @@ public abstract class ConnectionWrapperTestBase extends AbstractLdapTestUnit
         StudioProgressMonitor monitor = getProgressMonitor();
         SearchControls searchControls = new SearchControls();
         searchControls.setSearchScope( SearchControls.SUBTREE_SCOPE );
-        NamingEnumeration<SearchResult> result = getConnectionWrapper( monitor ).search(
+        NamingEnumeration<StudioSearchResult> result = getConnectionWrapper( monitor ).search(
             "cn=referral3,ou=referrals,ou=system", "(objectClass=*)", searchControls, AliasDereferencingMethod.NEVER,
             ReferralHandlingMethod.FOLLOW, null, monitor, null );
 
@@ -390,7 +386,7 @@ public abstract class ConnectionWrapperTestBase extends AbstractLdapTestUnit
         assertFalse( monitor.errorsReported() );
         assertNotNull( result );
 
-        List<String> dns = consume( result, sr -> sr.getNameInNamespace() );
+        List<String> dns = consume( result, sr -> sr.getDn().getName() );
         assertEquals( 3, dns.size() );
         assertThat( dns, hasItems( "ou=referrals,ou=system", "ou=users,ou=system", "uid=user.1,ou=users,ou=system" ) );
     }
@@ -402,7 +398,7 @@ public abstract class ConnectionWrapperTestBase extends AbstractLdapTestUnit
         StudioProgressMonitor monitor = getProgressMonitor();
         SearchControls searchControls = new SearchControls();
         searchControls.setSearchScope( SearchControls.SUBTREE_SCOPE );
-        NamingEnumeration<SearchResult> result = getConnectionWrapper( monitor ).search(
+        NamingEnumeration<StudioSearchResult> result = getConnectionWrapper( monitor ).search(
             "cn=referral4a,ou=referrals,ou=system", "(objectClass=*)", searchControls, AliasDereferencingMethod.NEVER,
             ReferralHandlingMethod.FOLLOW, null, monitor, null );
 
@@ -410,7 +406,7 @@ public abstract class ConnectionWrapperTestBase extends AbstractLdapTestUnit
         assertFalse( monitor.errorsReported() );
         assertNotNull( result );
 
-        List<String> dns = consume( result, sr -> sr.getNameInNamespace() );
+        List<String> dns = consume( result, sr -> sr.getDn().getName() );
         assertEquals( 0, dns.size() );
     }
 
@@ -423,7 +419,7 @@ public abstract class ConnectionWrapperTestBase extends AbstractLdapTestUnit
         searchControls.setSearchScope( SearchControls.SUBTREE_SCOPE );
         ConnectionWrapper connectionWrapper = getConnectionWrapper( monitor );
         ConnectionCorePlugin.getDefault().setReferralHandler( null );
-        NamingEnumeration<SearchResult> result = connectionWrapper.search( "ou=referrals,ou=system", "(objectClass=*)",
+        NamingEnumeration<StudioSearchResult> result = connectionWrapper.search( "ou=referrals,ou=system", "(objectClass=*)",
             searchControls, AliasDereferencingMethod.NEVER, ReferralHandlingMethod.FOLLOW_MANUALLY, null, monitor,
             null );
 
@@ -431,7 +427,7 @@ public abstract class ConnectionWrapperTestBase extends AbstractLdapTestUnit
         assertFalse( monitor.errorsReported() );
         assertNotNull( result );
 
-        List<String> dns = consume( result, sr -> sr.getNameInNamespace() );
+        List<String> dns = consume( result, sr -> sr.getDn().getName() );
         assertEquals( 6, dns.size() );
         assertThat( dns,
             hasItems( "ou=referrals,ou=system", "ou=users,ou=system", "cn=referral1,ou=referrals,ou=system",
@@ -445,7 +441,7 @@ public abstract class ConnectionWrapperTestBase extends AbstractLdapTestUnit
         StudioProgressMonitor monitor = getProgressMonitor();
         SearchControls searchControls = new SearchControls();
         searchControls.setSearchScope( SearchControls.SUBTREE_SCOPE );
-        NamingEnumeration<SearchResult> result = getConnectionWrapper( monitor ).search( "ou=referrals,ou=system",
+        NamingEnumeration<StudioSearchResult> result = getConnectionWrapper( monitor ).search( "ou=referrals,ou=system",
             "(objectClass=*)", searchControls, AliasDereferencingMethod.NEVER, ReferralHandlingMethod.IGNORE, null,
             monitor, null );
 
@@ -453,19 +449,19 @@ public abstract class ConnectionWrapperTestBase extends AbstractLdapTestUnit
         assertFalse( monitor.errorsReported() );
         assertNotNull( result );
 
-        List<String> dns = consume( result, sr -> sr.getNameInNamespace() );
+        List<String> dns = consume( result, sr -> sr.getDn().getName() );
         assertEquals( 1, dns.size() );
         assertThat( dns, hasItems( "ou=referrals,ou=system" ) );
     }
 
 
-    protected <T> List<T> consume( NamingEnumeration<SearchResult> result, Function<SearchResult, T> fn )
+    protected <T> List<T> consume( NamingEnumeration<StudioSearchResult> result, Function<StudioSearchResult, T> fn )
         throws NamingException
     {
         List<T> list = new ArrayList<>();
         while ( result.hasMore() )
         {
-            SearchResult sr = result.next();
+            StudioSearchResult sr = result.next();
             list.add( fn.apply( sr ) );
         }
         return list;
diff --git a/tests/test.integration.core/src/main/java/org/apache/directory/studio/test/integration/core/DirectoryApiConnectionWrapperTest.java b/tests/test.integration.core/src/main/java/org/apache/directory/studio/test/integration/core/DirectoryApiConnectionWrapperTest.java
index 53cb937..81cd532 100644
--- a/tests/test.integration.core/src/main/java/org/apache/directory/studio/test/integration/core/DirectoryApiConnectionWrapperTest.java
+++ b/tests/test.integration.core/src/main/java/org/apache/directory/studio/test/integration/core/DirectoryApiConnectionWrapperTest.java
@@ -40,17 +40,17 @@ import java.util.concurrent.atomic.AtomicLong;
 import javax.naming.NamingEnumeration;
 import javax.naming.NamingException;
 import javax.naming.directory.SearchControls;
-import javax.naming.directory.SearchResult;
 
 import org.apache.directory.studio.common.core.jobs.StudioProgressMonitor;
 import org.apache.directory.studio.connection.core.Connection;
-import org.apache.directory.studio.connection.core.ConnectionParameter;
 import org.apache.directory.studio.connection.core.Connection.AliasDereferencingMethod;
 import org.apache.directory.studio.connection.core.Connection.ReferralHandlingMethod;
+import org.apache.directory.studio.connection.core.ConnectionParameter;
 import org.apache.directory.studio.connection.core.ConnectionParameter.AuthenticationMethod;
 import org.apache.directory.studio.connection.core.ConnectionParameter.EncryptionMethod;
 import org.apache.directory.studio.connection.core.event.ConnectionEventRegistry;
 import org.apache.directory.studio.connection.core.io.api.DirectoryApiConnectionWrapper;
+import org.apache.directory.studio.connection.core.io.api.StudioSearchResult;
 import org.apache.directory.studio.ldapbrowser.core.jobs.InitializeRootDSERunnable;
 import org.apache.directory.studio.ldapbrowser.core.model.impl.BrowserConnection;
 import org.junit.Test;
@@ -72,7 +72,7 @@ public class DirectoryApiConnectionWrapperTest extends ConnectionWrapperTestBase
         StudioProgressMonitor monitor = getProgressMonitor();
         SearchControls searchControls = new SearchControls();
         searchControls.setSearchScope( SearchControls.SUBTREE_SCOPE );
-        NamingEnumeration<SearchResult> result = getConnectionWrapper( monitor ).search( "ou=referrals,ou=system",
+        NamingEnumeration<StudioSearchResult> result = getConnectionWrapper( monitor ).search( "ou=referrals,ou=system",
             "(objectClass=*)", searchControls, AliasDereferencingMethod.NEVER, ReferralHandlingMethod.FOLLOW, null,
             monitor, null );
 
@@ -80,7 +80,7 @@ public class DirectoryApiConnectionWrapperTest extends ConnectionWrapperTestBase
         assertFalse( monitor.errorsReported() );
         assertNotNull( result );
 
-        List<String> dns = consume( result, sr -> sr.getNameInNamespace() );
+        List<String> dns = consume( result, sr -> sr.getDn().getName() );
         assertEquals( 4, dns.size() );
         assertThat( dns, hasItems( "ou=referrals,ou=system", "ou=referrals,ou=system", "ou=users,ou=system",
             "uid=user.1,ou=users,ou=system" ) );


[directory-studio] 02/02: Relax check for open connections after test

Posted by se...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

seelmann pushed a commit to branch remove-jndi-provider-and-jndi-layer
in repository https://gitbox.apache.org/repos/asf/directory-studio.git

commit a4347ea547d99ae949f6bb79f811997b2c04410a
Author: Stefan Seelmann <ma...@stefan-seelmann.de>
AuthorDate: Sun Nov 25 15:03:41 2018 +0100

    Relax check for open connections after test
---
 .../studio/test/integration/ui/SearchTest.java          |  2 +-
 .../test/integration/ui/bots/utils/Assertions.java      | 17 ++++++++++++++++-
 2 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/SearchTest.java b/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/SearchTest.java
index 93b5547..37e527b 100644
--- a/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/SearchTest.java
+++ b/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/SearchTest.java
@@ -164,7 +164,7 @@ public class SearchTest extends AbstractLdapTestUnit
 
         browserViewBot.selectEntry( "DIT", "Root DSE", "ou=system", "Quick Search" );
 
-        // verify that only one events was fired
+        // verify that only one event was fired
         long fireCount = fireCount1 - fireCount0;
         assertEquals( "Only 1 event firings expected when running quick search.", 1, fireCount );
     }
diff --git a/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/bots/utils/Assertions.java b/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/bots/utils/Assertions.java
index 5043ad1..851b75d 100644
--- a/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/bots/utils/Assertions.java
+++ b/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/bots/utils/Assertions.java
@@ -4,6 +4,7 @@ package org.apache.directory.studio.test.integration.ui.bots.utils;
 import static org.junit.Assert.fail;
 
 import org.apache.directory.studio.connection.core.Messages;
+import org.apache.directory.studio.test.integration.ui.bots.BotUtils;
 import org.eclipse.core.runtime.jobs.IJobManager;
 import org.eclipse.core.runtime.jobs.Job;
 
@@ -12,14 +13,28 @@ public class Assertions
 {
     public static void genericTearDownAssertions()
     {
+        if ( isOpenConnectionJobRunning() )
+        {
+            BotUtils.sleep( 5000L );
+            if ( isOpenConnectionJobRunning() )
+            {
+                fail( "No 'Open Connection' job expected" );
+            }
+        }
+    }
+
+
+    private static boolean isOpenConnectionJobRunning()
+    {
         IJobManager jobManager = Job.getJobManager();
         Job[] jobs = jobManager.find( null );
         for ( Job job : jobs )
         {
             if ( job.getName().equals( Messages.jobs__open_connections_name_1 ) )
             {
-                fail( "No 'Open Connection' job expected" );
+                return true;
             }
         }
+        return false;
     }
 }