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 [7/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/jobs/ReloadSchemasJob.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ReloadSchemasJob.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ReloadSchemasJob.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ReloadSchemasJob.java Mon Nov 5 08:51:43 2007
@@ -0,0 +1,181 @@
+/*
+ * 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.jobs;
+
+
+import org.apache.directory.shared.ldap.name.LdapDN;
+import org.apache.directory.studio.connection.core.Connection;
+import org.apache.directory.studio.connection.core.StudioProgressMonitor;
+import org.apache.directory.studio.ldapbrowser.core.BrowserCoreMessages;
+import org.apache.directory.studio.ldapbrowser.core.events.BrowserConnectionUpdateEvent;
+import org.apache.directory.studio.ldapbrowser.core.events.EventRegistry;
+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.IRootDSE;
+import org.apache.directory.studio.ldapbrowser.core.model.SearchParameter;
+import org.apache.directory.studio.ldapbrowser.core.model.ISearch.SearchScope;
+import org.apache.directory.studio.ldapbrowser.core.model.ldif.LdifEnumeration;
+import org.apache.directory.studio.ldapbrowser.core.model.ldif.container.LdifContentRecord;
+import org.apache.directory.studio.ldapbrowser.core.model.schema.Schema;
+
+
+/**
+ * Job to reload the schema.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class ReloadSchemasJob extends AbstractNotificationJob
+{
+
+ /** The browser connection. */
+ private IBrowserConnection browserConnection;
+
+
+ /**
+ * Creates a new instance of ReloadSchemasJob.
+ *
+ * @param browserConnection the browser connection
+ */
+ public ReloadSchemasJob( IBrowserConnection browserConnection )
+ {
+ this.browserConnection = browserConnection;
+ setName( BrowserCoreMessages.jobs__reload_schemas_name_1 );
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.jobs.AbstractEclipseJob#getConnections()
+ */
+ protected Connection[] getConnections()
+ {
+ return new Connection[]
+ { browserConnection.getConnection() };
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.jobs.AbstractEclipseJob#getLockedObjects()
+ */
+ protected Object[] getLockedObjects()
+ {
+ return new IBrowserConnection[]
+ { browserConnection };
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.jobs.AbstractNotificationJob#executeNotificationJob(org.apache.directory.studio.connection.core.StudioProgressMonitor)
+ */
+ protected void executeNotificationJob( StudioProgressMonitor monitor )
+ {
+ monitor.beginTask( " ", 3 ); //$NON-NLS-1$
+ monitor.reportProgress( " " ); //$NON-NLS-1$
+
+ monitor.setTaskName( BrowserCoreMessages.bind( BrowserCoreMessages.jobs__reload_schemas_task, new String[]
+ { browserConnection.getConnection().getName() } ) );
+ monitor.worked( 1 );
+
+ // load root DSE
+ monitor.reportProgress( BrowserCoreMessages.model__loading_rootdse );
+ InitializeAttributesJob.initializeAttributes( browserConnection.getRootDSE(), true, monitor );
+ monitor.worked( 1 );
+
+ // load schema
+ monitor.reportProgress( BrowserCoreMessages.model__loading_schema );
+ reloadSchema( browserConnection, monitor );
+ monitor.worked( 1 );
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.jobs.AbstractNotificationJob#runNotification()
+ */
+ protected void runNotification()
+ {
+ BrowserConnectionUpdateEvent browserConnectionUpdateEvent = new BrowserConnectionUpdateEvent(
+ browserConnection, BrowserConnectionUpdateEvent.Detail.SCHEMA_UPDATED );
+ EventRegistry.fireBrowserConnectionUpdated( browserConnectionUpdateEvent, this );
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.jobs.AbstractEclipseJob#getErrorMessage()
+ */
+ protected String getErrorMessage()
+ {
+ return BrowserCoreMessages.jobs__reload_schemas_error_1;
+ }
+
+
+ /**
+ * Reloads the schema.
+ *
+ * @param browserConnection the browser connection
+ * @param monitor the progress monitor
+ */
+ public static void reloadSchema( IBrowserConnection browserConnection, StudioProgressMonitor monitor )
+ {
+ browserConnection.setSchema( Schema.DEFAULT_SCHEMA );
+
+ try
+ {
+ if ( browserConnection.getRootDSE().getAttribute( IRootDSE.ROOTDSE_ATTRIBUTE_SUBSCHEMASUBENTRY ) != null )
+ {
+ SearchParameter sp = new SearchParameter();
+ sp.setSearchBase( new LdapDN( browserConnection.getRootDSE().getAttribute( IRootDSE.ROOTDSE_ATTRIBUTE_SUBSCHEMASUBENTRY )
+ .getStringValue() ) );
+ sp.setFilter( Schema.SCHEMA_FILTER );
+ sp.setScope( SearchScope.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 = ExportLdifJob.search( browserConnection, sp, monitor );
+ if ( le.hasNext( monitor ) )
+ {
+ LdifContentRecord schemaRecord = ( LdifContentRecord ) le.next( monitor );
+ Schema schema = new Schema();
+ schema.loadFromRecord( schemaRecord );
+ browserConnection.setSchema( schema );
+ // TODO: Schema update event
+// EventRegistry.fireConnectionUpdated( new ConnectionUpdateEvent( this,
+// ConnectionUpdateEvent.EventDetail.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();
+ }
+ }
+}
Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/ReloadSchemasJob.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/RenameEntryJob.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/RenameEntryJob.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/RenameEntryJob.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/RenameEntryJob.java Mon Nov 5 08:51:43 2007
@@ -0,0 +1,232 @@
+/*
+ * 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.jobs;
+
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.naming.ldap.Control;
+import javax.naming.ldap.ManageReferralControl;
+
+import org.apache.directory.shared.ldap.name.LdapDN;
+import org.apache.directory.shared.ldap.name.Rdn;
+import org.apache.directory.studio.connection.core.Connection;
+import org.apache.directory.studio.connection.core.StudioProgressMonitor;
+import org.apache.directory.studio.ldapbrowser.core.BrowserCoreMessages;
+import org.apache.directory.studio.ldapbrowser.core.events.EntryRenamedEvent;
+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.IEntry;
+import org.apache.directory.studio.ldapbrowser.core.model.ISearch;
+import org.apache.directory.studio.ldapbrowser.core.model.ISearchResult;
+import org.apache.directory.studio.ldapbrowser.core.utils.DnUtils;
+
+
+/**
+ * Job to rename an entry.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class RenameEntryJob extends AbstractNotificationJob
+{
+
+ /** The browser connection. */
+ private IBrowserConnection browserConnection;
+
+ /** The old entry. */
+ private IEntry oldEntry;
+
+ /** The new rdn. */
+ private Rdn newRdn;
+
+ /** The delete old rdn flag. */
+ private boolean deleteOldRdn;
+
+ /** The new entry. */
+ private IEntry newEntry;
+
+ /** The updated searches. */
+ private Set<ISearch> updatedSearchesSet = new HashSet<ISearch>();
+
+
+ /**
+ * Creates a new instance of RenameEntryJob.
+ *
+ * @param entry the entry to rename
+ * @param newRdn the new rdn
+ * @param deleteOldRdn the delete old rdn flag
+ */
+ public RenameEntryJob( IEntry entry, Rdn newRdn, boolean deleteOldRdn )
+ {
+ this.browserConnection = entry.getBrowserConnection();
+ this.oldEntry = entry;
+ this.newEntry = entry;
+ this.newRdn = newRdn;
+ this.deleteOldRdn = deleteOldRdn;
+
+ setName( BrowserCoreMessages.jobs__rename_entry_name );
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.jobs.AbstractEclipseJob#getConnections()
+ */
+ protected Connection[] getConnections()
+ {
+ return new Connection[]
+ { browserConnection.getConnection() };
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.jobs.AbstractEclipseJob#getLockedObjects()
+ */
+ protected Object[] getLockedObjects()
+ {
+ List<Object> l = new ArrayList<Object>();
+ l.add( oldEntry.getParententry() );
+ return l.toArray();
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.jobs.AbstractNotificationJob#executeNotificationJob(org.apache.directory.studio.connection.core.StudioProgressMonitor)
+ */
+ protected void executeNotificationJob( StudioProgressMonitor monitor )
+ {
+ monitor.beginTask( BrowserCoreMessages.bind( BrowserCoreMessages.jobs__rename_entry_task, new String[]
+ { oldEntry.getDn().getUpName() } ), 3 );
+ monitor.reportProgress( " " ); //$NON-NLS-1$
+ monitor.worked( 1 );
+
+ IEntry parent = oldEntry.getParententry();
+ LdapDN newDn = DnUtils.composeDn( newRdn, parent.getDn() );
+
+ // rename in directory
+ // TODO: use manual/simulated rename, if rename of subtree is not
+ // supported
+ renameEntry( browserConnection, oldEntry, newDn, deleteOldRdn, monitor );
+
+ if ( !monitor.errorsReported() )
+ {
+ // uncache old entry
+ browserConnection.uncacheEntryRecursive( oldEntry );
+
+ // rename in parent
+ parent.deleteChild( oldEntry );
+ newEntry = ReadEntryJob.getEntry( browserConnection, newDn, monitor );
+ parent.addChild( newEntry );
+ parent.setHasMoreChildren( false );
+
+ newEntry.setHasChildrenHint( oldEntry.hasChildren() );
+ if ( oldEntry.isChildrenInitialized() )
+ {
+ InitializeChildrenJob.initializeChildren( newEntry, monitor );
+ }
+
+ // rename in searches
+ ISearch[] searches = browserConnection.getSearchManager().getSearches();
+ for ( int j = 0; j < searches.length; j++ )
+ {
+ ISearch search = searches[j];
+ if ( search.getSearchResults() != null )
+ {
+ ISearchResult[] searchResults = search.getSearchResults();
+ for ( int k = 0; k < searchResults.length; k++ )
+ {
+ ISearchResult result = searchResults[k];
+ if ( oldEntry.equals( result.getEntry() ) )
+ {
+ ISearchResult[] newsrs = new ISearchResult[searchResults.length - 1];
+ System.arraycopy( searchResults, 0, newsrs, 0, k );
+ System.arraycopy( searchResults, k + 1, newsrs, k, searchResults.length - k - 1 );
+ search.setSearchResults( newsrs );
+ searchResults = newsrs;
+ k--;
+ updatedSearchesSet.add( search );
+ }
+ }
+ }
+ }
+ }
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.jobs.AbstractNotificationJob#runNotification()
+ */
+ protected void runNotification()
+ {
+ if ( oldEntry != null && newEntry != null )
+ {
+ EventRegistry.fireEntryUpdated( new EntryRenamedEvent( oldEntry, newEntry ), this );
+ }
+ for ( ISearch search : updatedSearchesSet )
+ {
+ EventRegistry.fireSearchUpdated( new SearchUpdateEvent( search,
+ SearchUpdateEvent.EventDetail.SEARCH_PERFORMED ), this );
+ }
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.jobs.AbstractEclipseJob#getErrorMessage()
+ */
+ protected String getErrorMessage()
+ {
+ return BrowserCoreMessages.jobs__rename_entry_error;
+ }
+
+
+ /**
+ * Renames the entry.
+ *
+ * @param browserConnection the browser connection
+ * @param oldEntry the old entry
+ * @param newDn the new DN
+ * @param deleteOldRdn the delete old RDN flag
+ * @param monitor the progress monitor
+ */
+ static void renameEntry( IBrowserConnection browserConnection, IEntry oldEntry, LdapDN newDn, boolean deleteOldRdn,
+ StudioProgressMonitor monitor )
+ {
+ // dn
+ String oldDnString = oldEntry.getDn().getUpName();
+ String newDnString = newDn.getUpName();
+
+ // controls
+ Control[] controls = null;
+ if ( oldEntry.isReferral() )
+ {
+ controls = new Control[]
+ { new ManageReferralControl() };
+ }
+
+ browserConnection.getConnection().getJNDIConnectionWrapper().rename( oldDnString, newDnString, deleteOldRdn, controls,
+ monitor );
+ }
+
+}
Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/RenameEntryJob.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/RenameValuesJob.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/RenameValuesJob.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/RenameValuesJob.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/RenameValuesJob.java Mon Nov 5 08:51:43 2007
@@ -0,0 +1,176 @@
+/*
+ * 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.jobs;
+
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.directory.studio.connection.core.StudioProgressMonitor;
+import org.apache.directory.studio.ldapbrowser.core.BrowserCoreMessages;
+import org.apache.directory.studio.ldapbrowser.core.events.AttributesInitializedEvent;
+import org.apache.directory.studio.ldapbrowser.core.events.EntryModificationEvent;
+import org.apache.directory.studio.ldapbrowser.core.events.EventRegistry;
+import org.apache.directory.studio.ldapbrowser.core.events.ValueRenamedEvent;
+import org.apache.directory.studio.ldapbrowser.core.model.IAttribute;
+import org.apache.directory.studio.ldapbrowser.core.model.IEntry;
+import org.apache.directory.studio.ldapbrowser.core.model.IValue;
+import org.apache.directory.studio.ldapbrowser.core.model.impl.Attribute;
+import org.apache.directory.studio.ldapbrowser.core.model.impl.Value;
+
+
+/**
+ * Job to rename the attribute description of values asynchronously.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class RenameValuesJob extends AbstractAttributeModificationJob
+{
+
+ /** The entry to modify. */
+ private IEntry entry;
+
+ /** The old values. */
+ private IValue[] oldValues;
+
+ /** The new attribute description. */
+ private String newAttributeDescription;
+
+ /** The created values. */
+ private IValue[] createdValues;
+
+
+ /**
+ * Creates a new instance of RenameValuesJob.
+ *
+ * @param entry the entry to modify
+ * @param oldValues the old values
+ * @param newAttributeDescription the new attribute description
+ */
+ public RenameValuesJob( IEntry entry, IValue[] oldValues, String newAttributeDescription )
+ {
+ this.entry = entry;
+ this.oldValues = oldValues;
+ this.newAttributeDescription = newAttributeDescription;
+
+ setName( oldValues.length == 1 ? BrowserCoreMessages.jobs__rename_value_name_1
+ : BrowserCoreMessages.jobs__rename_value_name_n );
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.jobs.AbstractAttributeModificationJob#executeAttributeModificationJob(org.apache.directory.studio.connection.core.StudioProgressMonitor)
+ */
+ protected void executeAttributeModificationJob( StudioProgressMonitor monitor )
+ {
+ monitor.beginTask( oldValues.length == 1 ? BrowserCoreMessages.jobs__rename_value_task_1
+ : BrowserCoreMessages.jobs__rename_value_task_n, 2 );
+ monitor.reportProgress( " " ); //$NON-NLS-1$
+ monitor.worked( 1 );
+
+ for ( IValue oldValue : oldValues )
+ {
+ if ( oldValue.getAttribute().getEntry() != entry )
+ {
+ return;
+ }
+ }
+
+ IValue[] newValues = new IValue[oldValues.length];
+ for ( int i = 0; i < oldValues.length; i++ )
+ {
+ IAttribute attribute = entry.getAttribute( newAttributeDescription );
+ if ( attribute == null )
+ {
+ attribute = new Attribute( entry, newAttributeDescription );
+ }
+
+ newValues[i] = new Value( attribute, oldValues[i].getRawValue() );
+ }
+
+ CreateValuesJob.createValues( entry.getBrowserConnection(), entry, newValues, monitor );
+ if ( !monitor.errorsReported() )
+ {
+ DeleteAttributesValueJob.deleteAttributesAndValues( entry.getBrowserConnection(), entry, null, oldValues,
+ monitor );
+ }
+ if ( !monitor.errorsReported() )
+ {
+ createdValues = newValues;
+ }
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.jobs.AbstractAttributeModificationJob#getModifiedEntry()
+ */
+ protected IEntry getModifiedEntry()
+ {
+ return entry;
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.jobs.AbstractAttributeModificationJob#getAffectedAttributeDescriptions()
+ */
+ protected String[] getAffectedAttributeDescriptions()
+ {
+ Set<String> attributeDescriptionSet = new HashSet<String>();
+ attributeDescriptionSet.add( newAttributeDescription );
+ for ( IValue oldValue : oldValues )
+ {
+ attributeDescriptionSet.add( oldValue.getAttribute().getDescription() );
+ }
+ return attributeDescriptionSet.toArray( new String[attributeDescriptionSet.size()] );
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.jobs.AbstractNotificationJob#runNotification()
+ */
+ protected void runNotification()
+ {
+ EntryModificationEvent event;
+
+ if ( createdValues != null && createdValues.length > 0 )
+ {
+ event = new ValueRenamedEvent( entry.getBrowserConnection(), entry, oldValues[0], createdValues[0] );
+ }
+ else
+ {
+ event = new AttributesInitializedEvent( entry );
+ }
+
+ EventRegistry.fireEntryUpdated( event, this );
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.jobs.AbstractEclipseJob#getErrorMessage()
+ */
+ protected String getErrorMessage()
+ {
+ return oldValues.length == 1 ? BrowserCoreMessages.jobs__rename_value_error_1
+ : BrowserCoreMessages.jobs__rename_value_error_n;
+ }
+
+}
Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/RenameValuesJob.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/SearchJob.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/SearchJob.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/SearchJob.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/SearchJob.java Mon Nov 5 08:51:43 2007
@@ -0,0 +1,707 @@
+/*
+ * 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.jobs;
+
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+
+import javax.naming.NamingEnumeration;
+import javax.naming.NamingException;
+import javax.naming.directory.Attribute;
+import javax.naming.directory.SearchControls;
+import javax.naming.directory.SearchResult;
+import javax.naming.ldap.BasicControl;
+import javax.naming.ldap.Control;
+
+import org.apache.directory.shared.ldap.name.LdapDN;
+import org.apache.directory.studio.connection.core.Connection;
+import org.apache.directory.studio.connection.core.StudioProgressMonitor;
+import org.apache.directory.studio.ldapbrowser.core.BrowserCoreMessages;
+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.AttributeHierarchy;
+import org.apache.directory.studio.ldapbrowser.core.model.ConnectionException;
+import org.apache.directory.studio.ldapbrowser.core.model.IAttribute;
+import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection;
+import org.apache.directory.studio.ldapbrowser.core.model.IEntry;
+import org.apache.directory.studio.ldapbrowser.core.model.IRootDSE;
+import org.apache.directory.studio.ldapbrowser.core.model.ISearch;
+import org.apache.directory.studio.ldapbrowser.core.model.ISearchResult;
+import org.apache.directory.studio.ldapbrowser.core.model.ReferralException;
+import org.apache.directory.studio.ldapbrowser.core.model.SearchParameter;
+import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection.ReferralHandlingMethod;
+import org.apache.directory.studio.ldapbrowser.core.model.impl.BaseDNEntry;
+import org.apache.directory.studio.ldapbrowser.core.model.impl.Entry;
+import org.apache.directory.studio.ldapbrowser.core.model.impl.Value;
+import org.apache.directory.studio.ldapbrowser.core.model.schema.ObjectClassDescription;
+import org.apache.directory.studio.ldapbrowser.core.utils.DnUtils;
+import org.apache.directory.studio.ldapbrowser.core.utils.JNDIUtils;
+import org.apache.directory.studio.ldapbrowser.core.utils.Utils;
+
+
+/**
+ * Job to perform search operations.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class SearchJob extends AbstractNotificationJob
+{
+
+ /** The searches. */
+ private ISearch[] searches;
+
+
+ /**
+ * Creates a new instance of SearchJob.
+ *
+ * @param searches the searches
+ */
+ public SearchJob( ISearch[] searches )
+ {
+ this.searches = searches;
+ setName( BrowserCoreMessages.jobs__search_name );
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.jobs.AbstractEclipseJob#getConnections()
+ */
+ protected Connection[] getConnections()
+ {
+ Connection[] connections = new Connection[searches.length];
+ for ( int i = 0; i < connections.length; i++ )
+ {
+ connections[i] = searches[i].getBrowserConnection().getConnection();
+ }
+ return connections;
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.jobs.AbstractEclipseJob#getLockedObjects()
+ */
+ protected Object[] getLockedObjects()
+ {
+ List<Object> l = new ArrayList<Object>();
+ l.addAll( Arrays.asList( searches ) );
+ return l.toArray();
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.jobs.AbstractNotificationJob#executeNotificationJob(org.apache.directory.studio.connection.core.StudioProgressMonitor)
+ */
+ protected void executeNotificationJob( StudioProgressMonitor monitor )
+ {
+ monitor.beginTask( " ", searches.length + 1 ); //$NON-NLS-1$
+ monitor.reportProgress( " " ); //$NON-NLS-1$
+
+ for ( int pi = 0; pi < searches.length; pi++ )
+ {
+ ISearch search = searches[pi];
+
+ monitor.setTaskName( BrowserCoreMessages.bind( BrowserCoreMessages.jobs__search_task, new String[]
+ { search.getName() } ) );
+ monitor.worked( 1 );
+
+ if ( search.getBrowserConnection() != null )
+ {
+ searchAndUpdateModel( search.getBrowserConnection(), search, monitor );
+ }
+ }
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.jobs.AbstractNotificationJob#runNotification()
+ */
+ protected void runNotification()
+ {
+ for ( int pi = 0; pi < searches.length; pi++ )
+ {
+ EventRegistry.fireSearchUpdated( new SearchUpdateEvent( searches[pi],
+ SearchUpdateEvent.EventDetail.SEARCH_PERFORMED ), this );
+ }
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.jobs.AbstractEclipseJob#getErrorMessage()
+ */
+ protected String getErrorMessage()
+ {
+ return searches.length == 1 ? BrowserCoreMessages.jobs__search_error_1
+ : BrowserCoreMessages.jobs__search_error_n;
+ }
+
+
+ /**
+ * Searches the directory and updates the browser model.
+ *
+ * @param browserConnection the browser connection
+ * @param search the search
+ * @param monitor the progress monitor
+ */
+ public static void searchAndUpdateModel( IBrowserConnection browserConnection, ISearch search,
+ StudioProgressMonitor monitor )
+ {
+ try
+ {
+ if ( !monitor.isCanceled() )
+ {
+ // add returning attributes for children and alias detection
+ SearchParameter searchParameter = getSearchParameter( search );
+ ArrayList<ISearchResult> searchResultList = new ArrayList<ISearchResult>();
+
+ try
+ {
+ // search
+ NamingEnumeration<SearchResult> enumeration = search( browserConnection, searchParameter, monitor );
+
+ // iterate through the search result
+ while ( !monitor.isCanceled() && enumeration.hasMore() )
+ {
+ SearchResult sr = enumeration.nextElement(); // TODO: referrals exception
+ LdapDN dn = JNDIUtils.getDn( sr );
+
+ // get entry from cache or create it
+ IEntry entry = browserConnection.getEntryFromCache( dn );
+ if ( entry == null )
+ {
+ entry = createAndCacheEntry( browserConnection, dn );
+ }
+
+ // initialize special flags
+ initFlags( entry, sr, searchParameter );
+
+ // fill the attributes
+ fillAttributes( entry, sr, search.getSearchParameter() );
+
+ searchResultList
+ .add( new org.apache.directory.studio.ldapbrowser.core.model.impl.SearchResult( entry,
+ search ) );
+
+ monitor
+ .reportProgress( searchResultList.size() == 1 ? BrowserCoreMessages.model__retrieved_1_entry
+ : BrowserCoreMessages.bind( BrowserCoreMessages.model__retrieved_n_entries,
+ new String[]
+ { Integer.toString( searchResultList.size() ) } ) );
+ }
+ }
+ catch ( Exception e )
+ {
+ ConnectionException ce = JNDIUtils.createConnectionException( searchParameter, e );
+
+ if ( ce.getLdapStatusCode() == 3 || ce.getLdapStatusCode() == 4 || ce.getLdapStatusCode() == 11 )
+ {
+ search.setCountLimitExceeded( true );
+ }
+ else if ( ce instanceof ReferralException )
+ {
+ if ( search.getReferralsHandlingMethod() == ReferralHandlingMethod.FOLLOW )
+ {
+ ReferralException re = ( ReferralException ) ce;
+ ISearch[] referralSearches = re.getReferralSearches();
+ for ( int i = 0; i < referralSearches.length; i++ )
+ {
+ ISearch referralSearch = referralSearches[i];
+
+ searchAndUpdateModel( referralSearch.getBrowserConnection(), referralSearch, monitor );
+
+ ISearchResult[] referralSearchResults = referralSearch.getSearchResults();
+ for ( int j = 0; referralSearchResults != null && j < referralSearchResults.length; j++ )
+ {
+ ISearchResult referralSearchResult = referralSearchResults[j];
+ referralSearchResult.setSearch( search );
+ searchResultList.add( referralSearchResult );
+ }
+ }
+ }
+ }
+ else
+ {
+ monitor.reportError( ce );
+ }
+ }
+
+ monitor.reportProgress( searchResultList.size() == 1 ? BrowserCoreMessages.model__retrieved_1_entry
+ : BrowserCoreMessages.bind( BrowserCoreMessages.model__retrieved_n_entries, new String[]
+ { Integer.toString( searchResultList.size() ) } ) );
+ monitor.worked( 1 );
+
+ search.setSearchResults( ( ISearchResult[] ) searchResultList
+ .toArray( new ISearchResult[searchResultList.size()] ) );
+ }
+ }
+ catch ( Exception e )
+ {
+ if ( search != null )
+ {
+ search.setSearchResults( new ISearchResult[0] );
+ }
+ monitor.reportError( e );
+ }
+ }
+
+
+ static NamingEnumeration<SearchResult> search( IBrowserConnection browserConnection, SearchParameter parameter,
+ StudioProgressMonitor monitor )
+ {
+ String searchBase = parameter.getSearchBase().getUpName();
+ SearchControls controls = new SearchControls();
+ switch ( parameter.getScope() )
+ {
+ case OBJECT:
+ controls.setSearchScope( SearchControls.OBJECT_SCOPE );
+ break;
+ case ONELEVEL:
+ controls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
+ break;
+ case SUBTREE:
+ controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
+ break;
+ default:
+ controls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
+ }
+ controls.setReturningAttributes( parameter.getReturningAttributes() );
+ controls.setCountLimit( parameter.getCountLimit() );
+ controls.setTimeLimit( parameter.getTimeLimit() );
+ String filter = parameter.getFilter();
+ String derefAliasMethod = getDerefAliasMethod( parameter );
+ String handleReferralsMethod = getReferralsHandlingMethod( parameter );
+
+ Control[] ldapControls = null;
+ if ( parameter.getControls() != null )
+ {
+ org.apache.directory.studio.ldapbrowser.core.model.Control[] ctls = parameter.getControls();
+ ldapControls = new Control[ctls.length];
+ for ( int i = 0; i < ctls.length; i++ )
+ {
+ ldapControls[i] = new BasicControl( ctls[i].getOid(), ctls[i].isCritical(), ctls[i].getControlValue() );
+ }
+ }
+
+ NamingEnumeration<SearchResult> result = browserConnection.getConnection().getJNDIConnectionWrapper().search(
+ searchBase, filter, controls, derefAliasMethod, handleReferralsMethod, ldapControls, monitor );
+ return result;
+ }
+
+
+ private static String getDerefAliasMethod( SearchParameter parameter )
+ {
+ String m = "always"; //$NON-NLS-1$
+
+ switch ( parameter.getAliasesDereferencingMethod() )
+ {
+ case NEVER:
+ m = "never"; //$NON-NLS-1$
+ break;
+ case ALWAYS:
+ m = "always"; //$NON-NLS-1$
+ break;
+ case FINDING:
+ m = "finding"; //$NON-NLS-1$
+ break;
+ case SEARCH:
+ m = "searching"; //$NON-NLS-1$
+ break;
+ }
+
+ return m;
+ }
+
+
+ private static String getReferralsHandlingMethod( SearchParameter parameter )
+ {
+ String m = "follow"; //$NON-NLS-1$
+
+ switch ( parameter.getReferralsHandlingMethod() )
+ {
+ case IGNORE:
+ m = "ignore"; //$NON-NLS-1$
+ break;
+ case FOLLOW:
+ // m = "follow"; //$NON-NLS-1$
+ m = "throw"; //$NON-NLS-1$
+ break;
+ }
+
+ return m;
+ }
+
+
+ private static SearchParameter getSearchParameter( ISearch search )
+ {
+ SearchParameter searchParameter = ( SearchParameter ) search.getSearchParameter().clone();
+
+ // add children detetion attributes
+ if ( search.isInitHasChildrenFlag() )
+ {
+ if ( search.getBrowserConnection().getSchema().hasAttributeTypeDescription(
+ IAttribute.OPERATIONAL_ATTRIBUTE_HAS_SUBORDINATES )
+ && !Utils.containsIgnoreCase( Arrays.asList( searchParameter.getReturningAttributes() ),
+ IAttribute.OPERATIONAL_ATTRIBUTE_HAS_SUBORDINATES ) )
+ {
+ String[] returningAttributes = new String[searchParameter.getReturningAttributes().length + 1];
+ System.arraycopy( searchParameter.getReturningAttributes(), 0, returningAttributes, 0, searchParameter
+ .getReturningAttributes().length );
+ returningAttributes[returningAttributes.length - 1] = IAttribute.OPERATIONAL_ATTRIBUTE_HAS_SUBORDINATES;
+ searchParameter.setReturningAttributes( returningAttributes );
+ }
+ else if ( search.getBrowserConnection().getSchema().hasAttributeTypeDescription(
+ IAttribute.OPERATIONAL_ATTRIBUTE_NUM_SUBORDINATES )
+ && !Utils.containsIgnoreCase( Arrays.asList( searchParameter.getReturningAttributes() ),
+ IAttribute.OPERATIONAL_ATTRIBUTE_NUM_SUBORDINATES ) )
+ {
+ String[] returningAttributes = new String[searchParameter.getReturningAttributes().length + 1];
+ System.arraycopy( searchParameter.getReturningAttributes(), 0, returningAttributes, 0, searchParameter
+ .getReturningAttributes().length );
+ returningAttributes[returningAttributes.length - 1] = IAttribute.OPERATIONAL_ATTRIBUTE_NUM_SUBORDINATES;
+ searchParameter.setReturningAttributes( returningAttributes );
+ }
+ else if ( search.getBrowserConnection().getSchema().hasAttributeTypeDescription(
+ IAttribute.OPERATIONAL_ATTRIBUTE_SUBORDINATE_COUNT )
+ && !Utils.containsIgnoreCase( Arrays.asList( searchParameter.getReturningAttributes() ),
+ IAttribute.OPERATIONAL_ATTRIBUTE_SUBORDINATE_COUNT ) )
+ {
+ String[] returningAttributes = new String[searchParameter.getReturningAttributes().length + 1];
+ System.arraycopy( searchParameter.getReturningAttributes(), 0, returningAttributes, 0, searchParameter
+ .getReturningAttributes().length );
+ returningAttributes[returningAttributes.length - 1] = IAttribute.OPERATIONAL_ATTRIBUTE_SUBORDINATE_COUNT;
+ searchParameter.setReturningAttributes( returningAttributes );
+ }
+ }
+
+ // to init the alias/referral flag we need the objectClass
+ if ( search.isInitAliasAndReferralFlag() )
+ {
+ if ( !Utils.containsIgnoreCase( Arrays.asList( searchParameter.getReturningAttributes() ),
+ IAttribute.OBJECTCLASS_ATTRIBUTE ) )
+ {
+ String[] returningAttributes = new String[searchParameter.getReturningAttributes().length + 1];
+ System.arraycopy( searchParameter.getReturningAttributes(), 0, returningAttributes, 0, searchParameter
+ .getReturningAttributes().length );
+ returningAttributes[returningAttributes.length - 1] = IAttribute.OBJECTCLASS_ATTRIBUTE;
+ searchParameter.setReturningAttributes( returningAttributes );
+ }
+ }
+
+ // if returning attributes are requested but objectClass isn't included then add it
+ if ( search.getReturningAttributes() == null || search.getReturningAttributes().length > 0 )
+ {
+ if ( !Utils.containsIgnoreCase( Arrays.asList( searchParameter.getReturningAttributes() ),
+ IAttribute.OBJECTCLASS_ATTRIBUTE ) )
+ {
+ String[] returningAttributes = new String[searchParameter.getReturningAttributes().length + 1];
+ System.arraycopy( searchParameter.getReturningAttributes(), 0, returningAttributes, 0, searchParameter
+ .getReturningAttributes().length );
+ returningAttributes[returningAttributes.length - 1] = IAttribute.OBJECTCLASS_ATTRIBUTE;
+ searchParameter.setReturningAttributes( returningAttributes );
+ }
+ }
+
+ // filter controls if not supported by server
+ if ( searchParameter.getControls() != null )
+ {
+ IBrowserConnection connection = search.getBrowserConnection();
+ Set<String> suppportedConrolSet = new HashSet<String>();
+ if ( connection.getRootDSE() != null
+ && connection.getRootDSE().getAttribute( IRootDSE.ROOTDSE_ATTRIBUTE_SUPPORTEDCONTROL ) != null )
+ {
+ IAttribute scAttribute = connection.getRootDSE().getAttribute(
+ IRootDSE.ROOTDSE_ATTRIBUTE_SUPPORTEDCONTROL );
+ String[] supportedControls = scAttribute.getStringValues();
+ for ( int i = 0; i < supportedControls.length; i++ )
+ {
+ suppportedConrolSet.add( supportedControls[i].toLowerCase() );
+ }
+ }
+
+ org.apache.directory.studio.ldapbrowser.core.model.Control[] controls = searchParameter.getControls();
+ List<org.apache.directory.studio.ldapbrowser.core.model.Control> controlList = new ArrayList<org.apache.directory.studio.ldapbrowser.core.model.Control>();
+ for ( int i = 0; i < controls.length; i++ )
+ {
+ if ( suppportedConrolSet.contains( controls[i].getOid().toLowerCase() ) )
+ {
+ controlList.add( controls[i] );
+ }
+ }
+ searchParameter.setControls( controlList
+ .toArray( new org.apache.directory.studio.ldapbrowser.core.model.Control[controlList.size()] ) );
+ }
+
+ return searchParameter;
+ }
+
+
+ /**
+ * Creates the entry and puts it into the BrowserConnection's entry cache.
+ *
+ * @param browserConnection the browser connection
+ * @param dn the DN of the entry
+ *
+ * @return the created entry
+ */
+ private static IEntry createAndCacheEntry( IBrowserConnection browserConnection, LdapDN dn )
+ {
+ IEntry entry = null;
+
+ // build tree to parent
+ LinkedList<LdapDN> parentDnList = new LinkedList<LdapDN>();
+ LdapDN parentDN = dn;
+ while ( parentDN != null && browserConnection.getEntryFromCache( parentDN ) == null )
+ {
+ parentDnList.addFirst( parentDN );
+ parentDN = DnUtils.getParent( parentDN );
+ }
+ for ( LdapDN aDN : parentDnList )
+ {
+ parentDN = DnUtils.getParent( aDN );
+ if ( parentDN == null )
+ {
+ entry = new BaseDNEntry( aDN, browserConnection );
+ browserConnection.cacheEntry( entry );
+ }
+ else if ( browserConnection.getEntryFromCache( parentDN ) != null )
+ {
+ IEntry parentEntry = browserConnection.getEntryFromCache( parentDN );
+ entry = new Entry( parentEntry, aDN.getRdn() );
+ entry.setDirectoryEntry( true );
+
+ parentEntry.addChild( entry );
+ // parentEntry.setAttributesInitialized(false, this);
+
+ parentEntry.setChildrenInitialized( true );
+ parentEntry.setHasMoreChildren( true );
+ parentEntry.setHasChildrenHint( true );
+
+ browserConnection.cacheEntry( entry );
+ }
+ else
+ {
+ // ??
+ }
+ }
+
+ return entry;
+ }
+
+
+ /**
+ * Initializes the following flags of the entry:
+ * <ul>
+ * <li>hasChildren</li>
+ * <li>isAlias</li>
+ * <li>isReferral</li>
+ * <li>isSubentry</li>
+ * </ul>
+ *
+ * @param entry the entry
+ * @param sr the the JNDI search result
+ * @param searchParameter the search parameters
+ */
+ private static void initFlags( IEntry entry, SearchResult sr, SearchParameter searchParameter )
+ throws NamingException
+ {
+ NamingEnumeration<? extends Attribute> attributeEnumeration = sr.getAttributes().getAll();
+ while ( attributeEnumeration.hasMore() )
+ {
+ Attribute attribute = attributeEnumeration.next();
+ String attributeDescription = attribute.getID();
+ NamingEnumeration<?> valueEnumeration = attribute.getAll();
+ while ( valueEnumeration.hasMore() )
+ {
+ Object o = valueEnumeration.next();
+ if ( o instanceof String )
+ {
+ String value = ( String ) o;
+
+ if ( searchParameter.isInitHasChildrenFlag() )
+ {
+ // hasChildren flag
+ if ( IAttribute.OPERATIONAL_ATTRIBUTE_HAS_SUBORDINATES.equalsIgnoreCase( attributeDescription ) )
+ {
+ if ( "FALSE".equalsIgnoreCase( value ) ) { //$NON-NLS-1$
+ entry.setHasChildrenHint( false );
+ }
+ }
+ if ( IAttribute.OPERATIONAL_ATTRIBUTE_NUM_SUBORDINATES.equalsIgnoreCase( attributeDescription ) )
+ {
+ if ( "0".equalsIgnoreCase( value ) ) { //$NON-NLS-1$
+ entry.setHasChildrenHint( false );
+ }
+ }
+ if ( IAttribute.OPERATIONAL_ATTRIBUTE_SUBORDINATE_COUNT.equalsIgnoreCase( attributeDescription ) )
+ {
+ if ( "0".equalsIgnoreCase( value ) ) { //$NON-NLS-1$
+ entry.setHasChildrenHint( false );
+ }
+ }
+ }
+
+ if ( searchParameter.isInitAliasAndReferralFlag() )
+ {
+ if ( IAttribute.OBJECTCLASS_ATTRIBUTE.equalsIgnoreCase( attributeDescription ) )
+ {
+ if ( ObjectClassDescription.OC_ALIAS.equalsIgnoreCase( value ) )
+ {
+ entry.setAlias( true );
+ }
+ if ( ObjectClassDescription.OC_REFERRAL.equalsIgnoreCase( value ) )
+ {
+ entry.setReferral( true );
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if ( ( searchParameter.getControls() != null && Arrays.asList( searchParameter.getControls() ).contains(
+ org.apache.directory.studio.ldapbrowser.core.model.Control.SUBENTRIES_CONTROL ) )
+ || ISearch.FILTER_SUBENTRY.equalsIgnoreCase( searchParameter.getFilter() ) )
+ {
+ entry.setSubentry( true );
+ entry.setHasChildrenHint( false );
+ }
+ }
+
+
+ /**
+ * Fills the attributes and values of the search result into the entry.
+ * Clears existing attributes and values in the entry.
+ *
+ * @param entry the entry
+ * @param sr the JNDI search result
+ * @param searchParameter the search parameters
+ */
+ private static void fillAttributes( IEntry entry, SearchResult sr, SearchParameter searchParameter )
+ throws NamingException
+ {
+ if ( searchParameter.getReturningAttributes() == null || searchParameter.getReturningAttributes().length > 0 )
+ {
+ // clear old attributes defined as returning attributes or clear all
+ if ( searchParameter.getReturningAttributes() != null )
+ {
+ String[] ras = searchParameter.getReturningAttributes();
+
+ // special case *
+ if ( Arrays.asList( ras ).contains( ISearch.ALL_USER_ATTRIBUTES ) )
+ {
+ // clear all user attributes
+ IAttribute[] oldAttributes = entry.getAttributes();
+ for ( int i = 0; oldAttributes != null && i < oldAttributes.length; i++ )
+ {
+ if ( !oldAttributes[i].isOperationalAttribute() )
+ {
+ entry.deleteAttribute( oldAttributes[i] );
+ }
+ }
+ }
+
+ // special case +
+ if ( Arrays.asList( ras ).contains( ISearch.ALL_OPERATIONAL_ATTRIBUTES ) )
+ {
+ // clear all operational attributes
+ IAttribute[] oldAttributes = entry.getAttributes();
+ for ( int i = 0; oldAttributes != null && i < oldAttributes.length; i++ )
+ {
+ if ( oldAttributes[i].isOperationalAttribute() )
+ {
+ entry.deleteAttribute( oldAttributes[i] );
+ }
+ }
+ }
+
+ for ( int r = 0; r < ras.length; r++ )
+ {
+ // clear attributes requested from server, also include sub-types
+ AttributeHierarchy ah = entry.getAttributeWithSubtypes( ras[r] );
+ if ( ah != null )
+ {
+ for ( Iterator<IAttribute> it = ah.iterator(); it.hasNext(); )
+ {
+ IAttribute attribute = it.next();
+ entry.deleteAttribute( attribute );
+ }
+ }
+ }
+ }
+ else
+ {
+ // clear all
+ IAttribute[] oldAttributes = entry.getAttributes();
+ for ( int i = 0; oldAttributes != null && i < oldAttributes.length; i++ )
+ {
+ entry.deleteAttribute( oldAttributes[i] );
+ }
+ }
+
+ // additional clear old attributes if the record contains the attribute
+ NamingEnumeration<? extends Attribute> attributeEnumeration = sr.getAttributes().getAll();
+ while ( attributeEnumeration.hasMore() )
+ {
+ Attribute attribute = attributeEnumeration.next();
+ String attributeDescription = attribute.getID();
+ IAttribute oldAttribute = entry.getAttribute( attributeDescription );
+ if ( oldAttribute != null )
+ {
+ entry.deleteAttribute( oldAttribute );
+ }
+ }
+
+ // set new attributes and values
+ attributeEnumeration = sr.getAttributes().getAll();
+ while ( attributeEnumeration.hasMore() )
+ {
+ Attribute attribute = attributeEnumeration.next();
+ String attributeDescription = attribute.getID();
+
+ IAttribute studioAttribute = null;
+ if ( entry.getAttribute( attributeDescription ) == null )
+ {
+ studioAttribute = new org.apache.directory.studio.ldapbrowser.core.model.impl.Attribute( entry,
+ attributeDescription );
+ entry.addAttribute( studioAttribute );
+ }
+ else
+ {
+ studioAttribute = entry.getAttribute( attributeDescription );
+ }
+
+ NamingEnumeration<?> valueEnumeration = attribute.getAll();
+ while ( valueEnumeration.hasMore() )
+ {
+ Object value = valueEnumeration.next();
+ studioAttribute.addValue( new Value( studioAttribute, value ) );
+ }
+ }
+ }
+ }
+
+}
Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/jobs/SearchJob.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/AttributeDescription.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/AttributeDescription.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/AttributeDescription.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/AttributeDescription.java Mon Nov 5 08:51:43 2007
@@ -0,0 +1,287 @@
+/*
+ * 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.model;
+
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.directory.studio.ldapbrowser.core.model.schema.AttributeTypeDescription;
+import org.apache.directory.studio.ldapbrowser.core.model.schema.Schema;
+
+
+/**
+ * This class implements an attribute description as
+ * specified in RFC4512, section 2.5:
+ *
+ * An attribute description is represented by the ABNF:
+ *
+ * attributedescription = attributetype options
+ * attributetype = oid
+ * options = *( SEMI option )
+ * option = 1*keychar
+ *
+ * where <attributetype> identifies the attribute type and each <option>
+ * identifies an attribute option. Both <attributetype> and <option>
+ * productions are case insensitive. The order in which <option>s
+ * appear is irrelevant. That is, any two <attributedescription>s that
+ * consist of the same <attributetype> and same set of <option>s are
+ * equivalent.
+ *
+ * Examples of valid attribute descriptions:
+ *
+ * 2.5.4.0
+ * cn;lang-de;lang-en
+ * owner
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class AttributeDescription implements Serializable
+{
+
+ private static final long serialVersionUID = 1L;
+
+ /** The user provided description. */
+ private String description;
+
+ /** The parsed attribute type. */
+ private String parsedAttributeType;
+
+ /** The parsed language tag option list. */
+ private List<String> parsedLangList;
+
+ /** The parsed option list, except the language tags. */
+ private List<String> parsedOptionList;
+
+
+ /**
+ * Creates a new instance of AttributeDescription.
+ *
+ * @param description the user provided description
+ */
+ public AttributeDescription( String description )
+ {
+ this.description = description;
+
+ String[] attributeDescriptionComponents = description.split( IAttribute.OPTION_DELIMITER );
+ this.parsedAttributeType = attributeDescriptionComponents[0];
+ this.parsedLangList = new ArrayList<String>();
+ this.parsedOptionList = new ArrayList<String>();
+ for ( String component : attributeDescriptionComponents )
+ {
+ if ( component.startsWith( IAttribute.OPTION_LANG_PREFIX ) )
+ {
+ this.parsedLangList.add( component );
+ }
+ else
+ {
+ this.parsedOptionList.add( component );
+ }
+ }
+ }
+
+
+ /**
+ * Gets the user provided description.
+ *
+ * @return the user provided description
+ */
+ public String getDescription()
+ {
+ return description;
+ }
+
+
+ /**
+ * Gets the parsed attribute type.
+ *
+ * @return the parsed attribute type
+ */
+ public String getParsedAttributeType()
+ {
+ return parsedAttributeType;
+ }
+
+
+ /**
+ * Gets the list of parsed language tags.
+ *
+ * @return the list of parsed language tags
+ */
+ public List<String> getParsedLangList()
+ {
+ return parsedLangList;
+ }
+
+
+ /**
+ * Gets the list of parsed options, except the language tags.
+ *
+ * @return the list of parsed options, except the language tags
+ */
+ public List<String> getParsedOptionList()
+ {
+ return parsedOptionList;
+ }
+
+
+ /**
+ * Returns the attribute description with the numeric OID
+ * instead of the descriptive attribute type.
+ *
+ * @param schema the schema
+ *
+ * @return the attribute description with the numeric OID
+ */
+ public String toOidString( Schema schema )
+ {
+ if ( schema == null )
+ {
+ return description;
+ }
+
+ AttributeTypeDescription atd = schema.getAttributeTypeDescription( parsedAttributeType );
+ String oidString = atd.getNumericOID();
+
+ if ( !parsedLangList.isEmpty() )
+ {
+ for ( Iterator<String> it = parsedLangList.iterator(); it.hasNext(); )
+ {
+ String element = it.next();
+ oidString += element;
+
+ if ( it.hasNext() || !parsedOptionList.isEmpty() )
+ {
+ oidString += IAttribute.OPTION_DELIMITER;
+ }
+ }
+ }
+ if ( !parsedOptionList.isEmpty() )
+ {
+ for ( Iterator<String> it = parsedOptionList.iterator(); it.hasNext(); )
+ {
+ String element = it.next();
+ oidString += element;
+
+ if ( it.hasNext() )
+ {
+ oidString += IAttribute.OPTION_DELIMITER;
+ }
+ }
+ }
+
+ return oidString;
+ }
+
+
+ /**
+ * Checks if the given attribute description is subtype of
+ * this attriubte description.
+ *
+ * @param other the other attribute description
+ * @param schema the schema
+ *
+ * @return true, if the other attribute description is a
+ * subtype of this attribute description.
+ */
+ 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<String> myOptionsList = new ArrayList<String>( this.getParsedOptionList() );
+ List<String> otherOptionsList = new ArrayList<String>( other.getParsedOptionList() );
+ otherOptionsList.removeAll( myOptionsList );
+ if ( !otherOptionsList.isEmpty() )
+ {
+ return false;
+ }
+
+ // check language tags
+ List<String> myLangList = new ArrayList<String>( this.getParsedLangList() );
+ List<String> otherLangList = new ArrayList<String>( other.getParsedLangList() );
+ for ( String myLang : myLangList )
+ {
+ for ( Iterator<String> otherIt = otherLangList.iterator(); otherIt.hasNext(); )
+ {
+ String otherLang = 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;
+ }
+
+}
Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/AttributeDescription.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/AttributeHierarchy.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/AttributeHierarchy.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/AttributeHierarchy.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/AttributeHierarchy.java Mon Nov 5 08:51:43 2007
@@ -0,0 +1,151 @@
+/*
+ * 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.model;
+
+
+import java.util.Arrays;
+import java.util.Iterator;
+
+
+/**
+ * An AttributeHierarchy is a container for an attribute including all its subtypes.
+ * <p>
+ * Example:
+ * <ul>
+ * <li>attributeDescription is <code>name</code>
+ * <li>attributes contains <code>cn:test1</code>, <code>sn:test2</code> and <code>givenName:test3</code>
+ * </ul>
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class AttributeHierarchy
+{
+
+ /** The entry */
+ private IEntry entry;
+
+ /** The attribute description */
+ private String attributeDescription;
+
+ /** The attributes */
+ private IAttribute[] attributes;
+
+
+ /**
+ * Creates a new instance of AttributeHierarchy.
+ *
+ * @param entry the entry
+ * @param attributeDescription the attribute description
+ * @param attributes the attributes
+ */
+ public AttributeHierarchy( IEntry entry, String attributeDescription, IAttribute[] attributes )
+ {
+ if ( entry == null || attributeDescription == null || attributes == null || attributes.length < 1
+ || attributes[0] == null )
+ {
+ throw new IllegalArgumentException( "Empty AttributeHierachie" );
+ }
+ this.entry = entry;
+ this.attributeDescription = attributeDescription;
+ this.attributes = attributes;
+ }
+
+
+ /**
+ * Gets the attributes.
+ *
+ * @return the attributes
+ */
+ public IAttribute[] getAttributes()
+ {
+ return attributes;
+ }
+
+
+ /**
+ * Checks whether the given attribute is contained
+ * in this attribute hierarchy.
+ *
+ * @param attribute the attribute to check
+ * @return true if the attribute is contained in this attribute hierarchy
+ */
+ public boolean contains( IAttribute attribute )
+ {
+ return Arrays.asList( attributes ).contains( attribute );
+ }
+
+
+ /**
+ * Returns an iterator over the elements of this attribute hierarchy.
+ *
+ * @return an iterator over the elements of this attribute hierarchy
+ */
+ public Iterator<IAttribute> iterator()
+ {
+ return Arrays.asList( attributes ).iterator();
+ }
+
+
+ /**
+ * Gets the first attribute.
+ *
+ * @return the first attribute
+ */
+ public IAttribute getAttribute()
+ {
+ return attributes[0];
+ }
+
+
+ /**
+ * Gets the number of attributes.
+ *
+ * @return the number of attributes
+ */
+ public int size()
+ {
+ return attributes.length;
+ }
+
+
+ /**
+ * Gets the attribute description.
+ *
+ * @return the attribute description
+ */
+ public String getAttributeDescription()
+ {
+ return attributeDescription;
+ }
+
+
+ /**
+ * Gets the entry.
+ *
+ * @return the entry
+ */
+ public IEntry getEntry()
+ {
+ return entry;
+ }
+
+}
Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/AttributeHierarchy.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/BookmarkParameter.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/BookmarkParameter.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/BookmarkParameter.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/BookmarkParameter.java Mon Nov 5 08:51:43 2007
@@ -0,0 +1,137 @@
+/*
+ * 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.model;
+
+
+import java.io.Serializable;
+
+import javax.naming.InvalidNameException;
+
+import org.apache.directory.shared.ldap.name.LdapDN;
+
+
+/**
+ * A Bean class to hold the bookmark parameters.
+ * It is used to make bookmarks persistent.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class BookmarkParameter implements Serializable
+{
+
+ /** The serialVersionUID. */
+ private static final long serialVersionUID = 105108281861642267L;
+
+ /** The target DN. */
+ private LdapDN dn;
+
+ /** The symbolic name. */
+ private String name;
+
+
+ /**
+ * Creates a new instance of BookmarkParameter.
+ */
+ public BookmarkParameter()
+ {
+ }
+
+
+ /**
+ * Creates a new instance of BookmarkParameter.
+ *
+ * @param dn the target DN
+ * @param name the symbolic name
+ */
+ public BookmarkParameter( LdapDN dn, String name )
+ {
+ this.dn = dn;
+ this.name = name;
+ }
+
+
+ /**
+ * Gets the target DN.
+ *
+ * @return the target DN
+ */
+ public LdapDN getDn()
+ {
+ return dn;
+ }
+
+
+ /**
+ * Sets the target DN.
+ *
+ * @param dn the target DN
+ */
+ public void setDn( LdapDN dn )
+ {
+ this.dn = dn;
+ }
+
+
+ /**
+ * Sets the target DN.
+ *
+ * * @deprecated This method will be removed in the next version. The DN/RDN/RDNPart
+ * classes are replaced with the shared-ldap LdapDN/Rdn/ATAV. This method just
+ * remains to provide backward compatibility of the old browserconnections.xml
+ * file that stores searches and bookmarks.
+ *
+ * @param dn the target DN
+ */
+ public void setDn( DN dn )
+ {
+ try
+ {
+ setDn( new LdapDN( dn.toString() ) );
+ }
+ catch ( InvalidNameException e )
+ {
+ }
+ }
+
+
+ /**
+ * Gets the symbolic name.
+ *
+ * @return the symbolic name
+ */
+ public String getName()
+ {
+ return name;
+ }
+
+
+ /**
+ * Sets the symbolic name.
+ *
+ * @param name the symbolic name
+ */
+ public void setName( String name )
+ {
+ this.name = name;
+ }
+
+}
Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/BookmarkParameter.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/ConnectionException.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/ConnectionException.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/ConnectionException.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/ConnectionException.java Mon Nov 5 08:51:43 2007
@@ -0,0 +1,69 @@
+/*
+ * 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.model;
+
+
+public class ConnectionException extends Exception
+{
+
+ public static final int STAUS_CODE_TIMELIMIT_EXCEEDED = 3;
+ public static final int STAUS_CODE_SIZELIMIT_EXCEEDED = 4;
+ public static final int STAUS_CODE_ADMINLIMIT_EXCEEDED = 11;
+
+ 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;
+ }
+
+}
Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/ConnectionException.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/Control.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/Control.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/Control.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/Control.java Mon Nov 5 08:51:43 2007
@@ -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.studio.ldapbrowser.core.model;
+
+
+import java.io.Serializable;
+
+import org.apache.directory.studio.ldapbrowser.core.model.ldif.lines.LdifControlLine;
+
+
+/**
+ * The Control class represents a LDAP control as defined in RFC 4511
+ * <pre>
+ * Control ::= SEQUENCE {
+ * controlType LDAPOID,
+ * criticality BOOLEAN DEFAULT FALSE,
+ * controlValue OCTET STRING OPTIONAL }
+ * </pre>
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class Control implements Serializable
+{
+
+ /** The serialVersionUID. */
+ private static final long serialVersionUID = -1289018814649849178L;
+
+ /**
+ * The subentries control as defined in RFC 3672.
+ */
+ public static final Control SUBENTRIES_CONTROL = new Control( "Subentries Control", "1.3.6.1.4.1.4203.1.10.1",
+ false, new byte[]
+ { 0x01, 0x01, ( byte ) 0xFF } );
+
+ /** The symbolic name. */
+ private String name;
+
+ /** The oid. */
+ private String oid;
+
+ /** The critical. */
+ private boolean critical;
+
+ /** The control value. */
+ private transient byte[] controlValue;
+
+
+ /**
+ * Creates a new instance of Control.
+ */
+ public Control()
+ {
+ }
+
+
+ /**
+ * Creates a new instance of Control.
+ *
+ * @param name the symbolic name
+ * @param oid the oid
+ * @param critical the criticality
+ * @param controlValue the control value
+ */
+ public Control( String name, String oid, boolean critical, byte[] controlValue )
+ {
+ super();
+ this.name = name == null ? "" : name;
+ this.oid = oid;
+ this.critical = critical;
+ this.controlValue = controlValue;
+ }
+
+
+ /**
+ * Gets the control value.
+ *
+ * @return the control value
+ */
+ public byte[] getControlValue()
+ {
+ return controlValue;
+ }
+
+
+ /**
+ * Gets the oid.
+ *
+ * @return the oid
+ */
+ public String getOid()
+ {
+ return oid;
+ }
+
+
+ /**
+ * Checks if is critical.
+ *
+ * @return true, if is critical
+ */
+ public boolean isCritical()
+ {
+ return critical;
+ }
+
+
+ /**
+ * Gets the symbolic name.
+ *
+ * @return the name
+ */
+ public String getName()
+ {
+ return name;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public String toString()
+ {
+
+ if ( oid == null )
+ {
+ return "";
+ }
+
+ LdifControlLine line = LdifControlLine.create( getOid(), isCritical() ? " true" : " false", getControlValue() );
+ String s = line.toRawString();
+ s = s.substring( line.getRawControlSpec().length(), s.length() );
+ s = s.substring( line.getRawControlType().length(), s.length() );
+ s = s.substring( 0, s.length() - line.getRawNewLine().length() );
+
+ // System.out.println(s);
+
+ return s;
+ }
+
+
+ /**
+ * Sets the control value.
+ *
+ * @param controlValue the control value
+ */
+ public void setControlValue( byte[] controlValue )
+ {
+ this.controlValue = controlValue;
+ }
+
+
+ /**
+ * Sets the critical.
+ *
+ * @param critical the critical
+ */
+ public void setCritical( boolean critical )
+ {
+ this.critical = critical;
+ }
+
+
+ /**
+ * Sets the symbolic name.
+ *
+ * @param name the name
+ */
+ public void setName( String name )
+ {
+ this.name = name;
+ }
+
+
+ /**
+ * Sets the oid.
+ *
+ * @param oid the oid
+ */
+ public void setOid( String oid )
+ {
+ this.oid = oid;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean equals( Object obj )
+ {
+ if ( obj == null || !( obj instanceof Control ) )
+ {
+ return false;
+ }
+ Control other = ( Control ) obj;
+
+ return this.toString().equals( other.toString() );
+ }
+
+}
Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/Control.java
------------------------------------------------------------------------------
svn:eol-style = native