1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.directory.api.ldap.model.ldif;
21
22
23 import java.io.BufferedReader;
24 import java.io.IOException;
25 import java.io.StringReader;
26 import java.util.ArrayList;
27
28 import javax.naming.directory.Attributes;
29 import javax.naming.directory.BasicAttributes;
30
31 import org.apache.directory.api.i18n.I18n;
32 import org.apache.directory.api.ldap.model.entry.Attribute;
33 import org.apache.directory.api.ldap.model.entry.DefaultEntry;
34 import org.apache.directory.api.ldap.model.entry.Entry;
35 import org.apache.directory.api.ldap.model.exception.LdapException;
36 import org.apache.directory.api.ldap.model.exception.LdapInvalidAttributeValueException;
37 import org.apache.directory.api.ldap.model.schema.AttributeType;
38 import org.apache.directory.api.ldap.model.schema.SchemaManager;
39 import org.apache.directory.api.util.Strings;
40 import org.slf4j.Logger;
41 import org.slf4j.LoggerFactory;
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 public class LdifAttributesReader extends LdifReader
151 {
152
153 private static final Logger LOG = LoggerFactory.getLogger( LdifAttributesReader.class );
154
155
156
157
158
159 public LdifAttributesReader()
160 {
161 lines = new ArrayList<String>();
162 position = 0;
163 version = DEFAULT_VERSION;
164 }
165
166
167
168
169
170
171
172
173
174
175 private void parseAttribute( Attributes attributes, String line, String lowerLine ) throws LdapLdifException
176 {
177 int colonIndex = line.indexOf( ':' );
178
179 String attributeType = lowerLine.substring( 0, colonIndex );
180
181
182 if ( "dn".equals( attributeType ) )
183 {
184 LOG.error( I18n.err( I18n.ERR_12002_ENTRY_WITH_TWO_DNS ) );
185 throw new LdapLdifException( I18n.err( I18n.ERR_12003_LDIF_ENTRY_WITH_TWO_DNS ) );
186 }
187
188 Object attributeValue = parseValue( attributeType, line, colonIndex );
189
190
191 javax.naming.directory.Attribute attribute = attributes.get( attributeType );
192
193 if ( attribute == null )
194 {
195 attributes.put( attributeType, attributeValue );
196 }
197 else
198 {
199 attribute.add( attributeValue );
200 }
201 }
202
203
204
205
206
207
208
209
210
211
212
213 private void parseEntryAttribute( SchemaManager schemaManager, Entry entry, String line, String lowerLine )
214 throws LdapLdifException
215 {
216 int colonIndex = line.indexOf( ':' );
217
218 String attributeName = lowerLine.substring( 0, colonIndex );
219 AttributeType attributeType = null;
220
221
222 if ( "dn".equals( attributeName ) )
223 {
224 LOG.error( I18n.err( I18n.ERR_12002_ENTRY_WITH_TWO_DNS ) );
225 throw new LdapLdifException( I18n.err( I18n.ERR_12003_LDIF_ENTRY_WITH_TWO_DNS ) );
226 }
227
228 if ( schemaManager != null )
229 {
230 attributeType = schemaManager.getAttributeType( attributeName );
231
232 if ( attributeType == null )
233 {
234 LOG.error( "" );
235 throw new LdapLdifException( "" );
236 }
237 }
238
239 Object attributeValue = parseValue( attributeName, line, colonIndex );
240
241
242 Attribute attribute;
243
244 if ( schemaManager == null )
245 {
246 attribute = entry.get( attributeName );
247 }
248 else
249 {
250 attribute = entry.get( attributeType );
251 }
252
253 if ( attribute == null )
254 {
255 if ( schemaManager == null )
256 {
257 if ( attributeValue instanceof String )
258 {
259 entry.put( attributeName, ( String ) attributeValue );
260 }
261 else
262 {
263 entry.put( attributeName, ( byte[] ) attributeValue );
264 }
265 }
266 else
267 {
268 try
269 {
270 if ( attributeValue instanceof String )
271 {
272 entry.put( attributeName, attributeType, ( String ) attributeValue );
273 }
274 else
275 {
276 entry.put( attributeName, attributeType, ( byte[] ) attributeValue );
277 }
278 }
279 catch ( LdapException le )
280 {
281 throw new LdapLdifException( I18n.err( I18n.ERR_12057_BAD_ATTRIBUTE ), le );
282 }
283 }
284 }
285 else
286 {
287 try
288 {
289 if ( attributeValue instanceof String )
290 {
291 attribute.add( ( String ) attributeValue );
292 }
293 else
294 {
295 attribute.add( ( byte[] ) attributeValue );
296 }
297 }
298 catch ( LdapInvalidAttributeValueException liave )
299 {
300 throw new LdapLdifException( liave.getMessage(), liave );
301 }
302 }
303 }
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320 private Entry parseEntry( SchemaManager schemaManager ) throws LdapLdifException
321 {
322 if ( ( lines == null ) || lines.isEmpty() )
323 {
324 LOG.debug( "The entry is empty : end of ldif file" );
325 return null;
326 }
327
328 Entry entry = new DefaultEntry( schemaManager );
329
330
331 for ( String line : lines )
332 {
333
334
335 String lowerLine = Strings.toLowerCaseAscii( line );
336
337
338
339
340
341 if ( lowerLine.startsWith( "control:" ) )
342 {
343 LOG.error( I18n.err( I18n.ERR_12004_CHANGE_NOT_ALLOWED ) );
344 throw new LdapLdifException( I18n.err( I18n.ERR_12005_NO_CHANGE ) );
345 }
346 else if ( lowerLine.startsWith( "changetype:" ) )
347 {
348 LOG.error( I18n.err( I18n.ERR_12004_CHANGE_NOT_ALLOWED ) );
349 throw new LdapLdifException( I18n.err( I18n.ERR_12005_NO_CHANGE ) );
350 }
351 else if ( line.indexOf( ':' ) > 0 )
352 {
353 parseEntryAttribute( schemaManager, entry, line, lowerLine );
354 }
355 else
356 {
357
358 LOG.error( I18n.err( I18n.ERR_12006_EXPECTING_ATTRIBUTE_TYPE ) );
359 throw new LdapLdifException( I18n.err( I18n.ERR_12007_BAD_ATTRIBUTE ) );
360 }
361 }
362
363 LOG.debug( "Read an attributes : {}", entry );
364
365 return entry;
366 }
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384 private Attributes parseAttributes() throws LdapLdifException
385 {
386 if ( ( lines == null ) || lines.isEmpty() )
387 {
388 LOG.debug( "The entry is empty : end of ldif file" );
389 return null;
390 }
391
392 Attributes attributes = new BasicAttributes( true );
393
394
395 for ( String line : lines )
396 {
397
398
399 String lowerLine = Strings.toLowerCaseAscii( line );
400
401
402
403
404
405 if ( lowerLine.startsWith( "control:" ) )
406 {
407 LOG.error( I18n.err( I18n.ERR_12004_CHANGE_NOT_ALLOWED ) );
408 throw new LdapLdifException( I18n.err( I18n.ERR_12005_NO_CHANGE ) );
409 }
410 else if ( lowerLine.startsWith( "changetype:" ) )
411 {
412 LOG.error( I18n.err( I18n.ERR_12004_CHANGE_NOT_ALLOWED ) );
413 throw new LdapLdifException( I18n.err( I18n.ERR_12005_NO_CHANGE ) );
414 }
415 else if ( line.indexOf( ':' ) > 0 )
416 {
417 parseAttribute( attributes, line, lowerLine );
418 }
419 else
420 {
421
422 LOG.error( I18n.err( I18n.ERR_12006_EXPECTING_ATTRIBUTE_TYPE ) );
423 throw new LdapLdifException( I18n.err( I18n.ERR_12007_BAD_ATTRIBUTE ) );
424 }
425 }
426
427 LOG.debug( "Read an attributes : {}", attributes );
428
429 return attributes;
430 }
431
432
433
434
435
436
437
438
439
440 public Attributes parseAttributes( String ldif ) throws LdapLdifException
441 {
442 lines = new ArrayList<String>();
443 position = 0;
444
445 LOG.debug( "Starts parsing ldif buffer" );
446
447 if ( Strings.isEmpty( ldif ) )
448 {
449 return new BasicAttributes( true );
450 }
451
452 StringReader strIn = new StringReader( ldif );
453 reader = new BufferedReader( strIn );
454
455 try
456 {
457 readLines();
458
459 Attributes attributes = parseAttributes();
460
461 if ( LOG.isDebugEnabled() )
462 {
463 if ( attributes == null )
464 {
465 LOG.debug( "Parsed no entry." );
466 }
467 else
468 {
469 LOG.debug( "Parsed one entry." );
470 }
471 }
472
473 return attributes;
474 }
475 catch ( LdapLdifException ne )
476 {
477 LOG.error( I18n.err( I18n.ERR_12008_CANNOT_PARSE_LDIF_BUFFER, ne.getLocalizedMessage() ) );
478 throw new LdapLdifException( I18n.err( I18n.ERR_12009_ERROR_PARSING_LDIF_BUFFER ), ne );
479 }
480 finally
481 {
482 try
483 {
484 reader.close();
485 }
486 catch ( IOException ioe )
487 {
488 throw new LdapLdifException( I18n.err( I18n.ERR_12024_CANNOT_CLOSE_FILE ), ioe );
489 }
490 }
491 }
492
493
494
495
496
497
498
499
500
501 public Entry parseEntry( String ldif ) throws LdapLdifException
502 {
503 lines = new ArrayList<String>();
504 position = 0;
505
506 LOG.debug( "Starts parsing ldif buffer" );
507
508 if ( Strings.isEmpty( ldif ) )
509 {
510 return new DefaultEntry();
511 }
512
513 StringReader strIn = new StringReader( ldif );
514 reader = new BufferedReader( strIn );
515
516 try
517 {
518 readLines();
519
520 Entry entry = parseEntry( ( SchemaManager ) null );
521
522 if ( LOG.isDebugEnabled() )
523 {
524 if ( entry == null )
525 {
526 LOG.debug( "Parsed no entry." );
527 }
528 else
529 {
530 LOG.debug( "Parsed one entry." );
531 }
532
533 }
534
535 return entry;
536 }
537 catch ( LdapLdifException ne )
538 {
539 LOG.error( I18n.err( I18n.ERR_12008_CANNOT_PARSE_LDIF_BUFFER, ne.getLocalizedMessage() ) );
540 throw new LdapLdifException( I18n.err( I18n.ERR_12009_ERROR_PARSING_LDIF_BUFFER ), ne );
541 }
542 finally
543 {
544 try
545 {
546 reader.close();
547 }
548 catch ( IOException ioe )
549 {
550 throw new LdapLdifException( I18n.err( I18n.ERR_12024_CANNOT_CLOSE_FILE ), ioe );
551 }
552 }
553 }
554
555
556
557
558
559
560
561
562
563
564 public Entry parseEntry( SchemaManager schemaManager, String ldif ) throws LdapLdifException
565 {
566 lines = new ArrayList<String>();
567 position = 0;
568
569 LOG.debug( "Starts parsing ldif buffer" );
570
571 if ( Strings.isEmpty( ldif ) )
572 {
573 return new DefaultEntry( schemaManager );
574 }
575
576 StringReader strIn = new StringReader( ldif );
577 reader = new BufferedReader( strIn );
578
579 try
580 {
581 readLines();
582
583 Entry entry = parseEntry( schemaManager );
584
585 if ( LOG.isDebugEnabled() )
586 {
587 if ( entry == null )
588 {
589 LOG.debug( "Parsed no entry." );
590 }
591 else
592 {
593 LOG.debug( "Parsed one entry." );
594 }
595
596 }
597
598 return entry;
599 }
600 catch ( LdapLdifException ne )
601 {
602 LOG.error( I18n.err( I18n.ERR_12008_CANNOT_PARSE_LDIF_BUFFER, ne.getLocalizedMessage() ) );
603 throw new LdapLdifException( I18n.err( I18n.ERR_12009_ERROR_PARSING_LDIF_BUFFER ), ne );
604 }
605 finally
606 {
607 try
608 {
609 reader.close();
610 }
611 catch ( IOException ioe )
612 {
613 throw new LdapLdifException( I18n.err( I18n.ERR_12024_CANNOT_CLOSE_FILE ), ioe );
614 }
615 }
616 }
617 }