From 2fe585593bd3b3ca68064e5df4e6ee6eb210a66a Mon Sep 17 00:00:00 2001
From: Ludovic Poitou <ludovic.poitou@forgerock.com>
Date: Tue, 29 May 2012 12:05:52 +0000
Subject: [PATCH] Fix OPENDJ-508 - Searches that rely on searchable virtual attribute may be slow. For those searchable virtual attributes that can be faster than indexing (like when always matching a single entry), we process them before indexes. For the others, we fall back to them when indexes are not enough. Changes include a little bit of tidy up of comments and IDE warnings.
---
opends/src/server/org/opends/server/extensions/EntryDNVirtualAttributeProvider.java | 5
opends/src/server/org/opends/server/extensions/MemberVirtualAttributeProvider.java | 7
opends/src/server/org/opends/server/extensions/EntryUUIDVirtualAttributeProvider.java | 15 -
opends/src/server/org/opends/server/replication/common/LastChangeNumberVirtualAttributeProvider.java | 13
opends/src/server/org/opends/server/extensions/CollectiveAttributeSubentriesVirtualAttributeProvider.java | 5
opends/src/server/org/opends/server/extensions/HasSubordinatesVirtualAttributeProvider.java | 15 -
opends/src/server/org/opends/server/extensions/PasswordPolicySubentryVirtualAttributeProvider.java | 5
opends/src/server/org/opends/server/extensions/SubschemaSubentryVirtualAttributeProvider.java | 15 -
opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/UserDefinedVirtualAttributeProviderTestCase.java | 7
opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/IsMemberOfVirtualAttributeProviderTestCase.java | 8
opends/src/server/org/opends/server/extensions/UserDefinedVirtualAttributeProvider.java | 4
opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/VirtualStaticGroupTestCase.java | 7
opends/src/messages/messages/extension_ko.properties | 6
opends/src/messages/messages/extension.properties | 9
opends/src/messages/messages/extension_zh_CN.properties | 4
opends/src/server/org/opends/server/extensions/IsMemberOfVirtualAttributeProvider.java | 11
opends/src/messages/messages/extension_de.properties | 4
opends/tests/unit-tests-testng/src/server/org/opends/server/types/TestLDAPURL.java | 188 ++++++++++++++++++
opends/src/messages/messages/extension_ja.properties | 4
opends/src/server/org/opends/server/replication/common/LastCookieVirtualProvider.java | 13
opends/src/messages/messages/extension_zh_TW.properties | 6
opends/src/server/org/opends/server/extensions/GoverningStructureRuleVirtualAttributeProvider.java | 17 -
opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/EntryDNVirtualAttributeProviderTestCase.java | 9
opends/tests/unit-tests-testng/src/server/org/opends/server/types/TestDN.java | 5
opends/src/server/org/opends/server/extensions/EntityTagVirtualAttributeProvider.java | 11
opends/src/server/org/opends/server/replication/common/ChangelogBaseDNVirtualAttributeProvider.java | 12
opends/src/messages/messages/extension_es.properties | 12
opends/src/server/org/opends/server/extensions/NumSubordinatesVirtualAttributeProvider.java | 15 -
opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/EntityTagVirtualAttributeProviderTestCase.java | 3
opends/src/server/org/opends/server/api/VirtualAttributeProvider.java | 22 +-
opends/src/server/org/opends/server/backends/jeb/EntryContainer.java | 62 +++--
opends/src/server/org/opends/server/replication/common/FirstChangeNumberVirtualAttributeProvider.java | 13
opends/src/server/org/opends/server/extensions/PasswordExpirationTimeVirtualAttributeProvider.java | 5
opends/src/messages/messages/extension_fr.properties | 14
opends/src/server/org/opends/server/extensions/StructuralObjectClassVirtualAttributeProvider.java | 15 -
35 files changed, 409 insertions(+), 157 deletions(-)
diff --git a/opends/src/messages/messages/extension.properties b/opends/src/messages/messages/extension.properties
index 3eba639..0c2fc7e 100644
--- a/opends/src/messages/messages/extension.properties
+++ b/opends/src/messages/messages/extension.properties
@@ -1544,3 +1544,12 @@
properly configured for these types of searches
MILD_ERR_FCM_SEARCH_FAILED_624=An internal failure occurred while \
attempting to map the certificate with fingerprint %s to a user entry: %s
+MILD_ERR_FIRSTCHANGENUMBER_VATTR_NOT_SEARCHABLE_625=The %s attribute is not \
+ searchable and should not be included in otherwise unindexed search filters
+MILD_ERR_LASTCHANGENUMBER_VATTR_NOT_SEARCHABLE_626=The %s attribute is not \
+ searchable and should not be included in otherwise unindexed search filters
+MILD_ERR_LASTCOOKIE_VATTR_NOT_SEARCHABLE_627=The %s attribute is not \
+ searchable and should not be included in otherwise unindexed search filters
+MILD_ERR_CHANGELOGBASEDN_VATTR_NOT_SEARCHABLE_628=The %s attribute is not \
+ searchable and should not be included in otherwise unindexed search filters
+
\ No newline at end of file
diff --git a/opends/src/messages/messages/extension_de.properties b/opends/src/messages/messages/extension_de.properties
index 51b8606..c26ee53 100644
--- a/opends/src/messages/messages/extension_de.properties
+++ b/opends/src/messages/messages/extension_de.properties
@@ -529,3 +529,7 @@
INFO_GSSAPI_STOPPED_575=Der GSSAPI SASL-Mechanismus-Handler wurde angehalten
MILD_ERR_COLLECTIVEATTRIBUTESUBENTRIES_VATTR_NOT_SEARCHABLE_576=Das Attribut %s kann nicht durchsucht werden und darf nicht in ansonsten nicht indizierten Suchfiltern enthalten sein
MILD_ERR_PASSWORDPOLICYSUBENTRY_VATTR_NOT_SEARCHABLE_577=Das Attribut %s kann nicht durchsucht werden und darf nicht in ansonsten nicht indizierten Suchfiltern enthalten sein
+MILD_ERR_FIRSTCHANGENUMBER_VATTR_NOT_SEARCHABLE_625=Das Attribut %s kann nicht durchsucht werden und darf nicht in ansonsten nicht indizierten Suchfiltern enthalten sein
+MILD_ERR_LASTCHANGENUMBER_VATTR_NOT_SEARCHABLE_626=Das Attribut %s kann nicht durchsucht werden und darf nicht in ansonsten nicht indizierten Suchfiltern enthalten sein
+MILD_ERR_LASTCOOKIE_VATTR_NOT_SEARCHABLE_627=Das Attribut %s kann nicht durchsucht werden und darf nicht in ansonsten nicht indizierten Suchfiltern enthalten sein
+MILD_ERR_CHANGELOGBASEDN_VATTR_NOT_SEARCHABLE_628=Das Attribut %s kann nicht durchsucht werden und darf nicht in ansonsten nicht indizierten Suchfiltern enthalten sein
diff --git a/opends/src/messages/messages/extension_es.properties b/opends/src/messages/messages/extension_es.properties
index 2a0f934..448d3b9 100644
--- a/opends/src/messages/messages/extension_es.properties
+++ b/opends/src/messages/messages/extension_es.properties
@@ -427,12 +427,12 @@
SEVERE_ERR_FSCACHE_CANNOT_STORE_PERSISTENT_DATA_488=Se ha producido un error al tratar de almacenar la memoria cach\u00e9 persistente. Se vaciar\u00e1 la memoria cach\u00e9 persistente
SEVERE_ERR_FSCACHE_CANNOT_STORE_ENTRY_489=No puede almacenarse la nueva entrada de memoria cach\u00e9 en la memoria cach\u00e9 de entradas del sistema de archivos
SEVERE_ERR_FSCACHE_CANNOT_RETRIEVE_ENTRY_490=No puede recuperarse una entrada de memoria cach\u00e9 existente desde la memoria cach\u00e9 de entradas del sistema de archivos
-SEVERE_ERR_FSCACHE_CANNOT_SET_JE_MEMORY_PCT_491=Se ha producido un error interno al tratar de definir el tama\u00f1o de memoria cach\u00e9 interna del backend de memoria cach\u00e9 de entradas como un porcentaje. En su lugar, se emplear\u00e1 el valor predeterminado o previo
-SEVERE_ERR_FSCACHE_CANNOT_SET_JE_MEMORY_SIZE_492=Se ha producido un error interno al tratar de definir el tama\u00f1o de memoria cach\u00e9 interna del backend de memoria cach\u00e9 de entradas en bytes. En su lugar, se emplear\u00e1 el valor predeterminado o previo
+SEVERE_ERR_FSCACHE_CANNOT_SET_JE_MEMORY_PCT_491=Se ha producido un error interno al tratar de definir el tama\u00f1o de memoria cach\u00e9 interna del backend de memoria cach\u00e9 de entradas como un porcentaje. En su lugar, se emplear\u00e1 el valor predeterminado o previo
+SEVERE_ERR_FSCACHE_CANNOT_SET_JE_MEMORY_SIZE_492=Se ha producido un error interno al tratar de definir el tama\u00f1o de memoria cach\u00e9 interna del backend de memoria cach\u00e9 de entradas en bytes. En su lugar, se emplear\u00e1 el valor predeterminado o previo
SEVERE_ERR_FSCACHE_CANNOT_SET_JE_PROPERTIES_493=Se ha producido un error interno al tratar de establecer las propiedades Berkeley DB JE del backend de memoria cach\u00e9 de entradas: %s
FATAL_ERR_FSCACHE_HOMELESS_494=Se ha producido un error grave al tratar de configurar el inicio de memoria cach\u00e9 de entradas del sistema de archivos No pudo encontrarse una ruta adecuada para alojar el inicio de memoria cach\u00e9
SEVERE_WARN_FSCACHE_SET_PERMISSIONS_FAILED_495=No pueden definirse permisos de archivo para el directorio de bases de datos del backend de memoria cach\u00e9 de entradas del sistema de archivos %s
-SEVERE_WARN_FSCACHE_OFFLINE_STATE_FAIL_496=El estado de fuera de l\u00ednea actual del backend %s no coincide con el \u00faltimo estado de fuera de l\u00ednea registrado de la memoria cach\u00e9 persistente. Quedan descartados todos los datos de memoria cach\u00e9 para este backend
+SEVERE_WARN_FSCACHE_OFFLINE_STATE_FAIL_496=El estado de fuera de l\u00ednea actual del backend %s no coincide con el \u00faltimo estado de fuera de l\u00ednea registrado de la memoria cach\u00e9 persistente. Quedan descartados todos los datos de memoria cach\u00e9 para este backend
NOTICE_FSCACHE_RESTORE_REPORT_497=Restauradas %d entradas de cach\u00e9 persistente en la cach\u00e9 de entradas
NOTICE_FSCACHE_SAVE_REPORT_498=%d entradas de cach\u00e9 se han hecho persistentes
NOTICE_FSCACHE_INDEX_NOT_FOUND_499=No se puede encontrar ning\u00fan estado de cach\u00e9 persistente anterior. Empezando con una cach\u00e9 vac\u00eda
@@ -507,7 +507,7 @@
SEVERE_WARN_SATUACM_ATTR_UNINDEXED_568=El asignador de certificados de atributo de sujeto a atributo de usuario definido en la entrada de configuraci\u00f3n %s hace referencia al tipo de atributo %s que no tiene un \u00edndice de igualdad definido en el backend %s
SEVERE_ERR_SDTUACM_ATTR_UNINDEXED_569=El asignador de certificados de ND de sujeto a atributo de usuario definido en la entrada de configuraci\u00f3n %s hace referencia al tipo de atributo %s que no tiene un \u00edndice de igualdad definido en el backend %s
SEVERE_ERR_SASLDIGESTMD5_PROTOCOL_ERROR_570=Error de protocolo de SASL DIGEST MD5: %s
-NOTICE_LOG_EXTENSION_INFORMATION_571=Extensi\u00f3n cargada desde el archivo '%s' (versi\u00f3n %s, revisi\u00f3n %s)
+NOTICE_LOG_EXTENSION_INFORMATION_571=Extensi\u00f3n cargada desde el archivo '%s' (versi\u00f3n %s, revisi\u00f3n %s)
SEVERE_ERR_SASL_CREATE_SASL_SERVER_FAILED_572=Se produjo un error al crear un servidor SASL para el mecanismo SASL %s mediante un servidor FQDN de: %s
SEVERE_ERR_SASL_GSSAPI_KEYTAB_INVALID_573=No pudo realizarse la inicializaci\u00f3n del controlador del mecanismo GSSAPI SASL porque el archivo keytab %s no existe
INFO_GSSAPI_STARTED_574=La inicializaci\u00f3n del controlador del mecanismo GSSAPI (SASL) se realiz\u00f3 correctamente
@@ -515,4 +515,8 @@
MILD_ERR_COLLECTIVEATTRIBUTESUBENTRIES_VATTR_NOT_SEARCHABLE_576=El atributo %s no permite su b\u00fasqueda y no se deber\u00eda incluir en filtros de b\u00fasqueda no indizados
MILD_ERR_PASSWORDPOLICYSUBENTRY_VATTR_NOT_SEARCHABLE_577=El atributo %s no permite su b\u00fasqueda y no se deber\u00eda incluir en filtros de b\u00fasqueda no indizados
MILD_ERR_STATICMEMBERS_CANNOT_DECODE_DN_582=Se produjo un error al intentar analizar el ND del miembro %s del grupo est\u00e1tico %s: %s
+MILD_ERR_FIRSTCHANGENUMBER_VATTR_NOT_SEARCHABLE_625=El atributo %s no permite su b\u00fasqueda y no se deber\u00eda incluir en filtros de b\u00fasqueda no indizados
+MILD_ERR_LASTCHANGENUMBER_VATTR_NOT_SEARCHABLE_626=El atributo %s no permite su b\u00fasqueda y no se deber\u00eda incluir en filtros de b\u00fasqueda no indizados
+MILD_ERR_LASTCOOKIE_VATTR_NOT_SEARCHABLE_627=El atributo %s no permite su b\u00fasqueda y no se deber\u00eda incluir en filtros de b\u00fasqueda no indizados
+MILD_ERR_CHANGELOGBASEDN_VATTR_NOT_SEARCHABLE_628=El atributo %s no permite su b\u00fasqueda y no se deber\u00eda incluir en filtros de b\u00fasqueda no indizados
diff --git a/opends/src/messages/messages/extension_fr.properties b/opends/src/messages/messages/extension_fr.properties
index f2d3297..83aa010 100644
--- a/opends/src/messages/messages/extension_fr.properties
+++ b/opends/src/messages/messages/extension_fr.properties
@@ -294,7 +294,7 @@
INFO_RANDOMPWGEN_DESCRIPTION_PWFORMAT_344=Format \u00e0 utiliser pour les mots de passe construits par ce g\u00e9n\u00e9rateur de mots de passe. La valeur doit \u00eatre une s\u00e9quence d'\u00e9l\u00e9ments d\u00e9limit\u00e9e par des virgules, dont chaque \u00e9l\u00e9ment est le nom du jeu de caract\u00e8res suivi d'une virgule et du nombre de caract\u00e8res choisi de mani\u00e8re al\u00e9atoire dans le jeu de caract\u00e8res. Les modifications apport\u00e9es \u00e0 cette configuration seront imm\u00e9diatement prises en compte
MILD_ERR_RANDOMPWGEN_NO_PWFORMAT_345=L'entr\u00e9e de configuration "%s" ne contient pas l'attribut ds-cfg-password-format qui sp\u00e9cifie le format \u00e0 utiliser pour le mot de passe g\u00e9n\u00e9r\u00e9. Cet argument est obligatoire
MILD_ERR_RANDOMPWGEN_UNKNOWN_CHARSET_346=La cha\u00eene de format de mot de passe "%s" r\u00e9f\u00e9rence un jeu de caract\u00e8re non d\u00e9fini "%s"
-MILD_ERR_RANDOMPWGEN_INVALID_PWFORMAT_347=La cha\u00eene de format de mot de passe "%s" contient une syntaxe non valide. La valeur doit \u00eatre une s\u00e9quence d'\u00e9l\u00e9ments d\u00e9limit\u00e9e par des virgules, dont chaque \u00e9l\u00e9ment est le nom du jeu de caract\u00e8res suivi d'une virgule et du nombre de caract\u00e8res choisi de mani\u00e8re al\u00e9atoire dans ce jeu de caract\u00e8res.
+MILD_ERR_RANDOMPWGEN_INVALID_PWFORMAT_347=La cha\u00eene de format de mot de passe "%s" contient une syntaxe non valide. La valeur doit \u00eatre une s\u00e9quence d'\u00e9l\u00e9ments d\u00e9limit\u00e9e par des virgules, dont chaque \u00e9l\u00e9ment est le nom du jeu de caract\u00e8res suivi d'une virgule et du nombre de caract\u00e8res choisi de mani\u00e8re al\u00e9atoire dans ce jeu de caract\u00e8res.
MILD_ERR_RANDOMPWGEN_CANNOT_DETERMINE_PWFORMAT_348=Une erreur s'est produite lors du d\u00e9codage de la valeur de l'attribut de configuration ds-cfg-password-format sp\u00e9cifiant le format des mots de passe g\u00e9n\u00e9r\u00e9s : %s
INFO_SASLGSSAPI_DESCRIPTION_IDENTITY_MAPPER_DN_349=Le DN de l'entr\u00e9e de configuration contenant la configuration du mappeur d'identit\u00e9 \u00e0 utiliser pour mapper le nom GSSAPI principal \u00e0 une entr\u00e9e d'utilisateur Directory Server. Les modifications apport\u00e9es \u00e0 cette configuration seront imm\u00e9diatement prises en compte
MILD_ERR_SASLGSSAPI_NO_IDENTITY_MAPPER_ATTR_350=L'entr\u00e9e de configuration %s ne contient pas l'attribut ds-cfg-identity-mapper sp\u00e9cifiant le DN du mappeur d'identit\u00e9 \u00e0 utiliser conjointement au m\u00e9canisme GSSAPI SASL. Cet argument est obligatoire
@@ -415,7 +415,7 @@
MILD_ERR_CHARSET_VALIDATOR_DUPLICATE_CHAR_469=La d\u00e9finition du jeu de caract\u00e8res '%s' fournie n'est pas valide car elle contient le caract\u00e8re '%s' qui a d\u00e9j\u00e0 \u00e9t\u00e9 utilis\u00e9
MILD_ERR_VIRTUAL_STATIC_GROUP_MULTIPLE_TARGETS_470=Le groupe statique virtuel d\u00e9fini dans l'entr\u00e9e %s contient plusieurs DN de groupe cible, alors qu'un seul est autoris\u00e9
MILD_ERR_VIRTUAL_STATIC_GROUP_CANNOT_DECODE_TARGET_471=Impossible de d\u00e9coder "%s" comme DN cible pour le groupe %s\u00a0: %s
-MILD_ERR_VIRTUAL_STATIC_GROUP_NO_TARGET_472=Le groupe statique virtuel d\u00e9fini dans l'entr\u00e9e %s ne contient pas de d\u00e9finition de groupe cible
+MILD_ERR_VIRTUAL_STATIC_GROUP_NO_TARGET_472=Le groupe statique virtuel d\u00e9fini dans l'entr\u00e9e %s ne contient pas de d\u00e9finition de groupe cible
MILD_ERR_VIRTUAL_STATIC_GROUP_NESTING_NOT_SUPPORTED_473=Les groupes statiques virtuels ne prennent pas en charge l'imbrication
MILD_ERR_VIRTUAL_STATIC_GROUP_NO_TARGET_GROUP_474=Le groupe cible %s r\u00e9f\u00e9renc\u00e9 par le groupe statique virtuel %s n'existe pas
MILD_ERR_VIRTUAL_STATIC_GROUP_ALTERING_MEMBERS_NOT_SUPPORTED_475=La modification de l'adh\u00e9sion au groupe statique virtuel %s n'est pas autoris\u00e9e
@@ -482,10 +482,10 @@
MILD_ERR_SMTP_ASNH_NO_MAIL_SERVERS_CONFIGURED_543=Impossible d'activer le gestionnaire de notification de statut de compte SMTP d\u00e9fini dans l'entr\u00e9e de configuration %s sauf si Directory Server poss\u00e8de des information sur un ou plusieurs serveurs SMTP
MILD_ERR_SMTP_ASNH_NO_RECIPIENTS_544=L'entr\u00e9e de configuration du gestionnaire de notification de statut de compte SMTP '%s' ne comporte aucun type d'attribut d'adresse e-mail ou d'adresses de destinataires. Au moins l'un de ces \u00e9l\u00e9ments doit \u00eatre fourni
MILD_ERR_SMTP_ASNH_SUBJECT_NO_COLON_545=Impossible d'analyser la valeur de l'objet du message '%s' de l'entr\u00e9e de configuration '%s' car elle ne contient pas de deux-points pour d\u00e9limiter le type de notification de l'objet
-MILD_ERR_SMTP_ASNH_SUBJECT_INVALID_NOTIFICATION_TYPE_546=Impossible d'analyser la valeur de l'objet du message '%s' de l'entr\u00e9e de configuration '%s' car '%s' n'est pas un type de notification de statut de compte valide
+MILD_ERR_SMTP_ASNH_SUBJECT_INVALID_NOTIFICATION_TYPE_546=Impossible d'analyser la valeur de l'objet du message '%s' de l'entr\u00e9e de configuration '%s' car '%s' n'est pas un type de notification de statut de compte valide
MILD_ERR_SMTP_ASNH_SUBJECT_DUPLICATE_TYPE_547=Plusieurs objets sont d\u00e9finis pour le type de notification %s dans les d\u00e9finitions d'objet de message contenues dans l'entr\u00e9e de configuration '%s'
MILD_ERR_SMTP_ASNH_TEMPLATE_NO_COLON_548=Impossible d'analyser la valeur du chemin du fichier de mod\u00e8le '%s' de l'entr\u00e9e de configuration '%s' car elle ne contient pas de virgule pour d\u00e9limiter le type de notification de l'objet
-MILD_ERR_SMTP_ASNH_TEMPLATE_INVALID_NOTIFICATION_TYPE_549=Impossible d'analyser la valeur du chemin du fichier de mod\u00e8le '%s' de l'entr\u00e9e de configuration '%s' car '%s' n'est pas un type de notification de statut de compte valide
+MILD_ERR_SMTP_ASNH_TEMPLATE_INVALID_NOTIFICATION_TYPE_549=Impossible d'analyser la valeur du chemin du fichier de mod\u00e8le '%s' de l'entr\u00e9e de configuration '%s' car '%s' n'est pas un type de notification de statut de compte valide
MILD_ERR_SMTP_ASNH_TEMPLATE_DUPLICATE_TYPE_550=Il existe plusieurs chemins de fichier de mod\u00e8le pour le type de notification %s dans les d\u00e9finitions de chemin de fichier de mod\u00e8le de message contenues dans l'entr\u00e9e de configuration '%s'
MILD_ERR_SMTP_ASNH_TEMPLATE_NO_SUCH_FILE_551=Le fichier de mod\u00e8le de message '%s' r\u00e9f\u00e9renc\u00e9 dans l'entr\u00e9e de configuration '%s' n'existe pas
MILD_ERR_SMTP_ASNH_TEMPLATE_UNCLOSED_TOKEN_552=Un jeton non ferm\u00e9 d\u00e9marrant \u00e0 la colonne %d de la ligne %d a \u00e9t\u00e9 trouv\u00e9
@@ -510,9 +510,13 @@
NOTICE_LOG_EXTENSION_INFORMATION_571=Charg\u00e9 l'extension \u00e0 partir du fichier '%s' (version %s, r\u00e9vision %s)
SEVERE_ERR_SASL_CREATE_SASL_SERVER_FAILED_572=\u00c9chec de cr\u00e9ation de serveurSASL pour le m\u00e9canisme SASL %s utilisant un FQDN de serveur de %s
SEVERE_ERR_SASL_GSSAPI_KEYTAB_INVALID_573=L'initialisation du gestionnaire du m\u00e9canisme SASL GSSAPI a \u00e9chou\u00e9 car le fichier keytab %s n'existe pas
-INFO_GSSAPI_STARTED_574=Initialisation du gestionnaire de m\u00e9canisme SASL GSSAPI
+INFO_GSSAPI_STARTED_574=Initialisation du gestionnaire de m\u00e9canisme SASL GSSAPI
INFO_GSSAPI_STOPPED_575=Le gestionnaire de m\u00e9canisme SASL GSSAPI s'est arr\u00eat\u00e9
MILD_ERR_COLLECTIVEATTRIBUTESUBENTRIES_VATTR_NOT_SEARCHABLE_576=L'attribut %s ne peut pas faire l'objet d'une recherche et ne doit pas \u00eatre inclus dans des filtres de recherche non index\u00e9s
MILD_ERR_PASSWORDPOLICYSUBENTRY_VATTR_NOT_SEARCHABLE_577=L'attribut %s ne peut pas faire l'objet d'une recherche et ne doit pas \u00eatre inclus dans des filtres de recherche non index\u00e9s
MILD_ERR_PWSCHEME_INVALID_BASE64_DECODED_STORED_PASSWORD_578=La valeur du mot de passe %s a \u00e9t\u00e9 d\u00e9cod\u00e9 en base64, mais est trop courte pour \u00eatre valide
MILD_ERR_STATICMEMBERS_CANNOT_DECODE_DN_582=Une erreur s'est produite lors du d\u00e9codage du DN %s, membre du groupe statique %s\u00a0: %s
+MILD_ERR_FIRSTCHANGENUMBER_NOT_SEARCHABLE_625=L'attribut %s ne peut pas faire l'objet d'une recherche et ne doit pas \u00eatre inclus dans des filtres de recherche non index\u00e9s
+MILD_ERR_LASTCHANGENUNBER_NOT_SEARCHABLE_626=L'attribut %s ne peut pas faire l'objet d'une recherche et ne doit pas \u00eatre inclus dans des filtres de recherche non index\u00e9s
+MILD_ERR_LASTCOOKIE_NOT_SEARCHABLE_627=L'attribut %s ne peut pas faire l'objet d'une recherche et ne doit pas \u00eatre inclus dans des filtres de recherche non index\u00e9s
+MILD_ERR_CHANGELOGBASEDN_NOT_SEARCHABLE_628=L'attribut %s ne peut pas faire l'objet d'une recherche et ne doit pas \u00eatre inclus dans des filtres de recherche non index\u00e9s
diff --git a/opends/src/messages/messages/extension_ja.properties b/opends/src/messages/messages/extension_ja.properties
index 2952867..1f63942 100644
--- a/opends/src/messages/messages/extension_ja.properties
+++ b/opends/src/messages/messages/extension_ja.properties
@@ -529,3 +529,7 @@
INFO_GSSAPI_STOPPED_575=GSSAPI SASL \u30e1\u30ab\u30cb\u30ba\u30e0\u30cf\u30f3\u30c9\u30e9\u304c\u505c\u6b62\u3057\u307e\u3057\u305f
MILD_ERR_COLLECTIVEATTRIBUTESUBENTRIES_VATTR_NOT_SEARCHABLE_576=%s \u5c5e\u6027\u306f\u691c\u7d22\u53ef\u80fd\u3067\u306a\u3044\u305f\u3081\u3001\u307b\u304b\u306e\u65b9\u6cd5\u3067\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u304c\u6307\u5b9a\u3055\u308c\u3066\u3044\u306a\u3044\u691c\u7d22\u30d5\u30a3\u30eb\u30bf\u306b\u306f\u542b\u3081\u306a\u3044\u3067\u304f\u3060\u3055\u3044
MILD_ERR_PASSWORDPOLICYSUBENTRY_VATTR_NOT_SEARCHABLE_577=%s \u5c5e\u6027\u306f\u691c\u7d22\u53ef\u80fd\u3067\u306a\u3044\u305f\u3081\u3001\u307b\u304b\u306e\u65b9\u6cd5\u3067\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u304c\u6307\u5b9a\u3055\u308c\u3066\u3044\u306a\u3044\u691c\u7d22\u30d5\u30a3\u30eb\u30bf\u306b\u306f\u542b\u3081\u306a\u3044\u3067\u304f\u3060\u3055\u3044
+MILD_ERR_FIRSTCHANGENUMBER_VATTR_NOT_SEARCHABLE_625=%s \u5c5e\u6027\u306f\u691c\u7d22\u53ef\u80fd\u3067\u306a\u3044\u305f\u3081\u3001\u307b\u304b\u306e\u65b9\u6cd5\u3067\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u304c\u6307\u5b9a\u3055\u308c\u3066\u3044\u306a\u3044\u691c\u7d22\u30d5\u30a3\u30eb\u30bf\u306b\u306f\u542b\u3081\u306a\u3044\u3067\u304f\u3060\u3055\u3044
+MILD_ERR_LASTCHANGENUMBER_VATTR_NOT_SEARCHABLE_626=%s \u5c5e\u6027\u306f\u691c\u7d22\u53ef\u80fd\u3067\u306a\u3044\u305f\u3081\u3001\u307b\u304b\u306e\u65b9\u6cd5\u3067\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u304c\u6307\u5b9a\u3055\u308c\u3066\u3044\u306a\u3044\u691c\u7d22\u30d5\u30a3\u30eb\u30bf\u306b\u306f\u542b\u3081\u306a\u3044\u3067\u304f\u3060\u3055\u3044
+MILD_ERR_LASTCOOKIE_VATTR_NOT_SEARCHABLE_627=%s \u5c5e\u6027\u306f\u691c\u7d22\u53ef\u80fd\u3067\u306a\u3044\u305f\u3081\u3001\u307b\u304b\u306e\u65b9\u6cd5\u3067\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u304c\u6307\u5b9a\u3055\u308c\u3066\u3044\u306a\u3044\u691c\u7d22\u30d5\u30a3\u30eb\u30bf\u306b\u306f\u542b\u3081\u306a\u3044\u3067\u304f\u3060\u3055\u3044
+MILD_ERR_CHANGELOGBASEDN_VATTR_NOT_SEARCHABLE_628=%s \u5c5e\u6027\u306f\u691c\u7d22\u53ef\u80fd\u3067\u306a\u3044\u305f\u3081\u3001\u307b\u304b\u306e\u65b9\u6cd5\u3067\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u304c\u6307\u5b9a\u3055\u308c\u3066\u3044\u306a\u3044\u691c\u7d22\u30d5\u30a3\u30eb\u30bf\u306b\u306f\u542b\u3081\u306a\u3044\u3067\u304f\u3060\u3055\u3044
diff --git a/opends/src/messages/messages/extension_ko.properties b/opends/src/messages/messages/extension_ko.properties
index cbdfa9d..b5c629e 100644
--- a/opends/src/messages/messages/extension_ko.properties
+++ b/opends/src/messages/messages/extension_ko.properties
@@ -521,3 +521,9 @@
SEVERE_ERR_FCM_ATTR_UNINDEXED_567=\uad6c\uc131 \ud56d\ubaa9 %1$s\uc5d0 \uc815\uc758\ub41c \uc9c0\ubb38 \uc778\uc99d\uc11c \ub9e4\ud37c\uac00 \ubc31\uc5d4\ub4dc %3$s\uc5d0 \ub3d9\uc77c \uc0c9\uc778\uc774 \uc815\uc758\ub418\uc5b4 \uc788\uc9c0 \uc54a\uc740 \uc18d\uc131 \uc720\ud615 %2$s\uc744(\ub97c) \ucc38\uc870\ud569\ub2c8\ub2e4.
SEVERE_WARN_SATUACM_ATTR_UNINDEXED_568=\uad6c\uc131 \ud56d\ubaa9 %1$s\uc5d0 \uc815\uc758\ub41c \uc8fc\uc81c \uc18d\uc131-\uc0ac\uc6a9\uc790 \uc18d\uc131 \uc778\uc99d\uc11c \ub9e4\ud37c\uac00 \ubc31\uc5d4\ub4dc %3$s\uc5d0 \ub3d9\uc77c \uc0c9\uc778\uc774 \uc815\uc758\ub418\uc5b4 \uc788\uc9c0 \uc54a\uc740 \uc18d\uc131 \uc720\ud615 %2$s\uc744(\ub97c) \ucc38\uc870\ud569\ub2c8\ub2e4.
SEVERE_ERR_SDTUACM_ATTR_UNINDEXED_569=\uad6c\uc131 \ud56d\ubaa9 %1$s\uc5d0 \uc815\uc758\ub41c \uc8fc\uc81c DN-\uc0ac\uc6a9\uc790 \uc18d\uc131 \uc778\uc99d\uc11c \ub9e4\ud37c\uac00 \ubc31\uc5d4\ub4dc %3$s\uc5d0 \ub3d9\uc77c \uc0c9\uc778\uc774 \uc815\uc758\ub418\uc5b4 \uc788\uc9c0 \uc54a\uc740 \uc18d\uc131 \uc720\ud615 %2$s\uc744(\ub97c) \ucc38\uc870\ud569\ub2c8\ub2e4.
+MILD_ERR_COLLECTIVEATTRIBUTESUBENTRIES_VATTR_NOT_SEARCHABLE_576=%s \uc18d\uc131\uc740 \uac80\uc0c9\ud560 \uc218 \uc5c6\uc73c\uba70 \uc0c9\uc778\ud654\ub418\uc9c0 \uc54a\uc740 \uac80\uc0c9 \ud544\ud130\uc5d0 \ud3ec\ud568\ub418\uc5b4\uc11c\ub294 \uc548 \ub429\ub2c8\ub2e4.
+MILD_ERR_PASSWORDPOLICYSUBENTRY_VATTR_NOT_SEARCHABLE_577=%s \uc18d\uc131\uc740 \uac80\uc0c9\ud560 \uc218 \uc5c6\uc73c\uba70 \uc0c9\uc778\ud654\ub418\uc9c0 \uc54a\uc740 \uac80\uc0c9 \ud544\ud130\uc5d0 \ud3ec\ud568\ub418\uc5b4\uc11c\ub294 \uc548 \ub429\ub2c8\ub2e4.
+MILD_ERR_FIRSTCHANGENUMBER_VATTR_NOT_SEARCHABLE_625=%s \uc18d\uc131\uc740 \uac80\uc0c9\ud560 \uc218 \uc5c6\uc73c\uba70 \uc0c9\uc778\ud654\ub418\uc9c0 \uc54a\uc740 \uac80\uc0c9 \ud544\ud130\uc5d0 \ud3ec\ud568\ub418\uc5b4\uc11c\ub294 \uc548 \ub429\ub2c8\ub2e4.
+MILD_ERR_LASTCHANGENUMBER_VATTR_NOT_SEARCHABLE_626=%s \uc18d\uc131\uc740 \uac80\uc0c9\ud560 \uc218 \uc5c6\uc73c\uba70 \uc0c9\uc778\ud654\ub418\uc9c0 \uc54a\uc740 \uac80\uc0c9 \ud544\ud130\uc5d0 \ud3ec\ud568\ub418\uc5b4\uc11c\ub294 \uc548 \ub429\ub2c8\ub2e4.
+MILD_ERR_LASTCOOKIE_VATTR_NOT_SEARCHABLE_627=%s \uc18d\uc131\uc740 \uac80\uc0c9\ud560 \uc218 \uc5c6\uc73c\uba70 \uc0c9\uc778\ud654\ub418\uc9c0 \uc54a\uc740 \uac80\uc0c9 \ud544\ud130\uc5d0 \ud3ec\ud568\ub418\uc5b4\uc11c\ub294 \uc548 \ub429\ub2c8\ub2e4.
+MILD_ERR_CHANGELOGBASEDN_VATTR_NOT_SEARCHABLE_628=%s \uc18d\uc131\uc740 \uac80\uc0c9\ud560 \uc218 \uc5c6\uc73c\uba70 \uc0c9\uc778\ud654\ub418\uc9c0 \uc54a\uc740 \uac80\uc0c9 \ud544\ud130\uc5d0 \ud3ec\ud568\ub418\uc5b4\uc11c\ub294 \uc548 \ub429\ub2c8\ub2e4.
diff --git a/opends/src/messages/messages/extension_zh_CN.properties b/opends/src/messages/messages/extension_zh_CN.properties
index 4d189eb..11726df 100644
--- a/opends/src/messages/messages/extension_zh_CN.properties
+++ b/opends/src/messages/messages/extension_zh_CN.properties
@@ -529,3 +529,7 @@
INFO_GSSAPI_STOPPED_575=GSSAPI SASL \u673a\u5236\u5904\u7406\u7a0b\u5e8f\u5df2\u505c\u6b62
MILD_ERR_COLLECTIVEATTRIBUTESUBENTRIES_VATTR_NOT_SEARCHABLE_576=\u65e0\u6cd5\u641c\u7d22 %s \u5c5e\u6027\uff0c\u5e76\u4e14\u4e0d\u5e94\u5c06\u5176\u5305\u542b\u5728\u5176\u4ed6\u672a\u7f16\u5165\u7d22\u5f15\u7684\u641c\u7d22\u8fc7\u6ee4\u5668\u4e2d
MILD_ERR_PASSWORDPOLICYSUBENTRY_VATTR_NOT_SEARCHABLE_577=\u65e0\u6cd5\u641c\u7d22 %s \u5c5e\u6027\uff0c\u5e76\u4e14\u4e0d\u5e94\u5c06\u5176\u5305\u542b\u5728\u5176\u4ed6\u672a\u7f16\u5165\u7d22\u5f15\u7684\u641c\u7d22\u8fc7\u6ee4\u5668\u4e2d
+MILD_ERR_FIRSTCHANGENUMBER_VATTR_NOT_SEARCHABLE_625=\u65e0\u6cd5\u641c\u7d22 %s \u5c5e\u6027\uff0c\u5e76\u4e14\u4e0d\u5e94\u5c06\u5176\u5305\u542b\u5728\u5176\u4ed6\u672a\u7f16\u5165\u7d22\u5f15\u7684\u641c\u7d22\u8fc7\u6ee4\u5668\u4e2d
+MILD_ERR_LASTCHANGENUMBER_VATTR_NOT_SEARCHABLE_626=\u65e0\u6cd5\u641c\u7d22 %s \u5c5e\u6027\uff0c\u5e76\u4e14\u4e0d\u5e94\u5c06\u5176\u5305\u542b\u5728\u5176\u4ed6\u672a\u7f16\u5165\u7d22\u5f15\u7684\u641c\u7d22\u8fc7\u6ee4\u5668\u4e2d
+MILD_ERR_LASTCOOKIE_VATTR_NOT_SEARCHABLE_627=\u65e0\u6cd5\u641c\u7d22 %s \u5c5e\u6027\uff0c\u5e76\u4e14\u4e0d\u5e94\u5c06\u5176\u5305\u542b\u5728\u5176\u4ed6\u672a\u7f16\u5165\u7d22\u5f15\u7684\u641c\u7d22\u8fc7\u6ee4\u5668\u4e2d
+MILD_ERR_CHANGELOGBASEDN_VATTR_NOT_SEARCHABLE_628=\u65e0\u6cd5\u641c\u7d22 %s \u5c5e\u6027\uff0c\u5e76\u4e14\u4e0d\u5e94\u5c06\u5176\u5305\u542b\u5728\u5176\u4ed6\u672a\u7f16\u5165\u7d22\u5f15\u7684\u641c\u7d22\u8fc7\u6ee4\u5668\u4e2d
diff --git a/opends/src/messages/messages/extension_zh_TW.properties b/opends/src/messages/messages/extension_zh_TW.properties
index 147cbcd..dad5bf4 100644
--- a/opends/src/messages/messages/extension_zh_TW.properties
+++ b/opends/src/messages/messages/extension_zh_TW.properties
@@ -521,3 +521,9 @@
SEVERE_ERR_FCM_ATTR_UNINDEXED_567=\u914d\u7f6e\u9805\u76ee %s \u4e2d\u5b9a\u7fa9\u7684\u6307\u7d0b\u6191\u8b49\u5c0d\u6620\u5668\u53c3\u7167\u5c6c\u6027\u985e\u578b %s\uff0c\u800c\u6b64\u5c6c\u6027\u985e\u578b\u6c92\u6709\u5728\u5f8c\u7aef %s \u4e2d\u5b9a\u7fa9\u7684\u76f8\u7b49\u7d22\u5f15
SEVERE_WARN_SATUACM_ATTR_UNINDEXED_568=\u914d\u7f6e\u9805\u76ee %s \u4e2d\u5b9a\u7fa9\u4e4b\u4f7f\u7528\u8005\u5c6c\u6027\u6191\u8b49\u5c0d\u6620\u5668\u7684\u4e3b\u9ad4\u5c6c\u6027\u53c3\u7167\u5c6c\u6027\u985e\u578b %s\uff0c\u800c\u6b64\u5c6c\u6027\u985e\u578b\u6c92\u6709\u5728\u5f8c\u7aef %s \u4e2d\u5b9a\u7fa9\u7684\u76f8\u7b49\u7d22\u5f15
SEVERE_ERR_SDTUACM_ATTR_UNINDEXED_569=\u914d\u7f6e\u9805\u76ee %s \u4e2d\u5b9a\u7fa9\u4e4b\u4f7f\u7528\u8005\u5c6c\u6027\u6191\u8b49\u5c0d\u6620\u5668\u7684\u4e3b\u9ad4 DN \u53c3\u7167\u5c6c\u6027\u985e\u578b %s\uff0c\u800c\u6b64\u5c6c\u6027\u985e\u578b\u6c92\u6709\u5728\u5f8c\u7aef %s \u4e2d\u5b9a\u7fa9\u7684\u76f8\u7b49\u7d22\u5f15
+MILD_ERR_COLLECTIVEATTRIBUTESUBENTRIES_VATTR_NOT_SEARCHABLE_576=%s \u5c6c\u6027\u7121\u6cd5\u9032\u884c\u641c\u5c0b\uff0c\u4e14\u4e0d\u8a72\u5305\u542b\u65bc\u672a\u7d22\u5f15\u7684\u641c\u5c0b\u7be9\u9078\u5668\u4e2d
+MILD_ERR_PASSWORDPOLICYSUBENTRY_VATTR_NOT_SEARCHABLE_577=%s \u5c6c\u6027\u7121\u6cd5\u9032\u884c\u641c\u5c0b\uff0c\u4e14\u4e0d\u8a72\u5305\u542b\u65bc\u672a\u7d22\u5f15\u7684\u641c\u5c0b\u7be9\u9078\u5668\u4e2d
+MILD_ERR_FIRSTCHANGENUMBER_VATTR_NOT_SEARCHABLE_625=%s \u5c6c\u6027\u7121\u6cd5\u9032\u884c\u641c\u5c0b\uff0c\u4e14\u4e0d\u8a72\u5305\u542b\u65bc\u672a\u7d22\u5f15\u7684\u641c\u5c0b\u7be9\u9078\u5668\u4e2d
+MILD_ERR_LASTCHANGENUMBER_VATTR_NOT_SEARCHABLE_626=%s \u5c6c\u6027\u7121\u6cd5\u9032\u884c\u641c\u5c0b\uff0c\u4e14\u4e0d\u8a72\u5305\u542b\u65bc\u672a\u7d22\u5f15\u7684\u641c\u5c0b\u7be9\u9078\u5668\u4e2d
+MILD_ERR_LASTCOOKIE_VATTR_NOT_SEARCHABLE_627=%s \u5c6c\u6027\u7121\u6cd5\u9032\u884c\u641c\u5c0b\uff0c\u4e14\u4e0d\u8a72\u5305\u542b\u65bc\u672a\u7d22\u5f15\u7684\u641c\u5c0b\u7be9\u9078\u5668\u4e2d
+MILD_ERR_CHANGELOGBASEDN_VATTR_NOT_SEARCHABLE_628=%s \u5c6c\u6027\u7121\u6cd5\u9032\u884c\u641c\u5c0b\uff0c\u4e14\u4e0d\u8a72\u5305\u542b\u65bc\u672a\u7d22\u5f15\u7684\u641c\u5c0b\u7be9\u9078\u5668\u4e2d
diff --git a/opends/src/server/org/opends/server/api/VirtualAttributeProvider.java b/opends/src/server/org/opends/server/api/VirtualAttributeProvider.java
index 65bbe41..8e9fbfe 100644
--- a/opends/src/server/org/opends/server/api/VirtualAttributeProvider.java
+++ b/opends/src/server/org/opends/server/api/VirtualAttributeProvider.java
@@ -23,6 +23,7 @@
*
*
* Copyright 2006-2009 Sun Microsystems, Inc.
+ * Portions Copyright 2012 ForgeRock AS
*/
package org.opends.server.api;
import org.opends.messages.Message;
@@ -633,18 +634,19 @@
* Indicates whether this attribute may be included in search
* filters as part of the criteria for locating entries.
*
- * @param rule The virtual attribute rule which defines
- * the constraints for the virtual
- * attribute.
- * @param searchOperation The search operation for which to make
- * the determination.
- *
- * @return {@code true} if this attribute may be included in search
- * filters, or {@code false} if not.
+ * @param rule The virtual attribute rule which defines
+ * the constraints for the virtual
+ * attribute.
+ * @param searchOperation The search operation for which to make
+ * the determination.
+ * @param isPreIndexed Indicates if we expect the search on the virtual
+ * attribute to be faster than an index search.
+ * @return {@code true} if this attribute may be included in search
+ * filters, or {@code false} if not.
*/
public abstract boolean isSearchable(VirtualAttributeRule rule,
- SearchOperation
- searchOperation);
+ SearchOperation searchOperation,
+ boolean isPreIndexed);
diff --git a/opends/src/server/org/opends/server/backends/jeb/EntryContainer.java b/opends/src/server/org/opends/server/backends/jeb/EntryContainer.java
index 20e47d8..77c46fb 100644
--- a/opends/src/server/org/opends/server/backends/jeb/EntryContainer.java
+++ b/opends/src/server/org/opends/server/backends/jeb/EntryContainer.java
@@ -23,7 +23,7 @@
*
*
* Copyright 2006-2010 Sun Microsystems, Inc.
- * Portions Copyright 2011 ForgeRock AS
+ * Portions Copyright 2011-2012 ForgeRock AS
*/
package org.opends.server.backends.jeb;
import org.opends.messages.Message;
@@ -890,7 +890,7 @@
public void search(SearchOperation searchOperation)
throws DirectoryException, DatabaseException, CanceledOperationException
{
- DN baseDN = searchOperation.getBaseDN();
+ DN aBaseDN = searchOperation.getBaseDN();
SearchScope searchScope = searchOperation.getScope();
PagedResultsControl pageRequest = searchOperation
@@ -949,7 +949,7 @@
Entry baseEntry = null;
try
{
- baseEntry = getEntry(baseDN);
+ baseEntry = getEntry(aBaseDN);
}
catch (Exception e)
{
@@ -963,10 +963,10 @@
if (baseEntry == null)
{
// Check for referral entries above the base entry.
- dn2uri.targetEntryReferrals(baseDN, searchScope);
+ dn2uri.targetEntryReferrals(aBaseDN, searchScope);
- Message message = ERR_JEB_SEARCH_NO_SUCH_OBJECT.get(baseDN.toString());
- DN matchedDN = getMatchedDN(baseDN);
+ Message message = ERR_JEB_SEARCH_NO_SUCH_OBJECT.get(aBaseDN.toString());
+ DN matchedDN = getMatchedDN(aBaseDN);
throw new DirectoryException(ResultCode.NO_SUCH_OBJECT,
message, matchedDN, null);
}
@@ -1036,6 +1036,16 @@
if(entryIDList == null)
{
+ // See if we could use a virtual attribute rule to process the search.
+ for (VirtualAttributeRule rule : DirectoryServer.getVirtualAttributes())
+ {
+ if (rule.getProvider().isSearchable(rule, searchOperation, true))
+ {
+ rule.getProvider().processSearch(rule, searchOperation);
+ return;
+ }
+ }
+
// Create an index filter to get the search result candidate entries.
IndexFilter indexFilter =
new IndexFilter(this, searchOperation, debugBuffer,
@@ -1049,12 +1059,12 @@
if (entryIDList.size() > IndexFilter.FILTER_CANDIDATE_THRESHOLD)
{
// Read the ID from dn2id.
- EntryID baseID = dn2id.get(null, baseDN, LockMode.DEFAULT);
+ EntryID baseID = dn2id.get(null, aBaseDN, LockMode.DEFAULT);
if (baseID == null)
{
Message message =
- ERR_JEB_SEARCH_NO_SUCH_OBJECT.get(baseDN.toString());
- DN matchedDN = getMatchedDN(baseDN);
+ ERR_JEB_SEARCH_NO_SUCH_OBJECT.get(aBaseDN.toString());
+ DN matchedDN = getMatchedDN(aBaseDN);
throw new DirectoryException(ResultCode.NO_SUCH_OBJECT,
message, matchedDN, null);
}
@@ -1172,7 +1182,7 @@
// See if we could use a virtual attribute rule to process the search.
for (VirtualAttributeRule rule : DirectoryServer.getVirtualAttributes())
{
- if (rule.getProvider().isSearchable(rule, searchOperation))
+ if (rule.getProvider().isSearchable(rule, searchOperation, false))
{
rule.getProvider().processSearch(rule, searchOperation);
return;
@@ -1233,7 +1243,7 @@
throws DirectoryException, CanceledOperationException
{
EntryCache<?> entryCache = DirectoryServer.getEntryCache();
- DN baseDN = searchOperation.getBaseDN();
+ DN aBaseDN = searchOperation.getBaseDN();
SearchScope searchScope = searchOperation.getScope();
boolean manageDsaIT = isManageDsaITOperation(searchOperation);
@@ -1246,7 +1256,7 @@
Entry baseEntry = null;
try
{
- baseEntry = getEntry(baseDN);
+ baseEntry = getEntry(aBaseDN);
}
catch (Exception e)
{
@@ -1260,10 +1270,10 @@
if (baseEntry == null)
{
// Check for referral entries above the base entry.
- dn2uri.targetEntryReferrals(baseDN, searchScope);
+ dn2uri.targetEntryReferrals(aBaseDN, searchScope);
- Message message = ERR_JEB_SEARCH_NO_SUCH_OBJECT.get(baseDN.toString());
- DN matchedDN = getMatchedDN(baseDN);
+ Message message = ERR_JEB_SEARCH_NO_SUCH_OBJECT.get(aBaseDN.toString());
+ DN matchedDN = getMatchedDN(aBaseDN);
throw new DirectoryException(ResultCode.NO_SUCH_OBJECT,
message, matchedDN, null);
}
@@ -1309,7 +1319,7 @@
* "cn=joe,ou=people,dc=example,dc=com" will appear after the entry
* "ou=people,dc=example,dc=com".
*/
- byte[] baseDNKey = JebFormat.dnToDNKey(baseDN,
+ byte[] baseDNKey = JebFormat.dnToDNKey(aBaseDN,
this.baseDN.getNumComponents());
byte[] suffix = Arrays.copyOf(baseDNKey, baseDNKey.length+1);
suffix[suffix.length-1] = 0x00;
@@ -1515,7 +1525,7 @@
{
EntryCache<?> entryCache = DirectoryServer.getEntryCache();
SearchScope searchScope = searchOperation.getScope();
- DN baseDN = searchOperation.getBaseDN();
+ DN aBaseDN = searchOperation.getBaseDN();
boolean manageDsaIT = isManageDsaITOperation(searchOperation);
boolean continueSearch = true;
@@ -1616,15 +1626,15 @@
{
// Check if this entry is an immediate child.
if ((entryDN.getNumComponents() ==
- baseDN.getNumComponents() + 1) &&
- entryDN.isDescendantOf(baseDN))
+ aBaseDN.getNumComponents() + 1) &&
+ entryDN.isDescendantOf(aBaseDN))
{
isInScope = true;
}
}
else if (searchScope == SearchScope.WHOLE_SUBTREE)
{
- if (entryDN.isDescendantOf(baseDN))
+ if (entryDN.isDescendantOf(aBaseDN))
{
isInScope = true;
}
@@ -1632,8 +1642,8 @@
else if (searchScope == SearchScope.SUBORDINATE_SUBTREE)
{
if ((entryDN.getNumComponents() >
- baseDN.getNumComponents()) &&
- entryDN.isDescendantOf(baseDN))
+ aBaseDN.getNumComponents()) &&
+ entryDN.isDescendantOf(aBaseDN))
{
isInScope = true;
}
@@ -1705,7 +1715,7 @@
Entry baseEntry = null;
try
{
- baseEntry = getEntry(baseDN);
+ baseEntry = getEntry(aBaseDN);
}
catch (Exception e)
{
@@ -1719,10 +1729,10 @@
if (baseEntry == null)
{
// Check for referral entries above the base entry.
- dn2uri.targetEntryReferrals(baseDN, searchScope);
+ dn2uri.targetEntryReferrals(aBaseDN, searchScope);
- Message message = ERR_JEB_SEARCH_NO_SUCH_OBJECT.get(baseDN.toString());
- DN matchedDN = getMatchedDN(baseDN);
+ Message message = ERR_JEB_SEARCH_NO_SUCH_OBJECT.get(aBaseDN.toString());
+ DN matchedDN = getMatchedDN(aBaseDN);
throw new DirectoryException(ResultCode.NO_SUCH_OBJECT,
message, matchedDN, null);
}
diff --git a/opends/src/server/org/opends/server/extensions/CollectiveAttributeSubentriesVirtualAttributeProvider.java b/opends/src/server/org/opends/server/extensions/CollectiveAttributeSubentriesVirtualAttributeProvider.java
index 78b63c4..cfc7b55 100644
--- a/opends/src/server/org/opends/server/extensions/CollectiveAttributeSubentriesVirtualAttributeProvider.java
+++ b/opends/src/server/org/opends/server/extensions/CollectiveAttributeSubentriesVirtualAttributeProvider.java
@@ -23,7 +23,7 @@
*
*
* Copyright 2009-2010 Sun Microsystems, Inc.
- * Portions copyright 2011 ForgeRock AS
+ * Portions copyright 2011-2012 ForgeRock AS
*/
package org.opends.server.extensions;
@@ -152,7 +152,8 @@
*/
@Override()
public boolean isSearchable(VirtualAttributeRule rule,
- SearchOperation searchOperation)
+ SearchOperation searchOperation,
+ boolean isPreIndexed)
{
return false;
}
diff --git a/opends/src/server/org/opends/server/extensions/EntityTagVirtualAttributeProvider.java b/opends/src/server/org/opends/server/extensions/EntityTagVirtualAttributeProvider.java
index adf771a..4408c7d 100644
--- a/opends/src/server/org/opends/server/extensions/EntityTagVirtualAttributeProvider.java
+++ b/opends/src/server/org/opends/server/extensions/EntityTagVirtualAttributeProvider.java
@@ -7,14 +7,14 @@
* with the License.
*
* You can obtain a copy of the license at
- * trunk/opends/resource/legal-notices/OpenDS.LICENSE
- * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * trunk/opends/resource/legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at
- * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * trunk/opends/resource/legal-notices/CDDLv1_0.txt. If applicable,
* add the following below this CDDL HEADER, with the fields enclosed
* by brackets "[]" replaced with your own identifying information:
* Portions Copyright [yyyy] [name of copyright owner]
@@ -216,11 +216,12 @@
/**
- * {@inheritDoc}.
+ * {@inheritDoc}
*/
@Override()
public boolean isSearchable(final VirtualAttributeRule rule,
- final SearchOperation searchOperation)
+ final SearchOperation searchOperation,
+ final boolean isPreIndexed)
{
// ETags cannot be searched since there is no way to determine which entry
// is associated with a particular ETag.
diff --git a/opends/src/server/org/opends/server/extensions/EntryDNVirtualAttributeProvider.java b/opends/src/server/org/opends/server/extensions/EntryDNVirtualAttributeProvider.java
index a791ebe..dd48c3e 100644
--- a/opends/src/server/org/opends/server/extensions/EntryDNVirtualAttributeProvider.java
+++ b/opends/src/server/org/opends/server/extensions/EntryDNVirtualAttributeProvider.java
@@ -23,6 +23,7 @@
*
*
* Copyright 2008-2009 Sun Microsystems, Inc.
+ * Portions Copyright 2012 ForgeRock AS
*/
package org.opends.server.extensions;
@@ -235,10 +236,12 @@
* <LI>It is an OR filter in which all of the components are equality
* filters targeting the associated attribute type.</LI>
* </UL>
+ * This virtual attribute also can be optimized as pre-indexed.
*/
@Override()
public boolean isSearchable(VirtualAttributeRule rule,
- SearchOperation searchOperation)
+ SearchOperation searchOperation,
+ boolean isPreIndexed)
{
return isSearchable(rule.getAttributeType(), searchOperation.getFilter(),
0);
diff --git a/opends/src/server/org/opends/server/extensions/EntryUUIDVirtualAttributeProvider.java b/opends/src/server/org/opends/server/extensions/EntryUUIDVirtualAttributeProvider.java
index 3f64cea..bb9c924 100644
--- a/opends/src/server/org/opends/server/extensions/EntryUUIDVirtualAttributeProvider.java
+++ b/opends/src/server/org/opends/server/extensions/EntryUUIDVirtualAttributeProvider.java
@@ -23,6 +23,7 @@
*
*
* Copyright 2008-2009 Sun Microsystems, Inc.
+ * Portions Copyright 2012 ForgeRock AS
*/
package org.opends.server.extensions;
@@ -218,20 +219,12 @@
/**
- * {@inheritDoc}. This virtual attribute will support search operations only
- * if one of the following is true about the search filter:
- * <UL>
- * <LI>It is an equality filter targeting the associated attribute
- * type.</LI>
- * <LI>It is an AND filter in which at least one of the components is an
- * equality filter targeting the associated attribute type.</LI>
- * <LI>It is an OR filter in which all of the components are equality
- * filters targeting the associated attribute type.</LI>
- * </UL>
+ * {@inheritDoc}
*/
@Override()
public boolean isSearchable(VirtualAttributeRule rule,
- SearchOperation searchOperation)
+ SearchOperation searchOperation,
+ boolean isPreIndexed)
{
return false;
}
diff --git a/opends/src/server/org/opends/server/extensions/GoverningStructureRuleVirtualAttributeProvider.java b/opends/src/server/org/opends/server/extensions/GoverningStructureRuleVirtualAttributeProvider.java
index 2aad816..64e579a 100644
--- a/opends/src/server/org/opends/server/extensions/GoverningStructureRuleVirtualAttributeProvider.java
+++ b/opends/src/server/org/opends/server/extensions/GoverningStructureRuleVirtualAttributeProvider.java
@@ -23,6 +23,7 @@
*
*
* Copyright 2009 Sun Microsystems, Inc.
+ * Portions Copyright 2012 ForgeRock AS
*/
package org.opends.server.extensions;
@@ -181,22 +182,14 @@
/**
- * {@inheritDoc}. This virtual attribute will support search operations only
- * if one of the following is true about the search filter:
- * <UL>
- * <LI>It is an equality filter targeting the associated attribute
- * type.</LI>
- * <LI>It is an AND filter in which at least one of the components is an
- * equality filter targeting the associated attribute type.</LI>
- * <LI>It is an OR filter in which all of the components are equality
- * filters targeting the associated attribute type.</LI>
- * </UL>
+ * {@inheritDoc}
*/
@Override()
public boolean isSearchable(VirtualAttributeRule rule,
- SearchOperation searchOperation)
+ SearchOperation searchOperation,
+ boolean isPreIndexed)
{
- //Non-searchable for unindexed searches.
+ //Non-searchable.
return false;
}
diff --git a/opends/src/server/org/opends/server/extensions/HasSubordinatesVirtualAttributeProvider.java b/opends/src/server/org/opends/server/extensions/HasSubordinatesVirtualAttributeProvider.java
index 0ceec6e..548e3b1 100644
--- a/opends/src/server/org/opends/server/extensions/HasSubordinatesVirtualAttributeProvider.java
+++ b/opends/src/server/org/opends/server/extensions/HasSubordinatesVirtualAttributeProvider.java
@@ -23,6 +23,7 @@
*
*
* Copyright 2008-2009 Sun Microsystems, Inc.
+ * Portions Copyright 2012 ForgeRock AS
*/
package org.opends.server.extensions;
@@ -247,20 +248,12 @@
/**
- * {@inheritDoc}. This virtual attribute will support search operations only
- * if one of the following is true about the search filter:
- * <UL>
- * <LI>It is an equality filter targeting the associated attribute
- * type.</LI>
- * <LI>It is an AND filter in which at least one of the components is an
- * equality filter targeting the associated attribute type.</LI>
- * <LI>It is an OR filter in which all of the components are equality
- * filters targeting the associated attribute type.</LI>
- * </UL>
+ * {@inheritDoc}
*/
@Override()
public boolean isSearchable(VirtualAttributeRule rule,
- SearchOperation searchOperation)
+ SearchOperation searchOperation,
+ boolean isPreIndexed)
{
return false;
}
diff --git a/opends/src/server/org/opends/server/extensions/IsMemberOfVirtualAttributeProvider.java b/opends/src/server/org/opends/server/extensions/IsMemberOfVirtualAttributeProvider.java
index 23a522a..3558603 100644
--- a/opends/src/server/org/opends/server/extensions/IsMemberOfVirtualAttributeProvider.java
+++ b/opends/src/server/org/opends/server/extensions/IsMemberOfVirtualAttributeProvider.java
@@ -23,7 +23,7 @@
*
*
* Copyright 2008-2009 Sun Microsystems, Inc.
- * Portions copyright 2011 ForgeRock AS
+ * Portions copyright 2011-2012 ForgeRock AS
*/
package org.opends.server.extensions;
@@ -304,11 +304,18 @@
* <LI>It is an AND filter in which at least one of the components is an
* equality filter targeting the associated attribute type.</LI>
* </UL>
+ * Searching for this virtual attribute cannot be pre-indexed and thus,
+ * it should not be searchable when pre-indexed is required.
*/
@Override()
public boolean isSearchable(VirtualAttributeRule rule,
- SearchOperation searchOperation)
+ SearchOperation searchOperation,
+ boolean isPreIndexed)
{
+ if (isPreIndexed)
+ {
+ return false;
+ }
return isSearchable(rule.getAttributeType(), searchOperation.getFilter(),
0);
}
diff --git a/opends/src/server/org/opends/server/extensions/MemberVirtualAttributeProvider.java b/opends/src/server/org/opends/server/extensions/MemberVirtualAttributeProvider.java
index 0bff57b..facfd23 100644
--- a/opends/src/server/org/opends/server/extensions/MemberVirtualAttributeProvider.java
+++ b/opends/src/server/org/opends/server/extensions/MemberVirtualAttributeProvider.java
@@ -23,7 +23,7 @@
*
*
* Copyright 2008-2009 Sun Microsystems, Inc.
- * Portions copyright 2011 ForgeRock AS
+ * Portions copyright 2011-2012 ForgeRock AS
*/
package org.opends.server.extensions;
import org.opends.messages.Message;
@@ -334,11 +334,12 @@
/**
- * {@inheritDoc}.
+ * {@inheritDoc}
*/
@Override()
public boolean isSearchable(VirtualAttributeRule rule,
- SearchOperation searchOperation)
+ SearchOperation searchOperation,
+ boolean isPreIndexed)
{
return false;
}
diff --git a/opends/src/server/org/opends/server/extensions/NumSubordinatesVirtualAttributeProvider.java b/opends/src/server/org/opends/server/extensions/NumSubordinatesVirtualAttributeProvider.java
index 070873d..a4d0f4e 100644
--- a/opends/src/server/org/opends/server/extensions/NumSubordinatesVirtualAttributeProvider.java
+++ b/opends/src/server/org/opends/server/extensions/NumSubordinatesVirtualAttributeProvider.java
@@ -23,6 +23,7 @@
*
*
* Copyright 2008-2009 Sun Microsystems, Inc.
+ * Portions Copyright 2012 ForgeRock AS
*/
package org.opends.server.extensions;
@@ -219,20 +220,12 @@
/**
- * {@inheritDoc}. This virtual attribute will support search operations only
- * if one of the following is true about the search filter:
- * <UL>
- * <LI>It is an equality filter targeting the associated attribute
- * type.</LI>
- * <LI>It is an AND filter in which at least one of the components is an
- * equality filter targeting the associated attribute type.</LI>
- * <LI>It is an OR filter in which all of the components are equality
- * filters targeting the associated attribute type.</LI>
- * </UL>
+ * {@inheritDoc}
*/
@Override()
public boolean isSearchable(VirtualAttributeRule rule,
- SearchOperation searchOperation)
+ SearchOperation searchOperation,
+ boolean isPreIndexed)
{
return false;
}
diff --git a/opends/src/server/org/opends/server/extensions/PasswordExpirationTimeVirtualAttributeProvider.java b/opends/src/server/org/opends/server/extensions/PasswordExpirationTimeVirtualAttributeProvider.java
index 385b12d..027446b 100644
--- a/opends/src/server/org/opends/server/extensions/PasswordExpirationTimeVirtualAttributeProvider.java
+++ b/opends/src/server/org/opends/server/extensions/PasswordExpirationTimeVirtualAttributeProvider.java
@@ -14,7 +14,7 @@
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at
- * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * trunk/opends/resource/legal-notices/CDDLv1_0.txt. If applicable,
* add the following below this CDDL HEADER, with the fields enclosed
* by brackets "[]" replaced with your own identifying information:
* Portions Copyright [yyyy] [name of copyright owner]
@@ -119,7 +119,8 @@
*/
@Override
public boolean isSearchable(VirtualAttributeRule rule,
- SearchOperation searchOperation)
+ SearchOperation searchOperation,
+ boolean isPreIndexed)
{
return false;
}
diff --git a/opends/src/server/org/opends/server/extensions/PasswordPolicySubentryVirtualAttributeProvider.java b/opends/src/server/org/opends/server/extensions/PasswordPolicySubentryVirtualAttributeProvider.java
index d4fc10d..f12f66e 100644
--- a/opends/src/server/org/opends/server/extensions/PasswordPolicySubentryVirtualAttributeProvider.java
+++ b/opends/src/server/org/opends/server/extensions/PasswordPolicySubentryVirtualAttributeProvider.java
@@ -23,7 +23,7 @@
*
*
* Copyright 2010 Sun Microsystems, Inc.
- * Portions copyright 2011 ForgeRock AS.
+ * Portions copyright 2011-2012 ForgeRock AS.
*/
package org.opends.server.extensions;
@@ -170,7 +170,8 @@
*/
@Override()
public boolean isSearchable(VirtualAttributeRule rule,
- SearchOperation searchOperation)
+ SearchOperation searchOperation,
+ boolean isPreIndexed)
{
return false;
}
diff --git a/opends/src/server/org/opends/server/extensions/StructuralObjectClassVirtualAttributeProvider.java b/opends/src/server/org/opends/server/extensions/StructuralObjectClassVirtualAttributeProvider.java
index 6a1568b..04b0948 100644
--- a/opends/src/server/org/opends/server/extensions/StructuralObjectClassVirtualAttributeProvider.java
+++ b/opends/src/server/org/opends/server/extensions/StructuralObjectClassVirtualAttributeProvider.java
@@ -23,6 +23,7 @@
*
*
* Copyright 2009 Sun Microsystems, Inc.
+ * Portions Copyright 2012 ForgeRock AS
*/
package org.opends.server.extensions;
@@ -175,20 +176,12 @@
/**
- * {@inheritDoc}. This virtual attribute will support search operations only
- * if one of the following is true about the search filter:
- * <UL>
- * <LI>It is an equality filter targeting the associated attribute
- * type.</LI>
- * <LI>It is an AND filter in which at least one of the components is an
- * equality filter targeting the associated attribute type.</LI>
- * <LI>It is an OR filter in which all of the components are equality
- * filters targeting the associated attribute type.</LI>
- * </UL>
+ * {@inheritDoc}
*/
@Override()
public boolean isSearchable(VirtualAttributeRule rule,
- SearchOperation searchOperation)
+ SearchOperation searchOperation,
+ boolean isPreIndexed)
{
// This attribute is not searchable, since it will have the same value in
// tons of entries.
diff --git a/opends/src/server/org/opends/server/extensions/SubschemaSubentryVirtualAttributeProvider.java b/opends/src/server/org/opends/server/extensions/SubschemaSubentryVirtualAttributeProvider.java
index 1a0f0be..1318873 100644
--- a/opends/src/server/org/opends/server/extensions/SubschemaSubentryVirtualAttributeProvider.java
+++ b/opends/src/server/org/opends/server/extensions/SubschemaSubentryVirtualAttributeProvider.java
@@ -23,6 +23,7 @@
*
*
* Copyright 2006-2010 Sun Microsystems, Inc.
+ * Portions Copyright 2012 ForgeRock AS
*/
package org.opends.server.extensions;
@@ -168,20 +169,12 @@
/**
- * {@inheritDoc}. This virtual attribute will support search operations only
- * if one of the following is true about the search filter:
- * <UL>
- * <LI>It is an equality filter targeting the associated attribute
- * type.</LI>
- * <LI>It is an AND filter in which at least one of the components is an
- * equality filter targeting the associated attribute type.</LI>
- * <LI>It is an OR filter in which all of the components are equality
- * filters targeting the associated attribute type.</LI>
- * </UL>
+ * {@inheritDoc}
*/
@Override()
public boolean isSearchable(VirtualAttributeRule rule,
- SearchOperation searchOperation)
+ SearchOperation searchOperation,
+ boolean isPreIndexed)
{
// This attribute is not searchable, since it will have the same value in
// tons of entries.
diff --git a/opends/src/server/org/opends/server/extensions/UserDefinedVirtualAttributeProvider.java b/opends/src/server/org/opends/server/extensions/UserDefinedVirtualAttributeProvider.java
index 61a2686..ed275a1 100644
--- a/opends/src/server/org/opends/server/extensions/UserDefinedVirtualAttributeProvider.java
+++ b/opends/src/server/org/opends/server/extensions/UserDefinedVirtualAttributeProvider.java
@@ -23,6 +23,7 @@
*
*
* Copyright 2008-2009 Sun Microsystems, Inc.
+ * Portions Copyright 2012 ForgeRock AS
*/
package org.opends.server.extensions;
import org.opends.messages.Message;
@@ -150,7 +151,8 @@
*/
@Override()
public boolean isSearchable(VirtualAttributeRule rule,
- SearchOperation searchOperation)
+ SearchOperation searchOperation,
+ boolean isPreIndexed)
{
// We will not allow searches based only on user-defined virtual attributes.
return false;
diff --git a/opends/src/server/org/opends/server/replication/common/ChangelogBaseDNVirtualAttributeProvider.java b/opends/src/server/org/opends/server/replication/common/ChangelogBaseDNVirtualAttributeProvider.java
index 1129459..3e52f48 100644
--- a/opends/src/server/org/opends/server/replication/common/ChangelogBaseDNVirtualAttributeProvider.java
+++ b/opends/src/server/org/opends/server/replication/common/ChangelogBaseDNVirtualAttributeProvider.java
@@ -23,7 +23,7 @@
*
*
* Copyright 2009 Sun Microsystems, Inc.
- * Portions Copyright 2011 ForgeRock AS
+ * Portions Copyright 2011-2012 ForgeRock AS
*/
package org.opends.server.replication.common;
@@ -31,6 +31,7 @@
import java.util.List;
import java.util.Set;
+import static org.opends.messages.ExtensionMessages.*;
import org.opends.messages.Message;
import org.opends.server.admin.server.ConfigurationChangeListener;
import org.opends.server.admin.std.server.UserDefinedVirtualAttributeCfg;
@@ -133,9 +134,10 @@
*/
@Override()
public boolean isSearchable(VirtualAttributeRule rule,
- SearchOperation searchOperation)
+ SearchOperation searchOperation,
+ boolean isPreIndexed)
{
- // We will not allow searches based only on user-defined virtual attributes.
+ // We do not allow search as it may be present is too many entries.
return false;
}
@@ -149,7 +151,9 @@
SearchOperation searchOperation)
{
searchOperation.setResultCode(ResultCode.UNWILLING_TO_PERFORM);
- return;
+ final Message message = ERR_CHANGELOGBASEDN_VATTR_NOT_SEARCHABLE.get(
+ rule.getAttributeType().getNameOrOID());
+ searchOperation.appendErrorMessage(message);
}
diff --git a/opends/src/server/org/opends/server/replication/common/FirstChangeNumberVirtualAttributeProvider.java b/opends/src/server/org/opends/server/replication/common/FirstChangeNumberVirtualAttributeProvider.java
index 7e84adc..1219700 100644
--- a/opends/src/server/org/opends/server/replication/common/FirstChangeNumberVirtualAttributeProvider.java
+++ b/opends/src/server/org/opends/server/replication/common/FirstChangeNumberVirtualAttributeProvider.java
@@ -23,7 +23,7 @@
*
*
* Copyright 2009 Sun Microsystems, Inc.
- * Portions Copyright 2011 ForgeRock AS
+ * Portions Copyright 2011-2012 ForgeRock AS
*/
package org.opends.server.replication.common;
@@ -34,6 +34,7 @@
import java.util.List;
import java.util.Set;
+import static org.opends.messages.ExtensionMessages.*;
import org.opends.messages.Message;
import org.opends.server.admin.server.ConfigurationChangeListener;
import org.opends.server.admin.std.server.UserDefinedVirtualAttributeCfg;
@@ -182,9 +183,11 @@
*/
@Override()
public boolean isSearchable(VirtualAttributeRule rule,
- SearchOperation searchOperation)
+ SearchOperation searchOperation,
+ boolean isPreIndexed)
{
- // We will not allow searches based only on user-defined virtual attributes.
+ // We do not allow search for the firstChangeNumber. It's a read-only
+ // attribute of the RootDSE.
return false;
}
@@ -198,7 +201,9 @@
SearchOperation searchOperation)
{
searchOperation.setResultCode(ResultCode.UNWILLING_TO_PERFORM);
- return;
+ final Message message = ERR_FIRSTCHANGENUMBER_VATTR_NOT_SEARCHABLE.get(
+ rule.getAttributeType().getNameOrOID());
+ searchOperation.appendErrorMessage(message);
}
diff --git a/opends/src/server/org/opends/server/replication/common/LastChangeNumberVirtualAttributeProvider.java b/opends/src/server/org/opends/server/replication/common/LastChangeNumberVirtualAttributeProvider.java
index 0ca12bc..5efb18f 100644
--- a/opends/src/server/org/opends/server/replication/common/LastChangeNumberVirtualAttributeProvider.java
+++ b/opends/src/server/org/opends/server/replication/common/LastChangeNumberVirtualAttributeProvider.java
@@ -23,7 +23,7 @@
*
*
* Copyright 2009 Sun Microsystems, Inc.
- * Portions Copyright 2011 ForgeRock AS
+ * Portions Copyright 2011-2012 ForgeRock AS
*/
package org.opends.server.replication.common;
@@ -34,6 +34,7 @@
import java.util.List;
import java.util.Set;
+import static org.opends.messages.ExtensionMessages.*;
import org.opends.messages.Message;
import org.opends.server.admin.server.ConfigurationChangeListener;
import org.opends.server.admin.std.server.UserDefinedVirtualAttributeCfg;
@@ -181,9 +182,11 @@
*/
@Override()
public boolean isSearchable(VirtualAttributeRule rule,
- SearchOperation searchOperation)
+ SearchOperation searchOperation,
+ boolean isPreIndexed)
{
- // We will not allow searches based only on user-defined virtual attributes.
+ // We do not allow search for the lastChangeNumber. It's a read-only
+ // attribute of the RootDSE.
return false;
}
@@ -197,7 +200,9 @@
SearchOperation searchOperation)
{
searchOperation.setResultCode(ResultCode.UNWILLING_TO_PERFORM);
- return;
+ final Message message = ERR_LASTCHANGENUMBER_VATTR_NOT_SEARCHABLE.get(
+ rule.getAttributeType().getNameOrOID());
+ searchOperation.appendErrorMessage(message);
}
diff --git a/opends/src/server/org/opends/server/replication/common/LastCookieVirtualProvider.java b/opends/src/server/org/opends/server/replication/common/LastCookieVirtualProvider.java
index da4335c..6766286 100644
--- a/opends/src/server/org/opends/server/replication/common/LastCookieVirtualProvider.java
+++ b/opends/src/server/org/opends/server/replication/common/LastCookieVirtualProvider.java
@@ -23,7 +23,7 @@
*
*
* Copyright 2009 Sun Microsystems, Inc.
- * Portions Copyright 2011 ForgeRock AS
+ * Portions Copyright 2011-2012 ForgeRock AS
*/
package org.opends.server.replication.common;
@@ -34,6 +34,7 @@
import java.util.List;
import java.util.Set;
+import static org.opends.messages.ExtensionMessages.*;
import org.opends.messages.Message;
import org.opends.server.admin.server.ConfigurationChangeListener;
import org.opends.server.admin.std.server.UserDefinedVirtualAttributeCfg;
@@ -164,9 +165,11 @@
*/
@Override()
public boolean isSearchable(VirtualAttributeRule rule,
- SearchOperation searchOperation)
+ SearchOperation searchOperation,
+ boolean isPreIndexed)
{
- // We will not allow searches based only on user-defined virtual attributes.
+ // We do not allow search for the lastCookie. It's a read-only
+ // attribute of the RootDSE.
return false;
}
@@ -180,7 +183,9 @@
SearchOperation searchOperation)
{
searchOperation.setResultCode(ResultCode.UNWILLING_TO_PERFORM);
- return;
+ final Message message = ERR_LASTCOOKIE_VATTR_NOT_SEARCHABLE.get(
+ rule.getAttributeType().getNameOrOID());
+ searchOperation.appendErrorMessage(message);
}
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/EntityTagVirtualAttributeProviderTestCase.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/EntityTagVirtualAttributeProviderTestCase.java
index 5de3f6a..3d2ab72 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/EntityTagVirtualAttributeProviderTestCase.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/EntityTagVirtualAttributeProviderTestCase.java
@@ -470,7 +470,8 @@
@Test
public void testIsSearchable()
{
- assertFalse(provider.isSearchable(null, null));
+ assertFalse(provider.isSearchable(null, null, false));
+ assertFalse(provider.isSearchable(null, null, true));
}
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/EntryDNVirtualAttributeProviderTestCase.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/EntryDNVirtualAttributeProviderTestCase.java
index b1e2d4e..8a75db5 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/EntryDNVirtualAttributeProviderTestCase.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/EntryDNVirtualAttributeProviderTestCase.java
@@ -23,7 +23,7 @@
*
*
* Copyright 2008-2009 Sun Microsystems, Inc.
- * Portions Copyright 2011 ForgeRock AS
+ * Portions Copyright 2011-2012 ForgeRock AS
*/
package org.opends.server.extensions;
@@ -1025,8 +1025,11 @@
SearchScope.WHOLE_SUBTREE,
DereferencePolicy.NEVER_DEREF_ALIASES, 0,
0, false, filter, null, null);
-
- assertEquals(provider.isSearchable(rule, searchOperation), isSearchable);
+ // This attribute is searchable for either pre-indexed or not
+ assertEquals(provider.isSearchable(rule, searchOperation, false),
+ isSearchable);
+ assertEquals(provider.isSearchable(rule, searchOperation, true),
+ isSearchable);
}
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/IsMemberOfVirtualAttributeProviderTestCase.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/IsMemberOfVirtualAttributeProviderTestCase.java
index d9c4e94..85a6fe1 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/IsMemberOfVirtualAttributeProviderTestCase.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/IsMemberOfVirtualAttributeProviderTestCase.java
@@ -23,7 +23,7 @@
*
*
* Copyright 2008-2009 Sun Microsystems, Inc.
- * Portions Copyright 2011 ForgeRock AS
+ * Portions Copyright 2011-2012 ForgeRock AS
*/
package org.opends.server.extensions;
@@ -1127,7 +1127,11 @@
DereferencePolicy.NEVER_DEREF_ALIASES, 0,
0, false, filter, null, null);
- assertEquals(provider.isSearchable(rule, new LocalBackendSearchOperation(searchOperation)), isSearchable);
+ assertEquals(provider.isSearchable(rule,
+ new LocalBackendSearchOperation(searchOperation), false), isSearchable);
+ // isMemberOf is not searchable with preIndexed set to true
+ assertEquals(provider.isSearchable(rule,
+ new LocalBackendSearchOperation(searchOperation), true), false);
}
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/UserDefinedVirtualAttributeProviderTestCase.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/UserDefinedVirtualAttributeProviderTestCase.java
index 872ea68..f5fc787 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/UserDefinedVirtualAttributeProviderTestCase.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/UserDefinedVirtualAttributeProviderTestCase.java
@@ -23,6 +23,7 @@
*
*
* Copyright 2008-2010 Sun Microsystems, Inc.
+ * Portions Copyright 2012 ForgeRock AS
*/
package org.opends.server.extensions;
@@ -134,7 +135,8 @@
(UserDefinedVirtualAttributeProvider) rule.getProvider();
assertFalse(provider.isMultiValued());
- assertFalse(provider.isSearchable(rule, searchOperation));
+ assertFalse(provider.isSearchable(rule, searchOperation, false));
+ assertFalse(provider.isSearchable(rule, searchOperation, true));
provider.processSearch(rule, searchOperation);
assertEquals(searchOperation.getResultCode(),
@@ -201,7 +203,8 @@
(UserDefinedVirtualAttributeProvider) rule.getProvider();
assertTrue(provider.isMultiValued());
- assertFalse(provider.isSearchable(rule, searchOperation));
+ assertFalse(provider.isSearchable(rule, searchOperation, false));
+ assertFalse(provider.isSearchable(rule, searchOperation, true));
provider.processSearch(rule, searchOperation);
assertEquals(searchOperation.getResultCode(),
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/VirtualStaticGroupTestCase.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/VirtualStaticGroupTestCase.java
index 333b6c3..64fa0c8 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/VirtualStaticGroupTestCase.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/VirtualStaticGroupTestCase.java
@@ -23,6 +23,7 @@
*
*
* Copyright 2008-2010 Sun Microsystems, Inc.
+ * Portions Copyright 2012 ForgeRock AS
*/
package org.opends.server.extensions;
@@ -669,7 +670,8 @@
SearchFilter.createFilterFromString(
"(member=" + u1.toString() + ")"),
null, null);
- assertFalse(provider.isSearchable(rule, searchOperation));
+ assertFalse(provider.isSearchable(rule, searchOperation, false));
+ assertFalse(provider.isSearchable(rule, searchOperation, true));
provider.processSearch(rule, searchOperation);
assertFalse(searchOperation.getResultCode() == ResultCode.SUCCESS);
@@ -743,7 +745,8 @@
SearchFilter.createFilterFromString(
"(member=" + u1.toString() + ")"),
null, null);
- assertFalse(provider.isSearchable(rule, searchOperation));
+ assertFalse(provider.isSearchable(rule, searchOperation, false));
+ assertFalse(provider.isSearchable(rule, searchOperation, false));
provider.processSearch(rule, searchOperation);
assertFalse(searchOperation.getResultCode() == ResultCode.SUCCESS);
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/types/TestDN.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/types/TestDN.java
index b686927..598fba0 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/types/TestDN.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/types/TestDN.java
@@ -23,6 +23,7 @@
*
*
* Copyright 2006-2009 Sun Microsystems, Inc.
+ * Portions Copyright 2012 ForgeRock AS
*/
package org.opends.server.types;
@@ -149,7 +150,9 @@
{ "cn=#a" }, { "cn=#ag" }, { "cn=#ga" }, { "cn=#abcdefgh" },
{ "cn=a\\b" }, { "cn=a\\bg" }, { "cn=\"hello" },
{"cn=+mail=,dc=example,dc=com"},{"cn=xyz+sn=,dc=example,dc=com"},
- {"cn=,dc=example,dc=com"}};
+ {"cn=,dc=example,dc=com"},
+// {"cn=a+cn=b,dc=example,dc=com"}
+ };
}
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/types/TestLDAPURL.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/types/TestLDAPURL.java
new file mode 100644
index 0000000..8abc7e8
--- /dev/null
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/types/TestLDAPURL.java
@@ -0,0 +1,188 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Copyright 2012 ForgeRock AS
+ */
+package org.opends.server.types;
+
+import static org.testng.Assert.*;
+
+import org.opends.server.TestCaseUtils;
+import org.opends.server.core.DirectoryServer;
+import org.opends.server.util.Platform;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+import org.testng.annotations.BeforeClass;
+
+public class TestLDAPURL extends TypesTestCase {
+
+ /**
+ * Set up the environment for performing the tests in this suite.
+ *
+ * @throws Exception
+ * If the environment could not be set up.
+ */
+ @BeforeClass
+ public void setUp() throws Exception {
+ // This test suite depends on having the schema available, so
+ // we'll start the server.
+ TestCaseUtils.startServer();
+
+ }
+
+ /**
+ * Valid URLs test data provider.
+ *
+ * @return The array of valid test URL strings.
+ */
+ @DataProvider(name = "validURLs")
+ public Object[][] createValidData() {
+ return new Object[][] {
+ { "ldap:///", "ldap:///", "ldap:///??base?(objectClass=*)" },
+ { "http:///", "http:///", "http:///??base?(objectClass=*)" },
+ { "ldap://host:389/", "ldap://host:389/",
+ "ldap://host:389/??base?(objectClass=*)" },
+ { "ldap://192.168.0.1/", "ldap://192.168.0.1:389/",
+ "ldap://192.168.0.1:389/??base?(objectClass=*)" },
+ { "ldap://192.168.0.2:1389/", "ldap://192.168.0.2:1389/",
+ "ldap://192.168.0.2:1389/??base?(objectClass=*)" },
+ // URLs with a baseDN
+ { "ldap://host:389/cn=Foo,dc=example,dc=com",
+ "ldap://host:389/cn=Foo,dc=example,dc=com",
+ "ldap://host:389/cn=Foo,dc=example,dc=com??base?(objectClass=*)" },
+ { "ldap:///cn=a,dc=example,dc=com", "ldap:///cn=a,dc=example,dc=com",
+ "ldap:///cn=a,dc=example,dc=com??base?(objectClass=*)" },
+ { "ldap:///cn=a\"a,dc=example,dc=com", "ldap:///cn=a%5C%22a,dc=example,dc=com",
+ "ldap:///cn=a%5C%22a,dc=example,dc=com??base?(objectClass=*)" },
+ { "ldap://localhost/cn=Foo,dc=a.com", "ldap://localhost:389/cn=Foo,dc=a.com",
+ "ldap://localhost:389/cn=Foo,dc=a.com??base?(objectClass=*)" },
+ { "ldap://host:1389/cn=Foo,dc=b.com?", "ldap://host:1389/cn=Foo,dc=b.com",
+ "ldap://host:1389/cn=Foo,dc=b.com??base?(objectClass=*)" },
+ // URLs with some attribute lists
+ { "ldap://host:1389/cn=Foo,dc=b.com?,", "ldap://host:1389/cn=Foo,dc=b.com",
+ "ldap://host:1389/cn=Foo,dc=b.com??base?(objectClass=*)" },
+ { "ldap://host:1389/cn=Foo,dc=b.com?,,,?", "ldap://host:1389/cn=Foo,dc=b.com",
+ "ldap://host:1389/cn=Foo,dc=b.com??base?(objectClass=*)" },
+ { "ldap://host:1389/cn=Foo,dc=b.com?cn,sn", "ldap://host:1389/cn=Foo,dc=b.com",
+ "ldap://host:1389/cn=Foo,dc=b.com?cn,sn?base?(objectClass=*)" },
+ { "ldap://host:1389/cn=Foo,dc=b.com?sn,cn", "ldap://host:1389/cn=Foo,dc=b.com",
+ "ldap://host:1389/cn=Foo,dc=b.com?sn,cn?base?(objectClass=*)" },
+ { "ldap://host:1389/?cn", "ldap://host:1389/",
+ "ldap://host:1389/?cn?base?(objectClass=*)" },
+ // URLs with scope
+ { "ldap://host:1389/cn=Foo,dc=b.com??", "ldap://host:1389/cn=Foo,dc=b.com",
+ "ldap://host:1389/cn=Foo,dc=b.com??base?(objectClass=*)" },
+ { "ldap://host:1389/cn=Foo,dc=b.com???", "ldap://host:1389/cn=Foo,dc=b.com",
+ "ldap://host:1389/cn=Foo,dc=b.com??base?(objectClass=*)" },
+ { "ldap://host:1389/cn=Foo,dc=b.com??base", "ldap://host:1389/cn=Foo,dc=b.com",
+ "ldap://host:1389/cn=Foo,dc=b.com??base?(objectClass=*)" },
+ { "ldap://host:1389/cn=Foo,dc=b.com??base?", "ldap://host:1389/cn=Foo,dc=b.com",
+ "ldap://host:1389/cn=Foo,dc=b.com??base?(objectClass=*)" },
+ { "ldap://host:1389/cn=Foo,dc=b.com??one", "ldap://host:1389/cn=Foo,dc=b.com",
+ "ldap://host:1389/cn=Foo,dc=b.com??one?(objectClass=*)" },
+ { "ldap://host:1389/cn=Foo,dc=b.com??sub", "ldap://host:1389/cn=Foo,dc=b.com",
+ "ldap://host:1389/cn=Foo,dc=b.com??sub?(objectClass=*)" },
+ { "ldap://host:1389/cn=Foo,dc=b.com??subord", "ldap://host:1389/cn=Foo,dc=b.com",
+ "ldap://host:1389/cn=Foo,dc=b.com??subordinate?(objectClass=*)" },
+ { "ldap://host:1389/cn=Foo,dc=b.com??subordinate", "ldap://host:1389/cn=Foo,dc=b.com",
+ "ldap://host:1389/cn=Foo,dc=b.com??subordinate?(objectClass=*)" },
+ // URLs with filters
+ { "ldap://host:1389/cn=Foo,dc=b.com????", "ldap://host:1389/cn=Foo,dc=b.com",
+ "ldap://host:1389/cn=Foo,dc=b.com??base?(objectClass=*)" },
+ { "ldap://host:1389/cn=Foo,dc=b.com???(cn=Foo)?", "ldap://host:1389/cn=Foo,dc=b.com",
+ "ldap://host:1389/cn=Foo,dc=b.com??base?(cn=Foo)" },
+ { "ldap://host:1389/cn=Foo,dc=b.com???(cn=foo)", "ldap://host:1389/cn=Foo,dc=b.com",
+ "ldap://host:1389/cn=Foo,dc=b.com??base?(cn=foo)" },
+ { "ldap://host:1389/cn=Foo,dc=b.com???uid=user.0?", "ldap://host:1389/cn=Foo,dc=b.com",
+ "ldap://host:1389/cn=Foo,dc=b.com??base?(uid=user.0)" },
+ // Extensions are always returned, baseOnly or not.
+ { "ldap://host:1389/cn=Foo,dc=b.com????x-password", "ldap://host:1389/cn=Foo,dc=b.com????x-password",
+ "ldap://host:1389/cn=Foo,dc=b.com??base?(objectClass=*)?x-password" },
+ { "ldap://host:1389/cn=Foo,dc=b.com????a,b,c", "ldap://host:1389/cn=Foo,dc=b.com????a,b,c",
+ "ldap://host:1389/cn=Foo,dc=b.com??base?(objectClass=*)?a,b,c" },
+ { "ldap://host:1389/cn=Foo,dc=b.com????,,,", "ldap://host:1389/cn=Foo,dc=b.com",
+ "ldap://host:1389/cn=Foo,dc=b.com??base?(objectClass=*)" },
+ // URLs with everything
+ { "ldap://myhost.full.com:2389/cn=F oo,dc=full.com?cn,sn,userpassword?one?(cn=foo)?x-nothing",
+ "ldap://myhost.full.com:2389/cn=F%20oo,dc=full.com????x-nothing",
+ "ldap://myhost.full.com:2389/cn=F%20oo,dc=full.com?cn,sn,userpassword?one?(cn=foo)?x-nothing" },
+ };
+ }
+
+ @Test(dataProvider = "validURLs")
+ public void testDecodeString(String rawURL, String stringURL,
+ String fullURL)
+ throws Exception
+ {
+ LDAPURL url = LDAPURL.decode(rawURL, true);
+ StringBuilder buffer = new StringBuilder();
+ url.toString(buffer, true);
+ assertEquals(stringURL, buffer.toString());
+ }
+
+
+ @Test(dataProvider = "validURLs")
+ public void testDecodeStringFull(String rawURL, String stringURL,
+ String fullURL) throws Exception
+ {
+ LDAPURL url = LDAPURL.decode(rawURL, true);
+ StringBuilder buffer = new StringBuilder();
+ url.toString(buffer, false);
+ assertEquals(fullURL, buffer.toString());
+ }
+ /**
+ * Illegal URLs test data provider.
+ *
+ * @return The array of illegal test URk strings.
+ */
+ @DataProvider(name = "illegalURLs")
+ public Object[][] createIllegalData() {
+ return new Object[][] { { "http:" }, { "://" }, { "ldap://:389" },
+ { "ldap://localhost:"}, { "ldap://1.2.3.4:" }, { "ldap://host:-1" },
+ { "ldap://host:65536" }, { "ldap://host:ldap" }, { "ldap://host:389:/" },
+ // { "ldap://host:389/c=a\"a" },
+ { "ldap://host:389/cn=a,a" },
+ { "ldap://host:1389/cn=Foo,dc=b.com??suberror" },
+ { "ldap://host:1389/cn=Foo,dc=b.com???(invalidFilter)" },
+ { "ldap://host:1389/cn=Foo,dc=b.com???(&(cn=Foo)(cn=Bar" },
+ };
+ }
+
+ /**
+ * Test LDAPUrl string decoder against illegal strings.
+ *
+ * @param rawURL
+ * Illegal URL string representation.
+ * @throws Exception
+ * If the test failed unexpectedly.
+ */
+ @Test(dataProvider = "illegalURLs", expectedExceptions = DirectoryException.class)
+ public void testDecodeString(String rawURL) throws Exception
+ {
+ LDAPURL.decode(rawURL, true);
+
+ fail("Expected exception for value \"" + rawURL + "\"");
+ }
+
+}
\ No newline at end of file
--
Gitblit v1.10.0