1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.apache.directory.api.ldap.model.subtree;
22
23
24 import java.io.StringReader;
25 import java.text.ParseException;
26
27 import org.apache.directory.api.i18n.I18n;
28 import org.apache.directory.api.ldap.model.schema.NormalizerMappingResolver;
29 import org.apache.directory.api.ldap.model.schema.SchemaManager;
30
31 import antlr.RecognitionException;
32 import antlr.TokenStreamException;
33
34
35
36
37
38
39
40
41
42
43
44 public class SubtreeSpecificationParser
45 {
46
47 private ReusableAntlrSubtreeSpecificationParser parser;
48
49
50 private ReusableAntlrSubtreeSpecificationLexer lexer;
51
52 private final boolean isNormalizing;
53
54
55
56
57
58 public SubtreeSpecificationParser( SchemaManager schemaManager )
59 {
60 StringReader in = new StringReader( "" );
61
62 this.lexer = new ReusableAntlrSubtreeSpecificationLexer( in );
63 this.parser = new ReusableAntlrSubtreeSpecificationParser( lexer );
64 this.parser.init( schemaManager );
65
66 this.isNormalizing = false;
67 }
68
69
70
71
72
73 public SubtreeSpecificationParser( @SuppressWarnings("rawtypes") NormalizerMappingResolver resolver,
74 SchemaManager schemaManager )
75 {
76 StringReader in = new StringReader( "" );
77
78 this.lexer = new ReusableAntlrSubtreeSpecificationLexer( in );
79 this.parser = new ReusableAntlrSubtreeSpecificationParser( lexer );
80 this.parser.setNormalizerMappingResolver( resolver );
81 this.parser.init( schemaManager );
82
83 this.isNormalizing = true;
84 }
85
86
87
88
89
90
91 private synchronized void reset( String spec )
92 {
93 StringReader in = new StringReader( spec + "end" );
94
95 this.lexer.prepareNextInput( in );
96 this.parser.resetState();
97 }
98
99
100
101
102
103
104
105
106
107
108
109 public synchronized SubtreeSpecification parse( String spec ) throws ParseException
110 {
111 SubtreeSpecification ss = null;
112
113 if ( spec == null || spec.trim().equals( "" ) )
114 {
115 return null;
116 }
117
118 reset( spec );
119
120 try
121 {
122 ss = this.parser.wrapperEntryPoint();
123 }
124 catch ( TokenStreamException e )
125 {
126 String msg = I18n.err( I18n.ERR_04329, spec, e.getLocalizedMessage() );
127 throw new ParseException( msg, 0 );
128 }
129 catch ( RecognitionException e )
130 {
131 String msg = I18n.err( I18n.ERR_04329, spec, e.getLocalizedMessage() );
132 throw new ParseException( msg, e.getColumn() );
133 }
134 catch ( Exception e )
135 {
136 String msg = I18n.err( I18n.ERR_04329, spec, e.getLocalizedMessage() );
137 throw new ParseException( msg, 0 );
138 }
139
140 return ss;
141 }
142
143
144
145
146
147
148
149 public boolean isNormizing()
150 {
151 return this.isNormalizing;
152 }
153 }