/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at * trunk/opends/resource/legal-notices/OpenDS.LICENSE * or https://OpenDS.dev.java.net/OpenDS.LICENSE. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, * add the following below this CDDL HEADER, with the fields enclosed * by brackets "[]" replaced with your own identifying information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2009 Sun Microsystems, Inc. */ package org.opends.sdk.ldif; import java.io.IOException; import java.io.OutputStream; import java.util.List; import org.opends.sdk.*; import org.opends.sdk.schema.Schema; import com.sun.opends.sdk.util.Validator; /** * An LDIF entry writer writes attribute value records (entries) using * the LDAP Data Interchange Format (LDIF) to a user defined * destination. * * @see RFC 2849 - The LDAP * Data Interchange Format (LDIF) - Technical Specification */ public final class LDIFEntryWriter extends AbstractLDIFWriter implements EntryWriter { /** * Creates a new LDIF entry writer which will append lines of LDIF to * the provided list. * * @param ldifLines * The list to which lines of LDIF should be appended. */ public LDIFEntryWriter(List ldifLines) { super(ldifLines); } /** * Creates a new LDIF entry writer whose destination is the provided * output stream. * * @param out * The output stream to use. */ public LDIFEntryWriter(OutputStream out) { super(out); } /** * {@inheritDoc} */ public void close() throws IOException { close0(); } /** * {@inheritDoc} */ public void flush() throws IOException { flush0(); } /** * Specifies whether or not user-friendly comments should be added * whenever distinguished names or UTF-8 attribute values are * encountered which contained non-ASCII characters. The default is * {@code false}. * * @param addUserFriendlyComments * {@code true} if user-friendly comments should be added, or * {@code false} otherwise. * @return A reference to this {@code LDIFEntryWriter}. */ public LDIFEntryWriter setAddUserFriendlyComments( boolean addUserFriendlyComments) { this.addUserFriendlyComments = addUserFriendlyComments; return this; } /** * Specifies whether or not all operational attributes should be * excluded from any entries that are written to LDIF. The default is * {@code false}. * * @param excludeOperationalAttributes * {@code true} if all operational attributes should be * excluded, or {@code false} otherwise. * @return A reference to this {@code LDIFEntryWriter}. */ public LDIFEntryWriter setExcludeAllOperationalAttributes( boolean excludeOperationalAttributes) { this.excludeOperationalAttributes = excludeOperationalAttributes; return this; } /** * Specifies whether or not all user attributes should be excluded * from any entries that are written to LDIF. The default is {@code * false}. * * @param excludeUserAttributes * {@code true} if all user attributes should be excluded, or * {@code false} otherwise. * @return A reference to this {@code LDIFEntryWriter}. */ public LDIFEntryWriter setExcludeAllUserAttributes( boolean excludeUserAttributes) { this.excludeUserAttributes = excludeUserAttributes; return this; } /** * Excludes the named attribute from any entries that are written to * LDIF. By default all attributes are included unless explicitly * excluded. * * @param attributeDescription * The name of the attribute to be excluded. * @return A reference to this {@code LDIFEntryWriter}. */ public LDIFEntryWriter setExcludeAttribute( AttributeDescription attributeDescription) { Validator.ensureNotNull(attributeDescription); excludeAttributes.add(attributeDescription); return this; } /** * Excludes all entries beneath the named entry (inclusive) from being * written to LDIF. By default all entries are written unless * explicitly excluded or included by branches or filters. * * @param excludeBranch * The distinguished name of the branch to be excluded. * @return A reference to this {@code LDIFEntryWriter}. */ public LDIFEntryWriter setExcludeBranch(DN excludeBranch) { Validator.ensureNotNull(excludeBranch); excludeBranches.add(excludeBranch); return this; } /** * Excludes all entries which match the provided filter matcher from * being written to LDIF. By default all entries are written unless * explicitly excluded or included by branches or filters. * * @param excludeFilter * The filter matcher. * @return A reference to this {@code LDIFEntryWriter}. */ public LDIFEntryWriter setExcludeFilter(Matcher excludeFilter) { Validator.ensureNotNull(excludeFilter); excludeFilters.add(excludeFilter); return this; } /** * Ensures that the named attribute is not excluded from any entries * that are written to LDIF. By default all attributes are included * unless explicitly excluded. * * @param attributeDescription * The name of the attribute to be included. * @return A reference to this {@code LDIFEntryWriter}. */ public LDIFEntryWriter setIncludeAttribute( AttributeDescription attributeDescription) { Validator.ensureNotNull(attributeDescription); includeAttributes.add(attributeDescription); return this; } /** * Ensures that all entries beneath the named entry (inclusive) are * written to LDIF. By default all entries are written unless * explicitly excluded or included by branches or filters. * * @param includeBranch * The distinguished name of the branch to be included. * @return A reference to this {@code LDIFEntryWriter}. */ public LDIFEntryWriter setIncludeBranch(DN includeBranch) { Validator.ensureNotNull(includeBranch); includeBranches.add(includeBranch); return this; } /** * Ensures that all entries which match the provided filter matcher * are written to LDIF. By default all entries are written unless * explicitly excluded or included by branches or filters. * * @param includeFilter * The filter matcher. * @return A reference to this {@code LDIFEntryWriter}. */ public LDIFEntryWriter setIncludeFilter(Matcher includeFilter) { Validator.ensureNotNull(includeFilter); includeFilters.add(includeFilter); return this; } /** * Sets the schema which should be used when filtering entries (not * required if no filtering is to be performed). The default schema is * used if no other is specified. * * @param schema * The schema which should be used when filtering entries. * @return A reference to this {@code LDIFEntryWriter}. */ public LDIFEntryWriter setSchema(Schema schema) { Validator.ensureNotNull(schema); this.schema = schema; return this; } /** * Specifies the column at which long lines should be wrapped. A value * less than or equal to zero (the default) indicates that no wrapping * should be performed. * * @param wrapColumn * The column at which long lines should be wrapped. * @return A reference to this {@code LDIFEntryWriter}. */ public LDIFEntryWriter setWrapColumn(int wrapColumn) { this.wrapColumn = wrapColumn; return this; } /** * {@inheritDoc} */ public LDIFEntryWriter writeComment(CharSequence comment) throws IOException, NullPointerException { writeComment0(comment); return this; } /** * {@inheritDoc} */ public LDIFEntryWriter writeEntry(Entry entry) throws IOException, NullPointerException { Validator.ensureNotNull(entry); // Skip if branch containing the entry is excluded. if (isBranchExcluded(entry.getName())) { return this; } // Skip if the entry is excluded by any filters. if (isEntryExcluded(entry)) { return this; } writeKeyAndValue("dn", entry.getName().toString()); for (final Attribute attribute : entry.getAttributes()) { // Filter the attribute if required. if (isAttributeExcluded(attribute.getAttributeDescription())) { continue; } final String attributeDescription = attribute.getAttributeDescriptionAsString(); for (final ByteString value : attribute) { writeKeyAndValue(attributeDescription, value); } } // Make sure there is a blank line after the entry. impl.println(); return this; } }