You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by fe...@apache.org on 2007/11/05 17:52:07 UTC

svn commit: r592082 [2/20] - in /directory/sandbox/felixk/studio-ldapbrowser-core: ./ META-INF/ src/ src/main/ src/main/java/ src/main/java/org/ src/main/java/org/apache/ src/main/java/org/apache/directory/ src/main/java/org/apache/directory/studio/ sr...

Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserConnectionManager.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserConnectionManager.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserConnectionManager.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserConnectionManager.java Mon Nov  5 08:51:43 2007
@@ -0,0 +1,678 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *
+ */
+
+package org.apache.directory.studio.ldapbrowser.core;
+
+
+import java.beans.Encoder;
+import java.beans.ExceptionListener;
+import java.beans.Expression;
+import java.beans.PersistenceDelegate;
+import java.beans.XMLDecoder;
+import java.beans.XMLEncoder;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.directory.studio.connection.core.Connection;
+import org.apache.directory.studio.connection.core.ConnectionCorePlugin;
+import org.apache.directory.studio.connection.core.ConnectionFolder;
+import org.apache.directory.studio.connection.core.event.ConnectionEventRegistry;
+import org.apache.directory.studio.connection.core.event.ConnectionUpdateListener;
+import org.apache.directory.studio.connection.core.io.ConnectionIOException;
+import org.apache.directory.studio.ldapbrowser.core.events.BookmarkUpdateEvent;
+import org.apache.directory.studio.ldapbrowser.core.events.BookmarkUpdateListener;
+import org.apache.directory.studio.ldapbrowser.core.events.BrowserConnectionUpdateEvent;
+import org.apache.directory.studio.ldapbrowser.core.events.BrowserConnectionUpdateListener;
+import org.apache.directory.studio.ldapbrowser.core.events.EventRegistry;
+import org.apache.directory.studio.ldapbrowser.core.events.SearchUpdateEvent;
+import org.apache.directory.studio.ldapbrowser.core.events.SearchUpdateListener;
+import org.apache.directory.studio.ldapbrowser.core.model.BookmarkParameter;
+import org.apache.directory.studio.ldapbrowser.core.model.IBookmark;
+import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection;
+import org.apache.directory.studio.ldapbrowser.core.model.ISearch;
+import org.apache.directory.studio.ldapbrowser.core.model.SearchParameter;
+import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection.AliasDereferencingMethod;
+import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection.ReferralHandlingMethod;
+import org.apache.directory.studio.ldapbrowser.core.model.ISearch.SearchScope;
+import org.apache.directory.studio.ldapbrowser.core.model.impl.Bookmark;
+import org.apache.directory.studio.ldapbrowser.core.model.impl.BrowserConnection;
+import org.apache.directory.studio.ldapbrowser.core.model.impl.Search;
+import org.apache.directory.studio.ldapbrowser.core.model.schema.Schema;
+import org.apache.directory.studio.ldapbrowser.core.utils.LdifUtils;
+import org.eclipse.core.runtime.IPath;
+
+
+/**
+ * This class is used to manage {@link IBrowserConnection}s.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class BrowserConnectionManager implements ConnectionUpdateListener, BrowserConnectionUpdateListener, SearchUpdateListener, BookmarkUpdateListener
+{
+
+    /** The list of connections. */
+    private Map<String, IBrowserConnection> connectionMap;
+
+
+    /**
+     * Creates a new instance of ConnectionManager.
+     */
+    public BrowserConnectionManager()
+    {
+        this.connectionMap = new HashMap<String, IBrowserConnection>();
+        loadBrowserConnections();
+        ConnectionEventRegistry.addConnectionUpdateListener( this, ConnectionCorePlugin.getDefault().getEventRunner() );
+        EventRegistry.addSearchUpdateListener( this, BrowserCorePlugin.getDefault().getEventRunner() );
+        EventRegistry.addBookmarkUpdateListener( this, BrowserCorePlugin.getDefault().getEventRunner() );
+        EventRegistry.addBrowserConnectionUpdateListener( this, BrowserCorePlugin.getDefault().getEventRunner() );
+    }
+
+
+    /**
+     * Gets the Schema Cache filename for the corresponding browser connection.
+     *
+     * @param browserConnection
+     *      the browser connection
+     * @return
+     *      the Schema Cache filename for the corresponding browser connection
+     */
+    public static final String getSchemaCacheFileName( IBrowserConnection browserConnection )
+    {
+        return BrowserCorePlugin.getDefault().getStateLocation().append(
+            "schema-" + toSaveString( browserConnection.getConnection().getId() ) + ".ldif" ).toOSString(); //$NON-NLS-1$ //$NON-NLS-2$
+    }
+
+
+    /**
+     * Gets the Modification Log filename for the corresponding browser connection.
+     *
+     * @param browserConnection
+     *      the browser connection
+     * @return
+     *      the Modification Log filename
+     */
+    public static final String getModificationLogFileName( IBrowserConnection browserConnection )
+    {
+        IPath p = BrowserCorePlugin.getDefault().getStateLocation().append( "logs" ); //$NON-NLS-1$
+        File file = p.toFile();
+        if ( !file.exists() )
+        {
+            file.mkdir();
+        }
+        return p
+            .append( "modifications-" + toSaveString( browserConnection.getConnection().getId() ) + "-%u-%g.ldiflog" ).toOSString(); //$NON-NLS-1$ //$NON-NLS-2$
+    }
+
+
+    /**
+     * Gets the filename of the Connection Store.
+     *
+     * @return
+     *      the filename of the Connection Store
+     */
+    public static final String getBrowserConnectionStoreFileName()
+    {
+        String filename = BrowserCorePlugin.getDefault().getStateLocation().append( "browserconnections.xml" ).toOSString(); //$NON-NLS-1$
+        File file = new File( filename );
+        if ( !file.exists() )
+        {
+            // try to convert old connections.xml:
+            // 1st search it in current workspace with the old ldapstudio plugin ID
+            // 2nd search it in old .ldapstudio workspace with the old ldapstudio plugin ID
+            String[] oldFilenames = new String[2];
+            oldFilenames[0] = filename.replace( "org.apache.directory.studio.ldapbrowser.core",
+                "org.apache.directory.ldapstudio.browser.core" );
+            oldFilenames[1] = oldFilenames[0].replace( ".ApacheDirectoryStudio", ".ldapstudio" );
+            for ( int i = 0; i < oldFilenames.length; i++ )
+            {
+                File oldFile = new File( oldFilenames[i] );
+                if ( oldFile.exists() )
+                {
+                    try
+                    {
+                        String oldContent = FileUtils.readFileToString( oldFile, "UTF-8" );
+                        String newContent = oldContent.replace( "org.apache.directory.ldapstudio.browser.core",
+                            "org.apache.directory.studio.ldapbrowser.core" );
+                        FileUtils.writeStringToFile( file, newContent, "UTF-8" );
+                        break;
+                    }
+                    catch ( IOException e )
+                    {
+                        e.printStackTrace();
+                    }
+                }
+            }
+        }
+
+        return filename;
+    }
+
+
+    /**
+     * Converts a String into a Saveable String.
+     *
+     * @param s
+     *      the String to convert
+     * @return
+     *      the converted String
+     */
+    private static String toSaveString( String s )
+    {
+        if ( s == null )
+        {
+            return null;
+        }
+
+        byte[] b = LdifUtils.utf8encode( s );
+        StringBuffer sb = new StringBuffer();
+        for ( int i = 0; i < b.length; i++ )
+        {
+
+            if ( b[i] == '-' || b[i] == '_' || ( '0' <= b[i] && b[i] <= '9' ) || ( 'A' <= b[i] && b[i] <= 'Z' )
+                || ( 'a' <= b[i] && b[i] <= 'z' ) )
+            {
+                sb.append( ( char ) b[i] );
+            }
+            else
+            {
+                int x = ( int ) b[i];
+                if ( x < 0 )
+                    x = 256 + x;
+                String t = Integer.toHexString( x );
+                if ( t.length() == 1 )
+                    t = "0" + t; //$NON-NLS-1$
+                sb.append( t );
+            }
+        }
+
+        return sb.toString();
+    }
+
+
+    /**
+     * Gets a browser connection from its id.
+     *
+     * @param id
+     *      the id of the Connection
+     * @return
+     *      the corresponding IBrowserConnection
+     */
+    public IBrowserConnection getBrowserConnectionById( String id )
+    {
+        return connectionMap.get( id );
+    }
+
+
+    /**
+     * Gets a browser connection from its name.
+     *
+     * @param name
+     *      the name of the Connection
+     * @return
+     *      the corresponding IBrowserConnection
+     */
+    public IBrowserConnection getBrowserConnectionByName( String name )
+    {
+        Connection connection = ConnectionCorePlugin.getDefault().getConnectionManager().getConnectionByName( name );
+        return getBrowserConnection( connection );
+    }
+    
+    
+    /**
+     * Gets a browser connection from its underlying connection.
+     *
+     * @param connection
+     *      the underlying connection
+     * @return
+     *      the corresponding IBrowserConnection
+     */
+    public IBrowserConnection getBrowserConnection( Connection connection )
+    {
+        return connection != null ? getBrowserConnectionById( connection.getId() ) : null;
+    }
+
+
+    /**
+     * Gets an array containing all the Connections.
+     *
+     * @return
+     *      an array containing all the Connections
+     */
+    public IBrowserConnection[] getBrowserConnections()
+    {
+        return ( IBrowserConnection[] ) connectionMap.values().toArray( new IBrowserConnection[0] );
+    }
+
+
+    /**
+     * @see org.apache.directory.studio.connection.core.event.ConnectionUpdateListener#connectionRemoved(org.apache.directory.studio.connection.core.Connection)
+     */
+    public void connectionRemoved( Connection connection )
+    {
+        // update connection list
+        IBrowserConnection browserConnection = connectionMap.remove( connection.getId() );
+
+        // remove schema file
+        File schemaFile = new File( getSchemaCacheFileName( browserConnection ) );
+        if ( schemaFile.exists() )
+        {
+            schemaFile.delete();
+        }
+
+        // make persistent
+        saveBrowserConnections();
+    }
+
+
+    /**
+     * @see org.apache.directory.studio.connection.core.event.ConnectionUpdateListener#connectionAdded(org.apache.directory.studio.connection.core.Connection)
+     */
+    public void connectionAdded( Connection connection )
+    {
+        // update connection list
+        BrowserConnection browserConnection = new BrowserConnection( connection );
+        connectionMap.put( connection.getId(), browserConnection );
+
+        // make persistent
+        saveBrowserConnections();
+    }
+
+
+    /**
+     * @see org.apache.directory.studio.connection.core.event.ConnectionUpdateListener#connectionUpdated(org.apache.directory.studio.connection.core.Connection)
+     */
+    public void connectionUpdated( Connection connection )
+    {
+        saveBrowserConnections();
+        saveSchema( getBrowserConnection( connection ) );
+    }
+
+
+    /**
+     * @see org.apache.directory.studio.connection.core.event.ConnectionUpdateListener#connectionOpened(org.apache.directory.studio.connection.core.Connection)
+     */
+    public void connectionOpened( Connection connection )
+    {
+    }
+
+
+    /**
+     * @see org.apache.directory.studio.connection.core.event.ConnectionUpdateListener#connectionClosed(org.apache.directory.studio.connection.core.Connection)
+     */
+    public void connectionClosed( Connection connection )
+    {
+    }
+
+
+    /**
+     * @see org.apache.directory.studio.connection.core.event.ConnectionUpdateListener#connectionFolderModified(org.apache.directory.studio.connection.core.ConnectionFolder)
+     */
+    public void connectionFolderModified( ConnectionFolder connectionFolder )
+    {
+    }
+
+
+    /**
+     * @see org.apache.directory.studio.ldapbrowser.core.events.BrowserConnectionUpdateListener#browserConnectionUpdated(org.apache.directory.studio.ldapbrowser.core.events.BrowserConnectionUpdateEvent)
+     */
+    public void browserConnectionUpdated( BrowserConnectionUpdateEvent browserConnectionUpdateEvent )
+    {
+        if ( browserConnectionUpdateEvent.getDetail() == BrowserConnectionUpdateEvent.Detail.BROWSER_CONNECTION_OPENED
+            || browserConnectionUpdateEvent.getDetail() == BrowserConnectionUpdateEvent.Detail.SCHEMA_UPDATED )
+        {
+            saveSchema( browserConnectionUpdateEvent.getBrowserConnection() );
+        }
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public void searchUpdated( SearchUpdateEvent searchUpdateEvent )
+    {
+        if ( searchUpdateEvent.getDetail() == SearchUpdateEvent.EventDetail.SEARCH_ADDED
+            || searchUpdateEvent.getDetail() == SearchUpdateEvent.EventDetail.SEARCH_REMOVED
+            || searchUpdateEvent.getDetail() == SearchUpdateEvent.EventDetail.SEARCH_RENAMED
+            || searchUpdateEvent.getDetail() == SearchUpdateEvent.EventDetail.SEARCH_PARAMETER_UPDATED )
+        {
+            saveBrowserConnections();
+        }
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public void bookmarkUpdated( BookmarkUpdateEvent bookmarkUpdateEvent )
+    {
+        if ( bookmarkUpdateEvent.getDetail() == BookmarkUpdateEvent.Detail.BOOKMARK_ADDED
+            || bookmarkUpdateEvent.getDetail() == BookmarkUpdateEvent.Detail.BOOKMARK_REMOVED
+            || bookmarkUpdateEvent.getDetail() == BookmarkUpdateEvent.Detail.BOOKMARK_UPDATED )
+        {
+            saveBrowserConnections();
+        }
+    }
+
+
+    /**
+     * Saves the browser Connections
+     */
+    private void saveBrowserConnections()
+    {
+        // To avoid a corrupt file, save object to a temp file first 
+        try
+        {
+            BrowserConnectionIO.save( new FileOutputStream( getBrowserConnectionStoreFileName() + "-temp" ), connectionMap );
+        }
+        catch ( IOException e )
+        {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+
+        // move temp file to good file
+        File file = new File( getBrowserConnectionStoreFileName() );
+        File tempFile = new File( getBrowserConnectionStoreFileName() + "-temp" );
+        if ( file.exists() )
+        {
+            file.delete();
+        }
+
+        try
+        {
+            String content = FileUtils.readFileToString( tempFile, "UTF-8" );
+            FileUtils.writeStringToFile( file, content, "UTF-8" );
+        }
+        catch ( IOException e )
+        {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        
+//        Object[][] object = new Object[connectionMap.size()][3];
+//
+//        Iterator<IBrowserConnection> connectionIterator = connectionMap.values().iterator();
+//        for ( int i = 0; connectionIterator.hasNext(); i++ )
+//        {
+//            IBrowserConnection browserConnection = connectionIterator.next();
+//            
+//            ISearch[] searches = browserConnection.getSearchManager().getSearches();
+//            SearchParameter[] searchParameters = new SearchParameter[searches.length];
+//            for ( int k = 0; k < searches.length; k++ )
+//            {
+//                searchParameters[k] = searches[k].getSearchParameter();
+//            }
+//            
+//            IBookmark[] bookmarks = browserConnection.getBookmarkManager().getBookmarks();
+//            BookmarkParameter[] bookmarkParameters = new BookmarkParameter[bookmarks.length];
+//            for ( int k = 0; k < bookmarks.length; k++ )
+//            {
+//                bookmarkParameters[k] = bookmarks[k].getBookmarkParameter();
+//            }
+//
+//            object[i][0] = browserConnection.getConnection().getId();
+//            object[i][1] = searchParameters;
+//            object[i][2] = bookmarkParameters;
+//        }
+//
+//        save( object, getBrowserConnectionStoreFileName() );
+    }
+
+
+    /**
+     * Saves the Schema of the Connection
+     *
+     * @param connection
+     *      the Connection
+     */
+    private void saveSchema( IBrowserConnection connection )
+    {
+        try
+        {
+            String filename = getSchemaCacheFileName( connection );
+            FileWriter writer = new FileWriter( filename );
+            connection.getSchema().saveToLdif( writer );
+            writer.close();
+        }
+        catch ( Exception e )
+        {
+            e.printStackTrace();
+        }
+    }
+
+
+    /**
+     * Loads the Connections
+     */
+    private void loadBrowserConnections()
+    {
+        Connection[] connections = ConnectionCorePlugin.getDefault().getConnectionManager().getConnections();
+        for ( int i = 0; i < connections.length; i++ )
+        {
+            Connection connection = connections[i];
+            BrowserConnection browserConnection = new BrowserConnection( connection );
+            connectionMap.put( connection.getId(), browserConnection );
+            
+            try
+            {
+                String schemaFilename = getSchemaCacheFileName( browserConnection );
+                FileReader reader = new FileReader( schemaFilename );
+                Schema schema = new Schema();
+                schema.loadFromLdif( reader );
+                browserConnection.setSchema( schema );
+            }
+            catch ( Exception e )
+            {
+            }
+        }
+        
+        // java.beans.XMLDecoder
+        try
+        {
+            String fileName = getBrowserConnectionStoreFileName();
+            File file = new File( fileName );
+            if ( file.exists() )
+            {
+                String oldContent = FileUtils.readFileToString( file, "UTF-8" );
+                if(!oldContent.contains( "java.beans.XMLDecoder" ))
+                {
+                    // new file format
+                    try
+                    {
+                        BrowserConnectionIO.load( new FileInputStream( getBrowserConnectionStoreFileName() ), connectionMap );
+                    }
+                    catch ( Exception e )
+                    {
+                        // If loading failed, try with temp file
+                        try
+                        {
+                            BrowserConnectionIO
+                                .load( new FileInputStream( getBrowserConnectionStoreFileName() + "-temp" ), connectionMap );
+                        }
+                        catch ( FileNotFoundException e1 )
+                        {
+                            // TODO Auto-generated catch block
+                            return;
+                        }
+                        catch ( ConnectionIOException e1 )
+                        {
+                            // TODO Auto-generated catch block
+                            return;
+                        }
+                    }
+                }
+                else 
+                {
+                    // old file format
+                    Object[][] object = ( Object[][] ) this.load( getBrowserConnectionStoreFileName() );
+
+                    if ( object != null )
+                    {
+                        try
+                        {
+                            for ( int i = 0; i < object.length; i++ )
+                            {
+                                String connectionId = ( String ) object[i][0];
+                                IBrowserConnection browserConnection = getBrowserConnectionById( connectionId );
+
+                                if ( browserConnection != null )
+                                {
+                                    if ( object[i].length > 0 )
+                                    {
+                                        SearchParameter[] searchParameters = ( SearchParameter[] ) object[i][1];
+                                        for ( int k = 0; k < searchParameters.length; k++ )
+                                        {
+                                            ISearch search = new Search( browserConnection, searchParameters[k] );
+                                            browserConnection.getSearchManager().addSearch( search );
+                                        }
+                                    }
+
+                                    if ( object[i].length > 1 )
+                                    {
+                                        BookmarkParameter[] bookmarkParameters = ( BookmarkParameter[] ) object[i][2];
+                                        for ( int k = 0; k < bookmarkParameters.length; k++ )
+                                        {
+                                            IBookmark bookmark = new Bookmark( browserConnection, bookmarkParameters[k] );
+                                            browserConnection.getBookmarkManager().addBookmark( bookmark );
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                        catch ( ArrayIndexOutOfBoundsException e )
+                        {
+                            // Thrown by decoder.readObject(), signals EOF
+                        }
+                        catch ( Exception e )
+                        {
+                            e.printStackTrace();
+                        }
+                    }
+                }
+            }
+        }
+        catch ( Exception e )
+        {
+        }
+        
+        
+    }
+
+
+    /**
+     * Loads an Object from an XML file
+     *
+     * @param filename
+     *      the filename of the XML file
+     * @return
+     *      the deserialized Object
+     */
+    private synchronized Object load( String filename )
+    {
+        try
+        {
+            Thread.currentThread().setContextClassLoader( getClass().getClassLoader() );
+            XMLDecoder decoder = new XMLDecoder( new BufferedInputStream( ( new FileInputStream( filename ) ) ) );
+            Object object = decoder.readObject();
+            decoder.close();
+            return object;
+        }
+        catch ( IOException ioe )
+        {
+            return null;
+        }
+        catch ( Exception e )
+        {
+            // if loading failed, try with temp file
+            String tempFilename = filename + "-temp";
+            try
+            {
+                XMLDecoder decoder = new XMLDecoder( new BufferedInputStream( ( new FileInputStream( tempFilename ) ) ) );
+                Object object = decoder.readObject();
+                decoder.close();
+                return object;
+            }
+            catch ( IOException ioe2 )
+            {
+                return null;
+            }
+            catch ( Exception e2 )
+            {
+                return null;
+            }
+        }
+    }
+
+
+    class TypeSafeEnumPersistenceDelegate extends PersistenceDelegate
+    {
+        protected boolean mutatesTo( Object oldInstance, Object newInstance )
+        {
+            return oldInstance == newInstance;
+        }
+
+
+        protected Expression instantiate( Object oldInstance, Encoder out )
+        {
+            Class<?> type = oldInstance.getClass();
+            if ( !Modifier.isPublic( type.getModifiers() ) )
+            {
+                throw new IllegalArgumentException( "Could not instantiate instance of non-public class: "
+                    + oldInstance );
+            }
+
+            for ( Field field : type.getFields() )
+            {
+                int mod = field.getModifiers();
+                if ( Modifier.isPublic( mod ) && Modifier.isStatic( mod ) && Modifier.isFinal( mod )
+                    && ( type == field.getDeclaringClass() ) )
+                {
+                    try
+                    {
+                        if ( oldInstance == field.get( null ) )
+                        {
+                            return new Expression( oldInstance, field, "get", new Object[]
+                                { null } );
+                        }
+                    }
+                    catch ( IllegalAccessException exception )
+                    {
+                        throw new IllegalArgumentException( "Could not get value of the field: " + field, exception );
+                    }
+                }
+            }
+            throw new IllegalArgumentException( "Could not instantiate value: " + oldInstance );
+        }
+    }
+
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserConnectionManager.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserCoreConstants.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserCoreConstants.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserCoreConstants.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserCoreConstants.java Mon Nov  5 08:51:43 2007
@@ -0,0 +1,97 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+
+package org.apache.directory.studio.ldapbrowser.core;
+
+
+import java.io.ByteArrayOutputStream;
+import java.io.OutputStreamWriter;
+
+
+/**
+ * This class contains all the constants used by the Browser Core Plugin
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public interface BrowserCoreConstants
+{
+    public static final String PREFERENCE_BINARY_SYNTAXES = "binarySyntaxes"; //$NON-NLS-1$
+
+    public static final String PREFERENCE_BINARY_ATTRIBUTES = "binaryAttributes"; //$NON-NLS-1$
+
+    public static final String BINARY = "BINARY"; //$NON-NLS-1$
+
+    public static final String LINE_SEPARATOR = System.getProperty( "line.separator" ); //$NON-NLS-1$
+
+    public static final String DEFAULT_ENCODING = new OutputStreamWriter( new ByteArrayOutputStream() ).getEncoding();
+
+    public static final String DATEFORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS"; //$NON-NLS-1$
+
+    public static final String PREFERENCE_CHECK_FOR_CHILDREN = "checkForChildren"; //$NON-NLS-1$
+
+    public static final String PREFERENCE_SHOW_ALIAS_AND_REFERRAL_OBJECTS = "showAliasAndReferralObjects"; //$NON-NLS-1$
+
+    public static final String PREFERENCE_FETCH_SUBENTRIES = "fetchSubentries"; //$NON-NLS-1$
+
+    public static final String PREFERENCE_FORMAT_CSV_ATTRIBUTEDELIMITER = "formatCsvAttributeDelimiter"; //$NON-NLS-1$
+
+    public static final String PREFERENCE_FORMAT_CSV_VALUEDELIMITER = "formatCsvValueDelimiter"; //$NON-NLS-1$
+
+    public static final String PREFERENCE_FORMAT_CSV_QUOTECHARACTER = "formatCsvQuoteCharacter"; //$NON-NLS-1$
+
+    public static final String PREFERENCE_FORMAT_CSV_LINESEPARATOR = "formatCsvLineSeparator"; //$NON-NLS-1$
+
+    public static final String PREFERENCE_FORMAT_CSV_BINARYENCODING = "formatCsvBinaryEncoding"; //$NON-NLS-1$
+
+    public static final String PREFERENCE_FORMAT_CSV_ENCODING = "formatCsvEncoding"; //$NON-NLS-1$
+
+    public static final String PREFERENCE_FORMAT_XLS_VALUEDELIMITER = "formatXlsValueDelimiter"; //$NON-NLS-1$
+
+    public static final String PREFERENCE_FORMAT_XLS_BINARYENCODING = "formatXlsBinaryEncoding"; //$NON-NLS-1$
+
+    public static final String PREFERENCE_LDIF_LINE_WIDTH = "ldifLineWidth"; //$NON-NLS-1$
+
+    public static final String PREFERENCE_LDIF_LINE_SEPARATOR = "ldifLineSeparator"; //$NON-NLS-1$
+
+    public static final String PREFERENCE_LDIF_SPACE_AFTER_COLON = "ldifSpaceAfterColon"; //$NON-NLS-1$
+
+    public static final int BINARYENCODING_IGNORE = 0;
+
+    public static final int BINARYENCODING_BASE64 = 1;
+
+    public static final int BINARYENCODING_HEX = 2;
+
+    public static final int SORT_BY_NONE = 0;
+
+    public static final int SORT_BY_RDN = 1;
+
+    public static final int SORT_BY_RDN_VALUE = 2;
+
+    public static final int SORT_BY_ATTRIBUTE_DESCRIPTION = 3;
+
+    public static final int SORT_BY_VALUE = 4;
+
+    public static final int SORT_ORDER_NONE = 0;
+
+    public static final int SORT_ORDER_ASCENDING = 1;
+
+    public static final int SORT_ORDER_DESCENDING = 2;
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserCoreConstants.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserCoreMessages.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserCoreMessages.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserCoreMessages.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserCoreMessages.java Mon Nov  5 08:51:43 2007
@@ -0,0 +1,424 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+
+package org.apache.directory.studio.ldapbrowser.core;
+
+
+import org.eclipse.osgi.util.NLS;
+
+
+/**
+ * This class contains most of the Strings used by the Plugin
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class BrowserCoreMessages extends NLS
+{
+    private static final String BUNDLE_NAME = "org.apache.directory.studio.ldapbrowser.core.browsercoremessages"; //$NON-NLS-1$
+
+	
+	/**
+	 * Creates a new instance of BrowserCoreMessages.
+	 */
+	private BrowserCoreMessages()
+    {
+    }
+
+    static
+    {
+        // initialize resource bundle
+        NLS.initializeMessages( BUNDLE_NAME, BrowserCoreMessages.class );
+    }
+
+    public static String copy_n_of_s;
+
+    public static String event__added_att_to_dn;
+
+    public static String event__deleted_att_from_dn;
+
+    public static String event__dn_attributes_initialized;
+
+    public static String event__dn_children_initialized;
+    
+    public static String event__bulk_modification;
+
+    public static String event__empty_value_added_to_att_at_dn;
+
+    public static String event__empty_value_deleted_from_att_at_dn;
+
+    public static String event__added_dn;
+
+    public static String event__deleted_dn;
+
+    public static String event__moved_oldrdn_from_oldparent_to_newparent;
+
+    public static String event__renamed_olddn_to_newdn;
+
+    public static String event__added_val_to_att_at_dn;
+
+    public static String event__deleted_val_from_att_at_dn;
+
+    public static String event__replaced_oldval_by_newval_at_att_at_dn;
+
+    public static String event__renamed_oldval_by_newval_at_dn;
+
+    public static String jobs__copy_entries_source_and_target_are_equal;
+
+    public static String model__empty_connection;
+
+    public static String model__empty_entry;
+
+    public static String model__empty_attribute;
+
+    public static String model__empty_value;
+
+    public static String model__empty_url;
+
+    public static String model__empty_dn;
+
+    public static String model__empty_rdn;
+
+    public static String model__empty_password;
+
+    public static String model__invalid_url;
+
+    public static String model__invalid_protocol;
+
+    public static String model__attribute_does_not_exist;
+
+    public static String model__attribute_already_exists;
+
+    public static String model__attributes_entry_is_not_myself;
+
+    public static String model__url_no_attributes;
+
+    public static String model__url_no_dn;
+
+    public static String model__url_no_extensions;
+
+    public static String model__url_no_filter;
+
+    public static String model__url_no_host;
+
+    public static String model__url_no_port;
+
+    public static String model__url_no_protocol;
+
+    public static String model__url_no_scope;
+
+    public static String model__values_attribute_is_not_myself;
+
+    public static String model__move_between_different_connections_not_supported;
+
+    public static String model__copied_n_entries;
+
+    public static String model__deleted_n_entries;
+
+    public static String model__retrieved_n_entries;
+
+    public static String model__retrieved_1_entry;
+
+    public static String model__no_connection_provider;
+
+    public static String model__connecting;
+
+    public static String model__binding;
+
+    public static String model__loading_rootdse;
+
+    public static String model__error_loading_rootdse;
+
+    public static String model__setting_base_dn;
+
+    public static String model__error_setting_base_dn;
+
+    public static String model__error_setting_metadata;
+
+    public static String model__loading_schema;
+
+    public static String model__no_schema_information;
+
+    public static String model__missing_schema_location;
+
+    public static String model__error_loading_schema;
+
+    public static String model__no_such_entry;
+
+    public static String model__error_logging_modification;
+
+    public static String model__no_hash;
+
+    public static String model__unsupported_hash;
+
+    public static String ldif__imported_n_entries_m_errors;
+
+    public static String ldif__n_errors_see_logfile;
+
+    public static String ldif__imported_into_host_port_on_date;
+
+    public static String ldif__import_into_host_port_failed_on_date;
+
+    public static String ldif__error_msg;
+    
+    public static String dsml__n_errors_see_responsefile;
+
+    public static String model__no_connection;
+
+    public static String model__no_auth_handler;
+
+    public static String model__no_credentials;
+
+    public static String model__no_referral_handler;
+
+    public static String model__no_referral_connection;
+
+    public static String model__invalid_record;
+
+    public static String model__unknown_host;
+
+    public static String jobs__error_occurred;
+
+    public static String jobs__check_bind_name;
+
+    public static String jobs__check_bind_task;
+
+    public static String jobs__check_bind_error;
+
+    public static String jobs__check_network_name;
+
+    public static String jobs__check_network_task;
+
+    public static String jobs__check_network_error;
+
+    public static String jobs__fetch_basedns_name;
+
+    public static String jobs__fetch_basedns_task;
+
+    public static String jobs__fetch_basedns_error;
+
+    public static String jobs__copy_entries_name_1;
+
+    public static String jobs__copy_entries_name_n;
+
+    public static String jobs__copy_entries_task_1;
+
+    public static String jobs__copy_entries_task_n;
+
+    public static String jobs__copy_entries_error_1;
+
+    public static String jobs__copy_entries_error_n;
+
+    public static String jobs__create_entry_name_1;
+
+    public static String jobs__create_entry_name_n;
+
+    public static String jobs__create_entry_task_1;
+
+    public static String jobs__create_entry_task_n;
+
+    public static String jobs__create_entry_error_1;
+
+    public static String jobs__create_entry_error_n;
+
+    public static String jobs__create_values_name_1;
+
+    public static String jobs__create_values_name_n;
+
+    public static String jobs__create_values_task_1;
+
+    public static String jobs__create_values_task_n;
+
+    public static String jobs__create_values_error_1;
+
+    public static String jobs__create_values_error_n;
+
+    public static String jobs__delete_attributes_name_1;
+
+    public static String jobs__delete_attributes_name_n;
+
+    public static String jobs__delete_attributes_task_1;
+
+    public static String jobs__delete_attributes_task_n;
+
+    public static String jobs__delete_attributes_error_1;
+
+    public static String jobs__delete_attributes_error_n;
+
+    public static String jobs__delete_entries_name_1;
+
+    public static String jobs__delete_entries_name_n;
+
+    public static String jobs__delete_entries_task_1;
+
+    public static String jobs__delete_entries_task_n;
+
+    public static String jobs__delete_entries_error_1;
+
+    public static String jobs__delete_entries_error_n;
+
+    public static String jobs__execute_ldif_name;
+
+    public static String jobs__execute_ldif_task;
+
+    public static String jobs__execute_ldif_error;
+
+    public static String jobs__export_cvs_error;
+
+    public static String jobs__export_csv_name;
+
+    public static String jobs__export_csv_task;
+
+    public static String jobs__export_ldif_name;
+
+    public static String jobs__export_ldif_task;
+
+    public static String jobs__export_ldif_error;
+    
+    public static String jobs__export_dsml_name;
+
+    public static String jobs__export_dsml_task;
+
+    public static String jobs__export_dsml_error;
+
+    public static String jobs__export_progress;
+
+    public static String jobs__progressmonitor_check_cancellation;
+
+    public static String jobs__progressmonitor_report_progress;
+
+    public static String jobs__export_xls_name;
+
+    public static String jobs__export_xls_task;
+
+    public static String jobs__export_xls_error;
+
+    public static String jobs__import_ldif_name;
+
+    public static String jobs__import_ldif_task;
+
+    public static String jobs__import_ldif_error;
+    
+    public static String jobs__import_dsml_name;
+
+    public static String jobs__import_dsml_task;
+
+    public static String jobs__import_dsml_error;
+
+    public static String jobs__init_entries_title_attandsub;
+
+    public static String jobs__init_entries_title_subonly;
+
+    public static String jobs__init_entries_title_attonly;
+
+    public static String jobs__init_entries_title;
+
+    public static String jobs__init_entries_task;
+
+    public static String jobs__init_entries_progress_att;
+
+    public static String jobs__init_entries_progress_sub;
+
+    public static String jobs__init_entries_progress_subcount;
+
+    public static String jobs__init_entries_error_1;
+
+    public static String jobs__init_entries_error_n;
+
+    public static String jobs__modify_value_name;
+
+    public static String jobs__modify_value_task;
+
+    public static String jobs__modify_value_error;
+
+    public static String jobs__open_connections_name_1;
+
+    public static String jobs__open_connections_name_n;
+
+    public static String jobs__open_connections_task;
+
+    public static String jobs__open_connections_error_1;
+
+    public static String jobs__open_connections_error_n;
+
+    public static String jobs__read_entry_name;
+
+    public static String jobs__read_entry_task;
+
+    public static String jobs__read_entry_error;
+
+    public static String jobs__reload_schemas_name_1;
+
+    public static String jobs__reload_schemas_name_n;
+
+    public static String jobs__reload_schemas_task;
+
+    public static String jobs__reload_schemas_error_1;
+
+    public static String jobs__reload_schemas_error_n;
+
+    public static String jobs__move_entry_name_1;
+
+    public static String jobs__move_entry_name_n;
+
+    public static String jobs__move_entry_task_1;
+
+    public static String jobs__move_entry_task_n;
+
+    public static String jobs__move_entry_error_1;
+
+    public static String jobs__move_entry_error_n;
+
+    public static String jobs__rename_entry_name;
+
+    public static String jobs__rename_entry_task;
+
+    public static String jobs__rename_entry_error;
+
+    public static String jobs__rename_value_name_1;
+
+    public static String jobs__rename_value_name_n;
+
+    public static String jobs__rename_value_task_1;
+
+    public static String jobs__rename_value_task_n;
+
+    public static String jobs__rename_value_error_1;
+
+    public static String jobs__rename_value_error_n;
+
+    public static String jobs__search_name;
+
+    public static String jobs__search_task;
+
+    public static String jobs__search_error_1;
+
+    public static String jobs__search_error_n;
+
+    public static String model__empty_string_value;
+
+    public static String model__empty_binary_value;
+
+    public static String model__invalid_rdn;
+
+    public static String model_filter_missing_closing_parenthesis;
+
+    public static String model_filter_missing_filter_expression;
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserCoreMessages.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserCorePlugin.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserCorePlugin.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserCorePlugin.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserCorePlugin.java Mon Nov  5 08:51:43 2007
@@ -0,0 +1,175 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *
+ */
+
+package org.apache.directory.studio.ldapbrowser.core;
+
+
+import org.apache.directory.studio.ldapbrowser.core.events.CoreEventRunner;
+import org.apache.directory.studio.ldapbrowser.core.events.EventRunner;
+import org.apache.directory.studio.ldapbrowser.core.model.IReferralHandler;
+import org.eclipse.core.runtime.Plugin;
+import org.osgi.framework.BundleContext;
+
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class BrowserCorePlugin extends Plugin
+{
+    /** The plugin ID */
+    public static final String PLUGIN_ID = "org.apache.directory.studio.ldapbrowser.core"; //$NON-NLS-1$
+
+    /** The shared instance. */
+    private static BrowserCorePlugin plugin;
+
+    /** The connection manager */
+    private BrowserConnectionManager connectionManager;
+
+    /** The connection provider */
+    private IReferralHandler referralHandler;
+
+    /** The preferences */
+    private BrowserCorePreferences preferences;
+
+    /** The event runner. */
+    private EventRunner eventRunner;
+
+
+    /**
+     * Creates a new instance of BrowserCorePlugin.
+     */
+    public BrowserCorePlugin()
+    {
+        super();
+        plugin = this;
+        this.preferences = new BrowserCorePreferences();
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public void start( BundleContext context ) throws Exception
+    {
+        super.start( context );
+
+        if ( eventRunner == null )
+        {
+            eventRunner = new CoreEventRunner();
+        }
+
+        if ( connectionManager == null )
+        {
+            connectionManager = new BrowserConnectionManager();
+        }
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public void stop( BundleContext context ) throws Exception
+    {
+        super.stop( context );
+
+        if ( eventRunner != null )
+        {
+            eventRunner = null;
+        }
+
+        if ( connectionManager != null )
+        {
+//            IConnection[] connections = connectionManager.getConnections();
+//            for ( int i = 0; i < connections.length; i++ )
+//            {
+//                connections[i].close();
+//            }
+            connectionManager = null;
+        }
+    }
+
+
+    /**
+     * Returns the BrowserPlugin instance.
+     *
+     * @return The BrowserPlugin instance
+     */
+    public static BrowserCorePlugin getDefault()
+    {
+        return plugin;
+    }
+
+
+    /**
+     * Gets the Connection Manager
+     *
+     * @return
+     *      the connection manager
+     */
+    public BrowserConnectionManager getConnectionManager()
+    {
+        return connectionManager;
+    }
+
+
+    /**
+     *
+     * @return The preferences
+     */
+    public BrowserCorePreferences getCorePreferences()
+    {
+        return preferences;
+    }
+
+
+    /**
+     * Gets the ReferralHanlder
+     *
+     * @return
+     *      the ReferralHandler
+     */
+    public IReferralHandler getReferralHandler()
+    {
+        return referralHandler;
+    }
+
+
+    /**
+     * Sets the ReferralHandler
+     *
+     * @param referralHandler
+     *      the ReferralHandler to set
+     */
+    public void setReferralHandler( IReferralHandler referralHandler )
+    {
+        this.referralHandler = referralHandler;
+    }
+
+
+    /**
+     * Gets the event runner.
+     *
+     * @return the event runner
+     */
+    public EventRunner getEventRunner()
+    {
+        return eventRunner;
+    }
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserCorePlugin.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserCorePreferences.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserCorePreferences.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserCorePreferences.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserCorePreferences.java Mon Nov  5 08:51:43 2007
@@ -0,0 +1,259 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+
+package org.apache.directory.studio.ldapbrowser.core;
+
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.directory.studio.ldapbrowser.core.model.schema.BinaryAttribute;
+import org.apache.directory.studio.ldapbrowser.core.model.schema.BinarySyntax;
+import org.apache.directory.studio.ldapbrowser.core.utils.Utils;
+import org.eclipse.core.runtime.Preferences;
+
+
+/**
+ * This class is used to manage and access the preferences of the Browser Core Plugin
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class BrowserCorePreferences
+{
+    private Set<String> binaryAttributeCache;
+
+    private Set<String> binarySyntaxCache;
+
+
+    /**
+     * Gets the oids and names of the binary attributes
+     *
+     * @return
+     *      the oids and names of the binary attributes
+     */
+    public Set getBinaryAttributeOidsAndNames()
+    {
+        if ( binaryAttributeCache == null )
+        {
+            binaryAttributeCache = new HashSet<String>();
+            BinaryAttribute[] binaryAttributes =getBinaryAttributes();
+            for ( int i = 0; i < binaryAttributes.length; i++ )
+            {
+                if ( binaryAttributes[i].getAttributeNumericOidOrName() != null )
+                {
+                    binaryAttributeCache.add( binaryAttributes[i].getAttributeNumericOidOrName() );
+                }
+            }
+        }
+        return binaryAttributeCache;
+    }
+
+
+    /**
+     * Gets an array containing the binary attributes
+     * 
+     * @return
+     *      an array containing the binary attributes
+     */
+    public BinaryAttribute[] getBinaryAttributes()
+    {
+        BinaryAttribute[] binaryAttributes = ( BinaryAttribute[] ) load( BrowserCoreConstants.PREFERENCE_BINARY_ATTRIBUTES );
+        return binaryAttributes;
+    }
+
+
+    /**
+     * Sets the binary attributes
+     *
+     * @param binaryAttributes
+     *      the binary attributes to set
+     */
+    public void setBinaryAttributes( BinaryAttribute[] binaryAttributes )
+    {
+        store( BrowserCoreConstants.PREFERENCE_BINARY_ATTRIBUTES, binaryAttributes );
+        binaryAttributeCache = null;
+    }
+
+
+    /**
+     * Gets the default binary attributes
+     *
+     * @return
+     *      the default binary attributes
+     */
+    public BinaryAttribute[] getDefaultBinaryAttributes()
+    {
+        BinaryAttribute[] binaryAttributes = ( BinaryAttribute[] ) loadDefault( BrowserCoreConstants.PREFERENCE_BINARY_ATTRIBUTES );
+        return binaryAttributes;
+    }
+
+
+    /**
+     * Sets the default binary attributes
+     *
+     * @param defaultBinaryAttributes
+     *      the default binary attributes to set
+     */
+    public void setDefaultBinaryAttributes( BinaryAttribute[] defaultBinaryAttributes )
+    {
+        storeDefault( BrowserCoreConstants.PREFERENCE_BINARY_ATTRIBUTES, defaultBinaryAttributes );
+    }
+
+
+    /**
+     * Gets the binary syntax oids.
+     * 
+     * @return the binary syntax oids
+     */
+    public Set<String> getBinarySyntaxOids()
+    {
+        if ( binarySyntaxCache == null )
+        {
+            binarySyntaxCache = new HashSet<String>();
+            BinarySyntax[] binarySyntaxes = getBinarySyntaxes();
+            for ( int i = 0; i < binarySyntaxes.length; i++ )
+            {
+                if ( binarySyntaxes[i].getSyntaxNumericOid() != null )
+                {
+                    binarySyntaxCache.add( binarySyntaxes[i].getSyntaxNumericOid() );
+                }
+            }
+        }
+        return binarySyntaxCache;
+    }
+
+
+    /**
+     * Gets the binary syntaxes
+     *
+     * @return
+     *      the binary syntaxes
+     */
+    public BinarySyntax[] getBinarySyntaxes()
+    {
+        BinarySyntax[] binarySyntaxes = ( BinarySyntax[] ) load( BrowserCoreConstants.PREFERENCE_BINARY_SYNTAXES );
+        return binarySyntaxes;
+    }
+
+
+    /**
+     * Sets the binary syntaxes
+     *
+     * @param binarySyntaxes
+     *      the binary syntaxes to set
+     */
+    public void setBinarySyntaxes( BinarySyntax[] binarySyntaxes )
+    {
+        store( BrowserCoreConstants.PREFERENCE_BINARY_SYNTAXES, binarySyntaxes );
+        binarySyntaxCache = null;
+    }
+
+
+    /**
+     * Gets the default binary syntaxes
+     *
+     * @return
+     *      the default binary syntaxes
+     */
+    public BinarySyntax[] getDefaultBinarySyntaxes()
+    {
+        BinarySyntax[] binarySyntaxes = ( BinarySyntax[] ) loadDefault( BrowserCoreConstants.PREFERENCE_BINARY_SYNTAXES );
+        return binarySyntaxes;
+    }
+
+
+    /**
+     * Sets the default binary syntaxes
+     *
+     * @param defaultBinarySyntaxes
+     *      the default binary syntaxes to set
+     */
+    public void setDefaultBinarySyntaxes( BinarySyntax[] defaultBinarySyntaxes )
+    {
+        storeDefault( BrowserCoreConstants.PREFERENCE_BINARY_SYNTAXES, defaultBinarySyntaxes );
+    }
+
+
+    /**
+     * Loads the current value of the string-valued property with the given name.
+     *
+     * @param key
+     *      the name of the property
+     * @return
+     *      the corresponding object
+     */
+    private static Object load( String key )
+    {
+        Preferences store = BrowserCorePlugin.getDefault().getPluginPreferences();
+        String s = store.getString( key );
+        return Utils.deserialize( s );
+    }
+
+
+    /**
+     * Stores the current value of the string-valued property with the given name.
+     *
+     * @param key
+     *      the name of the property
+     * @param o
+     *      the new current value of the property
+     */
+    private static void store( String key, Object o )
+    {
+        Preferences store = BrowserCorePlugin.getDefault().getPluginPreferences();
+        String s = Utils.serialize( o );
+        store.setValue( key, s );
+        BrowserCorePlugin.getDefault().savePluginPreferences();
+    }
+
+
+    /**
+     * Loads the default value for the string-valued property with the given name.
+     *
+     * @param key
+     *      the name of the property
+     * @return
+     *      the default value of the named property
+     */
+    private static Object loadDefault( String key )
+    {
+        Preferences store = BrowserCorePlugin.getDefault().getPluginPreferences();
+        String s = store.getDefaultString( key );
+        return Utils.deserialize( s );
+    }
+
+
+    /**
+     * Stores the default value for the string-valued property with the given name.
+     *
+     * @param key
+     *      the name of the property
+     * @param o
+     *      the new default value for the property
+     */
+    private static void storeDefault( String key, Object o )
+    {
+        Preferences store = BrowserCorePlugin.getDefault().getPluginPreferences();
+        String s = Utils.serialize( o );
+        store.setDefault( key, s );
+        BrowserCorePlugin.getDefault().savePluginPreferences();
+    }
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserCorePreferences.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserCorePreferencesInitializer.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserCorePreferencesInitializer.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserCorePreferencesInitializer.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserCorePreferencesInitializer.java Mon Nov  5 08:51:43 2007
@@ -0,0 +1,124 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+
+package org.apache.directory.studio.ldapbrowser.core;
+
+
+import org.apache.directory.studio.ldapbrowser.core.model.schema.BinaryAttribute;
+import org.apache.directory.studio.ldapbrowser.core.model.schema.BinarySyntax;
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
+
+
+/**
+ * This class is used to set default preference values.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class BrowserCorePreferencesInitializer extends AbstractPreferenceInitializer
+{
+    /**
+     * {@inheritDoc}
+     */
+    public void initializeDefaultPreferences()
+    {
+        Preferences store = BrowserCorePlugin.getDefault().getPluginPreferences();
+
+        store.setDefault( BrowserCoreConstants.PREFERENCE_CHECK_FOR_CHILDREN, true );
+        store.setDefault( BrowserCoreConstants.PREFERENCE_SHOW_ALIAS_AND_REFERRAL_OBJECTS, true );
+        store.setDefault( BrowserCoreConstants.PREFERENCE_FETCH_SUBENTRIES, false );
+
+        store.setDefault( BrowserCoreConstants.PREFERENCE_FORMAT_CSV_ATTRIBUTEDELIMITER, "," );
+        store.setDefault( BrowserCoreConstants.PREFERENCE_FORMAT_CSV_VALUEDELIMITER, "|" );
+        store.setDefault( BrowserCoreConstants.PREFERENCE_FORMAT_CSV_QUOTECHARACTER, "\"" );
+        store
+            .setDefault( BrowserCoreConstants.PREFERENCE_FORMAT_CSV_LINESEPARATOR, BrowserCoreConstants.LINE_SEPARATOR );
+        store.setDefault( BrowserCoreConstants.PREFERENCE_FORMAT_CSV_BINARYENCODING,
+            BrowserCoreConstants.BINARYENCODING_IGNORE );
+        store.setDefault( BrowserCoreConstants.PREFERENCE_FORMAT_CSV_ENCODING, BrowserCoreConstants.DEFAULT_ENCODING );
+
+        store.setDefault( BrowserCoreConstants.PREFERENCE_FORMAT_XLS_VALUEDELIMITER, "|" );
+        store.setDefault( BrowserCoreConstants.PREFERENCE_FORMAT_XLS_BINARYENCODING,
+            BrowserCoreConstants.BINARYENCODING_IGNORE );
+
+        store.setDefault( BrowserCoreConstants.PREFERENCE_LDIF_LINE_WIDTH, 76 );
+        store.setDefault( BrowserCoreConstants.PREFERENCE_LDIF_LINE_SEPARATOR, BrowserCoreConstants.LINE_SEPARATOR );
+        store.setDefault( BrowserCoreConstants.PREFERENCE_LDIF_SPACE_AFTER_COLON, true );
+
+        // default binary attributes
+        BinaryAttribute[] defaultBinaryAttributes = new BinaryAttribute[]
+            { new BinaryAttribute( "0.9.2342.19200300.100.1.7" ), // photo
+                // //$NON-NLS-1$
+                new BinaryAttribute( "0.9.2342.19200300.100.1.53" ), // personalSignature
+                // //$NON-NLS-1$
+                new BinaryAttribute( "0.9.2342.19200300.100.1.55" ), // audio
+                // //$NON-NLS-1$
+                new BinaryAttribute( "0.9.2342.19200300.100.1.60" ), // jpegPhoto
+                // //$NON-NLS-1$
+                new BinaryAttribute( "1.3.6.1.4.1.42.2.27.4.1.8" ), // javaSerializedData
+                // //$NON-NLS-1$
+                new BinaryAttribute( "1.3.6.1.4.1.1466.101.120.35" ), // thumbnailPhoto
+                // //$NON-NLS-1$
+                new BinaryAttribute( "1.3.6.1.4.1.1466.101.120.36" ), // thumbnailLogo
+                // //$NON-NLS-1$
+                new BinaryAttribute( "2.5.4.35" ), // userPassword
+                // //$NON-NLS-1$
+                new BinaryAttribute( "2.5.4.36" ), // userCertificate
+                // //$NON-NLS-1$
+                new BinaryAttribute( "2.5.4.37" ), // cACertificate
+                // //$NON-NLS-1$
+                new BinaryAttribute( "2.5.4.38" ), // authorityRevocationList
+                // //$NON-NLS-1$
+                new BinaryAttribute( "2.5.4.39" ), // certificateRevocationList
+                // //$NON-NLS-1$
+                new BinaryAttribute( "2.5.4.40" ), // crossCertificatePair
+                // //$NON-NLS-1$
+                new BinaryAttribute( "2.5.4.45" ), // x500UniqueIdentifier
+            // //$NON-NLS-1$
+            };
+        BrowserCorePlugin.getDefault().getCorePreferences().setDefaultBinaryAttributes( defaultBinaryAttributes );
+
+        // default binary syntaxes
+        BinarySyntax[] defaultBinarySyntaxes = new BinarySyntax[]
+            { new BinarySyntax( "1.3.6.1.4.1.1466.115.121.1.5" ), // Binary
+                // //$NON-NLS-1$
+                new BinarySyntax( "1.3.6.1.4.1.1466.115.121.1.8" ), // Certificate
+                // //$NON-NLS-1$
+                new BinarySyntax( "1.3.6.1.4.1.1466.115.121.1.9" ), // Certificate
+                // List
+                // //$NON-NLS-1$
+                new BinarySyntax( "1.3.6.1.4.1.1466.115.121.1.10" ), // Certificate
+                // Pair
+                // //$NON-NLS-1$
+                new BinarySyntax( "1.3.6.1.4.1.1466.115.121.1.23" ), // Fax
+                // //$NON-NLS-1$
+                new BinarySyntax( "1.3.6.1.4.1.1466.115.121.1.28" ), // JPEG
+                // //$NON-NLS-1$
+                new BinarySyntax( "1.3.6.1.4.1.1466.115.121.1.40" ), // Octet
+                // String
+                // //$NON-NLS-1$
+                new BinarySyntax( "1.3.6.1.4.1.1466.115.121.1.49" ) // Supported
+            // Algorithm
+            // //$NON-NLS-1$
+            };
+        BrowserCorePlugin.getDefault().getCorePreferences().setDefaultBinarySyntaxes( defaultBinarySyntaxes );
+    }
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/BrowserCorePreferencesInitializer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/SearchManager.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/SearchManager.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/SearchManager.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/SearchManager.java Mon Nov  5 08:51:43 2007
@@ -0,0 +1,209 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *
+ */
+
+package org.apache.directory.studio.ldapbrowser.core;
+
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.directory.studio.ldapbrowser.core.events.EventRegistry;
+import org.apache.directory.studio.ldapbrowser.core.events.SearchUpdateEvent;
+import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection;
+import org.apache.directory.studio.ldapbrowser.core.model.ISearch;
+import org.eclipse.osgi.util.NLS;
+
+
+/**
+ * This class is used to manages {@link ISearch}es of an {@link IBrowserConnection}
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class SearchManager implements Serializable
+{
+
+    /** The Constant serialVersionUID. */
+    private static final long serialVersionUID = 8665227628274097691L;
+
+    /** The list of searches. */
+    private List<ISearch> searchList;
+
+    /** The connection. */
+    private IBrowserConnection connection;
+
+
+    /**
+     * Creates a new instance of SearchManager.
+     */
+    protected SearchManager()
+    {
+    }
+
+
+    /**
+     * Creates a new instance of SearchManager.
+     *
+     * @param connection
+     *      the attached Connection
+     */
+    public SearchManager( IBrowserConnection connection )
+    {
+        this.connection = connection;
+        this.searchList = new ArrayList<ISearch>();
+    }
+
+
+    /**
+     * Gets the Connection.
+     *
+     * @return
+     *      the Connection
+     */
+    public IBrowserConnection getConnection()
+    {
+        return this.connection;
+    }
+
+
+    /**
+     * Adds a Search.
+     *
+     * @param search
+     *      the Search to add
+     */
+    public void addSearch( ISearch search )
+    {
+        this.addSearch( this.searchList.size(), search );
+    }
+
+
+    /**
+     * Adds a Search at a specified position.
+     *
+     * @param index
+     *      index at which the specified Search is to be inserted.
+     * @param search
+     *      the Search to be inserted
+     */
+    public void addSearch( int index, ISearch search )
+    {
+        if ( getSearch( search.getName() ) != null )
+        {
+            String newSearchName = NLS.bind( BrowserCoreMessages.copy_n_of_s, "", search.getName() ); //$NON-NLS-1$
+
+            for ( int i = 2; this.getSearch( newSearchName ) != null; i++ )
+            {
+                newSearchName = NLS.bind( BrowserCoreMessages.copy_n_of_s, i + " ", search.getName() ); //$NON-NLS-1$
+            }
+
+            search.setName( newSearchName );
+        }
+
+        searchList.add( index, search );
+        EventRegistry.fireSearchUpdated( new SearchUpdateEvent( search, SearchUpdateEvent.EventDetail.SEARCH_ADDED ), this );
+    }
+
+
+    /**
+     * Gets a Search.
+     *
+     * @param name
+     *      the name of the Search
+     * @return
+     *      the corresponding Search
+     */
+    public ISearch getSearch( String name )
+    {
+        for ( ISearch search:searchList )
+        {
+            if ( search.getName().equals( name ) )
+            {
+                return search;
+            }
+        }
+
+        return null;
+    }
+
+
+    /**
+     * Returns the index in the Searches list of the first occurrence of the specified Search.
+     *
+     * @param search
+     *      the Search to search for
+     * @return
+     *      the index in the Searches list of the first occurrence of the specified Search
+     */
+    public int indexOf( ISearch search )
+    {
+        return searchList.indexOf( search );
+    }
+
+
+    /**
+     * Removes a Search
+     *
+     * @param search
+     *      the Search to remove
+     */
+    public void removeSearch( ISearch search )
+    {
+        searchList.remove( search );
+        EventRegistry.fireSearchUpdated( new SearchUpdateEvent( search, SearchUpdateEvent.EventDetail.SEARCH_REMOVED ), this );
+    }
+
+
+    /**
+     * Removes a Search
+     *
+     * @param name
+     *      the name of the Search to remove
+     */
+    public void removeSearch( String name )
+    {
+        this.removeSearch( this.getSearch( name ) );
+    }
+
+
+    /**
+     * Gets an array containing all the Searches
+     *
+     * @return
+     *      an array containing all the Searches
+     */
+    public ISearch[] getSearches()
+    {
+        return searchList.toArray( new ISearch[0] );
+    }
+
+
+    /**
+     * Gets the number of Searches
+     *
+     * @return
+     *      the number of Searches
+     */
+    public int getSearchCount()
+    {
+        return searchList.size();
+    }
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/SearchManager.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/events/AttributeAddedEvent.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/events/AttributeAddedEvent.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/events/AttributeAddedEvent.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/events/AttributeAddedEvent.java Mon Nov  5 08:51:43 2007
@@ -0,0 +1,77 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+
+package org.apache.directory.studio.ldapbrowser.core.events;
+
+
+import org.apache.directory.studio.ldapbrowser.core.BrowserCoreMessages;
+import org.apache.directory.studio.ldapbrowser.core.model.IAttribute;
+import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection;
+import org.apache.directory.studio.ldapbrowser.core.model.IEntry;
+
+
+/**
+ * An AttributeAddedEvent indicates that an {@link IAttribute} was added to an {@link IEntry}.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class AttributeAddedEvent extends EntryModificationEvent
+{
+
+    /** The added attribute. */
+    private IAttribute addedAttribute;
+
+
+    /**
+     * Creates a new instance of AttributeAddedEvent.
+     * 
+     * @param connection the connection
+     * @param modifiedEntry the modified entry
+     * @param addedAttribute the added attribute
+     */
+    public AttributeAddedEvent( IBrowserConnection connection, IEntry modifiedEntry, IAttribute addedAttribute )
+    {
+        super( connection, modifiedEntry );
+        this.addedAttribute = addedAttribute;
+    }
+
+
+    /**
+     * Gets the added attribute.
+     * 
+     * @return the added attribute
+     */
+    public IAttribute getAddedAttribute()
+    {
+        return addedAttribute;
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public String toString()
+    {
+        return BrowserCoreMessages.bind( BrowserCoreMessages.event__added_att_to_dn, new String[]
+            { getAddedAttribute().getDescription(), getModifiedEntry().getDn().getUpName() } );
+    }
+
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/events/AttributeAddedEvent.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/events/AttributeDeletedEvent.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/events/AttributeDeletedEvent.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/events/AttributeDeletedEvent.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/events/AttributeDeletedEvent.java Mon Nov  5 08:51:43 2007
@@ -0,0 +1,77 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+
+package org.apache.directory.studio.ldapbrowser.core.events;
+
+
+import org.apache.directory.studio.ldapbrowser.core.BrowserCoreMessages;
+import org.apache.directory.studio.ldapbrowser.core.model.IAttribute;
+import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection;
+import org.apache.directory.studio.ldapbrowser.core.model.IEntry;
+
+
+/**
+ * An AttributeDeletedEvent indicates that an {@link IAttribute} was deleted from an {@link IEntry}.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class AttributeDeletedEvent extends EntryModificationEvent
+{
+
+    /** The deleted attribute. */
+    private IAttribute deletedAttribute;
+
+
+    /**
+     * Creates a new instance of AttributeDeletedEvent.
+     * 
+     * @param connection the connection
+     * @param modifiedEntry the modified entry
+     * @param deletedAttribute the deleted attribute
+     */
+    public AttributeDeletedEvent( IBrowserConnection connection, IEntry modifiedEntry, IAttribute deletedAttribute )
+    {
+        super( connection, modifiedEntry );
+        this.deletedAttribute = deletedAttribute;
+    }
+
+
+    /**
+     * Gets the deleted attribute.
+     * 
+     * @return the deleted attribute
+     */
+    public IAttribute getDeletedAttribute()
+    {
+        return deletedAttribute;
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public String toString()
+    {
+        return BrowserCoreMessages.bind( BrowserCoreMessages.event__deleted_att_from_dn, new String[]
+            { getDeletedAttribute().getDescription(), getModifiedEntry().getDn().getUpName() } );
+    }
+    
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/events/AttributeDeletedEvent.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/events/AttributesInitializedEvent.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/events/AttributesInitializedEvent.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/events/AttributesInitializedEvent.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/events/AttributesInitializedEvent.java Mon Nov  5 08:51:43 2007
@@ -0,0 +1,60 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+
+package org.apache.directory.studio.ldapbrowser.core.events;
+
+
+import org.apache.directory.studio.ldapbrowser.core.BrowserCoreMessages;
+import org.apache.directory.studio.ldapbrowser.core.model.IAttribute;
+import org.apache.directory.studio.ldapbrowser.core.model.IEntry;
+
+
+/**
+ * An AttributesInitializedEvent indicates that the {@link IAttribute}s
+ * of an {@link IEntry} were newly initialized from the underlying 
+ * directory.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class AttributesInitializedEvent extends EntryModificationEvent
+{
+
+    /**
+     * Creates a new instance of AttributesInitializedEvent.
+     * 
+     * @param initializedEntry the initialized entry
+     */
+    public AttributesInitializedEvent( IEntry initializedEntry )
+    {
+        super( initializedEntry.getBrowserConnection(), initializedEntry );
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public String toString()
+    {
+        return BrowserCoreMessages.bind( BrowserCoreMessages.event__dn_attributes_initialized, new String[]
+            { getModifiedEntry().getDn().getUpName() } );
+    }
+
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/events/AttributesInitializedEvent.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/events/BookmarkUpdateEvent.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/events/BookmarkUpdateEvent.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/events/BookmarkUpdateEvent.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/events/BookmarkUpdateEvent.java Mon Nov  5 08:51:43 2007
@@ -0,0 +1,92 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *
+ */
+
+package org.apache.directory.studio.ldapbrowser.core.events;
+
+
+import org.apache.directory.studio.ldapbrowser.core.model.IBookmark;
+
+
+/**
+ * An BookmarkUpdateEvent indicates that an {@link IBookmark} was modified.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class BookmarkUpdateEvent
+{
+
+    /**
+     * Contains constants to specify the event detail.
+     */
+    public enum Detail
+    {
+        /** Indicates that the bookmark was added. */
+        BOOKMARK_ADDED,
+
+        /** Indicates that the bookmark was updated. */
+        BOOKMARK_UPDATED,
+
+        /** Indicates that the bookmark was removed. */
+        BOOKMARK_REMOVED
+    }
+
+    /** The event detail. */
+    private Detail detail;
+
+    /** The updated bookmark. */
+    private IBookmark bookmark;
+
+
+    /**
+     * Creates a new instance of BookmarkUpdateEvent.
+     *
+     * @param bookmark the updated bookmark
+     * @param detail the event detail
+     */
+    public BookmarkUpdateEvent( IBookmark bookmark, Detail detail )
+    {
+        this.bookmark = bookmark;
+        this.detail = detail;
+    }
+
+
+    /**
+     * Gets the updated bookmark.
+     *
+     * @return the updated bookmark
+     */
+    public IBookmark getBookmark()
+    {
+        return bookmark;
+    }
+
+
+    /**
+     * Gets the event detail.
+     *
+     * @return the event detail
+     */
+    public Detail getDetail()
+    {
+        return detail;
+    }
+
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/events/BookmarkUpdateEvent.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/events/BookmarkUpdateListener.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/events/BookmarkUpdateListener.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/events/BookmarkUpdateListener.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/events/BookmarkUpdateListener.java Mon Nov  5 08:51:43 2007
@@ -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.studio.ldapbrowser.core.events;
+
+import java.util.EventListener;
+
+import org.apache.directory.studio.ldapbrowser.core.model.IBookmark;
+
+
+/**
+ * A listener for {@link BookmarkUpdateEvent}s
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public interface BookmarkUpdateListener extends EventListener
+{
+
+    /**
+     * Called when an {@link IBookmark} was updated.
+     *
+     * @param bookmarkUpdateEvent the bookmark update event
+     */
+    public void bookmarkUpdated( BookmarkUpdateEvent bookmarkUpdateEvent );
+
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/events/BookmarkUpdateListener.java
------------------------------------------------------------------------------
    svn:eol-style = native