opendj-core/src/main/java/org/forgerock/opendj/ldap/DN.java
@@ -19,6 +19,7 @@ import java.util.Arrays; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.Map; import java.util.NoSuchElementException; import java.util.UUID; @@ -28,6 +29,7 @@ import org.forgerock.opendj.ldap.schema.CoreSchema; import org.forgerock.opendj.ldap.schema.Schema; import org.forgerock.opendj.ldap.schema.UnknownSchemaElementException; import org.forgerock.util.Pair; import org.forgerock.util.Reject; import com.forgerock.opendj.util.SubstringReader; @@ -270,25 +272,41 @@ ERR_DN_TYPE_NOT_FOUND.get(reader.getString(), e.getMessageObject())); } if (reader.remaining() > 0 && reader.read() == ',') { LinkedList<Pair<Integer, RDN>> parentRDNs = null; DN parent = null; while (reader.remaining() > 0 && reader.read() == ',') { reader.skipWhitespaces(); if (reader.remaining() == 0) { throw new LocalizedIllegalArgumentException(ERR_ATTR_SYNTAX_DN_ATTR_NO_NAME.get(reader.getString())); } reader.mark(); final String parentString = reader.read(reader.remaining()); DN parent = cache.get(parentString); if (parent == null) { reader.reset(); parent = decode(reader, schema, cache); // Only cache parent DNs since leaf DNs are likely to make the cache to volatile. cache.put(parentString, parent); parent = cache.get(parentString); if (parent != null) { break; } return new DN(schema, parent, rdn); } else { return new DN(schema, ROOT_DN, rdn); reader.reset(); if (parentRDNs == null) { parentRDNs = new LinkedList<>(); } parentRDNs.add(Pair.of(reader.pos(), RDN.decode(reader, schema))); } if (parent == null) { parent = ROOT_DN; } if (parentRDNs != null) { Iterator<Pair<Integer, RDN>> iter = parentRDNs.descendingIterator(); int parentsLeft = parentRDNs.size(); while (iter.hasNext()) { Pair<Integer, RDN> parentRDN = iter.next(); parent = new DN(schema, parent, parentRDN.getSecond()); if (parentsLeft-- < DN_CACHE_SIZE) { cache.put(reader.getString().substring(parentRDN.getFirst()), parent); } } } return new DN(schema, parent, rdn); } @SuppressWarnings("serial") @@ -877,10 +895,15 @@ public String toString() { // We don't care about potential race conditions here. if (stringValue == null) { final StringBuilder builder = rdn.toString(new StringBuilder()); if (!parent.isRootDN()) { final StringBuilder builder = new StringBuilder(); builder.append(rdn); for (DN dn = parent; dn.rdn != null; dn = dn.parent) { builder.append(RDN_CHAR_SEPARATOR); builder.append(parent); if (dn.stringValue != null) { builder.append(dn.stringValue); break; } builder.append(dn.rdn); } stringValue = builder.toString(); } @@ -902,9 +925,14 @@ if (rdn == null) { normalizedDN = ByteString.empty(); } else { final ByteString normalizedParent = parent.toNormalizedByteString(); final ByteStringBuilder builder = new ByteStringBuilder(normalizedParent.length() + 16); builder.appendBytes(normalizedParent); final ByteStringBuilder builder = new ByteStringBuilder(size * 8); if (parent.normalizedDN == null) { for (int i = size() - 1; i > 0; i--) { parent(i).rdn().toNormalizedByteString(builder); } } else { builder.appendBytes(parent.normalizedDN); } rdn.toNormalizedByteString(builder); normalizedDN = builder.toByteString(); } opendj-core/src/main/java/org/forgerock/opendj/ldap/RDN.java
@@ -493,10 +493,6 @@ return stringValue; } StringBuilder toString(final StringBuilder builder) { return builder.append(this); } /** * Returns the normalized byte string representation of this RDN. * <p> opendj-core/src/test/java/org/forgerock/opendj/ldap/DNTestCase.java
@@ -1393,4 +1393,19 @@ public void rdnShouldThrowIAEForNegativeIndexes() throws Exception { DN.valueOf("dc=example,dc=com").rdn(-1); } @Test public void testToStringOnExtremelyLongDNs() { int numRDNs = 16384; String rdn = "cn=verylongdn,"; String base = "dc=example,dc=com"; StringBuilder builder = new StringBuilder(rdn.length() * numRDNs + base.length()); for (int i = 0; i < numRDNs; i++) { builder.append(rdn); } builder.append(base); DN longDN = DN.valueOf(builder.toString()); assertEquals(longDN.toString(), builder.toString(), "String representation of a very long DN does not match the source DN"); } } opendj-server-legacy/src/main/java/org/opends/server/loggers/TextErrorLogPublisher.java
@@ -455,16 +455,19 @@ StringBuilder sb = new StringBuilder(); sb.append("["); sb.append(TimeThread.getLocalTime()); sb.append("] category=").append(category). append(" severity=").append(severity). append(" msgID=").append(message.resourceName()) .append('.') .append(message.ordinal()). append(" msg=").append(message); sb.append("] category=") .append(category) .append(" severity=") .append(severity) .append(" msgID=") .append(message.resourceName()) .append('.') .append(message.ordinal()) .append(" msg=") .append(message.toString()); if (exception != null) { sb.append(" exception=").append( StaticUtils.stackTraceToSingleLineString(exception)); sb.append(" exception=").append(StaticUtils.stackTraceToSingleLineString(exception)); } writer.writeRecord(sb.toString()); opendj-server-legacy/src/main/java/org/opends/server/protocols/ldap/LDAPFilter.java
@@ -25,6 +25,7 @@ import java.util.Set; import org.forgerock.i18n.LocalizableMessage; import org.forgerock.i18n.LocalizedIllegalArgumentException; import org.forgerock.i18n.slf4j.LocalizedLogger; import org.forgerock.opendj.ldap.AttributeDescription; import org.forgerock.opendj.ldap.ByteString; @@ -1891,7 +1892,14 @@ Set<String> options = Collections.emptySet(); if (attributeDescription != null) { attrDesc = AttributeDescription.valueOf(attributeDescription); try { attrDesc = AttributeDescription.valueOf(attributeDescription); } catch (LocalizedIllegalArgumentException e) { throw new DirectoryException(ResultCode.PROTOCOL_ERROR, e.getMessageObject(), e); } attributeType = attrDesc.getAttributeType(); options = toSet(attrDesc); } opendj-server-legacy/src/main/java/org/opends/server/workflowelement/localbackend/LocalBackendWorkflowElement.java
@@ -20,6 +20,7 @@ import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.TreeMap; import org.forgerock.i18n.LocalizableMessage; @@ -898,14 +899,14 @@ private static LocalBackendWorkflowElement getLocalBackendWorkflowElement(DN entryDN) { while (entryDN != null) if (entryDN.isRootDN()) { final LocalBackendWorkflowElement workflow = registeredLocalBackends.get(entryDN); if (workflow != null) { return workflow; } entryDN = DirectoryServer.getParentDNInSuffix(entryDN); return registeredLocalBackends.get(entryDN); } Map.Entry<DN, LocalBackendWorkflowElement> backendWorkflow = registeredLocalBackends.floorEntry(entryDN); if (backendWorkflow.getKey().isSuperiorOrEqualTo(entryDN)) { return backendWorkflow.getValue(); } return null; }