From 4c6a4c3e78a13b9237a46cc1e7ef8680c1c55a90 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Fri, 22 Nov 2013 07:57:26 +0000
Subject: [PATCH] LDIFReader.java: Extracted methods findFirstNonSpaceCharPosition(), base64Decode() and decodeDN(). In readAttribute(), moved common code out of if/else branches. Used early exits. Removed useless parenthesis. Condensed code and comments on one line where possible.
---
opends/src/server/org/opends/server/util/LDIFReader.java | 345 ++++++++++++++++++++-------------------------------------
1 files changed, 120 insertions(+), 225 deletions(-)
diff --git a/opends/src/server/org/opends/server/util/LDIFReader.java b/opends/src/server/org/opends/server/util/LDIFReader.java
index 6839ff5..eb24e0e 100644
--- a/opends/src/server/org/opends/server/util/LDIFReader.java
+++ b/opends/src/server/org/opends/server/util/LDIFReader.java
@@ -606,8 +606,7 @@
logToRejectWriter(lines, message);
throw new LDIFException(message, lastEntryLineNumber, true);
}
- //Add any superior objectclass(s) missing in an entries
- //objectclass map.
+ //Add any superior objectclass(s) missing in an entries objectclass map.
addSuperiorObjectClasses(entry.getObjectClasses());
}
@@ -734,35 +733,26 @@
// This must mean that we have reached the end of the LDIF source.
// If the set of lines read so far is empty, then move onto the next
// file or return null. Otherwise, break out of this loop.
- if (lines.isEmpty())
- {
- reader = importConfig.nextReader();
- if (reader == null)
- {
- return null;
- }
- else
- {
- return readEntryLines();
- }
- }
- else
+ if (!lines.isEmpty())
{
break;
}
+ reader = importConfig.nextReader();
+ if (reader != null)
+ {
+ return readEntryLines();
+ }
+ return null;
}
else if (line.length() == 0)
{
// This is a blank line. If the set of lines read so far is empty,
// then just skip over it. Otherwise, break out of this loop.
- if (lines.isEmpty())
- {
- continue;
- }
- else
+ if (!lines.isEmpty())
{
break;
}
+ continue;
}
else if (line.charAt(0) == '#')
{
@@ -868,8 +858,7 @@
// Look at the character immediately after the colon. If there is none,
// then assume the null DN. If it is another colon, then the DN must be
// base64-encoded. Otherwise, it may be one or more spaces.
- int length = line.length();
- if (colonPos == (length-1))
+ if (colonPos == line.length() - 1)
{
return DN.nullDN();
}
@@ -878,115 +867,90 @@
{
// The DN is base64-encoded. Find the first non-blank character and
// take the rest of the line, base64-decode it, and parse it as a DN.
- int pos = colonPos+2;
- while ((pos < length) && (line.charAt(pos) == ' '))
- {
- pos++;
- }
-
- String encodedDNStr = line.substring(pos);
-
- String dnStr;
- try
- {
- dnStr = new String(Base64.decode(encodedDNStr), "UTF-8");
- }
- catch (Exception e)
- {
- // The value did not have a valid base64-encoding.
- if (debugEnabled())
- {
- TRACER.debugInfo("Base64 decode failed for dn: ",
- line.substring(pos));
- }
-
- Message message =
- ERR_LDIF_COULD_NOT_BASE64_DECODE_DN.get(
- lastEntryLineNumber, line,
- String.valueOf(e));
-
- logToRejectWriter(lines, message);
- throw new LDIFException(message, lastEntryLineNumber, true, e);
- }
-
- try
- {
- return DN.decode(dnStr);
- }
- catch (DirectoryException de)
- {
- if (debugEnabled())
- {
- TRACER.debugInfo("DN decode failed for: ", dnStr);
- }
-
- Message message = ERR_LDIF_INVALID_DN.get(
- lastEntryLineNumber, line.toString(),
- de.getMessageObject());
-
- logToRejectWriter(lines, message);
- throw new LDIFException(message, lastEntryLineNumber, true, de);
- }
- catch (Exception e)
- {
- if (debugEnabled())
- {
- TRACER.debugInfo("DN decode failed for: ", dnStr);
- }
- Message message = ERR_LDIF_INVALID_DN.get(
- lastEntryLineNumber, line.toString(),
- String.valueOf(e));
-
- logToRejectWriter(lines, message);
- throw new LDIFException(message, lastEntryLineNumber, true, e);
- }
+ int pos = findFirstNonSpaceCharPosition(line, colonPos + 2);
+ String dnStr = base64Decode(line.substring(pos), lines, line);
+ return decodeDN(dnStr, lines, line);
}
else
{
// The rest of the value should be the DN. Skip over any spaces and
// attempt to decode the rest of the line as the DN.
- int pos = colonPos+1;
- while ((pos < length) && (line.charAt(pos) == ' '))
- {
- pos++;
- }
-
- String dnString = line.substring(pos);
-
- try
- {
- return DN.decode(dnString);
- }
- catch (DirectoryException de)
- {
- if (debugEnabled())
- {
- TRACER.debugInfo("DN decode failed for: ", line.substring(pos));
- }
- Message message = ERR_LDIF_INVALID_DN.get(
- lastEntryLineNumber, line.toString(), de.getMessageObject());
-
- logToRejectWriter(lines, message);
- throw new LDIFException(message, lastEntryLineNumber, true, de);
- }
- catch (Exception e)
- {
- if (debugEnabled())
- {
- TRACER.debugInfo("DN decode failed for: ", line.substring(pos));
- }
-
- Message message = ERR_LDIF_INVALID_DN.get(
- lastEntryLineNumber, line.toString(),
- String.valueOf(e));
-
- logToRejectWriter(lines, message);
- throw new LDIFException(message, lastEntryLineNumber, true, e);
- }
+ int pos = findFirstNonSpaceCharPosition(line, colonPos + 1);
+ return decodeDN(line.substring(pos), lines, line);
}
}
+ private int findFirstNonSpaceCharPosition(StringBuilder line, int startPos)
+ {
+ final int length = line.length();
+ int pos = startPos;
+ while ((pos < length) && (line.charAt(pos) == ' '))
+ {
+ pos++;
+ }
+ return pos;
+ }
+ private String base64Decode(String encodedStr, List<StringBuilder> lines,
+ StringBuilder line) throws LDIFException
+ {
+ try
+ {
+ return new String(Base64.decode(encodedStr), "UTF-8");
+ }
+ catch (Exception e)
+ {
+ // The value did not have a valid base64-encoding.
+ final String stackTrace = StaticUtils.stackTraceToSingleLineString(e);
+ if (debugEnabled())
+ {
+ TRACER.debugInfo(
+ "Base64 decode failed for dn '%s', exception stacktrace: %s",
+ encodedStr, stackTrace);
+ }
+
+ Message message = ERR_LDIF_COULD_NOT_BASE64_DECODE_DN.get(
+ lastEntryLineNumber, line, stackTrace);
+ logToRejectWriter(lines, message);
+ throw new LDIFException(message, lastEntryLineNumber, true, e);
+ }
+ }
+
+ private DN decodeDN(String dnString, List<StringBuilder> lines,
+ StringBuilder line) throws LDIFException
+ {
+ try
+ {
+ return DN.decode(dnString);
+ }
+ catch (DirectoryException de)
+ {
+ if (debugEnabled())
+ {
+ TRACER.debugInfo("DN decode failed for: ", dnString);
+ }
+
+ Message message = ERR_LDIF_INVALID_DN.get(
+ lastEntryLineNumber, line.toString(),
+ de.getMessageObject());
+
+ logToRejectWriter(lines, message);
+ throw new LDIFException(message, lastEntryLineNumber, true, de);
+ }
+ catch (Exception e)
+ {
+ if (debugEnabled())
+ {
+ TRACER.debugInfo("DN decode failed for: ", dnString);
+ }
+ Message message = ERR_LDIF_INVALID_DN.get(
+ lastEntryLineNumber, line.toString(),
+ String.valueOf(e));
+
+ logToRejectWriter(lines, message);
+ throw new LDIFException(message, lastEntryLineNumber, true, e);
+ }
+ }
/**
* Reads the changetype of the entry from the provided list of lines. If
@@ -1025,11 +989,9 @@
{
// No changetype attribute - return null
return null;
- } else
- {
- // Remove the line
- lines.remove();
}
+ // Remove the line
+ lines.remove();
// Look at the character immediately after the colon. If there is none,
@@ -1044,51 +1006,16 @@
if (line.charAt(colonPos+1) == ':')
{
- // The change type is base64-encoded. Find the first non-blank
- // character and
- // take the rest of the line, and base64-decode it.
- int pos = colonPos+2;
- while ((pos < length) && (line.charAt(pos) == ' '))
- {
- pos++;
- }
-
- String encodedChangeTypeStr = line.substring(pos);
-
- String changeTypeStr;
- try
- {
- changeTypeStr = new String(Base64.decode(encodedChangeTypeStr),
- "UTF-8");
- }
- catch (Exception e)
- {
- // The value did not have a valid base64-encoding.
- if (debugEnabled())
- {
- TRACER.debugCaught(DebugLogLevel.ERROR, e);
- }
-
- Message message = ERR_LDIF_COULD_NOT_BASE64_DECODE_DN.get(
- lastEntryLineNumber, line,
- String.valueOf(e));
- logToRejectWriter(lines, message);
- throw new LDIFException(message, lastEntryLineNumber, true, e);
- }
-
- return changeTypeStr;
+ // The change type is base64-encoded. Find the first non-blank character
+ // and take the rest of the line, and base64-decode it.
+ int pos = findFirstNonSpaceCharPosition(line, colonPos + 2);
+ return base64Decode(line.substring(pos), lines, line);
}
else
{
- // The rest of the value should be the changetype.
- // Skip over any spaces and
- // attempt to decode the rest of the line as the changetype string.
- int pos = colonPos+1;
- while ((pos < length) && (line.charAt(pos) == ' '))
- {
- pos++;
- }
-
+ // The rest of the value should be the changetype. Skip over any spaces
+ // and attempt to decode the rest of the line as the changetype string.
+ int pos = findFirstNonSpaceCharPosition(line, colonPos + 1);
return line.substring(pos);
}
}
@@ -1215,40 +1142,30 @@
else
{
logToRejectWriter(lines, message);
- throw new LDIFException(message, lastEntryLineNumber,
- true);
+ throw new LDIFException(message, lastEntryLineNumber, true);
}
}
}
- AttributeValue attributeValue =
- AttributeValues.create(attrType, value);
- List<AttributeBuilder> attrList;
+ AttributeValue attributeValue = AttributeValues.create(attrType, value);
+ final Map<AttributeType, List<AttributeBuilder>> attrBuilders;
if (attrType.isOperational())
{
- attrList = operationalAttrBuilders.get(attrType);
- if (attrList == null)
- {
- AttributeBuilder builder = new AttributeBuilder(attribute, true);
- builder.add(attributeValue);
- attrList = new ArrayList<AttributeBuilder>();
- attrList.add(builder);
- operationalAttrBuilders.put(attrType, attrList);
- return;
- }
+ attrBuilders = operationalAttrBuilders;
}
else
{
- attrList = userAttrBuilders.get(attrType);
- if (attrList == null)
- {
- AttributeBuilder builder = new AttributeBuilder(attribute, true);
- builder.add(attributeValue);
- attrList = new ArrayList<AttributeBuilder>();
- attrList.add(builder);
- userAttrBuilders.put(attrType, attrList);
- return;
- }
+ attrBuilders = userAttrBuilders;
+ }
+ List<AttributeBuilder> attrList = attrBuilders.get(attrType);
+ if (attrList == null)
+ {
+ AttributeBuilder builder = new AttributeBuilder(attribute, true);
+ builder.add(attributeValue);
+ attrList = new ArrayList<AttributeBuilder>();
+ attrList.add(builder);
+ attrBuilders.put(attrType, attrList);
+ return;
}
// Check to see if any of the attributes in the list have the same set of
@@ -1264,8 +1181,7 @@
lastEntryLineNumber, attrName,
value.toString());
logToRejectWriter(lines, message);
- throw new LDIFException(message, lastEntryLineNumber,
- true);
+ throw new LDIFException(message, lastEntryLineNumber, true);
}
if (attrType.isSingleValue() && (a.size() > 1) && checkSchema)
{
@@ -1422,8 +1338,7 @@
rejectWriter.write(message.toString());
rejectWriter.newLine();
}
- String dnStr = e.getDN().toString();
- rejectWriter.write(dnStr);
+ rejectWriter.write(e.getDN().toString());
rejectWriter.newLine();
List<StringBuilder> eLDIF = e.toLDIF();
for(StringBuilder l : eLDIF) {
@@ -1710,16 +1625,14 @@
List<RawModification> modifications = new ArrayList<RawModification>();
while(!lines.isEmpty())
{
- ModificationType modType;
-
StringBuilder line = lines.remove();
- Attribute attr =
- readSingleValueAttribute(lines, line, entryDN, null);
+ Attribute attr = readSingleValueAttribute(lines, line, entryDN, null);
String name = attr.getName();
// Get the attribute description
String attrDescr = attr.iterator().next().getValue().toString();
+ ModificationType modType;
String lowerName = toLowerCase(name);
if (lowerName.equals("add"))
{
@@ -1745,8 +1658,7 @@
throw new LDIFException(message, lineNumber, true);
}
- // Now go through the rest of the attributes till the "-" line is
- // reached.
+ // Now go through the rest of the attributes till the "-" line is reached.
Attribute modAttr = LDIFReader.parseAttrDescription(attrDescr);
AttributeBuilder builder = new AttributeBuilder(modAttr, true);
while (! lines.isEmpty())
@@ -1821,8 +1733,7 @@
AttributeType ocType = DirectoryServer.getObjectClassAttributeType();
AttributeBuilder builder = new AttributeBuilder(ocType, "objectClass");
for (String value : objectClasses.values()) {
- AttributeValue av = AttributeValues.create(ocType, value);
- builder.add(av);
+ builder.add(AttributeValues.create(ocType, value));
}
Map<AttributeType, List<Attribute>> attributes =
toAttributesMap(attrBuilders);
@@ -1851,7 +1762,6 @@
*/
private int parseColonPosition(List<StringBuilder> lines,
StringBuilder line) throws LDIFException {
-
int colonPos = line.indexOf(":");
if (colonPos <= 0)
{
@@ -1906,11 +1816,7 @@
{
// The value is base64-encoded. Find the first non-blank
// character, take the rest of the line, and base64-decode it.
- int pos = colonPos+2;
- while ((pos < length) && (line.charAt(pos) == ' '))
- {
- pos++;
- }
+ int pos = findFirstNonSpaceCharPosition(line, colonPos + 2);
try
{
@@ -1936,11 +1842,7 @@
{
// Find the first non-blank character, decode the rest of the
// line as a URL, and read its contents.
- int pos = colonPos+2;
- while ((pos < length) && (line.charAt(pos) == ' '))
- {
- pos++;
- }
+ int pos = findFirstNonSpaceCharPosition(line, colonPos + 2);
URL contentURL;
try
@@ -1976,8 +1878,7 @@
}
catch (Exception e)
{
- // We were unable to read the contents of that URL for some
- // reason.
+ // We were unable to read the contents of that URL for some reason.
if (debugEnabled())
{
TRACER.debugCaught(DebugLogLevel.ERROR, e);
@@ -2000,12 +1901,7 @@
{
// The rest of the line should be the value. Skip over any
// spaces and take the rest of the line as the value.
- int pos = colonPos+1;
- while ((pos < length) && (line.charAt(pos) == ' '))
- {
- pos++;
- }
-
+ int pos = findFirstNonSpaceCharPosition(line, colonPos + 1);
value = ByteString.valueOf(line.substring(pos));
}
}
@@ -2154,4 +2050,3 @@
}
}
}
-
--
Gitblit v1.10.0