File: ldif-parsing.xml

package info (click to toggle)
libspring-ldap-java 1.3.1.RELEASE-5
  • links: PTS, VCS
  • area: main
  • in suites: jessie-kfreebsd
  • size: 2,872 kB
  • sloc: java: 12,509; xml: 4,106; jsp: 36; makefile: 33; sh: 13
file content (168 lines) | stat: -rw-r--r-- 7,525 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
<?xml version="1.0" encoding="UTF-8"?>
<chapter id="ldif-parsing">
  <title>LDIF Parsing</title>

  <section id="ldif-parsing-intro">
    <title>Introduction</title>

    <para>LDAP Directory Interchange Format (LDIF) files are the standard
    medium for describing directory data in a flat file format. The most common
    uses of this format include information transfer and archival. However,
    the standard also defines a way to describe modifications to stored data
    in a flat file format. LDIFs of this later type are typically referred to
    as <emphasis>changetype</emphasis> or <emphasis>modify</emphasis> LDIFs.
    </para>

    <para>The <token>org.springframework.ldap.ldif</token> package provides
    classes needed to parse LDIF files and deserialize them into tangible
    objects. The <token>LdifParser</token> is the main class of the
    <token>org.springframework.ldap.ldif</token> package and is capable of
    parsing files that are RFC 2849 compliant. This class reads lines from a
    resource and assembles them into an <token>LdapAttributes</token> object.
    The <token>LdifParser</token> currently ignores
    <emphasis>changetype</emphasis> LDIF entries as their usefulness in the
    context of an application has yet to be determined.</para>
  </section>

  <section id="ldif-parsing-obj-repr">
    <title>Object Representation</title>

    <para>Two classes in the <token>org.springframework.ldap.core</token>
    package provide the means to represent an LDIF in code:</para>

    <itemizedlist>
      <listitem>
        <para><token>LdapAttribute</token> - Extends
        <token>javax.naming.directory.BasicAttribute</token> adding support
        for LDIF options as defined in RFC2849.</para>
      </listitem>

      <listitem>
        <para><token>LdapAttributes</token> - Extends
        <token>javax.naming.directory.BasicAttributes</token> adding
        specialized support for DNs.</para>
      </listitem>
    </itemizedlist>

    <para><token>LdapAttribute</token> objects represent options as a
    <token>Set&lt;String&gt;</token>. The DN support added to the
    <token>LdapAttributes</token> object employs the
    <token>org.springframework.ldap.core.DistinguishedName</token> class. </para>
  </section>

  <section id="ldif-parsing-parser">
    <title>The Parser</title>

    <para>The <token>Parser</token> interface provides the foundation for
    operation and employs three supporting policy definitions:</para>

    <itemizedlist>
      <listitem>
        <para><token>SeparatorPolicy</token> - establishes the mechanism by
        which lines are assembled into attributes. </para>
      </listitem>

      <listitem>
        <para><token>AttributeValidationPolicy</token> - ensures that
        attributes are correctly structured prior to parsing.</para>
      </listitem>

      <listitem>
        <para><token>Specification</token> - provides a mechanism by which
        object structure can be validated after assembly. </para>
      </listitem>
    </itemizedlist>

    <simpara>The default implementations of these interfaces are the
    <token>org.springframework.ldap.ldif.parser.LdifParser</token>, the
    <token>org.springframework.ldap.ldif.support.SeparatorPolicy</token>, and
    the
    <token>org.springframework.ldap.ldif.support.DefaultAttributeValidationPolicy</token>,
    and the
    <token>org.springframework.ldap.schema.DefaultSchemaSpecification</token>
    respectively. Together, these 4 classes parse a resource line by line and
    translate the data into <token>LdapAttributes</token> objects. </simpara>

    <simpara>The <token>SeparatorPolicy</token> determines how individual
    lines read from the source file should be interpreted as the LDIF
    specification allows attributes to span multiple lines. The default policy
    assess lines in the context of the order in which they were read to
    determine the nature of the line in consideration.
    <emphasis>control</emphasis> attributes and
    <emphasis>changetype</emphasis> records are ignored.</simpara>

    <simpara>The <token>DefaultAttributeValidationPolicy</token> uses REGEX
    expressions to ensure each attribute conforms to a valid attribute format
    according to RFC 2849 once parsed. If an attribute fails validation, an
    <token>InvalidAttributeFormatException</token> is logged and the record is
    skipped (the parser returns null).</simpara>
  </section>

  <section id="ldif-parsing-schema">
    <title>Schema Validation</title>

    <para>A mechanism for validating parsed objects against a schema and is
    available via the <token>Specification</token> interface in the
    <token>org.springframework.ldap.schema</token> package. The
    <token>DefaultSchemaSpecification</token> does not do any validation and
    is available for instances where records are known to be valid and not
    required to be checked. This option saves the performance penalty that
    validation imposes. The <token>BasicSchemaSpecification</token> applies
    basic checks such as ensuring DN and object class declarations have been
    provided. Currently, validation against an actual schema requires
    implementation of the <token>Specification</token> interface. </para>
  </section>

  <section id="ldif-parsing-batch">
    <title>Spring Batch Integration</title>

    <para>While the <token>LdifParser</token> can be employed by any
    application that requires parsing of LDIF files, Spring offers a batch
    processing framework that offers many file processing utilities for
    parsing delimited files such as CSV. The
    <token>org.springframework.ldap.ldif.batch</token> package offers the
    classes necessary for using the <token>LdifParser</token> as a valid
    configuration option in the Spring Batch framework.</para>

    <para>There are 5 classes in this package which offer three basic use
    cases:</para>

    <itemizedlist>
      <listitem>
        <para>Use Case 1: Read LDIF records from a file and return an
        <token>LdapAttributes</token> object.</para>
      </listitem>

      <listitem>
        <para>Use Case 2: Read LDIF records from a file and map records to
        Java objects (POJOs).</para>
      </listitem>

      <listitem>
        <para>Use Case 3: Write LDIF records to a file.</para>
      </listitem>
    </itemizedlist>

    <para>The first use case is accomplished with the LdifReader. This class
    extends Spring Batch's
    <token>AbstractItemCountingItemSteamItemReader</token> and implements its
    <token>ResourceAwareItemReaderItemStream</token>. It fits naturally into
    the framework and can be used to read <token>LdapAttributes</token>
    objects from a file.</para>

    <para>The <token>MappingLdifReader</token> can be used to map LDIF objects
    directly to any POJO. This class requires an implementation of the
    <token>RecordMapper</token> interface be provided. This implementation
    should implement the logic for mapping objects to POJOs.</para>

    <para>The <token>RecordCallbackHandler</token> can be implemented and
    provided to either reader. This handler can be used to operate on skipped
    records. Consult the Spring Batch documentation for more
    information.</para>

    <para>The last member of this package, the <token>LdifAggregator</token>,
    can be used to write LDIF records to a file. This class simply invokes the
    <token>toString()</token> method of the <token>LdapAttributes</token>
    object.</para>
  </section>
</chapter>