} catch (Exception e) {}
}
// Open the output writer that we'll use to write the differences.
LDIFWriter writer;
try
{
LDIFExportConfig exportConfig;
if (outputLDIF.isPresent())
{
if (overwriteExisting.isPresent())
{
exportConfig = new LDIFExportConfig(outputLDIF.getValue(),
ExistingFileBehavior.OVERWRITE);
}
else
{
exportConfig = new LDIFExportConfig(outputLDIF.getValue(),
ExistingFileBehavior.APPEND);
}
}
else
{
exportConfig = new LDIFExportConfig(out);
}
writer = new LDIFWriter(exportConfig);
}
catch (Exception e)
{
Message message = ERR_LDIFDIFF_CANNOT_OPEN_OUTPUT.get(String.valueOf(e));
err.println(message);
return 1;
}
try
{
// Check to see if either or both of the source and target maps are empty.
if (sourceMap.isEmpty())
{
if (targetMap.isEmpty())
{
// They're both empty, so there are no differences.
Message message = INFO_LDIFDIFF_NO_DIFFERENCES.get();
writer.writeComment(message, 0);
return 0;
}
else
{
// The target isn't empty, so they're all adds.
Iterator<DN> targetIterator = targetMap.keySet().iterator();
while (targetIterator.hasNext())
{
writeAdd(writer, targetMap.get(targetIterator.next()));
}
return 0;
}
}
else if (targetMap.isEmpty())
{
// The source isn't empty, so they're all deletes.
Iterator<DN> sourceIterator = sourceMap.keySet().iterator();
while (sourceIterator.hasNext())
{
writeDelete(writer, sourceMap.get(sourceIterator.next()));
}
return 0;
}
else
{
// Iterate through all the entries in the source and target maps and
// identify the differences.
Iterator<DN> sourceIterator = sourceMap.keySet().iterator();
Iterator<DN> targetIterator = targetMap.keySet().iterator();
DN sourceDN = sourceIterator.next();
DN targetDN = targetIterator.next();
Entry sourceEntry = sourceMap.get(sourceDN);
Entry targetEntry = targetMap.get(targetDN);
boolean differenceFound = false;
while (true)
{
// Compare the DNs to determine the relative order of the
// entries.
int comparatorValue = sourceDN.compareTo(targetDN);
if (comparatorValue < 0)
{
// The source entry should be before the target entry, which means
// that the source entry has been deleted.
writeDelete(writer, sourceEntry);
differenceFound = true;
if (sourceIterator.hasNext())
{
sourceDN = sourceIterator.next();
sourceEntry = sourceMap.get(sourceDN);
}
else
{
// There are no more source entries, so if there are more target
// entries then they're all adds.
writeAdd(writer, targetEntry);
while (targetIterator.hasNext())
{
targetDN = targetIterator.next();
targetEntry = targetMap.get(targetDN);
writeAdd(writer, targetEntry);
differenceFound = true;
}
break;
}
}
else if (comparatorValue > 0)
{
// The target entry should be before the source entry, which means
// that the target entry has been added.
writeAdd(writer, targetEntry);
differenceFound = true;
if (targetIterator.hasNext())
{
targetDN = targetIterator.next();
targetEntry = targetMap.get(targetDN);
}
else
{
// There are no more target entries so all of the remaining source
// entries are deletes.
writeDelete(writer, sourceEntry);
differenceFound = true;
while (sourceIterator.hasNext())
{
sourceDN = sourceIterator.next();
sourceEntry = sourceMap.get(sourceDN);
writeDelete(writer, sourceEntry);
}
break;
}
}
else
{
// The DNs are the same, so check to see if the entries are the
// same or have been modified.
if (writeModify(writer, sourceEntry, targetEntry, ignoreAttrs,
singleValueChanges.isPresent()))
{
differenceFound = true;
}
if (sourceIterator.hasNext())
{
sourceDN = sourceIterator.next();
sourceEntry = sourceMap.get(sourceDN);
}
else
{
// There are no more source entries, so if there are more target
// entries then they're all adds.
while (targetIterator.hasNext())
{
targetDN = targetIterator.next();
targetEntry = targetMap.get(targetDN);
writeAdd(writer, targetEntry);
differenceFound = true;
}
break;
}
if (targetIterator.hasNext())
{
targetDN = targetIterator.next();
targetEntry = targetMap.get(targetDN);
}
else
{
// There are no more target entries so all of the remaining source
// entries are deletes.
writeDelete(writer, sourceEntry);
differenceFound = true;
while (sourceIterator.hasNext())
{
sourceDN = sourceIterator.next();
sourceEntry = sourceMap.get(sourceDN);
writeDelete(writer, sourceEntry);
}
break;
}
}
}
if (! differenceFound)
{
Message message = INFO_LDIFDIFF_NO_DIFFERENCES.get();
writer.writeComment(message, 0);
}
}
}
catch (IOException e)
{
Message message =
ERR_LDIFDIFF_ERROR_WRITING_OUTPUT.get(String.valueOf(e));
err.println(message);
return 1;
}
finally
{
try
{
writer.close();
} catch (Exception e) {}
}
// If we've gotten to this point, then everything was successful.