From b2dc0243fdef08a6c1d751fec039366fd244a18c Mon Sep 17 00:00:00 2001
From: Jean-Noël Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Thu, 28 Jan 2016 13:49:12 +0000
Subject: [PATCH] Replaced org.opends.server.types.AttributeDescription with org.forgerock.opendj.ldap.AttributeDescription.
---
opendj-server-legacy/src/main/java/org/opends/server/api/CompressedSchema.java | 84 ++++++++++++++++++++++-------------------
1 files changed, 45 insertions(+), 39 deletions(-)
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/api/CompressedSchema.java b/opendj-server-legacy/src/main/java/org/opends/server/api/CompressedSchema.java
index 17f6ece..89f5294 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/api/CompressedSchema.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/api/CompressedSchema.java
@@ -47,6 +47,7 @@
import net.jcip.annotations.GuardedBy;
+import org.forgerock.opendj.ldap.AttributeDescription;
import org.forgerock.opendj.ldap.ByteSequenceReader;
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.ByteStringBuilder;
@@ -56,6 +57,7 @@
import org.opends.server.core.ServerContext;
import org.opends.server.types.Attribute;
import org.opends.server.types.AttributeBuilder;
+import org.opends.server.types.AttributeDescriptions;
import org.opends.server.types.Attributes;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.ObjectClass;
@@ -77,9 +79,9 @@
private static final class Mappings
{
/** Maps encoded representation's ID to its attribute description (the List's index is the ID). */
- private final List<Entry<AttributeType, Set<String>>> adDecodeMap = new CopyOnWriteArrayList<>();
+ private final List<AttributeDescription> adDecodeMap = new CopyOnWriteArrayList<>();
/** Maps attribute description to its encoded representation's ID. */
- private final Map<Entry<AttributeType, Set<String>>, Integer> adEncodeMap;
+ private final Map<AttributeDescription, Integer> adEncodeMap;
/** Maps encoded representation's ID to its object class (the List's index is the ID). */
private final List<Map<ObjectClass, String>> ocDecodeMap = new CopyOnWriteArrayList<>();
/** Maps object class to its encoded representation's ID. */
@@ -174,11 +176,11 @@
*/
private void reloadAttributeTypeMaps(Mappings mappings, Mappings newMappings)
{
- for (Entry<Entry<AttributeType, Set<String>>, Integer> entry : mappings.adEncodeMap.entrySet())
+ for (Entry<AttributeDescription, Integer> entry : mappings.adEncodeMap.entrySet())
{
- Entry<AttributeType, Set<String>> ad = entry.getKey();
+ AttributeDescription ad = entry.getKey();
Integer id = entry.getValue();
- loadAttributeToMaps(id, ad.getKey().getNameOrOID(), ad.getValue(), newMappings);
+ loadAttributeToMaps(id, ad.getAttributeType().getNameOrOID(), ad.getOptions(), newMappings);
}
}
@@ -214,21 +216,20 @@
// Before returning the attribute, make sure that the attribute type is not stale.
final Mappings mappings = reloadMappingsIfSchemaChanged(false);
- final Entry<AttributeType, Set<String>> ad = mappings.adDecodeMap.get(id);
+ final AttributeDescription ad = mappings.adDecodeMap.get(id);
if (ad == null)
{
throw new DirectoryException(DirectoryServer.getServerErrorResultCode(),
ERR_COMPRESSEDSCHEMA_UNRECOGNIZED_AD_TOKEN.get(id));
}
- AttributeType attrType = ad.getKey();
- Set<String> options = ad.getValue();
+ AttributeType attrType = ad.getAttributeType();
// Determine the number of values for the attribute.
final int numValues = reader.readBERLength();
// For the common case of a single value with no options, generate less garbage.
- if (numValues == 1 && options.isEmpty())
+ if (numValues == 1 && !ad.hasOptions())
{
return Attributes.create(attrType, readValue(reader));
}
@@ -236,7 +237,7 @@
{
// Read the appropriate number of values.
final AttributeBuilder builder = new AttributeBuilder(attrType);
- builder.setOptions(options);
+ builder.setOptions(ad.getOptions());
for (int i = 0; i < numValues; i++)
{
builder.add(readValue(reader));
@@ -318,9 +319,7 @@
final Attribute attribute) throws DirectoryException
{
// Re-use or allocate a new ID.
- final AttributeType type = attribute.getAttributeType();
- final Set<String> options = attribute.getOptions();
- int id = getAttributeId(new SimpleImmutableEntry<>(type, options));
+ int id = getAttributeId(AttributeDescriptions.create(attribute));
// Encode the attribute.
final byte[] idBytes = encodeId(id);
@@ -334,7 +333,7 @@
}
}
- private int getAttributeId(final Entry<AttributeType, Set<String>> ad) throws DirectoryException
+ private int getAttributeId(final AttributeDescription ad) throws DirectoryException
{
// avoid lazy registration races
boolean shared = true;
@@ -357,7 +356,7 @@
id = mappings.adDecodeMap.size();
mappings.adDecodeMap.add(ad);
mappings.adEncodeMap.put(ad, id);
- storeAttribute(encodeId(id), ad.getKey().getNameOrOID(), ad.getValue());
+ storeAttribute(encodeId(id), ad.getAttributeType().getNameOrOID(), ad.getOptions());
}
return id;
}
@@ -434,17 +433,17 @@
*
* @return A view of the encoded attributes in this compressed schema.
*/
- protected final Iterable<Entry<byte[], Entry<String, Collection<String>>>> getAllAttributes()
+ protected final Iterable<Entry<byte[], Entry<String, Iterable<String>>>> getAllAttributes()
{
- return new Iterable<Entry<byte[], Entry<String, Collection<String>>>>()
+ return new Iterable<Entry<byte[], Entry<String, Iterable<String>>>>()
{
@Override
- public Iterator<Entry<byte[], Entry<String, Collection<String>>>> iterator()
+ public Iterator<Entry<byte[], Entry<String, Iterable<String>>>> iterator()
{
- return new Iterator<Entry<byte[], Entry<String, Collection<String>>>>()
+ return new Iterator<Entry<byte[], Entry<String, Iterable<String>>>>()
{
private int id;
- private List<Entry<AttributeType, Set<String>>> adDecodeMap = getMappings().adDecodeMap;
+ private List<AttributeDescription> adDecodeMap = getMappings().adDecodeMap;
@Override
public boolean hasNext()
@@ -453,15 +452,14 @@
}
@Override
- public Entry<byte[], Entry<String, Collection<String>>> next()
+ public Entry<byte[], Entry<String, Iterable<String>>> next()
{
final byte[] encodedAttribute = encodeId(id);
- final Entry<AttributeType, Set<String>> ad = adDecodeMap.get(id++);
- return new SimpleImmutableEntry<byte[],
- Entry<String, Collection<String>>>(
+ final AttributeDescription ad = adDecodeMap.get(id++);
+ return new SimpleImmutableEntry<byte[], Entry<String, Iterable<String>>>(
encodedAttribute,
- new SimpleImmutableEntry<String, Collection<String>>(ad
- .getKey().getNameOrOID(), ad.getValue()));
+ new SimpleImmutableEntry<String, Iterable<String>>(
+ ad.getAttributeType().getNameOrOID(), ad.getOptions()));
}
@Override
@@ -531,7 +529,7 @@
* The non-null but possibly empty set of attribute options.
* @return The attribute type description.
*/
- protected final Entry<AttributeType, Set<String>> loadAttribute(
+ protected final AttributeDescription loadAttribute(
final byte[] encodedAttribute, final String attributeName,
final Collection<String> attributeOptions)
{
@@ -552,12 +550,12 @@
* attribute description encodeMap and decodeMap maps id to entry
* @return The attribute type description.
*/
- private Entry<AttributeType, Set<String>> loadAttributeToMaps(final int id, final String attributeName,
- final Collection<String> attributeOptions, final Mappings mappings)
+ private AttributeDescription loadAttributeToMaps(final int id, final String attributeName,
+ final Iterable<String> attributeOptions, final Mappings mappings)
{
final AttributeType type = DirectoryServer.getAttributeTypeOrDefault(attributeName);
final Set<String> options = getOptions(attributeOptions);
- final Entry<AttributeType, Set<String>> ad = new SimpleImmutableEntry<>(type, options);
+ final AttributeDescription ad = AttributeDescriptions.create(type, options);
exclusiveLock.lock();
try
{
@@ -583,17 +581,25 @@
}
}
- private Set<String> getOptions(final Collection<String> attributeOptions)
+ private Set<String> getOptions(final Iterable<String> attributeOptions)
{
- switch (attributeOptions.size())
+ Iterator<String> it = attributeOptions.iterator();
+ if (!it.hasNext())
{
- case 0:
return Collections.emptySet();
- case 1:
- return Collections.singleton(attributeOptions.iterator().next());
- default:
- return new LinkedHashSet<>(attributeOptions);
}
+ String firstOption = it.next();
+ if (!it.hasNext())
+ {
+ return Collections.singleton(firstOption);
+ }
+ LinkedHashSet<String> results = new LinkedHashSet<>();
+ results.add(firstOption);
+ while (it.hasNext())
+ {
+ results.add(it.next());
+ }
+ return results;
}
/**
@@ -695,7 +701,7 @@
* If an error occurred while persisting the encoded attribute.
*/
protected void storeAttribute(final byte[] encodedAttribute,
- final String attributeName, final Collection<String> attributeOptions)
+ final String attributeName, final Iterable<String> attributeOptions)
throws DirectoryException
{
// Do nothing by default.
@@ -706,7 +712,7 @@
* to do nothing. Calls to this method are synchronized, so implementations
* can assume that this method is not being called by other threads. Note that
* this method is not thread-safe with respect to
- * {@link #storeAttribute(byte[], String, Collection)}.
+ * {@link #storeAttribute(byte[], String, Iterable)}.
*
* @param encodedObjectClasses
* The encoded object classes.
--
Gitblit v1.10.0