You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by pa...@apache.org on 2006/12/18 18:15:08 UTC

svn commit: r488345 [4/12] - in /directory/sandbox/pamarcelot/ldapstudio: ldapstudio-browser-core/ ldapstudio-browser-core/META-INF/ ldapstudio-browser-core/about_files/ ldapstudio-browser-core/lib/ ldapstudio-browser-core/src/ ldapstudio-browser-core/...

Added: directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/AttributeComparator.java
URL: http://svn.apache.org/viewvc/directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/AttributeComparator.java?view=auto&rev=488345
==============================================================================
--- directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/AttributeComparator.java (added)
+++ directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/AttributeComparator.java Mon Dec 18 09:15:00 2006
@@ -0,0 +1,217 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+
+package org.apache.directory.ldapstudio.browser.core.internal.model;
+
+
+import java.util.Comparator;
+
+import org.apache.directory.ldapstudio.browser.core.BrowserCoreConstants;
+import org.apache.directory.ldapstudio.browser.core.model.DN;
+import org.apache.directory.ldapstudio.browser.core.model.IAttribute;
+import org.apache.directory.ldapstudio.browser.core.model.IConnection;
+import org.apache.directory.ldapstudio.browser.core.model.IEntry;
+import org.apache.directory.ldapstudio.browser.core.model.IValue;
+import org.apache.directory.ldapstudio.browser.core.model.ldif.lines.LdifAttrValLine;
+import org.apache.directory.ldapstudio.browser.core.utils.ModelConverter;
+
+
+public class AttributeComparator implements Comparator
+{
+
+    private IEntry dummyEntry;
+
+
+    public AttributeComparator( IConnection connection )
+    {
+        this.dummyEntry = new DummyEntry( new DN(), connection );
+    }
+
+
+    public AttributeComparator( IEntry entry )
+    {
+        this.dummyEntry = entry;
+    }
+
+
+    public int compare( Object o1, Object o2 )
+    {
+
+        IAttribute attribute1 = null;
+        IValue value1 = null;
+        if ( o1 instanceof IAttribute )
+        {
+            attribute1 = ( IAttribute ) o1;
+        }
+        else if ( o1 instanceof IValue )
+        {
+            value1 = ( IValue ) o1;
+            attribute1 = value1.getAttribute();
+        }
+        else if ( o1 instanceof LdifAttrValLine )
+        {
+            LdifAttrValLine line1 = ( LdifAttrValLine ) o1;
+            value1 = ModelConverter.ldifAttrValLineToValue( line1, dummyEntry );
+            attribute1 = value1.getAttribute();
+        }
+
+        IAttribute attribute2 = null;
+        IValue value2 = null;
+        if ( o2 instanceof IAttribute )
+        {
+            attribute2 = ( IAttribute ) o2;
+        }
+        else if ( o2 instanceof IValue )
+        {
+            value2 = ( IValue ) o2;
+            attribute2 = value2.getAttribute();
+        }
+        else if ( o2 instanceof LdifAttrValLine )
+        {
+            LdifAttrValLine line2 = ( LdifAttrValLine ) o2;
+            value2 = ModelConverter.ldifAttrValLineToValue( line2, dummyEntry );
+            attribute2 = value2.getAttribute();
+        }
+
+        if ( value1 != null && value2 != null )
+        {
+            if ( this.getSortByOrDefault() == BrowserCoreConstants.SORT_BY_ATTRIBUTE_DESCRIPTION )
+            {
+                if ( value1.getAttribute() != value2.getAttribute() )
+                {
+                    return this.compareAttributeNames( value1.getAttribute(), value2.getAttribute() );
+                }
+                else
+                {
+                    return this.compareValues( value1, value2 );
+                }
+            }
+            else if ( this.getSortByOrDefault() == BrowserCoreConstants.SORT_BY_VALUE )
+            {
+                return this.compareValues( value1, value2 );
+            }
+            else
+            {
+                return this.equal();
+            }
+        }
+        else if ( attribute1 != null && attribute2 != null )
+        {
+            return this.compareAttributeNames( attribute1, attribute2 );
+        }
+        else
+        {
+            return this.equal();
+        }
+    }
+
+
+    private int compareAttributeNames( IAttribute attribute1, IAttribute attribute2 )
+    {
+
+        if ( attribute1.isObjectClassAttribute() )
+        {
+            return lessThan();
+        }
+        else if ( attribute2.isObjectClassAttribute() )
+        {
+            return greaterThan();
+        }
+
+        if ( attribute1.isMustAttribute() && !attribute2.isMustAttribute() )
+        {
+            return lessThan();
+        }
+        else if ( attribute2.isMustAttribute() && !attribute1.isMustAttribute() )
+        {
+            return greaterThan();
+        }
+
+        if ( attribute1.isOperationalAttribute() && !attribute2.isOperationalAttribute() )
+        {
+            return greaterThan();
+        }
+        else if ( attribute2.isOperationalAttribute() && !attribute1.isOperationalAttribute() )
+        {
+            return lessThan();
+        }
+
+        return compare( attribute1.getDescription(), attribute2.getDescription() );
+    }
+
+
+    private int compareValues( IValue value1, IValue value2 )
+    {
+
+        if ( value1.isEmpty() && value2.isEmpty() )
+        {
+            return equal();
+        }
+
+        if ( value1.isEmpty() && !value2.isEmpty() )
+        {
+            return greaterThan();
+        }
+        if ( !value1.isEmpty() && value2.isEmpty() )
+        {
+            return lessThan();
+        }
+
+        return compare( value1.getStringValue(), value2.getStringValue() );
+    }
+
+
+    private int getSortOrderOrDefault()
+    {
+        return BrowserCoreConstants.SORT_ORDER_ASCENDING;
+    }
+
+
+    private int getSortByOrDefault()
+    {
+        return BrowserCoreConstants.SORT_BY_ATTRIBUTE_DESCRIPTION;
+    }
+
+
+    private int lessThan()
+    {
+        return this.getSortOrderOrDefault() == BrowserCoreConstants.SORT_ORDER_ASCENDING ? -1 : 1;
+    }
+
+
+    private int equal()
+    {
+        return 0;
+    }
+
+
+    private int greaterThan()
+    {
+        return this.getSortOrderOrDefault() == BrowserCoreConstants.SORT_ORDER_ASCENDING ? 1 : -1;
+    }
+
+
+    private int compare( String s1, String s2 )
+    {
+        return this.getSortOrderOrDefault() == BrowserCoreConstants.SORT_ORDER_ASCENDING ? s1.compareToIgnoreCase( s2 )
+            : s2.compareToIgnoreCase( s1 );
+    }
+
+}

Added: directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/AttributeDescription.java
URL: http://svn.apache.org/viewvc/directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/AttributeDescription.java?view=auto&rev=488345
==============================================================================
--- directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/AttributeDescription.java (added)
+++ directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/AttributeDescription.java Mon Dec 18 09:15:00 2006
@@ -0,0 +1,218 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+
+package org.apache.directory.ldapstudio.browser.core.internal.model;
+
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.directory.ldapstudio.browser.core.model.IAttribute;
+import org.apache.directory.ldapstudio.browser.core.model.schema.AttributeTypeDescription;
+import org.apache.directory.ldapstudio.browser.core.model.schema.Schema;
+
+
+public class AttributeDescription implements Serializable
+{
+
+    private static final long serialVersionUID = 1L;
+
+    private String description;
+
+    private String parsedAttributeType;
+
+    private List parsedLangList;
+
+    private List parsedOptionList;
+
+
+    public AttributeDescription( String description )
+    {
+
+        this.description = description;
+
+        String[] attributeDescriptionComponents = description.split( IAttribute.OPTION_DELIMITER );
+        this.parsedAttributeType = attributeDescriptionComponents[0];
+        this.parsedLangList = new ArrayList();
+        this.parsedOptionList = new ArrayList();
+        for ( int i = 1; i < attributeDescriptionComponents.length; i++ )
+        {
+            if ( attributeDescriptionComponents[i].startsWith( IAttribute.OPTION_LANG_PREFIX ) )
+            {
+                this.parsedLangList.add( attributeDescriptionComponents[i] );
+            }
+            else
+            {
+                this.parsedOptionList.add( attributeDescriptionComponents[i] );
+            }
+        }
+    }
+
+
+    public String getDescription()
+    {
+        return description;
+    }
+
+
+    public String getParsedAttributeType()
+    {
+        return parsedAttributeType;
+    }
+
+
+    public List getParsedLangList()
+    {
+        return parsedLangList;
+    }
+
+
+    public List getParsedOptionList()
+    {
+        return parsedOptionList;
+    }
+
+
+    public String toOidString( Schema schema )
+    {
+
+        if ( schema == null )
+        {
+            return description;
+        }
+
+        AttributeTypeDescription atd = schema.getAttributeTypeDescription( parsedAttributeType );
+        String oidString = atd.getNumericOID();
+
+        if ( !parsedLangList.isEmpty() )
+        {
+            for ( Iterator it = parsedLangList.iterator(); it.hasNext(); )
+            {
+                String element = ( String ) it.next();
+                oidString += element;
+
+                if ( it.hasNext() || !parsedOptionList.isEmpty() )
+                {
+                    oidString += IAttribute.OPTION_DELIMITER;
+                }
+            }
+        }
+        if ( !parsedOptionList.isEmpty() )
+        {
+            for ( Iterator it = parsedOptionList.iterator(); it.hasNext(); )
+            {
+                String element = ( String ) it.next();
+                oidString += element;
+
+                if ( it.hasNext() )
+                {
+                    oidString += IAttribute.OPTION_DELIMITER;
+                }
+            }
+        }
+
+        return oidString;
+    }
+
+
+    public boolean isSubtypeOf( AttributeDescription other, Schema schema )
+    {
+
+        // this=name, other=givenName;lang-de -> false
+        // this=name;lang-en, other=givenName;lang-de -> false
+        // this=givenName, other=name -> true
+        // this=givenName;lang-de, other=givenName -> true
+        // this=givenName;lang-de, other=name -> true
+        // this=givenName;lang-en, other=name;lang-de -> false
+        // this=givenName, other=givenName;lang-de -> false
+
+        // check equal descriptions
+        if ( this.toOidString( schema ).equals( other.toOidString( schema ) ) )
+        {
+            return false;
+        }
+
+        // check type
+        AttributeTypeDescription myAtd = schema.getAttributeTypeDescription( this.getParsedAttributeType() );
+        AttributeTypeDescription otherAtd = schema.getAttributeTypeDescription( other.getParsedAttributeType() );
+        if ( myAtd != otherAtd )
+        {
+            AttributeTypeDescription superiorAtd = null;
+            String superiorName = myAtd.getSuperiorAttributeTypeDescriptionName();
+            while ( superiorName != null )
+            {
+                superiorAtd = schema.getAttributeTypeDescription( superiorName );
+                if ( superiorAtd == otherAtd )
+                {
+                    break;
+                }
+                superiorName = superiorAtd.getSuperiorAttributeTypeDescriptionName();
+            }
+            if ( superiorAtd != otherAtd )
+            {
+                return false;
+            }
+        }
+
+        // check options
+        List myOptionsList = new ArrayList( this.getParsedOptionList() );
+        List otherOptionsList = new ArrayList( other.getParsedOptionList() );
+        otherOptionsList.removeAll( myOptionsList );
+        if ( !otherOptionsList.isEmpty() )
+        {
+            return false;
+        }
+
+        // check language tags
+        List myLangList = new ArrayList( this.getParsedLangList() );
+        List otherLangList = new ArrayList( other.getParsedLangList() );
+        for ( Iterator myIt = myLangList.iterator(); myIt.hasNext(); )
+        {
+            String myLang = ( String ) myIt.next();
+            for ( Iterator otherIt = otherLangList.iterator(); otherIt.hasNext(); )
+            {
+                String otherLang = ( String ) otherIt.next();
+                if ( otherLang.endsWith( "-" ) )
+                {
+                    if ( myLang.toLowerCase().startsWith( otherLang.toLowerCase() ) )
+                    {
+                        otherIt.remove();
+                    }
+                }
+                else
+                {
+                    if ( myLang.equalsIgnoreCase( otherLang ) )
+                    {
+                        otherIt.remove();
+                    }
+                }
+            }
+        }
+        if ( !otherLangList.isEmpty() )
+        {
+            return false;
+        }
+
+        return true;
+    }
+
+}

Added: directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/AttributeInfo.java
URL: http://svn.apache.org/viewvc/directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/AttributeInfo.java?view=auto&rev=488345
==============================================================================
--- directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/AttributeInfo.java (added)
+++ directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/AttributeInfo.java Mon Dec 18 09:15:00 2006
@@ -0,0 +1,50 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+
+package org.apache.directory.ldapstudio.browser.core.internal.model;
+
+
+import java.io.Serializable;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.apache.directory.ldapstudio.browser.core.model.schema.Subschema;
+
+
+public class AttributeInfo implements Serializable
+{
+
+    private static final long serialVersionUID = -298229262461058833L;
+
+    public static int COUNTER = 0;
+
+    protected volatile boolean attributesInitialzed = false;
+
+    protected volatile Map attributeMap = new LinkedHashMap();
+
+    protected volatile Subschema subschema = null;
+
+
+    public AttributeInfo()
+    {
+        COUNTER++;
+    }
+
+}

Added: directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/BaseDNEntry.java
URL: http://svn.apache.org/viewvc/directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/BaseDNEntry.java?view=auto&rev=488345
==============================================================================
--- directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/BaseDNEntry.java (added)
+++ directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/BaseDNEntry.java Mon Dec 18 09:15:00 2006
@@ -0,0 +1,101 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+
+package org.apache.directory.ldapstudio.browser.core.internal.model;
+
+
+import org.apache.directory.ldapstudio.browser.core.BrowserCoreMessages;
+import org.apache.directory.ldapstudio.browser.core.events.ModelModifier;
+import org.apache.directory.ldapstudio.browser.core.model.DN;
+import org.apache.directory.ldapstudio.browser.core.model.IConnection;
+import org.apache.directory.ldapstudio.browser.core.model.IEntry;
+import org.apache.directory.ldapstudio.browser.core.model.ModelModificationException;
+import org.apache.directory.ldapstudio.browser.core.model.RDN;
+
+
+public class BaseDNEntry extends AbstractEntry
+{
+
+    private static final long serialVersionUID = -5444229580355372176L;
+
+    protected DN baseDn;
+
+    // protected String connectionName;
+    protected IConnection connection;
+
+
+    protected BaseDNEntry()
+    {
+    }
+
+
+    public BaseDNEntry( DN baseDn, IConnection connection, ModelModifier source ) throws ModelModificationException
+    {
+        super();
+
+        if ( baseDn == null )
+        {
+            throw new ModelModificationException( BrowserCoreMessages.model__empty_dn );
+        }
+        if ( "".equals( baseDn.toString() ) ) { //$NON-NLS-1$
+            throw new ModelModificationException( BrowserCoreMessages.model__empty_dn );
+        }
+        if ( connection == null )
+        {
+            throw new ModelModificationException( BrowserCoreMessages.model__empty_connection );
+        }
+
+        this.setDirectoryEntry( true );
+        this.baseDn = baseDn;
+        // this.connectionName = connection.getName();
+        this.connection = connection;
+    }
+
+
+    public DN getDn()
+    {
+        return this.baseDn;
+    }
+
+
+    public IEntry getParententry()
+    {
+        return null;
+    }
+
+
+    public IConnection getConnection()
+    {
+        // return
+        // BrowserCorePlugin.getDefault().getConnectionManager().getConnection(this.connectionName);
+        return this.connection;
+    }
+
+
+    protected void setRdn( RDN newRdn )
+    {
+    }
+
+
+    protected void setParent( IEntry newParent )
+    {
+    }
+
+}

Added: directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/Bookmark.java
URL: http://svn.apache.org/viewvc/directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/Bookmark.java?view=auto&rev=488345
==============================================================================
--- directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/Bookmark.java (added)
+++ directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/Bookmark.java Mon Dec 18 09:15:00 2006
@@ -0,0 +1,159 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+
+package org.apache.directory.ldapstudio.browser.core.internal.model;
+
+
+import org.apache.directory.ldapstudio.browser.core.events.BookmarkUpdateEvent;
+import org.apache.directory.ldapstudio.browser.core.events.EventRegistry;
+import org.apache.directory.ldapstudio.browser.core.internal.search.LdapSearchPageScoreComputer;
+import org.apache.directory.ldapstudio.browser.core.model.BookmarkParameter;
+import org.apache.directory.ldapstudio.browser.core.model.DN;
+import org.apache.directory.ldapstudio.browser.core.model.IBookmark;
+import org.apache.directory.ldapstudio.browser.core.model.IConnection;
+import org.apache.directory.ldapstudio.browser.core.model.IEntry;
+import org.eclipse.search.ui.ISearchPageScoreComputer;
+
+
+public class Bookmark implements IBookmark
+{
+
+    private static final long serialVersionUID = 2914726541167255499L;
+
+    private IConnection connection;
+
+    private BookmarkParameter bookmarkParameter;
+
+    private DelegateEntry bookmarkEntry;
+
+
+    protected Bookmark()
+    {
+    }
+
+
+    public Bookmark( IConnection connection, BookmarkParameter bookmarkParameter )
+    {
+        this.connection = connection;
+        this.bookmarkParameter = bookmarkParameter;
+        this.bookmarkEntry = new DelegateEntry( connection, bookmarkParameter.getDn() );
+    }
+
+
+    public Bookmark( IConnection connection, DN dn, String name )
+    {
+        this.connection = connection;
+        this.bookmarkParameter = new BookmarkParameter( dn, name );
+        this.bookmarkEntry = new DelegateEntry( connection, dn );
+    }
+
+
+    public DN getDn()
+    {
+        return this.bookmarkParameter.getDn();
+    }
+
+
+    public void setDn( DN dn )
+    {
+        this.bookmarkParameter.setDn( dn );
+        this.fireBookmarkUpdated( BookmarkUpdateEvent.BOOKMARK_UPDATED );
+    }
+
+
+    public String getName()
+    {
+        return this.bookmarkParameter.getName();
+    }
+
+
+    public void setName( String name )
+    {
+        this.bookmarkParameter.setName( name );
+        this.fireBookmarkUpdated( BookmarkUpdateEvent.BOOKMARK_UPDATED );
+    }
+
+
+    public Object getAdapter( Class adapter )
+    {
+        if ( adapter.isAssignableFrom( ISearchPageScoreComputer.class ) )
+        {
+            return new LdapSearchPageScoreComputer();
+        }
+        if ( adapter == IConnection.class )
+        {
+            return this.connection;
+        }
+        if ( adapter == IEntry.class )
+        {
+            return this.bookmarkEntry;
+        }
+        if ( adapter == IBookmark.class )
+        {
+            return this;
+        }
+        return null;
+    }
+
+
+    private void fireBookmarkUpdated( int detail )
+    {
+        if ( this.getName() != null && !"".equals( this.getName() ) ) { //$NON-NLS-1$
+            EventRegistry.fireBookmarkUpdated( new BookmarkUpdateEvent( this, detail ), this );
+        }
+    }
+
+
+    public BookmarkParameter getBookmarkParameter()
+    {
+        return bookmarkParameter;
+    }
+
+
+    public void setBookmarkParameter( BookmarkParameter bookmarkParameter )
+    {
+        this.bookmarkParameter = bookmarkParameter;
+    }
+
+
+    public IConnection getConnection()
+    {
+        return this.connection;
+    }
+
+
+    public IEntry getEntry()
+    {
+        return this.bookmarkEntry;
+    }
+
+
+    public IBookmark getBookmark()
+    {
+        return this;
+    }
+
+
+    public String toString()
+    {
+        return this.getName();
+    }
+
+}

Added: directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/CancelException.java
URL: http://svn.apache.org/viewvc/directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/CancelException.java?view=auto&rev=488345
==============================================================================
--- directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/CancelException.java (added)
+++ directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/CancelException.java Mon Dec 18 09:15:00 2006
@@ -0,0 +1,44 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+
+package org.apache.directory.ldapstudio.browser.core.internal.model;
+
+
+import javax.naming.NamingException;
+
+
+public class CancelException extends NamingException
+{
+
+    private static final long serialVersionUID = 1L;
+
+
+    public CancelException()
+    {
+        super();
+    }
+
+
+    public CancelException( String arg0 )
+    {
+        super( arg0 );
+    }
+
+}

Added: directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/ChildrenInfo.java
URL: http://svn.apache.org/viewvc/directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/ChildrenInfo.java?view=auto&rev=488345
==============================================================================
--- directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/ChildrenInfo.java (added)
+++ directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/ChildrenInfo.java Mon Dec 18 09:15:00 2006
@@ -0,0 +1,95 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+
+package org.apache.directory.ldapstudio.browser.core.internal.model;
+
+
+import java.io.Serializable;
+import java.util.Set;
+
+import org.apache.directory.ldapstudio.browser.core.model.DN;
+import org.apache.directory.ldapstudio.browser.core.model.IConnection;
+
+
+public class ChildrenInfo implements Serializable
+{
+
+    private static final long serialVersionUID = -4642987611142312896L;
+
+    public static int COUNTER = 0;
+
+    protected volatile boolean childrenInitialzed = false;
+
+    protected volatile Set childrenSet = null;
+
+    protected volatile boolean hasMoreChildren = false;
+
+
+    public ChildrenInfo()
+    {
+        COUNTER++;
+    }
+
+    class AliasOrReferral implements Serializable
+    {
+
+        private static final long serialVersionUID = -8339682035388780022L;
+
+        protected IConnection connection;
+
+        protected DN dn;
+
+
+        protected AliasOrReferral()
+        {
+        }
+
+
+        public AliasOrReferral( IConnection connection, DN dn )
+        {
+            this.connection = connection;
+            this.dn = dn;
+        }
+
+
+        public boolean equals( Object o ) throws ClassCastException
+        {
+            if ( o instanceof AliasOrReferral )
+            {
+                return this.toString().equals( ( ( AliasOrReferral ) o ).toString() );
+            }
+            return false;
+        }
+
+
+        public int hashCode()
+        {
+            return this.toString().hashCode();
+        }
+
+
+        public String toString()
+        {
+            return connection.hashCode() + "_" + dn.toString(); //$NON-NLS-1$
+        }
+
+    }
+
+}

Added: directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/Connection.java
URL: http://svn.apache.org/viewvc/directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/Connection.java?view=auto&rev=488345
==============================================================================
--- directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/Connection.java (added)
+++ directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/Connection.java Mon Dec 18 09:15:00 2006
@@ -0,0 +1,1120 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+
+package org.apache.directory.ldapstudio.browser.core.internal.model;
+
+
+import java.io.Serializable;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.directory.ldapstudio.browser.core.BookmarkManager;
+import org.apache.directory.ldapstudio.browser.core.BrowserCoreMessages;
+import org.apache.directory.ldapstudio.browser.core.BrowserCorePlugin;
+import org.apache.directory.ldapstudio.browser.core.SearchManager;
+import org.apache.directory.ldapstudio.browser.core.events.ConnectionRenamedEvent;
+import org.apache.directory.ldapstudio.browser.core.events.ConnectionUpdateEvent;
+import org.apache.directory.ldapstudio.browser.core.events.EventRegistry;
+import org.apache.directory.ldapstudio.browser.core.internal.search.LdapSearchPageScoreComputer;
+import org.apache.directory.ldapstudio.browser.core.jobs.ExtendedProgressMonitor;
+import org.apache.directory.ldapstudio.browser.core.model.ConnectionParameter;
+import org.apache.directory.ldapstudio.browser.core.model.DN;
+import org.apache.directory.ldapstudio.browser.core.model.IAttribute;
+import org.apache.directory.ldapstudio.browser.core.model.IAuthHandler;
+import org.apache.directory.ldapstudio.browser.core.model.IConnection;
+import org.apache.directory.ldapstudio.browser.core.model.IConnectionProvider;
+import org.apache.directory.ldapstudio.browser.core.model.ICredentials;
+import org.apache.directory.ldapstudio.browser.core.model.IEntry;
+import org.apache.directory.ldapstudio.browser.core.model.IRootDSE;
+import org.apache.directory.ldapstudio.browser.core.model.ISearch;
+import org.apache.directory.ldapstudio.browser.core.model.ISearchResult;
+import org.apache.directory.ldapstudio.browser.core.model.IValue;
+import org.apache.directory.ldapstudio.browser.core.model.ModelModificationException;
+import org.apache.directory.ldapstudio.browser.core.model.NameException;
+import org.apache.directory.ldapstudio.browser.core.model.SearchParameter;
+import org.apache.directory.ldapstudio.browser.core.model.URL;
+import org.apache.directory.ldapstudio.browser.core.model.ldif.LdifEnumeration;
+import org.apache.directory.ldapstudio.browser.core.model.ldif.container.LdifContentRecord;
+import org.apache.directory.ldapstudio.browser.core.model.schema.Schema;
+import org.eclipse.search.ui.ISearchPageScoreComputer;
+
+
+public class Connection implements IConnection, Serializable
+{
+
+    private static final long serialVersionUID = 2987596234755856270L;
+
+    private ConnectionParameter connectionParameter;
+
+    private IEntry[] baseDNEntries;
+
+    private IEntry[] metadataEntries;
+
+    private IRootDSE rootDSE;
+
+    private Schema schema;
+
+    private SearchManager searchManager;
+
+    private BookmarkManager bookmarkManager;
+
+    private volatile Map dnToEntryCache;
+
+    private volatile Map entryToChildrenFilterMap;
+
+    private volatile Map entryToAttributeInfoMap;
+
+    private volatile Map entryToChildrenInfoMap;
+
+    private static final String DEFAULT_PROVIDER = JNDIConnectionProvider.class.getName();
+
+    transient IConnectionProvider connectionProvider;
+
+    transient ConnectionModifyHandler modifyHandler;
+
+    transient ConnectionSearchHandler searchHandler;
+
+
+    public Connection()
+    {
+        this( null, null, 0, 0, true, new DN(), 0, 0, IConnection.DEREFERENCE_ALIASES_NEVER,
+            IConnection.HANDLE_REFERRALS_IGNORE, IConnection.AUTH_ANONYMOUS, null, null );
+    }
+
+
+    public Connection( String name, String host, int port, int encryptionMethod, boolean fetchBaseDNs, DN baseDN,
+        int countLimit, int timeLimit, int aliasesDereferencingMethod, int referralsHandlingMethod, int authMethod,
+        String bindPrincipal, String bindPassword )
+    {
+
+        this.connectionParameter = new ConnectionParameter();
+        this.connectionParameter.setName( name );
+        this.connectionParameter.setHost( host );
+        this.connectionParameter.setPort( port );
+        this.connectionParameter.setEncryptionMethod( encryptionMethod );
+        this.connectionParameter.setCountLimit( countLimit );
+        this.connectionParameter.setTimeLimit( timeLimit );
+        this.connectionParameter.setAliasesDereferencingMethod( aliasesDereferencingMethod );
+        this.connectionParameter.setReferralsHandlingMethod( referralsHandlingMethod );
+        this.connectionParameter.setFetchBaseDNs( fetchBaseDNs );
+        this.connectionParameter.setBaseDN( baseDN );
+        this.connectionParameter.setAuthMethod( authMethod );
+        // this.connectionParameter.setBindDN(bindDn);
+        this.connectionParameter.setBindPrincipal( bindPrincipal );
+        this.connectionParameter.setBindPassword( bindPassword );
+
+        this.baseDNEntries = new IEntry[0];
+        this.metadataEntries = new IEntry[0];
+        this.rootDSE = null;
+
+        this.schema = Schema.DEFAULT_SCHEMA;
+        this.searchManager = new SearchManager( this );
+        this.bookmarkManager = new BookmarkManager( this );
+
+        this.entryToChildrenFilterMap = new HashMap();
+        this.dnToEntryCache = new HashMap();
+        this.entryToAttributeInfoMap = new HashMap();
+        this.entryToChildrenInfoMap = new HashMap();
+
+        this.setConnectionProviderClassName( DEFAULT_PROVIDER );
+        this.modifyHandler = new ConnectionModifyHandler( this );
+        this.searchHandler = new ConnectionSearchHandler( this );
+    }
+
+
+    public URL getUrl()
+    {
+        return new URL( this );
+    }
+
+
+    public Object clone()
+    {
+        Connection newConnection = new Connection( this.getName(), this.getHost(), this.getPort(), this
+            .getEncryptionMethod(), this.isFetchBaseDNs(), this.getBaseDN(), this.getCountLimit(), this.getTimeLimit(),
+            this.getAliasesDereferencingMethod(), this.getReferralsHandlingMethod(), this.getAuthMethod(), this
+                .getBindPrincipal(), this.getBindPassword() );
+
+        return newConnection;
+    }
+
+
+    public void reloadSchema( ExtendedProgressMonitor monitor )
+    {
+        monitor.reportProgress( BrowserCoreMessages.model__loading_schema );
+        this.loadSchema( monitor );
+    }
+
+
+    public void connect( ExtendedProgressMonitor monitor )
+    {
+        if ( this.connectionProvider == null )
+        {
+            if ( this.getConnectionProviderClassName() == null )
+            {
+                monitor.reportError( BrowserCoreMessages.model__no_connection_provider );
+                return;
+            }
+
+            try
+            {
+                this.connectionProvider = ( IConnectionProvider ) Class.forName( this.getConnectionProviderClassName() )
+                    .newInstance();
+            }
+            catch ( Exception e )
+            {
+                monitor.reportError( BrowserCoreMessages.model__no_connection_provider );
+                return;
+            }
+        }
+
+        try
+        {
+
+            this.entryToChildrenFilterMap = new HashMap();
+            this.dnToEntryCache = new HashMap();
+            this.entryToAttributeInfoMap = new HashMap();
+            this.entryToChildrenInfoMap = new HashMap();
+
+            modifyHandler.connectionOpened();
+            searchHandler.connectionOpened();
+
+            monitor.reportProgress( BrowserCoreMessages.model__connecting );
+            this.connectionProvider.connect( this.connectionParameter, monitor );
+            monitor.worked( 1 );
+        }
+        catch ( ConnectionException e )
+        {
+            monitor.reportError( e.getMessage(), e );
+            this.connectionProvider = null;
+        }
+    }
+
+
+    public void bind( ExtendedProgressMonitor monitor )
+    {
+        this.connect( monitor );
+
+        if ( this.connectionProvider != null )
+        {
+            try
+            {
+                monitor.reportProgress( BrowserCoreMessages.model__binding );
+
+                IAuthHandler authHandler = BrowserCorePlugin.getDefault().getAuthHandler();
+                if ( authHandler == null )
+                {
+                    throw new ConnectionException( BrowserCoreMessages.model__no_auth_handler );
+                }
+
+                ICredentials credentials = authHandler.getCredentials( this.connectionParameter );
+                if ( credentials == null )
+                {
+                    throw new ConnectionException( BrowserCoreMessages.model__no_credentials );
+                }
+
+                this.connectionProvider.bind( this.connectionParameter, credentials, monitor );
+                monitor.worked( 1 );
+            }
+            catch ( ConnectionException e )
+            {
+                monitor.reportError( e.getMessage(), e );
+                this.connectionProvider = null;
+            }
+        }
+    }
+
+
+    public void fetchRootDSE( ExtendedProgressMonitor monitor )
+    {
+        this.bind( monitor );
+
+        if ( this.connectionProvider != null )
+        {
+            try
+            {
+                monitor.reportProgress( BrowserCoreMessages.model__loading_rootdse );
+                this.loadRootDSE( monitor );
+                monitor.worked( 1 );
+            }
+            catch ( Exception e )
+            {
+                monitor.reportError( BrowserCoreMessages.model__error_loading_rootdse );
+                this.rootDSE = null;
+            }
+        }
+    }
+
+
+    public void open( ExtendedProgressMonitor monitor )
+    {
+        this.fetchRootDSE( monitor );
+
+        if ( this.connectionProvider != null && this.rootDSE != null )
+        {
+            try
+            {
+                monitor.reportProgress( BrowserCoreMessages.model__setting_base_dn );
+                if ( !this.connectionParameter.isFetchBaseDNs() )
+                {
+                    this.baseDNEntries = new BaseDNEntry[1];
+                    this.baseDNEntries[0] = new BaseDNEntry( new DN( this.connectionParameter.getBaseDN() ), this, this );
+                    this.cacheEntry( this.baseDNEntries[0] );
+                }
+            }
+            catch ( ModelModificationException mme )
+            {
+                monitor.reportError( BrowserCoreMessages.model__error_setting_base_dn, mme );
+            }
+
+            try
+            {
+                this.loadDirectoryMetadataEntries();
+            }
+            catch ( ModelModificationException mme )
+            {
+                monitor.reportError( BrowserCoreMessages.model__error_setting_metadata, mme );
+            }
+
+            try
+            {
+                monitor.reportProgress( BrowserCoreMessages.model__loading_schema );
+
+                // check if schema is cached
+                if ( this.schema == Schema.DEFAULT_SCHEMA )
+                {
+                    this.loadSchema( monitor );
+                }
+                else
+                {
+                    if ( this.rootDSE.getAttribute( IRootDSE.ROOTDSE_ATTRIBUTE_SUBSCHEMASUBENTRY ) != null )
+                    {
+                        // check if schema is up-to-date
+                        SearchParameter sp = new SearchParameter();
+                        sp.setSearchBase( new DN( this.rootDSE.getAttribute(
+                            IRootDSE.ROOTDSE_ATTRIBUTE_SUBSCHEMASUBENTRY ).getStringValue() ) );
+                        sp.setFilter( ISearch.FILTER_TRUE );
+                        sp.setScope( ISearch.SCOPE_OBJECT );
+                        sp.setReturningAttributes( new String[]
+                            { IAttribute.OPERATIONAL_ATTRIBUTE_CREATE_TIMESTAMP,
+                                IAttribute.OPERATIONAL_ATTRIBUTE_MODIFY_TIMESTAMP, } );
+                        ISearch search = new Search( this, sp );
+                        // ISearch search = new Search(null, this, new
+                        // DN(this.rootDSE.getAttribute("subschemaSubentry").getStringValue()),
+                        // ISearch.FILTER_TRUE,
+                        // new String[] {
+                        // IAttribute.OPERATIONAL_ATTRIBUTE_CREATE_TIMESTAMP,
+                        // IAttribute.OPERATIONAL_ATTRIBUTE_MODIFY_TIMESTAMP },
+                        // ISearch.SCOPE_OBJECT, 0, 0);
+                        this.search( search, monitor );
+                        ISearchResult[] results = search.getSearchResults();
+
+                        if ( results != null && results.length == 1 )
+                        {
+                            String schemaTimestamp = results[0]
+                                .getAttribute( IAttribute.OPERATIONAL_ATTRIBUTE_MODIFY_TIMESTAMP ) != null ? results[0]
+                                .getAttribute( IAttribute.OPERATIONAL_ATTRIBUTE_MODIFY_TIMESTAMP ).getStringValue()
+                                : null;
+                            if ( schemaTimestamp == null )
+                            {
+                                schemaTimestamp = results[0]
+                                    .getAttribute( IAttribute.OPERATIONAL_ATTRIBUTE_CREATE_TIMESTAMP ) != null ? results[0]
+                                    .getAttribute( IAttribute.OPERATIONAL_ATTRIBUTE_CREATE_TIMESTAMP ).getStringValue()
+                                    : null;
+                            }
+                            String cacheTimestamp = this.schema.getModifyTimestamp() != null ? this.schema
+                                .getModifyTimestamp() : this.schema.getCreateTimestamp();
+                            if ( cacheTimestamp == null
+                                || ( cacheTimestamp != null && schemaTimestamp != null && schemaTimestamp
+                                    .compareTo( cacheTimestamp ) > 0 ) )
+                            {
+                                this.loadSchema( monitor );
+                            }
+                        }
+                        else
+                        {
+                            this.schema = Schema.DEFAULT_SCHEMA;
+                            monitor.reportError( BrowserCoreMessages.model__no_schema_information );
+                        }
+                    }
+                    else
+                    {
+                        this.schema = Schema.DEFAULT_SCHEMA;
+                        monitor.reportError( BrowserCoreMessages.model__missing_schema_location );
+                    }
+                }
+
+            }
+            catch ( Exception e )
+            {
+                this.schema = Schema.DEFAULT_SCHEMA;
+                monitor.reportError( BrowserCoreMessages.model__error_loading_schema, e );
+                e.printStackTrace();
+                return;
+            }
+
+            EventRegistry.fireConnectionUpdated( new ConnectionUpdateEvent( this,
+                ConnectionUpdateEvent.CONNECTION_OPENED ), this );
+        }
+    }
+
+
+    public boolean isOpened()
+    {
+        return this.connectionProvider != null;
+    }
+
+
+    public boolean canOpen()
+    {
+        return !this.isOpened();
+    }
+
+
+    public boolean canClose()
+    {
+        return this.isOpened();
+    }
+
+
+    public void close()
+    {
+        if ( this.isOpened() )
+        {
+            if ( this.connectionProvider != null )
+            {
+                try
+                {
+                    this.connectionProvider.close();
+                }
+                catch ( ConnectionException ce )
+                {
+                    ce.printStackTrace();
+                }
+                this.connectionProvider = null;
+            }
+
+            if ( this.baseDNEntries != null )
+            {
+                this.baseDNEntries = new BaseDNEntry[0];
+            }
+            if ( this.metadataEntries != null )
+            {
+                this.metadataEntries = new IEntry[0];
+            }
+
+            for ( int i = 0; i < this.getSearchManager().getSearchCount(); i++ )
+            {
+                this.getSearchManager().getSearches()[i].setSearchResults( null );
+            }
+
+            this.dnToEntryCache.clear();
+            this.entryToAttributeInfoMap.clear();
+            this.entryToChildrenInfoMap.clear();
+            this.entryToChildrenFilterMap.clear();
+
+            modifyHandler.connectionClosed();
+            searchHandler.connectionClosed();
+
+            EventRegistry.fireConnectionUpdated( new ConnectionUpdateEvent( this,
+                ConnectionUpdateEvent.CONNECTION_CLOSED ), this );
+            System.gc();
+        }
+    }
+
+
+    private void loadRootDSE( ExtendedProgressMonitor monitor ) throws Exception
+    {
+        this.rootDSE = new RootDSE( this, this );
+        this.cacheEntry( this.rootDSE );
+
+        // First get ALL attributes
+        ISearch search = new Search( null, this, new DN(), ISearch.FILTER_TRUE, null, ISearch.SCOPE_OBJECT, 0, 0,
+            IConnection.DEREFERENCE_ALIASES_NEVER, IConnection.HANDLE_REFERRALS_IGNORE, false, false, null );
+        this.search( search, monitor );
+
+        // Second get well-known root DSE attributes
+        search = new Search( null, this, new DN(), ISearch.FILTER_TRUE, ROOT_DSE_ATTRIBUTES, ISearch.SCOPE_OBJECT, 0,
+            0, IConnection.DEREFERENCE_ALIASES_NEVER, IConnection.HANDLE_REFERRALS_IGNORE, false, false, null );
+        this.search( search, monitor );
+
+        // Set base DNs from root DSE
+        if ( this.rootDSE != null )
+        {
+            try
+            {
+                List baseDnEntryList = new ArrayList();
+                String[] baseDnAttributeNames = new String[]
+                    { IRootDSE.ROOTDSE_ATTRIBUTE_NAMINGCONTEXTS };
+                for ( int x = 0; x < baseDnAttributeNames.length; x++ )
+                {
+                    IAttribute attribute = this.rootDSE.getAttribute( baseDnAttributeNames[x] );
+                    if ( attribute != null )
+                    {
+                        String[] values = attribute.getStringValues();
+                        for ( int i = 0; i < values.length; i++ )
+                        {
+                            if ( !"".equals( values[i] ) ) { //$NON-NLS-1$
+                                baseDnEntryList.add( values[i] );
+                            }
+                        }
+                    }
+                }
+                this.baseDNEntries = new BaseDNEntry[baseDnEntryList.size()];
+                for ( int i = 0; i < this.baseDNEntries.length; i++ )
+                {
+                    this.baseDNEntries[i] = new BaseDNEntry( new DN( ( String ) baseDnEntryList.get( i ) ), this, this );
+                    this.cacheEntry( this.baseDNEntries[i] );
+                }
+
+                // this.loadDirectoryMetadataEntries();
+            }
+            catch ( Exception e )
+            {
+                monitor.reportError( BrowserCoreMessages.model__error_setting_base_dn, e );
+            }
+        }
+    }
+
+
+    private void loadDirectoryMetadataEntries() throws ModelModificationException
+    {
+
+        List metadataEntryList = new ArrayList();
+
+        // special case for schema entry
+        DirectoryMetadataEntry[] schemaEntries = getDirectoryMetadataEntries( IRootDSE.ROOTDSE_ATTRIBUTE_SUBSCHEMASUBENTRY );
+        for ( int i = 0; i < schemaEntries.length; i++ )
+        {
+            schemaEntries[i].setSchemaEntry( true );
+        }
+        metadataEntryList.addAll( Arrays.asList( schemaEntries ) );
+
+        // other metadata entries
+        String[] metadataAttributeNames = new String[]
+            { IRootDSE.ROOTDSE_ATTRIBUTE_MONITORCONTEXT, IRootDSE.ROOTDSE_ATTRIBUTE_CONFIGCONTEXT,
+                IRootDSE.ROOTDSE_ATTRIBUTE_DSANAME };
+        for ( int x = 0; x < metadataAttributeNames.length; x++ )
+        {
+            DirectoryMetadataEntry[] metadataEntries = getDirectoryMetadataEntries( metadataAttributeNames[x] );
+            metadataEntryList.addAll( Arrays.asList( metadataEntries ) );
+        }
+
+        this.metadataEntries = new IEntry[metadataEntryList.size()];
+        for ( int i = 0; i < metadataEntryList.size(); i++ )
+        {
+            this.metadataEntries[i] = ( IEntry ) metadataEntryList.get( i );
+            this.cacheEntry( this.metadataEntries[i] );
+        }
+
+    }
+
+
+    private DirectoryMetadataEntry[] getDirectoryMetadataEntries( String metadataAttributeName )
+        throws ModelModificationException
+    {
+        List metadataEntryList = new ArrayList();
+        IAttribute attribute = this.rootDSE.getAttribute( metadataAttributeName );
+        if ( attribute != null )
+        {
+            String[] values = attribute.getStringValues();
+            for ( int i = 0; i < values.length; i++ )
+            {
+                try
+                {
+                    metadataEntryList.add( new DN( values[i] ) );
+                }
+                catch ( NameException e )
+                {
+                }
+            }
+        }
+
+        DirectoryMetadataEntry[] metadataEntries = new DirectoryMetadataEntry[metadataEntryList.size()];
+        for ( int i = 0; i < metadataEntryList.size(); i++ )
+        {
+            metadataEntries[i] = new DirectoryMetadataEntry( ( DN ) metadataEntryList.get( i ), this, this );
+            metadataEntries[i].setDirectoryEntry( true );
+        }
+        return metadataEntries;
+    }
+
+
+    private void loadSchema( ExtendedProgressMonitor monitor )
+    {
+
+        this.schema = Schema.DEFAULT_SCHEMA;
+
+        try
+        {
+
+            // System.out.println(this.rootDSE);
+            // System.out.println(Arrays.asList(this.rootDSE.getAttributes()));
+            // System.out.println(this.rootDSE.getAttribute(IRootDSE.ROOTDSE_ATTRIBUTE_SUBSCHEMASUBENTRY));
+
+            if ( this.rootDSE.getAttribute( IRootDSE.ROOTDSE_ATTRIBUTE_SUBSCHEMASUBENTRY ) != null )
+            {
+                SearchParameter sp = new SearchParameter();
+                sp.setSearchBase( new DN( this.rootDSE.getAttribute( IRootDSE.ROOTDSE_ATTRIBUTE_SUBSCHEMASUBENTRY )
+                    .getStringValue() ) );
+                sp.setFilter( ISearch.FILTER_TRUE );
+                sp.setScope( ISearch.SCOPE_OBJECT );
+                sp.setReturningAttributes( new String[]
+                    { Schema.SCHEMA_ATTRIBUTE_OBJECTCLASSES, Schema.SCHEMA_ATTRIBUTE_ATTRIBUTETYPES,
+                        Schema.SCHEMA_ATTRIBUTE_LDAPSYNTAXES, Schema.SCHEMA_ATTRIBUTE_MATCHINGRULES,
+                        Schema.SCHEMA_ATTRIBUTE_MATCHINGRULEUSE, IAttribute.OPERATIONAL_ATTRIBUTE_CREATE_TIMESTAMP,
+                        IAttribute.OPERATIONAL_ATTRIBUTE_MODIFY_TIMESTAMP, } );
+                LdifEnumeration le = this.connectionProvider.search( sp, monitor );
+                if ( le.hasNext( monitor ) )
+                {
+                    LdifContentRecord schemaRecord = ( LdifContentRecord ) le.next( monitor );
+                    this.schema = new Schema();
+                    this.schema.loadFromRecord( schemaRecord );
+                    EventRegistry.fireConnectionUpdated( new ConnectionUpdateEvent( this,
+                        ConnectionUpdateEvent.CONNECTION_SCHEMA_LOADED ), this );
+                }
+                else
+                {
+                    monitor.reportError( BrowserCoreMessages.model__no_schema_information );
+                }
+            }
+            else
+            {
+                monitor.reportError( BrowserCoreMessages.model__missing_schema_location );
+            }
+        }
+        catch ( Exception e )
+        {
+            monitor.reportError( BrowserCoreMessages.model__error_loading_schema, e );
+            e.printStackTrace();
+        }
+
+        if ( this.schema == null )
+        {
+            this.schema = Schema.DEFAULT_SCHEMA;
+        }
+
+    }
+
+
+    public void search( ISearch searchRequest, ExtendedProgressMonitor monitor )
+    {
+        searchHandler.search( searchRequest, monitor );
+    }
+
+
+    public boolean existsEntry( DN dn, ExtendedProgressMonitor monitor )
+    {
+        return searchHandler.existsEntry( dn, monitor );
+    }
+
+
+    public IEntry getEntryFromCache( DN dn )
+    {
+
+        if ( this.dnToEntryCache != null && this.dnToEntryCache.containsKey( dn.toOidString( this.schema ) ) )
+        {
+            return ( IEntry ) dnToEntryCache.get( dn.toOidString( this.schema ) );
+        }
+        if ( this.rootDSE != null && this.rootDSE.getDn() != null && this.rootDSE.getDn().equals( dn ) )
+        {
+            return this.rootDSE;
+        }
+        if ( this.baseDNEntries != null )
+        {
+            for ( int i = 0; i < this.baseDNEntries.length; i++ )
+            {
+                if ( this.baseDNEntries[i] != null && this.baseDNEntries[i].getDn() != null
+                    && this.baseDNEntries[i].getDn().equals( dn ) )
+                {
+                    return this.baseDNEntries[i];
+                }
+            }
+        }
+        if ( this.metadataEntries != null )
+        {
+            for ( int i = 0; i < this.metadataEntries.length; i++ )
+            {
+                if ( this.metadataEntries[i] != null && this.metadataEntries[i].getDn() != null
+                    && this.metadataEntries[i].getDn().equals( dn ) )
+                {
+                    return this.metadataEntries[i];
+                }
+            }
+        }
+        return null;
+    }
+
+
+    public IEntry getEntry( DN dn, ExtendedProgressMonitor monitor )
+    {
+        return searchHandler.getEntry( dn, monitor );
+    }
+
+
+    public void create( IValue[] valuesToCreate, ExtendedProgressMonitor monitor )
+    {
+        modifyHandler.create( valuesToCreate, monitor );
+    }
+
+
+    public void modify( IValue oldValue, IValue newValue, ExtendedProgressMonitor monitor )
+    {
+        modifyHandler.modify( oldValue, newValue, monitor );
+    }
+
+
+    public void create( IEntry entryToCreate, ExtendedProgressMonitor monitor )
+    {
+        modifyHandler.create( entryToCreate, monitor );
+    }
+
+
+    public void rename( IEntry entryToRename, DN newDn, boolean deleteOldRdn, ExtendedProgressMonitor monitor )
+    {
+        modifyHandler.rename( entryToRename, newDn, deleteOldRdn, monitor );
+    }
+
+
+    public void move( IEntry entryToMove, DN newSuperior, ExtendedProgressMonitor monitor )
+    {
+        modifyHandler.move( entryToMove, newSuperior, monitor );
+    }
+
+
+    public LdifEnumeration exportLdif( SearchParameter searchParameter, ExtendedProgressMonitor monitor )
+        throws ConnectionException
+    {
+        LdifEnumeration subEnumeration = this.connectionProvider.search( searchParameter, monitor );
+        return subEnumeration;
+    }
+
+
+    public final String getName()
+    {
+        return this.connectionParameter.getName();
+    }
+
+
+    public final void setName( String name )
+    {
+        String oldName = this.getName();
+        this.connectionParameter.setName( name );
+        EventRegistry.fireConnectionUpdated( new ConnectionRenamedEvent( this, oldName ), this );
+    }
+
+
+    public boolean isFetchBaseDNs()
+    {
+        return this.connectionParameter.isFetchBaseDNs();
+    }
+
+
+    public void setFetchBaseDNs( boolean fetchBaseDNs )
+    {
+        this.connectionParameter.setFetchBaseDNs( fetchBaseDNs );
+        EventRegistry.fireConnectionUpdated( new ConnectionUpdateEvent( this,
+            ConnectionUpdateEvent.CONNECTION_PARAMETER_UPDATED ), this );
+    }
+
+
+    public DN getBaseDN()
+    {
+        return this.connectionParameter.getBaseDN();
+    }
+
+
+    public void setBaseDN( DN baseDN )
+    {
+        this.connectionParameter.setBaseDN( baseDN );
+        EventRegistry.fireConnectionUpdated( new ConnectionUpdateEvent( this,
+            ConnectionUpdateEvent.CONNECTION_PARAMETER_UPDATED ), this );
+    }
+
+
+    public int getCountLimit()
+    {
+        return this.connectionParameter.getCountLimit();
+    }
+
+
+    public void setCountLimit( int countLimit )
+    {
+        this.connectionParameter.setCountLimit( countLimit );
+        EventRegistry.fireConnectionUpdated( new ConnectionUpdateEvent( this,
+            ConnectionUpdateEvent.CONNECTION_PARAMETER_UPDATED ), this );
+    }
+
+
+    public String getHost()
+    {
+        return this.connectionParameter.getHost();
+    }
+
+
+    public void setHost( String host )
+    {
+        this.connectionParameter.setHost( host );
+        EventRegistry.fireConnectionUpdated( new ConnectionUpdateEvent( this,
+            ConnectionUpdateEvent.CONNECTION_PARAMETER_UPDATED ), this );
+    }
+
+
+    public int getPort()
+    {
+        return this.connectionParameter.getPort();
+    }
+
+
+    public void setPort( int port )
+    {
+        this.connectionParameter.setPort( port );
+        EventRegistry.fireConnectionUpdated( new ConnectionUpdateEvent( this,
+            ConnectionUpdateEvent.CONNECTION_PARAMETER_UPDATED ), this );
+    }
+
+
+    public int getAliasesDereferencingMethod()
+    {
+        return this.connectionParameter.getAliasesDereferencingMethod();
+    }
+
+
+    public void setAliasesDereferencingMethod( int aliasesDereferencingMethod )
+    {
+        this.connectionParameter.setAliasesDereferencingMethod( aliasesDereferencingMethod );
+        EventRegistry.fireConnectionUpdated( new ConnectionUpdateEvent( this,
+            ConnectionUpdateEvent.CONNECTION_PARAMETER_UPDATED ), this );
+    }
+
+
+    public int getReferralsHandlingMethod()
+    {
+        return this.connectionParameter.getReferralsHandlingMethod();
+    }
+
+
+    public void setReferralsHandlingMethod( int referralsHandlingMethod )
+    {
+        this.connectionParameter.setReferralsHandlingMethod( referralsHandlingMethod );
+        EventRegistry.fireConnectionUpdated( new ConnectionUpdateEvent( this,
+            ConnectionUpdateEvent.CONNECTION_PARAMETER_UPDATED ), this );
+    }
+
+
+    public int getEncryptionMethod()
+    {
+        return this.connectionParameter.getEncryptionMethod();
+    }
+
+
+    public void setEncryptionMethod( int encryptionMethod )
+    {
+        this.connectionParameter.setEncryptionMethod( encryptionMethod );
+        EventRegistry.fireConnectionUpdated( new ConnectionUpdateEvent( this,
+            ConnectionUpdateEvent.CONNECTION_PARAMETER_UPDATED ), this );
+    }
+
+
+    public int getTimeLimit()
+    {
+        return this.connectionParameter.getTimeLimit();
+    }
+
+
+    public void setTimeLimit( int timeLimit )
+    {
+        this.connectionParameter.setTimeLimit( timeLimit );
+        EventRegistry.fireConnectionUpdated( new ConnectionUpdateEvent( this,
+            ConnectionUpdateEvent.CONNECTION_PARAMETER_UPDATED ), this );
+    }
+
+
+    public String getBindPrincipal()
+    {
+        return this.connectionParameter.getBindPrincipal();
+    }
+
+
+    public void setBindPrincipal( String bindPrincipal )
+    {
+        this.connectionParameter.setBindPrincipal( bindPrincipal );
+        EventRegistry.fireConnectionUpdated( new ConnectionUpdateEvent( this,
+            ConnectionUpdateEvent.CONNECTION_PARAMETER_UPDATED ), this );
+    }
+
+
+    public String getBindPassword()
+    {
+        return this.connectionParameter.getBindPassword();
+    }
+
+
+    public void setBindPassword( String bindPassword )
+    {
+        this.connectionParameter.setBindPassword( bindPassword );
+        EventRegistry.fireConnectionUpdated( new ConnectionUpdateEvent( this,
+            ConnectionUpdateEvent.CONNECTION_PARAMETER_UPDATED ), this );
+    }
+
+
+    public int getAuthMethod()
+    {
+        return this.connectionParameter.getAuthMethod();
+    }
+
+
+    public void setAuthMethod( int authMethod )
+    {
+        this.connectionParameter.setAuthMethod( authMethod );
+        EventRegistry.fireConnectionUpdated( new ConnectionUpdateEvent( this,
+            ConnectionUpdateEvent.CONNECTION_PARAMETER_UPDATED ), this );
+    }
+
+
+    public String getConnectionProviderClassName()
+    {
+        return this.connectionParameter.getConnectionProviderClassName();
+    }
+
+
+    public void setConnectionProviderClassName( String connectionProviderClassName )
+    {
+        this.connectionParameter.setConnectionProviderClassName( connectionProviderClassName );
+        EventRegistry.fireConnectionUpdated( new ConnectionUpdateEvent( this,
+            ConnectionUpdateEvent.CONNECTION_PARAMETER_UPDATED ), this );
+    }
+
+
+    public final IEntry[] getBaseDNEntries()
+    {
+        return this.baseDNEntries;
+    }
+
+
+    public final IEntry[] getMetadataEntries()
+    {
+        return this.metadataEntries;
+    }
+
+
+    public final IRootDSE getRootDSE()
+    {
+        return this.rootDSE;
+    }
+
+
+    public Schema getSchema()
+    {
+        return schema;
+    }
+
+
+    public void setSchema( Schema schema )
+    {
+        this.schema = schema;
+    }
+
+
+    public ConnectionParameter getConnectionParameter()
+    {
+        return connectionParameter;
+    }
+
+
+    public void setConnectionParameter( ConnectionParameter connectionParameter )
+    {
+        this.connectionParameter = connectionParameter;
+    }
+
+
+    public String toString()
+    {
+        return this.connectionParameter.getName();
+    }
+
+
+    public SearchManager getSearchManager()
+    {
+        return searchManager;
+    }
+
+
+    public BookmarkManager getBookmarkManager()
+    {
+        return bookmarkManager;
+    }
+
+
+    public ModificationLogger getModificationLogger()
+    {
+        return modifyHandler.getModificationLogger();
+    }
+
+
+    public Object getAdapter( Class adapter )
+    {
+
+        if ( adapter.isAssignableFrom( ISearchPageScoreComputer.class ) )
+        {
+            return new LdapSearchPageScoreComputer();
+        }
+        if ( adapter == IConnection.class )
+        {
+            return this;
+        }
+
+        return null;
+    }
+
+
+    public IConnection getConnection()
+    {
+        return this;
+    }
+
+
+    protected void cacheEntry( IEntry entry )
+    {
+        this.dnToEntryCache.put( entry.getDn().toOidString( this.schema ), entry );
+    }
+
+
+    protected void uncacheEntry( IEntry entry )
+    {
+        this.dnToEntryCache.remove( entry.getDn().toOidString( this.schema ) );
+    }
+
+
+    protected void uncacheEntry( DN dn )
+    {
+        this.dnToEntryCache.remove( dn.toOidString( this.schema ) );
+    }
+
+
+    protected String getChildrenFilter( IEntry entry )
+    {
+        return this.entryToChildrenFilterMap == null ? null : ( String ) this.entryToChildrenFilterMap.get( entry );
+    }
+
+
+    protected void setChildrenFilter( IEntry entry, String childrenFilter )
+    {
+        if ( childrenFilter == null || "".equals( childrenFilter ) ) { //$NON-NLS-1$
+            this.entryToChildrenFilterMap.remove( entry );
+        }
+        else
+        {
+            this.entryToChildrenFilterMap.put( entry, childrenFilter );
+        }
+    }
+
+
+    protected AttributeInfo getAttributeInfo( IEntry entry )
+    {
+        return this.entryToAttributeInfoMap == null ? null : ( AttributeInfo ) this.entryToAttributeInfoMap.get( entry );
+    }
+
+
+    protected void setAttributeInfo( IEntry entry, AttributeInfo ai )
+    {
+        if ( ai == null )
+        {
+            this.entryToAttributeInfoMap.remove( entry );
+        }
+        else
+        {
+            this.entryToAttributeInfoMap.put( entry, ai );
+        }
+    }
+
+
+    protected ChildrenInfo getChildrenInfo( IEntry entry )
+    {
+        return this.entryToChildrenInfoMap == null ? null : ( ChildrenInfo ) this.entryToChildrenInfoMap.get( entry );
+    }
+
+
+    protected void setChildrenInfo( IEntry entry, ChildrenInfo si )
+    {
+        if ( si == null )
+        {
+            this.entryToChildrenInfoMap.remove( entry );
+        }
+        else
+        {
+            this.entryToChildrenInfoMap.put( entry, si );
+        }
+    }
+
+
+    public void delete( IEntry entry, ExtendedProgressMonitor monitor )
+    {
+        modifyHandler.delete( entry, monitor );
+    }
+
+
+    public void delete( IValue[] valuesToDelete, ExtendedProgressMonitor monitor )
+    {
+        modifyHandler.delete( valuesToDelete, monitor );
+    }
+
+
+    public void delete( IAttribute[] attriubtesToDelete, ExtendedProgressMonitor monitor )
+    {
+        modifyHandler.delete( attriubtesToDelete, monitor );
+    }
+
+
+    public void importLdif( LdifEnumeration enumeration, Writer logWriter, boolean continueOnError,
+        ExtendedProgressMonitor monitor )
+    {
+        modifyHandler.importLdif( enumeration, logWriter, continueOnError, monitor );
+    }
+
+
+    public synchronized boolean isSuspended()
+    {
+        return modifyHandler.isSuspended();
+    }
+
+
+    public synchronized void suspend()
+    {
+        modifyHandler.suspend();
+    }
+
+
+    public synchronized void resume( ExtendedProgressMonitor monitor )
+    {
+        modifyHandler.resume( monitor );
+    }
+
+
+    public synchronized void reset()
+    {
+        modifyHandler.reset();
+    }
+
+}

Added: directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/ConnectionException.java
URL: http://svn.apache.org/viewvc/directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/ConnectionException.java?view=auto&rev=488345
==============================================================================
--- directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/ConnectionException.java (added)
+++ directory/sandbox/pamarcelot/ldapstudio/ldapstudio-browser-core/src/org/apache/directory/ldapstudio/browser/core/internal/model/ConnectionException.java Mon Dec 18 09:15:00 2006
@@ -0,0 +1,65 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+
+package org.apache.directory.ldapstudio.browser.core.internal.model;
+
+
+public class ConnectionException extends Exception
+{
+
+    private static final long serialVersionUID = 1L;
+
+    private int ldapStatusCode;
+
+    private Throwable originalThrowable;
+
+
+    public ConnectionException( int ldapStatusCode, String message, Throwable originalThrowable )
+    {
+        super( message );
+        this.ldapStatusCode = ldapStatusCode;
+        this.originalThrowable = originalThrowable;
+    }
+
+
+    public ConnectionException( String message )
+    {
+        this( -1, message, null );
+    }
+
+
+    public ConnectionException( Throwable t )
+    {
+        this( -1, t.getMessage(), t );
+    }
+
+
+    public int getLdapStatusCode()
+    {
+        return ldapStatusCode;
+    }
+
+
+    public Throwable getOriginalThrowable()
+    {
+        return originalThrowable;
+    }
+
+}