You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2016/05/09 17:22:21 UTC
svn commit: r1743011 [4/13] - in /directory/shared/branches/shared-value:
dsml/parser/src/main/java/org/apache/directory/api/dsmlv2/request/
dsml/parser/src/main/java/org/apache/directory/api/dsmlv2/response/
dsml/parser/src/test/java/org/apache/direct...
Modified: directory/shared/branches/shared-value/ldap/model/src/main/antlr/distinguishedName.g
URL: http://svn.apache.org/viewvc/directory/shared/branches/shared-value/ldap/model/src/main/antlr/distinguishedName.g?rev=1743011&r1=1743010&r2=1743011&view=diff
==============================================================================
--- directory/shared/branches/shared-value/ldap/model/src/main/antlr/distinguishedName.g (original)
+++ directory/shared/branches/shared-value/ldap/model/src/main/antlr/distinguishedName.g Mon May 9 17:22:19 2016
@@ -30,8 +30,11 @@ import org.apache.directory.api.ldap.mod
import javax.naming.NameParser;
import org.apache.directory.api.ldap.model.entry.Value;
import org.apache.directory.api.ldap.model.schema.parsers.ParserMonitor;
+import org.apache.directory.api.ldap.model.schema.SchemaManager;
+import org.apache.directory.api.ldap.model.schema.AttributeType;
+import org.apache.directory.api.util.ExpansibleByteBuffer;
import org.apache.directory.api.util.Strings;
-
+import org.apache.directory.api.util.Unicode;
}
/**
@@ -107,7 +110,7 @@ UTFMB : '\u0080'..'\uFFFE' ;
* DIGIT (0x30-0x39)
* ALPHA (0x41-0x5A and 0x61-0x7A)
*/
-LUTF1_REST :
+CHAR_REST :
'\u0001'..'\u001F' |
'\u0021' |
'\u0024'..'\u002A' |
@@ -135,10 +138,12 @@ options {
{
private ParserMonitor monitor = null;
+
public void setParserMonitor( ParserMonitor monitor )
{
this.monitor = monitor;
}
+
private void matchedProduction( String msg )
{
if ( null != monitor )
@@ -146,43 +151,53 @@ options {
monitor.matchedProduction( msg );
}
}
- static class UpAndNormValue
+
+ /**
+ * This class is used to store the decoded value
+ */
+ private static class UpAndNormValue
{
- Object value = "";
- String rawValue = "";
- int lastEscapedSpace = -1;
+ // The value as a byte array
+ ExpansibleByteBuffer bytes = new ExpansibleByteBuffer();
+
+ // The user provided value
+ StringBuilder upValue = new StringBuilder();
+
+ // A flag set to false if we have a binary value
+ boolean isHR = true;
}
}
- /**
- * Parses an Dn string.
- *
- * RFC 4514, Section 3
- * distinguishedName = [ relativeDistinguishedName
- * *( COMMA relativeDistinguishedName ) ]
- *
- * RFC 2253, Section 3
- * distinguishedName = [name]
- * name = name-component *("," name-component)
- *
- * RFC 1779, Section 2.3
- * <name> ::= <name-component> ( <spaced-separator> )
- * | <name-component> <spaced-separator> <name>
- * <spaced-separator> ::= <optional-space>
- * <separator>
- * <optional-space>
- * <separator> ::= "," | ";"
- * <optional-space> ::= ( <CR> ) *( " " )
- *
- */
-distinguishedName [Dn dn]
+
+/**
+ * Parses a Dn string.
+ *
+ * RFC 4514, Section 3
+ * distinguishedName = [ relativeDistinguishedName
+ * *( COMMA relativeDistinguishedName ) ]
+ *
+ * RFC 2253, Section 3
+ * distinguishedName = [name]
+ * name = name-component *("," name-component)
+ *
+ * RFC 1779, Section 2.3
+ * <name> ::= <name-component> ( <spaced-separator> )
+ * | <name-component> <spaced-separator> <name>
+ * <spaced-separator> ::= <optional-space>
+ * <separator>
+ * <optional-space>
+ * <separator> ::= "," | ";"
+ * <optional-space> ::= ( <CR> ) *( " " )
+ *
+ */
+distinguishedName [SchemaManager schemaManager, Dn dn]
{
matchedProduction( "distinguishedName()" );
- Rdn rdn = null;
+ Rdn rdn = new Rdn( schemaManager );
}
:
(
- rdn = relativeDistinguishedName[new Rdn()]
+ relativeDistinguishedName[schemaManager, rdn]
{
try
{
@@ -192,12 +207,13 @@ distinguishedName [Dn dn]
{
// Do nothing, can't get an exception here
}
-
- rdn=null;
}
(
( COMMA | SEMI )
- rdn = relativeDistinguishedName[new Rdn()]
+ {
+ rdn = new Rdn( schemaManager );
+ }
+ relativeDistinguishedName[schemaManager, rdn]
{
try
{
@@ -207,8 +223,6 @@ distinguishedName [Dn dn]
{
// Do nothing, can't get an exception here
}
-
- rdn=null;
}
)*
EOF
@@ -216,238 +230,205 @@ distinguishedName [Dn dn]
;
- /**
- * Parses an Dn string.
- *
- * RFC 4514, Section 3
- * distinguishedName = [ relativeDistinguishedName
- * *( COMMA relativeDistinguishedName ) ]
- *
- * RFC 2253, Section 3
- * distinguishedName = [name]
- * name = name-component *("," name-component)
- *
- * RFC 1779, Section 2.3
- * <name> ::= <name-component> ( <spaced-separator> )
- * | <name-component> <spaced-separator> <name>
- * <spaced-separator> ::= <optional-space>
- * <separator>
- * <optional-space>
- * <separator> ::= "," | ";"
- * <optional-space> ::= ( <CR> ) *( " " )
- *
- */
-relativeDistinguishedNames [List<Rdn> rdns]
+/**
+ * Parses a Dn string.
+ *
+ * RFC 4514, Section 3
+ * distinguishedName = [ relativeDistinguishedName
+ * *( COMMA relativeDistinguishedName ) ]
+ *
+ * RFC 2253, Section 3
+ * distinguishedName = [name]
+ * name = name-component *("," name-component)
+ *
+ * RFC 1779, Section 2.3
+ * <name> ::= <name-component> ( <spaced-separator> )
+ * | <name-component> <spaced-separator> <name>
+ * <spaced-separator> ::= <optional-space>
+ * <separator>
+ * <optional-space>
+ * <separator> ::= "," | ";"
+ * <optional-space> ::= ( <CR> ) *( " " )
+ *
+ */
+relativeDistinguishedNames [SchemaManager schemaManager, List<Rdn> rdns]
{
matchedProduction( "relativeDistinguishedNames()" );
- Rdn rdn = null;
+ Rdn rdn = new Rdn( schemaManager );
}
:
(
- rdn = relativeDistinguishedName[new Rdn()]
+ relativeDistinguishedName[ schemaManager, rdn]
{
rdns.add( rdn );
+ rdn = new Rdn( schemaManager );
}
(
( COMMA | SEMI )
- rdn = relativeDistinguishedName[new Rdn()]
+ relativeDistinguishedName[schemaManager, rdn]
{
rdns.add( rdn );
+ rdn = new Rdn( schemaManager );
}
)*
EOF
)?
;
- /**
- * Parses an Rdn string.
- *
- * RFC 4514, Section 3
- * relativeDistinguishedName = attributeTypeAndValue
- * *( PLUS attributeTypeAndValue )
- *
- * RFC 2253, Section 3
- * name-component = attributeTypeAndValue *("+" attributeTypeAndValue)
- *
- * RFC 1779, Section 2.3
- * <name-component> ::= <attribute>
- * | <attribute> <optional-space> "+"
- * <optional-space> <name-component>
- *
- */
-relativeDistinguishedName [Rdn initialRdn] returns [Rdn rdn]
+/**
+ * Parses a Rdn string.
+ *
+ * RFC 4514, Section 3
+ * relativeDistinguishedName = attributeTypeAndValue
+ * *( PLUS attributeTypeAndValue )
+ *
+ * RFC 2253, Section 3
+ * name-component = attributeTypeAndValue *("+" attributeTypeAndValue)
+ *
+ * RFC 1779, Section 2.3
+ * <name-component> ::= <attribute>
+ * | <attribute> <optional-space> "+"
+ * <optional-space> <name-component>
+ *
+ */
+relativeDistinguishedName [SchemaManager schemaManager, Rdn rdn]
{
matchedProduction( "relativeDistinguishedName()" );
- rdn = initialRdn;
String tmp;
- String upName = "";
+
+ // The rdnStr variable is used to gather the full RDN string
+ // as provided
+ StringBuilder rdnStr = new StringBuilder();
}
:
(
- tmp = attributeTypeAndValue[rdn]
- {
- upName += tmp;
+ tmp = attributeTypeAndValue[schemaManager, rdn]
+ {
+ rdnStr.append( tmp );
}
(
- PLUS { upName += "+"; }
- tmp = attributeTypeAndValue[rdn]
- {
- upName += tmp;
+ PLUS { rdnStr.append( '+' ); }
+
+ tmp = attributeTypeAndValue[schemaManager, rdn]
+ {
+ rdnStr.append( tmp );
}
)*
)
{
- rdn.normalize();
- rdn.setUpName( upName );
+ rdn.hashCode();
+ rdn.setUpName( rdnStr.toString() );
}
;
- /**
- * RFC 4514, Section 3
- * attributeTypeAndValue = attributeType EQUALS attributeValue
- *
- * RFC 2253, Section 3
- * attributeTypeAndValue = attributeType "=" attributeValue
- *
- */
-attributeTypeAndValue [Rdn rdn] returns [String upName = ""]
+/**
+ * RFC 4514, Section 3
+ * attributeTypeAndValue = attributeType EQUALS attributeValue
+ *
+ * RFC 2253, Section 3
+ * attributeTypeAndValue = attributeType "=" attributeValue
+ *
+ */
+attributeTypeAndValue [SchemaManager schemaManager, Rdn rdn] returns [String upNameStr]
{
matchedProduction( "attributeTypeAndValue()" );
String type = null;
UpAndNormValue value = new UpAndNormValue();
- String upValue = null;
+ StringBuilder rdnUpName = new StringBuilder();
}
:
(
- ( SPACE { upName += " "; } )*
- type = attributeType { upName += type; }
- ( SPACE { upName += " "; } )*
- EQUALS { upName += "="; }
- ( SPACE
- {
- upName += " ";
-
- if ( upValue == null )
- {
- upValue = " ";
- }
- else
- {
- upValue += " ";
- }
- } )*
+ ( SPACE { rdnUpName.append( ' ' ); } )*
+ type = attributeType { rdnUpName.append( type ); }
+ ( SPACE { rdnUpName.append( ' ' ); } )*
+ EQUALS { rdnUpName.append( '=' ); }
+ ( SPACE { rdnUpName.append( ' ' ); } )*
attributeValue[value]
{
try
{
- upName += value.rawValue;
+ // We have to remove the ending spaces that may have been added, as the tutf1 rule
+ // cannot be processed
+ rdnUpName.append( value.upValue );
+ AttributeType attributeType = null;
Ava ava = null;
-
- if ( value.value instanceof String )
+
+ if ( schemaManager != null )
{
- if ( upValue != null )
+ if ( ( type.startsWith( "oid." ) ) || ( type.startsWith( "OID." ) ) )
{
- value.rawValue = upValue + value.rawValue;
+ type = type.substring( 4 );
}
+
+ attributeType = schemaManager.getAttributeType( type );
+ }
+
+ if ( ( ( attributeType != null ) && attributeType.isHR() ) || value.isHR )
+ {
+ int valueLength = value.upValue.length();
+ int pos = value.bytes.position();
- int start = 0;
-
- for ( int pos = 0; pos < value.rawValue.length(); pos++ )
- {
- if ( value.rawValue.charAt( pos ) == ' ' )
- {
- start++;
- }
- else
- {
- break;
- }
- }
-
- boolean escape = false;
- int lastEscapedSpace = -1;
-
- for ( int pos = start; pos< value.rawValue.length(); pos++ )
- {
- if ( escape )
- {
- escape = false;
-
- if ( value.rawValue.charAt( pos ) == ' ' )
- {
- lastEscapedSpace = pos;
- }
- }
- else if ( value.rawValue.charAt( pos ) == '\\' )
- {
- escape = true;
- }
- }
-
- // Remove spaces from the right if needed
- int pos = value.rawValue.length() - 1;
-
- while ( ( value.rawValue.charAt( pos ) == ' ' ) && ( pos > lastEscapedSpace ) )
- {
- pos--;
- }
-
- String trimmedValue = value.rawValue;
-
- if ( ( start > 0 ) || ( pos + 1 < value.rawValue.length() ) )
- {
- trimmedValue = value.rawValue.substring( start, pos + 1 );
- }
-
- Object unescapedValue = Rdn.unescapeValue( trimmedValue );
-
- if ( unescapedValue instanceof String )
+ for ( int i = valueLength - 1; i >= 0; i-- )
{
- ava = new Ava(
- type,
- type,
- new Value( trimmedValue, (String)unescapedValue ),
- upName
- );
+ if ( value.upValue.charAt( i ) == ' ' )
+ {
+ if ( i == 0 )
+ {
+ // The value is empty
+ ava = new Ava( schemaManager, type, rdnUpName.toString(), ( String ) null );
+ break;
+ }
+ else if ( value.upValue.charAt( i - 1 ) != '\\' )
+ {
+ // This is a trailing space, get rid of it
+ value.upValue.deleteCharAt( i );
+ pos--;
+ value.bytes.position( pos );
+ }
+ else
+ {
+ // This is an escaped space, get out
+ break;
+ }
+ }
+ else
+ {
+ break;
+ }
}
- else
+
+ if ( ava == null )
{
- ava = new Ava(
- type,
- type,
- new Value( (byte[])unescapedValue ),
- upName
- );
+ ava = new Ava( schemaManager, type, rdnUpName.toString(), Strings.utf8ToString( value.bytes.copyOfUsedBytes() ) );
}
}
else
{
- ava = new Ava(
- type,
- type,
- new Value( (byte[])value.value ),
- upName
- );
+ ava = new Ava( schemaManager, type, rdnUpName.toString(), value.bytes.copyOfUsedBytes() );
}
- rdn.addAVA( null, ava );
+ rdn.addAVA( schemaManager, ava );
}
catch ( LdapInvalidDnException e )
{
throw new SemanticException( e.getMessage() );
}
}
+ ( SPACE { rdnUpName.append( ' ' ); } )*
)
+ {
+ upNameStr = rdnUpName.toString();
+ }
;
- /**
- * RFC 4514 Section 3
- *
- * attributeType = descr / numericoid
- *
- */
+/**
+ * RFC 4514 Section 3
+ *
+ * attributeType = descr / numericoid
+ *
+ */
attributeType returns [String attributeType]
{
matchedProduction( "attributeType()" );
@@ -461,117 +442,111 @@ attributeType returns [String attributeT
;
- /**
- * RFC 4512 Section 1.4
- *
- * descr = keystring
- * keystring = leadkeychar *keychar
- * leadkeychar = ALPHA
- * keychar = ALPHA / DIGIT / HYPHEN
- *
- * We additionally add UNDERSCORE because some servers allow them.
- *
- */
+/**
+ * RFC 4512 Section 1.4
+ *
+ * descr = keystring
+ * keystring = leadkeychar *keychar
+ * leadkeychar = ALPHA
+ * keychar = ALPHA / DIGIT / HYPHEN
+ *
+ * We additionally add UNDERSCORE because some servers allow them.
+ *
+ */
descr returns [String descr]
{
matchedProduction( "descr()" );
+ StringBuilder descrSb = new StringBuilder();
}
:
- leadkeychar:ALPHA { descr = leadkeychar.getText(); }
+ leadkeychar:ALPHA { descrSb.append( leadkeychar.getText() ); }
(
- alpha:ALPHA { descr += alpha.getText(); }
+ alpha:ALPHA { descrSb.append( alpha.getText() ); }
|
- digit:DIGIT { descr += digit.getText(); }
+ digit:DIGIT { descrSb.append( digit.getText() ); }
|
- hyphen:HYPHEN { descr += hyphen.getText(); }
+ HYPHEN { descrSb.append( '-' ); }
|
- underscore:UNDERSCORE { descr += underscore.getText(); }
+ UNDERSCORE { descrSb.append( '_' ); }
)*
+ {
+ descr = descrSb.toString();
+ }
;
- /**
- * RFC 4512 Section 1.4
- *
- * numericoid = number 1*( DOT number )
- * number = DIGIT / ( LDIGIT 1*DIGIT )
- * DIGIT = %x30 / LDIGIT ; "0"-"9"
- * LDIGIT = %x31-39 ; "1"-"9"
- *
- */
+/**
+ * RFC 4512 Section 1.4
+ *
+ * numericoid = number 1*( DOT number )
+ * number = DIGIT / ( LDIGIT 1*DIGIT )
+ * DIGIT = %x30 / LDIGIT ; "0"-"9"
+ * LDIGIT = %x31-39 ; "1"-"9"
+ *
+ */
numericoid returns [String numericoid = ""]
{
matchedProduction( "numericoid()" );
}
:
- noid:NUMERICOID { numericoid += noid.getText(); }
+ noid:NUMERICOID { numericoid = noid.getText(); }
;
- /**
- * RFC 4514, Section 3
- * attributeValue = string / hexstring
- *
- * RFC 2253, Section 3
- * attributeValue = string
- * string = *( stringchar / pair )
- * / "#" hexstring
- * / QUOTATION *( quotechar / pair ) QUOTATION ; only from v2
- *
- */
-attributeValue [UpAndNormValue value]
+/**
+ * RFC 4514, Section 3
+ * attributeValue = string / hexstring
+ *
+ * RFC 2253, Section 3
+ * attributeValue = string
+ * string = *( stringchar / pair )
+ * / "#" hexstring
+ * / QUOTATION *( quotechar / pair ) QUOTATION ; only from v2
+ *
+ * We still accept both forms, which means we can have a value surrounded by '"'
+ */
+attributeValue [UpAndNormValue value]
{
matchedProduction( "attributeValue()" );
}
:
(
- (
- quotestring [value]
- ( SPACE { value.rawValue += " "; } )*
- )
+ // Special for RFC 2253
+ quotestring [value]
|
string [value]
|
- (
- hexstring [value]
- ( SPACE { value.rawValue += " "; } )*
- )
+ hexstring [value]
)?
;
- /**
- * RFC 2253, Section 3
- * / QUOTATION *( quotechar / pair ) QUOTATION ; only from v2
- * quotechar = <any character except "\" or QUOTATION >
- *
- */
+/**
+ * RFC 2253, Section 3
+ * / QUOTATION *( quotechar / pair ) QUOTATION ; only from v2
+ * quotechar = <any character except "\" or QUOTATION >
+ *
+ */
quotestring [UpAndNormValue value]
{
matchedProduction( "quotestring()" );
- org.apache.directory.api.util.ByteBuffer bb = new org.apache.directory.api.util.ByteBuffer();
- byte[] bytes;
}
:
(
- dq1:DQUOTE { value.rawValue += dq1.getText(); }
+ DQUOTE { value.upValue.append( '"' ); }
(
(
s:~(DQUOTE|ESC|ESCESC|ESCSHARP|HEXPAIR)
{
- value.rawValue += s.getText();
- bb.append( Strings.getBytesUtf8( s.getText() ) );
+ value.upValue.append( s.getText() );
+ value.bytes.append( Strings.getBytesUtf8( s.getText() ) );
}
)
|
- bytes = pair[value] { bb.append( bytes ); }
+ pair [value]
)*
- dq2:DQUOTE { value.rawValue += dq2.getText(); }
+ DQUOTE { value.upValue.append( '"' ); }
)
- {
- String string = Strings.utf8ToString( bb.copyOfUsedBytes() );
- value.value = string;
- }
;
@@ -592,9 +567,10 @@ hexstring [UpAndNormValue value]
:
hexValue:HEXVALUE
{
- // convert to byte[]
- value.rawValue = "#" + hexValue.getText();
- value.value = Strings.toByteArray( hexValue.getText() );
+ String hexStr = hexValue.getText();
+ value.upValue.append( '#' ).append( hexStr );
+ value.bytes.append( Strings.toByteArray( hexStr ) );
+ value.isHR = false;
}
;
@@ -605,74 +581,21 @@ hexstring [UpAndNormValue value]
* ; The following characters are to be escaped when they appear
* ; in the value to be encoded: ESC, one of <escaped>, leading
* ; SHARP or SPACE, trailing SPACE, and NULL.
- * string = [ ( leadchar / pair ) [ *( stringchar / pair )
- * ( trailchar / pair ) ] ]
- *
+ * string = [ ( leadchar / pair ) [ *( stringchar / pair ) ( trailchar / pair ) ] ]
+ * leadchar = LUTF1 | UTFMB
+ * stringchar = SUTF1 / UTFMB
+ * trailchar = TUTF1 / UTFMB
*/
string [UpAndNormValue value]
{
matchedProduction( "string()" );
- org.apache.directory.api.util.ByteBuffer bb = new org.apache.directory.api.util.ByteBuffer();
- String tmp;
- byte[] bytes;
}
:
(
- (
- tmp = lutf1
- {
- value.rawValue += tmp;
- bb.append( Strings.getBytesUtf8( tmp ) );
- }
- |
- tmp = utfmb
- {
- value.rawValue += tmp;
- bb.append( Strings.getBytesUtf8( tmp ) );
- }
- |
- bytes = pair [value]
- {
- bb.append( bytes );
- }
- )
- (
- tmp = sutf1
- {
- value.rawValue += tmp;
- bb.append( Strings.getBytesUtf8( tmp ) );
- }
- |
- tmp = utfmb
- {
- value.rawValue += tmp;
- bb.append( Strings.getBytesUtf8( tmp ) );
- }
- |
- bytes = pair [value]
- {
- bb.append( bytes );
- }
- )*
+ // Note that we don't distinguish between sutf1 and tutf1, as it would be ambiguous.
+ // The final spaces will be handled later.
+ ( lutf1 [value] | utfmb [value] | pair [value] ) ( sutf1 [value] | utfmb [value] | pair [value] )*
)
- {
- /*
- String string = Strings.utf8ToString( bb.copyOfUsedBytes() );
-
- // trim trailing space characters manually
- // don't know how to tell antlr that the last char mustn't be a space.
- int rawIndex = value.rawValue.length();
- while ( string.length() > 0 && rawIndex > 1
- && value.rawValue.charAt( rawIndex - 1 ) == ' '
- && value.rawValue.charAt( rawIndex - 2 ) != '\\' )
- {
- string = string.substring( 0, string.length() - 1 );
- rawIndex--;
- }
-
- value.value = string;
- */
- }
;
@@ -681,7 +604,7 @@ string [UpAndNormValue value]
* LUTF1 = %x01-1F / %x21 / %x24-2A / %x2D-3A /
* %x3D / %x3F-5B / %x5D-7F
*
- * The rule LUTF1_REST doesn't contain the following charcters,
+ * The rule CHAR_REST doesn't contain the following charcters,
* so we must check them additionally
* EQUALS (0x3D)
* HYPHEN (0x2D)
@@ -689,175 +612,326 @@ string [UpAndNormValue value]
* DIGIT (0x30-0x39)
* ALPHA (0x41-0x5A and 0x61-0x7A)
*/
-lutf1 returns [String lutf1=""]
+lutf1 [UpAndNormValue value]
{
matchedProduction( "lutf1()" );
}
:
- rest:LUTF1_REST { lutf1 = rest.getText(); }
+ rest:CHAR_REST
+ {
+ char c = rest.getText().charAt( 0 );
+ value.upValue.append( c );
+ value.bytes.append( ( byte ) c );
+ }
|
- equals:EQUALS { lutf1 = equals.getText(); }
+ EQUALS
+ {
+ value.upValue.append( '=' );
+ value.bytes.append( '=' );
+ }
|
- hyphen:HYPHEN { lutf1 = hyphen.getText(); }
+ HYPHEN
+ {
+ value.upValue.append( '-' );
+ value.bytes.append( '-' );
+ }
|
- underscore:UNDERSCORE { lutf1 = underscore.getText(); }
+ UNDERSCORE
+ {
+ value.upValue.append( '_' );
+ value.bytes.append( '_' );
+ }
|
- digit:DIGIT { lutf1 = digit.getText(); }
+ digit:DIGIT
+ {
+ char c = digit.getText().charAt( 0 );
+ value.upValue.append( c );
+ value.bytes.append( ( byte ) c );
+ }
|
- alpha:ALPHA { lutf1 = alpha.getText(); }
+ alpha:ALPHA
+ {
+ char c = alpha.getText().charAt( 0 );
+ value.upValue.append( c );
+ value.bytes.append( ( byte ) c );
+ }
|
- numericoid:NUMERICOID { lutf1 = numericoid.getText(); }
+ // Another hack : having a String like 127.0.0.1 in the value
+ // will not match a DIGIT, because it's swallowed by the NUMERICOID
+ // token
+ numericoid:NUMERICOID
+ {
+ String number = numericoid.getText();
+ value.upValue.append( number );
+ value.bytes.append( Strings.getBytesUtf8( number ) );
+ }
;
-
+
+
/**
* RFC 4514, Section 3:
* SUTF1 = %x01-21 / %x23-2A / %x2D-3A /
* %x3D / %x3F-5B / %x5D-7F
*
- * The rule LUTF1_REST doesn't contain the following charcters,
+ * The rule CHAR_REST doesn't contain the following charcters,
* so we must check them additionally
* EQUALS (0x3D)
* HYPHEN (0x2D)
* UNDERSCORE (0x5F)
* DIGIT (0x30-0x39)
* ALPHA (0x41-0x5A and 0x61-0x7A)
- * SHARP
- * SPACE
+ * SHARP (0x23)
+ * SPACE (0x20)
*/
-sutf1 returns [String sutf1=""]
+sutf1 [UpAndNormValue value]
{
matchedProduction( "sutf1()" );
}
:
- rest:LUTF1_REST { sutf1 = rest.getText(); }
+ rest:CHAR_REST
+ {
+ char c = rest.getText().charAt( 0 );
+ value.upValue.append( c );
+ value.bytes.append( ( byte ) c );
+ }
|
- equals:EQUALS { sutf1 = equals.getText(); }
+ EQUALS
+ {
+ value.upValue.append( '=' );
+ value.bytes.append( '=' );
+ }
|
- hyphen:HYPHEN { sutf1 = hyphen.getText(); }
+ HYPHEN
+ {
+ value.upValue.append( '-' );
+ value.bytes.append( '-' );
+ }
|
- underscore:UNDERSCORE { sutf1 = underscore.getText(); }
+ UNDERSCORE
+ {
+ value.upValue.append( '_' );
+ value.bytes.append( '_' );
+ }
|
- digit:DIGIT { sutf1 = digit.getText(); }
+ digit:DIGIT
+ {
+ char c = digit.getText().charAt( 0 );
+ value.upValue.append( c );
+ value.bytes.append( ( byte ) c );
+ }
|
- alpha:ALPHA { sutf1 = alpha.getText(); }
+ alpha:ALPHA
+ {
+ char c = alpha.getText().charAt( 0 );
+ value.upValue.append( c );
+ value.bytes.append( ( byte ) c );
+ }
|
- sharp:SHARP { sutf1 = sharp.getText(); }
+ SHARP
+ {
+ value.upValue.append( '#' );
+ value.bytes.append( '#' );
+ }
|
- space:SPACE { sutf1 = space.getText(); }
+ SPACE
+ {
+ value.upValue.append( ' ' );
+ value.bytes.append( ' ' );
+ }
|
// This is a hack to deal with #NN included into the value, due to
// some collision with the HEXVALUE token. In this case, we should
// consider that a hex value is in fact a String
- hex:HEXVALUE { sutf1 = "#" + hex.getText(); }
- |
- numericoid:NUMERICOID { sutf1 = numericoid.getText(); }
- ;
+ hex:HEXVALUE
+ {
+ String hexStr = hex.getText();
+ value.upValue.append( '#' ).append( hexStr );
+ value.bytes.append( '#' );
+ value.bytes.append( Strings.getBytesUtf8( hexStr ) );
+ }
+ |
+ // Another hack : having a String like 127.0.0.1 in the value
+ // will not match a DIGIT, because it's swallowed by the NUMERICOID
+ // token
+ numericoid:NUMERICOID
+ {
+ String number = numericoid.getText();
+ value.upValue.append( number );
+ value.bytes.append( Strings.getBytesUtf8( number ) );
+ }
+ ;
-utfmb returns [String utfmb]
+/**
+ * RFC 4514, Section 3:
+ * TUTF1 = %x01-1F / %x21 / %x23-2A / %x2D-3A /
+ * %x3D / %x3F-5B / %x5D-7F
+ *
+ * The rule CHAR_REST doesn't contain the following charcters,
+ * so we must check them additionally
+ * EQUALS (0x3D)
+ * HYPHEN (0x2D)
+ * UNDERSCORE (0x5F)
+ * DIGIT (0x30-0x39)
+ * ALPHA (0x41-0x5A and 0x61-0x7A)
+ * SHARP (0x23)
+ *
+tutf1 [UpAndNormValue value]
+ {
+ matchedProduction( "tutf1()" );
+ }
+ :
+ rest:CHAR_REST
+ {
+ char c = rest.getText().charAt( 0 );
+ value.upValue.append( c );
+ value.bytes.append( ( byte ) c );
+ }
+ |
+ EQUALS
+ {
+ value.upValue.append( '=' );
+ value.bytes.append( '=' );
+ }
+ |
+ HYPHEN
+ {
+ value.upValue.append( '-' );
+ value.bytes.append( '-' );
+ }
+ |
+ UNDERSCORE
+ {
+ value.upValue.append( '_' );
+ value.bytes.append( '_' );
+ }
+ |
+ digit:DIGIT
+ {
+ char c = digit.getText().charAt( 0 );
+ value.upValue.append( c );
+ value.bytes.append( ( byte ) c );
+ }
+ |
+ alpha:ALPHA
+ {
+ char c = alpha.getText().charAt( 0 );
+ value.upValue.append( c );
+ value.bytes.append( ( byte ) c );
+ }
+ ;
+*/
+
+utfmb [UpAndNormValue value]
{
matchedProduction( "utfmb()" );
}
:
- s:UTFMB { utfmb = s.getText(); }
+ s:UTFMB
+ {
+ char c = s.getText().charAt( 0 );
+ value.upValue.append( c );
+ value.bytes.append( Unicode.charToBytes( c ) );
+ }
;
- /**
- * RFC 4514, Section 3
- * pair = ESC ( ESC / special / hexpair )
- * special = escaped / SPACE / SHARP / EQUALS
- * escaped = DQUOTE / PLUS / COMMA / SEMI / LANGLE / RANGLE
- * hexpair = HEX HEX
- *
- * If in <string> form, a LDAP string representation asserted value can
- * be obtained by replacing (left to right, non-recursively) each <pair>
- * appearing in the <string> as follows:
- * replace <ESC><ESC> with <ESC>;
- * replace <ESC><special> with <special>;
- * replace <ESC><hexpair> with the octet indicated by the <hexpair>.
- *
- * RFC 2253, Section 3
- * pair = "\" ( special / "\" / QUOTATION / hexpair )
- * special = "," / "=" / "+" / "<" / ">" / "#" / ";"
- *
- * RFC 1779, Section 2.3
- * <pair> ::= "\" ( <special> | "\" | '"')
- * <special> ::= "," | "=" | <CR> | "+" | "<" | ">"
- * | "#" | ";"
- *
- */
-pair [UpAndNormValue value] returns [byte[] pair]
+/**
+ * RFC 4514, Section 3
+ * pair = ESC ( ESC / special / hexpair )
+ * special = escaped / SPACE / SHARP / EQUALS
+ * escaped = DQUOTE / PLUS / COMMA / SEMI / LANGLE / RANGLE
+ * hexpair = HEX HEX
+ *
+ * If in <string> form, a LDAP string representation asserted value can
+ * be obtained by replacing (left to right, non-recursively) each <pair>
+ * appearing in the <string> as follows:
+ * replace <ESC><ESC> with <ESC>;
+ * replace <ESC><special> with <special>;
+ * replace <ESC><hexpair> with the octet indicated by the <hexpair>.
+ *
+ * RFC 2253, Section 3
+ * pair = "\" ( special / "\" / QUOTATION / hexpair )
+ * special = "," / "=" / "+" / "<" / ">" / "#" / ";"
+ *
+ * RFC 1779, Section 2.3
+ * <pair> ::= "\" ( <special> | "\" | '"')
+ * <special> ::= "," | "=" | <CR> | "+" | "<" | ">"
+ * | "#" | ";"
+ *
+ */
+pair [UpAndNormValue value]
{
matchedProduction( "pair()" );
- String tmp;
+ char specialChar;
}
:
(
ESCESC
{
- value.rawValue += "\\\\";
- pair = Strings.getBytesUtf8( "\\" );
+ value.upValue.append( "\\\\" );
+ value.bytes.append( '\\' );
}
)
|
(
ESCSHARP
{
- value.rawValue += "\\#";
- pair = Strings.getBytesUtf8( "#" );
+ value.upValue.append( "\\#" );
+ value.bytes.append( '#' );
}
)
|
(
ESC
- tmp = special
+ specialChar = special
{
- value.rawValue += "\\" + tmp;
- pair = Strings.getBytesUtf8( tmp );
+ value.upValue.append( '\\' ).append( specialChar );
+ value.bytes.append( specialChar );
}
)
|
- (
- hexpair:HEXPAIR
- {
- value.rawValue += "\\" + hexpair.getText();
- pair = Strings.toByteArray( hexpair.getText() );
- }
+ (
+ // A String like "\C4", corresponding to the hex value 0xC4.
+ hexpair:HEXPAIR
+ {
+ value.upValue.append( '\\' ).append( hexpair.getText() );
+ value.bytes.append( Strings.toByteArray( hexpair.getText() ) );
+ }
)
;
- /**
- * RFC 4514 Section 3
- *
- * special = escaped / SPACE / SHARP / EQUALS
- * escaped = DQUOTE / PLUS / COMMA / SEMI / LANGLE / RANGLE
- *
- */
-special returns [String special]
+/**
+ * RFC 4514 Section 3
+ *
+ * special = escaped / SPACE / SHARP / EQUALS
+ * escaped = DQUOTE / PLUS / COMMA / SEMI / LANGLE / RANGLE
+ *
+ */
+special returns [char special]
{
matchedProduction( "special()" );
}
:
(
- dquote:DQUOTE { special = dquote.getText(); }
+ DQUOTE { special = '"'; }
|
- plus:PLUS { special = plus.getText(); }
+ PLUS { special = '+'; }
|
- comma:COMMA { special = comma.getText(); }
+ COMMA { special = ','; }
|
- semi:SEMI { special = semi.getText(); }
+ SEMI { special = ';'; }
|
- langle:LANGLE { special = langle.getText(); }
+ LANGLE { special = '<'; }
|
- rangle:RANGLE { special = rangle.getText(); }
+ RANGLE { special = '>'; }
|
- space:SPACE { special = space.getText(); }
+ SPACE { special = ' '; }
|
- sharp:SHARP { special = sharp.getText(); }
+ SHARP { special = '#'; }
|
- equals:EQUALS { special = equals.getText(); }
+ EQUALS { special = '='; }
)
;
Modified: directory/shared/branches/shared-value/ldap/model/src/main/antlr/subtree-specification.g
URL: http://svn.apache.org/viewvc/directory/shared/branches/shared-value/ldap/model/src/main/antlr/subtree-specification.g?rev=1743011&r1=1743010&r2=1743011&view=diff
==============================================================================
--- directory/shared/branches/shared-value/ldap/model/src/main/antlr/subtree-specification.g (original)
+++ directory/shared/branches/shared-value/ldap/model/src/main/antlr/subtree-specification.g Mon May 9 17:22:19 2016
@@ -352,8 +352,7 @@ distinguishedName returns [ Dn name ]
:
token:SAFEUTF8STRING
{
- name = new Dn( token.getText() );
- name.apply( schemaManager );
+ name = new Dn( schemaManager, token.getText() );
log.debug( "recognized a DistinguishedName: " + token.getText() );
}
Modified: directory/shared/branches/shared-value/ldap/model/src/main/java/org/apache/directory/api/ldap/model/entry/AttributeUtils.java
URL: http://svn.apache.org/viewvc/directory/shared/branches/shared-value/ldap/model/src/main/java/org/apache/directory/api/ldap/model/entry/AttributeUtils.java?rev=1743011&r1=1743010&r2=1743011&view=diff
==============================================================================
--- directory/shared/branches/shared-value/ldap/model/src/main/java/org/apache/directory/api/ldap/model/entry/AttributeUtils.java (original)
+++ directory/shared/branches/shared-value/ldap/model/src/main/java/org/apache/directory/api/ldap/model/entry/AttributeUtils.java Mon May 9 17:22:19 2016
@@ -169,7 +169,7 @@ public final class AttributeUtils
* option = 1*keychar
* keychar = 'a'-z' | 'A'-'Z' / '0'-'9' / '-'
*/
- private static void parseOptions( byte[] str, Position pos ) throws ParseException
+ private static void parseOptions( char[] str, Position pos ) throws ParseException
{
while ( Strings.isCharASCII( str, pos.start, ';' ) )
{
@@ -192,6 +192,38 @@ public final class AttributeUtils
}
+
+
+ /**
+ * Parse attribute's options :
+ *
+ * options = *( ';' option )
+ * option = 1*keychar
+ * keychar = 'a'-z' | 'A'-'Z' / '0'-'9' / '-'
+ */
+ private static void parseOptions( byte[] bytes, Position pos ) throws ParseException
+ {
+ while ( Strings.isCharASCII( bytes, pos.start, ';' ) )
+ {
+ pos.start++;
+
+ // We have an option
+ if ( !Chars.isAlphaDigitMinus( bytes, pos.start ) )
+ {
+ // We must have at least one keychar
+ throw new ParseException( I18n.err( I18n.ERR_04343 ), pos.start );
+ }
+
+ pos.start++;
+
+ while ( Chars.isAlphaDigitMinus( bytes, pos.start ) )
+ {
+ pos.start++;
+ }
+ }
+ }
+
+
/**
* Parse a number :
*
@@ -200,11 +232,11 @@ public final class AttributeUtils
*
* @return true if a number has been found
*/
- private static boolean parseNumber( byte[] filter, Position pos )
+ private static boolean parseNumber( char[] filter, Position pos )
{
- byte b = Strings.byteAt( filter, pos.start );
+ char c = Strings.charAt( filter, pos.start );
- switch ( b )
+ switch ( c )
{
case '0':
// If we get a starting '0', we should get out
@@ -237,8 +269,54 @@ public final class AttributeUtils
}
+
+
/**
+ * Parse a number :
+ *
+ * number = '0' | '1'..'9' digits
+ * digits = '0'..'9'*
*
+ * @return true if a number has been found
+ */
+ private static boolean parseNumber( byte[] bytes, Position pos )
+ {
+ byte b = Strings.byteAt( bytes, pos.start );
+
+ switch ( b )
+ {
+ case '0':
+ // If we get a starting '0', we should get out
+ pos.start++;
+ return true;
+
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ pos.start++;
+ break;
+
+ default:
+ // Not a number.
+ return false;
+ }
+
+ while ( Chars.isDigit( bytes, pos.start ) )
+ {
+ pos.start++;
+ }
+
+ return true;
+ }
+
+
+ /**
* Parse an OID.
*
* numericoid = number 1*( '.' number )
@@ -248,7 +326,7 @@ public final class AttributeUtils
* @param pos The current position in the string
* @throws ParseException If we don't have a valid OID
*/
- private static void parseOID( byte[] str, Position pos ) throws ParseException
+ private static void parseOID( char[] str, Position pos ) throws ParseException
{
// We have an OID
parseNumber( str, pos );
@@ -284,6 +362,54 @@ public final class AttributeUtils
}
+
+
+ /**
+ * Parse an OID.
+ *
+ * numericoid = number 1*( '.' number )
+ * number = '0'-'9' / ( '1'-'9' 1*'0'-'9' )
+ *
+ * @param bytes The OID to parse
+ * @param pos The current position in the string
+ * @throws ParseException If we don't have a valid OID
+ */
+ private static void parseOID( byte[] bytes, Position pos ) throws ParseException
+ {
+ // We have an OID
+ parseNumber( bytes, pos );
+
+ // We must have at least one '.' number
+ if ( !Strings.isCharASCII( bytes, pos.start, '.' ) )
+ {
+ throw new ParseException( I18n.err( I18n.ERR_04344 ), pos.start );
+ }
+
+ pos.start++;
+
+ if ( !parseNumber( bytes, pos ) )
+ {
+ throw new ParseException( I18n.err( I18n.ERR_04345 ), pos.start );
+ }
+
+ while ( true )
+ {
+ // Break if we get something which is not a '.'
+ if ( !Strings.isCharASCII( bytes, pos.start, '.' ) )
+ {
+ break;
+ }
+
+ pos.start++;
+
+ if ( !parseNumber( bytes, pos ) )
+ {
+ throw new ParseException( I18n.err( I18n.ERR_04345 ), pos.start );
+ }
+ }
+ }
+
+
/**
* Parse an attribute. The grammar is :
* attributedescription = attributetype options
@@ -302,25 +428,25 @@ public final class AttributeUtils
* @param pos The position of the attribute in the current string
* @return The parsed attribute if valid
*/
- public static String parseAttribute( byte[] str, Position pos, boolean withOption, boolean relaxed )
+ public static String parseAttribute( char[] str, Position pos, boolean withOption, boolean relaxed )
throws ParseException
{
// We must have an OID or an DESCR first
- byte b = Strings.byteAt( str, pos.start );
+ char c = Strings.charAt( str, pos.start );
- if ( b == '\0' )
+ if ( c == '\0' )
{
throw new ParseException( I18n.err( I18n.ERR_04346 ), pos.start );
}
int start = pos.start;
- if ( Chars.isAlpha( b ) )
+ if ( Chars.isAlpha( c ) )
{
// A DESCR
pos.start++;
- while ( Chars.isAlphaDigitMinus( str, pos.start ) || ( relaxed && Chars.isUnderscore( str, pos.start ) ) )
+ while ( Chars.isAlphaDigitMinus( str, pos.start ) || ( relaxed && Chars.isCharASCII( str, pos.start, '_' ) ) )
{
pos.start++;
}
@@ -331,9 +457,9 @@ public final class AttributeUtils
parseOptions( str, pos );
}
- return Strings.getString( str, start, pos.start - start, "UTF-8" );
+ return new String( str, start, pos.start - start );
}
- else if ( Chars.isDigit( b ) )
+ else if ( Chars.isDigit( c ) )
{
// An OID
pos.start++;
@@ -347,7 +473,81 @@ public final class AttributeUtils
parseOptions( str, pos );
}
- return Strings.getString( str, start, pos.start - start, "UTF-8" );
+ return new String( str, start, pos.start - start );
+ }
+ else
+ {
+ throw new ParseException( I18n.err( I18n.ERR_04347 ), pos.start );
+ }
+ }
+
+
+
+
+ /**
+ * Parse an attribute. The grammar is :
+ * attributedescription = attributetype options
+ * attributetype = oid
+ * oid = descr / numericoid
+ * descr = keystring
+ * numericoid = number 1*( '.' number )
+ * options = *( ';' option )
+ * option = 1*keychar
+ * keystring = leadkeychar *keychar
+ * leadkeychar = 'a'-z' | 'A'-'Z'
+ * keychar = 'a'-z' | 'A'-'Z' / '0'-'9' / '-'
+ * number = '0'-'9' / ( '1'-'9' 1*'0'-'9' )
+ *
+ * @param bytes The parsed attribute,
+ * @param pos The position of the attribute in the current string
+ * @return The parsed attribute if valid
+ */
+ public static String parseAttribute( byte[] bytes, Position pos, boolean withOption, boolean relaxed )
+ throws ParseException
+ {
+ // We must have an OID or an DESCR first
+ byte b = Strings.byteAt( bytes, pos.start );
+
+ if ( b == '\0' )
+ {
+ throw new ParseException( I18n.err( I18n.ERR_04346 ), pos.start );
+ }
+
+ int start = pos.start;
+
+ if ( Chars.isAlpha( b ) )
+ {
+ // A DESCR
+ //pos.start++;
+
+ while ( Chars.isAlphaDigitMinus( bytes, pos.start ) || ( relaxed && Strings.isCharASCII( bytes, pos.start, '_' ) ) )
+ {
+ pos.start++;
+ }
+
+ // Parse the options if needed
+ if ( withOption )
+ {
+ parseOptions( bytes, pos );
+ }
+
+ return Strings.utf8ToString( bytes, start, pos.start - start );
+ }
+ else if ( Chars.isDigit( b ) )
+ {
+ // An OID
+ //pos.start++;
+
+ // Parse the OID
+ parseOID( bytes, pos );
+
+ // Parse the options
+ if ( withOption )
+ {
+ parseOptions( bytes, pos );
+ }
+
+ return Strings.utf8ToString( bytes, start, pos.start - start );
}
else
{
Modified: directory/shared/branches/shared-value/ldap/model/src/main/java/org/apache/directory/api/ldap/model/entry/DefaultAttribute.java
URL: http://svn.apache.org/viewvc/directory/shared/branches/shared-value/ldap/model/src/main/java/org/apache/directory/api/ldap/model/entry/DefaultAttribute.java?rev=1743011&r1=1743010&r2=1743011&view=diff
==============================================================================
--- directory/shared/branches/shared-value/ldap/model/src/main/java/org/apache/directory/api/ldap/model/entry/DefaultAttribute.java (original)
+++ directory/shared/branches/shared-value/ldap/model/src/main/java/org/apache/directory/api/ldap/model/entry/DefaultAttribute.java Mon May 9 17:22:19 2016
@@ -463,7 +463,7 @@ public class DefaultAttribute implements
if ( isHR )
{
- serverValue = new Value( attributeType, clientValue.getString() );
+ serverValue = new Value( attributeType, clientValue.getValue() );
}
else
{
@@ -505,7 +505,7 @@ public class DefaultAttribute implements
if ( isHR && ( value != null ) )
{
- return value.getString();
+ return value.getValue();
}
String message = I18n.err( I18n.ERR_04131 );
@@ -970,7 +970,7 @@ public class DefaultAttribute implements
{
// The attribute Type is HR, convert the
// value to a Value
- Value sv = new Value( val.getString() );
+ Value sv = new Value( Strings.utf8ToString( val.getBytes() ) );
if ( !contains( sv ) )
{
@@ -1245,7 +1245,7 @@ public class DefaultAttribute implements
{
if ( val.isHumanReadable() )
{
- String stringVal = val.getString();
+ String stringVal = val.getValue();
// We have to convert the binary value to a String
if ( !values.contains( new Value( Strings.getBytesUtf8( stringVal ) ) ) )
@@ -1783,7 +1783,7 @@ public class DefaultAttribute implements
{
if ( value.isHumanReadable() )
{
- newValues.add( new Value( attributeType, value.getString() ) );
+ newValues.add( new Value( attributeType, value.getValue() ) );
}
else
{
Modified: directory/shared/branches/shared-value/ldap/model/src/main/java/org/apache/directory/api/ldap/model/entry/DefaultEntry.java
URL: http://svn.apache.org/viewvc/directory/shared/branches/shared-value/ldap/model/src/main/java/org/apache/directory/api/ldap/model/entry/DefaultEntry.java?rev=1743011&r1=1743010&r2=1743011&view=diff
==============================================================================
--- directory/shared/branches/shared-value/ldap/model/src/main/java/org/apache/directory/api/ldap/model/entry/DefaultEntry.java (original)
+++ directory/shared/branches/shared-value/ldap/model/src/main/java/org/apache/directory/api/ldap/model/entry/DefaultEntry.java Mon May 9 17:22:19 2016
@@ -259,7 +259,11 @@ public final class DefaultEntry implemen
if ( schemaManager != null )
{
- this.dn.apply( schemaManager );
+ if ( !dn.isSchemaAware() )
+ {
+ this.dn = new Dn( schemaManager, dn );
+ }
+
initObjectClassAT();
}
}
@@ -518,7 +522,7 @@ public final class DefaultEntry implemen
try
{
// The dn must be normalized
- dn.apply( schemaManager );
+ dn = new Dn( schemaManager, dn );
}
catch ( LdapException ne )
{
@@ -2505,7 +2509,7 @@ public final class DefaultEntry implemen
for ( Value value : objectClass )
{
// Loop on all the values, and check if they are present
- if ( !attribute.contains( value.getString() ) )
+ if ( !attribute.contains( value.getValue() ) )
{
return false;
}