From 388f25a9dc58704ea19a333ba9a28054d48590b1 Mon Sep 17 00:00:00 2001
From: matthew_swift <matthew_swift@localhost>
Date: Tue, 15 Dec 2009 21:58:47 +0000
Subject: [PATCH] Various changes:
---
sdk/src/org/opends/sdk/schema/Schema.java | 635 +++++++++++++++++++++++++++++++--------------------------
1 files changed, 342 insertions(+), 293 deletions(-)
diff --git a/sdk/src/org/opends/sdk/schema/Schema.java b/sdk/src/org/opends/sdk/schema/Schema.java
index 37b665f..fd6722e 100644
--- a/sdk/src/org/opends/sdk/schema/Schema.java
+++ b/sdk/src/org/opends/sdk/schema/Schema.java
@@ -42,8 +42,8 @@
import org.opends.sdk.responses.Result;
import org.opends.sdk.responses.SearchResultEntry;
-import com.sun.opends.sdk.util.ResultChain;
-import com.sun.opends.sdk.util.ResultTransformer;
+import com.sun.opends.sdk.util.FutureResultTransformer;
+import com.sun.opends.sdk.util.RecursiveFutureResult;
import com.sun.opends.sdk.util.StaticUtils;
@@ -281,6 +281,16 @@
+ /**
+ * {@inheritDoc}
+ */
+ public String getSchemaName()
+ {
+ return "Empty Schema";
+ }
+
+
+
public Syntax getSyntax(String numericOID)
{
// Fake up a syntax substituted by the default syntax.
@@ -483,6 +493,10 @@
+ String getSchemaName();
+
+
+
Syntax getSyntax(String numericOID)
throws UnknownSchemaElementException;
@@ -750,6 +764,13 @@
+ public String getSchemaName()
+ {
+ return strictImpl.getSchemaName();
+ }
+
+
+
public Syntax getSyntax(String numericOID)
{
if (!strictImpl.hasSyntax(numericOID))
@@ -883,9 +904,12 @@
private final List<LocalizableMessage> warnings;
+ private final String schemaName;
- private StrictImpl(Map<String, Syntax> numericOID2Syntaxes,
+
+ private StrictImpl(String schemaName,
+ Map<String, Syntax> numericOID2Syntaxes,
Map<String, MatchingRule> numericOID2MatchingRules,
Map<String, MatchingRuleUse> numericOID2MatchingRuleUses,
Map<String, AttributeType> numericOID2AttributeTypes,
@@ -904,6 +928,7 @@
Map<String, List<DITStructureRule>> nameForm2StructureRules,
SchemaCompatOptions options, List<LocalizableMessage> warnings)
{
+ this.schemaName = schemaName;
this.numericOID2Syntaxes = Collections
.unmodifiableMap(numericOID2Syntaxes);
this.numericOID2MatchingRules = Collections
@@ -1320,6 +1345,13 @@
+ public String getSchemaName()
+ {
+ return schemaName;
+ }
+
+
+
public Syntax getSyntax(String numericOID)
throws UnknownSchemaElementException
{
@@ -1502,276 +1534,6 @@
/**
- * Reads the schema from the Directory Server contained in the named
- * subschema sub-entry using the provided connection.
- * <p>
- * If the requested schema is not returned by the Directory Server
- * then the request will fail with an {@link EntryNotFoundException}.
- * More specifically, this method will never return {@code null}.
- *
- * @param connection
- * A connection to the Directory Server whose schema is to be
- * read.
- * @param name
- * The distinguished name of the subschema sub-entry.
- * @return The schema from the Directory Server.
- * @throws ErrorResultException
- * If the result code indicates that the request failed for
- * some reason.
- * @throws InterruptedException
- * If the current thread was interrupted while waiting.
- * @throws UnsupportedOperationException
- * If the connection does not support search operations.
- * @throws IllegalStateException
- * If the connection has already been closed, i.e. if
- * {@code isClosed() == true}.
- * @throws NullPointerException
- * If the {@code connection} or {@code name} was {@code
- * null}.
- */
- public static Schema readSchema(Connection connection, DN name)
- throws ErrorResultException, InterruptedException,
- UnsupportedOperationException, IllegalStateException,
- NullPointerException
- {
- final SearchRequest request = getReadSchemaSearchRequest(name);
- final Entry entry = connection.searchSingleEntry(request);
- return valueOf(entry);
- }
-
-
-
- /**
- * Reads the schema from the Directory Server which applies to the
- * named entry using the provided connection.
- * <p>
- * If the requested entry or its associated schema are not returned by
- * the Directory Server then the request will fail with an
- * {@link EntryNotFoundException}. More specifically, this method will
- * never return {@code null}.
- * <p>
- * A typical implementation will first read the {@code
- * subschemaSubentry} attribute of the entry in order to locate the
- * schema. However, implementations may choose to perform other
- * optimizations, such as caching.
- *
- * @param connection
- * A connection to the Directory Server whose schema is to be
- * read.
- * @param name
- * The distinguished name of the entry whose schema is to be
- * located.
- * @return The schema from the Directory Server which applies to the
- * named entry.
- * @throws ErrorResultException
- * If the result code indicates that the request failed for
- * some reason.
- * @throws InterruptedException
- * If the current thread was interrupted while waiting.
- * @throws UnsupportedOperationException
- * If the connection does not support search operations.
- * @throws IllegalStateException
- * If the connection has already been closed, i.e. if
- * {@code isClosed() == true}.
- * @throws NullPointerException
- * If the {@code connection} or {@code name} was {@code
- * null}.
- */
- public static Schema readSchemaForEntry(Connection connection, DN name)
- throws ErrorResultException, InterruptedException,
- UnsupportedOperationException, IllegalStateException,
- NullPointerException
- {
- final SearchRequest request = getReadSchemaForEntrySearchRequest(name);
- final Entry entry = connection.searchSingleEntry(request);
- final DN subschemaDN = getSubschemaSubentryDN(name, entry);
-
- return readSchema(connection, subschemaDN);
- }
-
-
-
- private static DN getSubschemaSubentryDN(DN name, final Entry entry)
- throws ErrorResultException
- {
- final Attribute subentryAttr = entry
- .getAttribute(ATTR_SUBSCHEMA_SUBENTRY);
-
- if (subentryAttr == null || subentryAttr.isEmpty())
- {
- // Did not get the subschema sub-entry attribute.
- Result result = Responses.newResult(
- ResultCode.CLIENT_SIDE_NO_RESULTS_RETURNED)
- .setDiagnosticMessage(
- ERR_NO_SUBSCHEMA_SUBENTRY_ATTR.get(name.toString())
- .toString());
- throw ErrorResultException.wrap(result);
- }
-
- String dnString = subentryAttr.iterator().next().toString();
- DN subschemaDN;
- try
- {
- subschemaDN = DN.valueOf(dnString);
- }
- catch (LocalizedIllegalArgumentException e)
- {
- Result result = Responses.newResult(
- ResultCode.CLIENT_SIDE_NO_RESULTS_RETURNED)
- .setDiagnosticMessage(
- ERR_INVALID_SUBSCHEMA_SUBENTRY_ATTR.get(name.toString(),
- dnString, e.getMessageObject()).toString());
- throw ErrorResultException.wrap(result);
- }
- return subschemaDN;
- }
-
-
-
- /**
- * Reads the schema from the Directory Server contained in the named
- * subschema sub-entry.
- * <p>
- * If the requested schema is not returned by the Directory Server
- * then the request will fail with an {@link EntryNotFoundException}.
- * More specifically, the returned future will never return {@code
- * null}.
- * <p>
- * Implementations may choose to perform optimizations such as
- * caching.
- *
- * @param connection
- * A connection to the Directory Server whose schema is to be
- * read.
- * @param name
- * The distinguished name of the subschema sub-entry.
- * @param handler
- * A result handler which can be used to asynchronously
- * process the operation result when it is received, may be
- * {@code null}.
- * @return A future representing the result of the operation.
- * @throws UnsupportedOperationException
- * If this connection does not support search operations.
- * @throws IllegalStateException
- * If this connection has already been closed, i.e. if
- * {@code isClosed() == true}.
- * @throws NullPointerException
- * If the {@code connection} or {@code name} was {@code
- * null}.
- */
- public static ResultFuture<Schema> readSchema(
- AsynchronousConnection connection, DN name,
- ResultHandler<? super Schema> handler)
- throws UnsupportedOperationException, IllegalStateException,
- NullPointerException
- {
- final SearchRequest request = getReadSchemaSearchRequest(name);
-
- final ResultTransformer<SearchResultEntry, Schema> future = new ResultTransformer<SearchResultEntry, Schema>(
- handler)
- {
-
- protected Schema transformResult(SearchResultEntry result)
- throws ErrorResultException
- {
- return valueOf(result);
- }
-
- };
-
- ResultFuture<SearchResultEntry> innerFuture = connection
- .searchSingleEntry(request, future);
- future.setResultFuture(innerFuture);
- return future;
- }
-
-
-
- /**
- * Reads the schema from the Directory Server which applies to the
- * named entry.
- * <p>
- * If the requested entry or its associated schema are not returned by
- * the Directory Server then the request will fail with an
- * {@link EntryNotFoundException}. More specifically, the returned
- * future will never return {@code null}.
- * <p>
- * A typical implementation will first read the {@code
- * subschemaSubentry} attribute of the entry in order to locate the
- * schema. However, implementations may choose to perform other
- * optimizations, such as caching.
- *
- * @param connection
- * A connection to the Directory Server whose schema is to be
- * read.
- * @param name
- * The distinguished name of the entry whose schema is to be
- * located.
- * @param handler
- * A result handler which can be used to asynchronously
- * process the operation result when it is received, may be
- * {@code null}.
- * @return A future representing the result of the operation.
- * @throws UnsupportedOperationException
- * If this connection does not support search operations.
- * @throws IllegalStateException
- * If this connection has already been closed, i.e. if
- * {@code isClosed() == true}.
- * @throws NullPointerException
- * If the {@code connection} or {@code name} was {@code
- * null}.
- */
- public static ResultFuture<Schema> readSchemaForEntry(
- final AsynchronousConnection connection, final DN name,
- ResultHandler<Schema> handler)
- throws UnsupportedOperationException, IllegalStateException,
- NullPointerException
- {
- final ResultChain<SearchResultEntry, Schema> future = new ResultChain<SearchResultEntry, Schema>(
- handler)
- {
-
- protected ResultFuture<Schema> chainResult(
- SearchResultEntry innerResult,
- ResultHandler<? super Schema> handler)
- throws ErrorResultException
- {
- final DN subschemaDN = getSubschemaSubentryDN(name, innerResult);
- return readSchema(connection, subschemaDN, handler);
- }
-
- };
-
- final SearchRequest request = getReadSchemaForEntrySearchRequest(name);
- ResultFuture<SearchResultEntry> innerFuture = connection
- .searchSingleEntry(request, future);
- future.setInnerResultFuture(innerFuture);
- return future;
- }
-
-
-
- // Constructs a search request for retrieving the named subschema
- // sub-entry.
- private static SearchRequest getReadSchemaSearchRequest(DN dn)
- {
- return Requests.newSearchRequest(dn, SearchScope.BASE_OBJECT,
- SUBSCHEMA_FILTER, SUBSCHEMA_ATTRS);
- }
-
-
-
- // Constructs a search request for retrieving the subschemaSubentry
- // attribute from the named entry.
- private static SearchRequest getReadSchemaForEntrySearchRequest(DN dn)
- {
- return Requests.newSearchRequest(dn, SearchScope.BASE_OBJECT,
- SUBSCHEMA_FILTER, SUBSCHEMA_SUBENTRY_ATTRS);
- }
-
-
-
- /**
* Returns the core schema. The core schema is non-strict and contains
* the following standard LDAP schema elements:
* <ul>
@@ -1831,6 +1593,234 @@
/**
+ * Reads the schema from the Directory Server contained in the named
+ * subschema sub-entry.
+ * <p>
+ * If the requested schema is not returned by the Directory Server
+ * then the request will fail with an {@link EntryNotFoundException}.
+ * More specifically, the returned future will never return {@code
+ * null}.
+ * <p>
+ * Implementations may choose to perform optimizations such as
+ * caching.
+ *
+ * @param connection
+ * A connection to the Directory Server whose schema is to be
+ * read.
+ * @param name
+ * The distinguished name of the subschema sub-entry.
+ * @param handler
+ * A result handler which can be used to asynchronously
+ * process the operation result when it is received, may be
+ * {@code null}.
+ * @return A future representing the result of the operation.
+ * @throws UnsupportedOperationException
+ * If this connection does not support search operations.
+ * @throws IllegalStateException
+ * If this connection has already been closed, i.e. if
+ * {@code isClosed() == true}.
+ * @throws NullPointerException
+ * If the {@code connection} or {@code name} was {@code
+ * null}.
+ */
+ public static FutureResult<Schema> readSchema(
+ AsynchronousConnection connection, DN name,
+ ResultHandler<? super Schema> handler)
+ throws UnsupportedOperationException, IllegalStateException,
+ NullPointerException
+ {
+ final SearchRequest request = getReadSchemaSearchRequest(name);
+
+ final FutureResultTransformer<SearchResultEntry, Schema> future = new FutureResultTransformer<SearchResultEntry, Schema>(
+ handler)
+ {
+
+ protected Schema transformResult(SearchResultEntry result)
+ throws ErrorResultException
+ {
+ return valueOf(result);
+ }
+
+ };
+
+ final FutureResult<SearchResultEntry> innerFuture = connection
+ .searchSingleEntry(request, future);
+ future.setFutureResult(innerFuture);
+ return future;
+ }
+
+
+
+ /**
+ * Reads the schema from the Directory Server contained in the named
+ * subschema sub-entry using the provided connection.
+ * <p>
+ * If the requested schema is not returned by the Directory Server
+ * then the request will fail with an {@link EntryNotFoundException}.
+ * More specifically, this method will never return {@code null}.
+ *
+ * @param connection
+ * A connection to the Directory Server whose schema is to be
+ * read.
+ * @param name
+ * The distinguished name of the subschema sub-entry.
+ * @return The schema from the Directory Server.
+ * @throws ErrorResultException
+ * If the result code indicates that the request failed for
+ * some reason.
+ * @throws InterruptedException
+ * If the current thread was interrupted while waiting.
+ * @throws UnsupportedOperationException
+ * If the connection does not support search operations.
+ * @throws IllegalStateException
+ * If the connection has already been closed, i.e. if
+ * {@code isClosed() == true}.
+ * @throws NullPointerException
+ * If the {@code connection} or {@code name} was {@code
+ * null}.
+ */
+ public static Schema readSchema(Connection connection, DN name)
+ throws ErrorResultException, InterruptedException,
+ UnsupportedOperationException, IllegalStateException,
+ NullPointerException
+ {
+ final SearchRequest request = getReadSchemaSearchRequest(name);
+ final Entry entry = connection.searchSingleEntry(request);
+ return valueOf(entry);
+ }
+
+
+
+ /**
+ * Reads the schema from the Directory Server which applies to the
+ * named entry.
+ * <p>
+ * If the requested entry or its associated schema are not returned by
+ * the Directory Server then the request will fail with an
+ * {@link EntryNotFoundException}. More specifically, the returned
+ * future will never return {@code null}.
+ * <p>
+ * A typical implementation will first read the {@code
+ * subschemaSubentry} attribute of the entry in order to locate the
+ * schema. However, implementations may choose to perform other
+ * optimizations, such as caching.
+ *
+ * @param connection
+ * A connection to the Directory Server whose schema is to be
+ * read.
+ * @param name
+ * The distinguished name of the entry whose schema is to be
+ * located.
+ * @param handler
+ * A result handler which can be used to asynchronously
+ * process the operation result when it is received, may be
+ * {@code null}.
+ * @return A future representing the result of the operation.
+ * @throws UnsupportedOperationException
+ * If this connection does not support search operations.
+ * @throws IllegalStateException
+ * If this connection has already been closed, i.e. if
+ * {@code isClosed() == true}.
+ * @throws NullPointerException
+ * If the {@code connection} or {@code name} was {@code
+ * null}.
+ */
+ public static FutureResult<Schema> readSchemaForEntry(
+ final AsynchronousConnection connection, final DN name,
+ ResultHandler<Schema> handler)
+ throws UnsupportedOperationException, IllegalStateException,
+ NullPointerException
+ {
+ final RecursiveFutureResult<SearchResultEntry, Schema> future = new RecursiveFutureResult<SearchResultEntry, Schema>(
+ handler)
+ {
+
+ protected FutureResult<Schema> chainResult(
+ SearchResultEntry innerResult,
+ ResultHandler<? super Schema> handler)
+ throws ErrorResultException
+ {
+ final DN subschemaDN = getSubschemaSubentryDN(name, innerResult);
+ return readSchema(connection, subschemaDN, handler);
+ }
+
+ };
+
+ final SearchRequest request = getReadSchemaForEntrySearchRequest(name);
+ final FutureResult<SearchResultEntry> innerFuture = connection
+ .searchSingleEntry(request, future);
+ future.setFutureResult(innerFuture);
+ return future;
+ }
+
+
+
+ /**
+ * Reads the schema from the Directory Server which applies to the
+ * named entry using the provided connection.
+ * <p>
+ * If the requested entry or its associated schema are not returned by
+ * the Directory Server then the request will fail with an
+ * {@link EntryNotFoundException}. More specifically, this method will
+ * never return {@code null}.
+ * <p>
+ * A typical implementation will first read the {@code
+ * subschemaSubentry} attribute of the entry in order to locate the
+ * schema. However, implementations may choose to perform other
+ * optimizations, such as caching.
+ *
+ * @param connection
+ * A connection to the Directory Server whose schema is to be
+ * read.
+ * @param name
+ * The distinguished name of the entry whose schema is to be
+ * located.
+ * @return The schema from the Directory Server which applies to the
+ * named entry.
+ * @throws ErrorResultException
+ * If the result code indicates that the request failed for
+ * some reason.
+ * @throws InterruptedException
+ * If the current thread was interrupted while waiting.
+ * @throws UnsupportedOperationException
+ * If the connection does not support search operations.
+ * @throws IllegalStateException
+ * If the connection has already been closed, i.e. if
+ * {@code isClosed() == true}.
+ * @throws NullPointerException
+ * If the {@code connection} or {@code name} was {@code
+ * null}.
+ */
+ public static Schema readSchemaForEntry(Connection connection, DN name)
+ throws ErrorResultException, InterruptedException,
+ UnsupportedOperationException, IllegalStateException,
+ NullPointerException
+ {
+ final SearchRequest request = getReadSchemaForEntrySearchRequest(name);
+ final Entry entry = connection.searchSingleEntry(request);
+ final DN subschemaDN = getSubschemaSubentryDN(name, entry);
+
+ return readSchema(connection, subschemaDN);
+ }
+
+
+
+ /**
+ * Sets the default schema which should be used by this application.
+ * The default schema is initially set to the core schema.
+ *
+ * @param schema
+ * The default schema which should be used by this
+ * application.
+ */
+ public static void setDefaultSchema(Schema schema)
+ {
+ DEFAULT_SCHEMA = schema;
+ }
+
+
+
+ /**
* Parses the provided entry as a subschema subentry. Any problems
* encountered while parsing the entry can be retrieved using the
* returned schema's {@link #getWarnings()} method.
@@ -1841,7 +1831,8 @@
*/
public static Schema valueOf(Entry entry)
{
- final SchemaBuilder builder = new SchemaBuilder();
+ final SchemaBuilder builder = new SchemaBuilder(entry.getName()
+ .toString());
Attribute attr = entry.getAttribute(ATTR_LDAP_SYNTAXES);
if (attr != null)
@@ -1976,17 +1967,59 @@
- /**
- * Sets the default schema which should be used by this application.
- * The default schema is initially set to the core schema.
- *
- * @param schema
- * The default schema which should be used by this
- * application.
- */
- public static void setDefaultSchema(Schema schema)
+ // Constructs a search request for retrieving the subschemaSubentry
+ // attribute from the named entry.
+ private static SearchRequest getReadSchemaForEntrySearchRequest(DN dn)
{
- DEFAULT_SCHEMA = schema;
+ return Requests.newSearchRequest(dn, SearchScope.BASE_OBJECT,
+ Filter.getObjectClassPresentFilter(), SUBSCHEMA_SUBENTRY_ATTRS);
+ }
+
+
+
+ // Constructs a search request for retrieving the named subschema
+ // sub-entry.
+ private static SearchRequest getReadSchemaSearchRequest(DN dn)
+ {
+ return Requests.newSearchRequest(dn, SearchScope.BASE_OBJECT,
+ SUBSCHEMA_FILTER, SUBSCHEMA_ATTRS);
+ }
+
+
+
+ private static DN getSubschemaSubentryDN(DN name, final Entry entry)
+ throws ErrorResultException
+ {
+ final Attribute subentryAttr = entry
+ .getAttribute(ATTR_SUBSCHEMA_SUBENTRY);
+
+ if (subentryAttr == null || subentryAttr.isEmpty())
+ {
+ // Did not get the subschema sub-entry attribute.
+ final Result result = Responses.newResult(
+ ResultCode.CLIENT_SIDE_NO_RESULTS_RETURNED)
+ .setDiagnosticMessage(
+ ERR_NO_SUBSCHEMA_SUBENTRY_ATTR.get(name.toString())
+ .toString());
+ throw ErrorResultException.wrap(result);
+ }
+
+ final String dnString = subentryAttr.iterator().next().toString();
+ DN subschemaDN;
+ try
+ {
+ subschemaDN = DN.valueOf(dnString);
+ }
+ catch (final LocalizedIllegalArgumentException e)
+ {
+ final Result result = Responses.newResult(
+ ResultCode.CLIENT_SIDE_NO_RESULTS_RETURNED)
+ .setDiagnosticMessage(
+ ERR_INVALID_SUBSCHEMA_SUBENTRY_ATTR.get(name.toString(),
+ dnString, e.getMessageObject()).toString());
+ throw ErrorResultException.wrap(result);
+ }
+ return subschemaDN;
}
@@ -2009,7 +2042,14 @@
- Schema(Map<String, Syntax> numericOID2Syntaxes,
+ private Schema(Impl impl)
+ {
+ this.impl = impl;
+ }
+
+
+
+ Schema(String schemaName, Map<String, Syntax> numericOID2Syntaxes,
Map<String, MatchingRule> numericOID2MatchingRules,
Map<String, MatchingRuleUse> numericOID2MatchingRuleUses,
Map<String, AttributeType> numericOID2AttributeTypes,
@@ -2028,7 +2068,7 @@
Map<String, List<DITStructureRule>> nameForm2StructureRules,
SchemaCompatOptions options, List<LocalizableMessage> warnings)
{
- impl = new StrictImpl(numericOID2Syntaxes,
+ impl = new StrictImpl(schemaName, numericOID2Syntaxes,
numericOID2MatchingRules, numericOID2MatchingRuleUses,
numericOID2AttributeTypes, numericOID2ObjectClasses,
numericOID2NameForms, numericOID2ContentRules,
@@ -2040,13 +2080,6 @@
- private Schema(Impl impl)
- {
- this.impl = impl;
- }
-
-
-
/**
* Returns the attribute type with the specified name or numeric OID.
*
@@ -2441,6 +2474,22 @@
/**
+ * Returns the user-friendly name of this schema which may be used for
+ * debugging purposes. The format of the schema name is not defined
+ * but should contain the distinguished name of the subschema
+ * sub-entry for those schemas retrieved from a Directory Server.
+ *
+ * @return The user-friendly name of this schema which may be used for
+ * debugging purposes.
+ */
+ public String getSchemaName()
+ {
+ return impl.getSchemaName();
+ }
+
+
+
+ /**
* Returns the syntax with the specified numeric OID.
*
* @param numericOID
--
Gitblit v1.10.0