Author: akarasulu Date: Sun Oct 10 03:56:01 2004 New Revision: 54238 Modified: incubator/directory/eve/trunk/backend/tools/src/antlr/openldap.g incubator/directory/eve/trunk/backend/tools/src/java/org/apache/eve/tools/schema/OpenLdapSchemaParser.java incubator/directory/eve/trunk/backend/tools/src/test/org/apache/eve/tools/schema/OpenLdapSchemaParserTest.java Log: Commit changes ... o corrected bugs in grammar around name productions on all entities o added more specific point tests o tested and passed all OpenLDAP schema file parses Notes ... o found several errors that do not comply with RFC in schema files - I double tripple checked these with rfc 2252 description syntaxes o the primary problems were the occasional term order confusion and there were just one or two typos o the OpenLDAP server must just ignore term ordering or must ignore malformed descriptions Corrected several bugs in grammar with processing names and added a Modified: incubator/directory/eve/trunk/backend/tools/src/antlr/openldap.g ============================================================================== --- incubator/directory/eve/trunk/backend/tools/src/antlr/openldap.g (original) +++ incubator/directory/eve/trunk/backend/tools/src/antlr/openldap.g Sun Oct 10 03:56:01 2004 @@ -100,7 +100,7 @@ SYNTAX : - "syntax" WS NUMERICOID OPEN_BRACKET ( DIGIT )+ CLOSE_BRACKET + "syntax" WS NUMERICOID ( OPEN_BRACKET ( DIGIT )+ CLOSE_BRACKET )? ; class antlrOpenLdapSchemaParser extends Parser ; @@ -302,7 +302,8 @@ } : ( - "NAME" QUOTE id0:IDENTIFIER QUOTE + "NAME" + ( QUOTE id0:IDENTIFIER QUOTE { list.add( id0.getText() ); } @@ -315,6 +316,7 @@ { list.add( id2.getText() ); } )* CLOSE_PAREN ) + ) ) { objectClass.setNames( ( String[] ) list.toArray( EMPTY ) ); @@ -337,6 +339,7 @@ OPEN_PAREN oid:NUMERICOID { type = new AttributeTypeLiteral( oid.getText() ); + System.out.println( oid.getText() ); } ( names[type] )? ( desc[type] )? @@ -365,6 +368,7 @@ : d:DESC { type.setDescription( d.getText().split( "'" )[1] ); + System.out.println( d.getText() ); } ; Modified: incubator/directory/eve/trunk/backend/tools/src/java/org/apache/eve/tools/schema/OpenLdapSchemaParser.java ============================================================================== --- incubator/directory/eve/trunk/backend/tools/src/java/org/apache/eve/tools/schema/OpenLdapSchemaParser.java (original) +++ incubator/directory/eve/trunk/backend/tools/src/java/org/apache/eve/tools/schema/OpenLdapSchemaParser.java Sun Oct 10 03:56:01 2004 @@ -35,8 +35,6 @@ */ public class OpenLdapSchemaParser { - /** a buffer to use while streaming data into the parser */ - private byte[] buf = new byte[128]; /** the monitor to use for this parser */ private ParserMonitor monitor = new ParserMonitorAdapter(); /** The antlr generated parser */ @@ -102,20 +100,23 @@ + "the empty String!", 0 ); } - parserIn.write( schemaObject.getBytes() ); + this.schemaIn = new ByteArrayInputStream( schemaObject.getBytes() ); + + if ( producerThread == null ) + { + producerThread = new Thread( new DataProducer() ); + } + + producerThread.start(); invokeParser( schemaObject ); } private void invokeParser( String subject ) throws IOException, ParseException { - // using an input termination token END - need extra space to return - parserIn.write( "END ".getBytes() ); - parserIn.flush(); - try { - monitor.startedParse( "starting parse ..." ); + monitor.startedParse( "starting parse on:\n" + subject ); parser.parseSchema(); monitor.finishedParse( "Done parsing!" ); } @@ -136,6 +137,10 @@ } + byte[] buf = new byte[128]; + private InputStream schemaIn; + private Thread producerThread; + /** * Thread safe method parses a stream of OpenLDAP schemaObject elements/objects. * @@ -143,12 +148,14 @@ */ public synchronized void parse( InputStream schemaIn ) throws IOException, ParseException { - int count = -1; - while ( ( count = schemaIn.read( buf ) ) != -1 ) + this.schemaIn = schemaIn; + + if ( producerThread == null ) { - parserIn.write( buf, 0, count ); + producerThread = new Thread( new DataProducer() ); } + producerThread.start(); invokeParser( "schema input stream ==> " + schemaIn.toString() ); } @@ -160,14 +167,14 @@ */ public synchronized void parse( File schemaFile ) throws IOException, ParseException { - FileInputStream schemaIn = new FileInputStream( schemaFile ); + this.schemaIn = new FileInputStream( schemaFile ); - int count = -1; - while ( ( count = schemaIn.read( buf ) ) != -1 ) + if ( producerThread == null ) { - parserIn.write( buf, 0, count ); + producerThread = new Thread( new DataProducer() ); } + producerThread.start(); invokeParser( "schema file ==> " + schemaFile.getAbsolutePath() ); } @@ -176,5 +183,30 @@ { this.monitor = monitor ; this.parser.setParserMonitor( monitor ); + } + + + class DataProducer implements Runnable + { + public void run() + { + int count = -1; + + try + { + while ( ( count = schemaIn.read( buf ) ) != -1 ) + { + parserIn.write( buf, 0, count ); + parserIn.flush(); + } + + // using an input termination token END - need extra space to return + parserIn.write( "END ".getBytes() ); + } + catch ( IOException e ) + { + e.printStackTrace(); + } + } } } Modified: incubator/directory/eve/trunk/backend/tools/src/test/org/apache/eve/tools/schema/OpenLdapSchemaParserTest.java ============================================================================== --- incubator/directory/eve/trunk/backend/tools/src/test/org/apache/eve/tools/schema/OpenLdapSchemaParserTest.java (original) +++ incubator/directory/eve/trunk/backend/tools/src/test/org/apache/eve/tools/schema/OpenLdapSchemaParserTest.java Sun Oct 10 03:56:01 2004 @@ -18,6 +18,7 @@ import java.util.Map; +import java.io.InputStream; import junit.framework.TestCase; import org.apache.ldap.common.schema.ObjectClassTypeEnum; @@ -50,6 +51,24 @@ } + public void testSimpleAttributeTypeNoLength() throws Exception + { + String attributeTypeData = "attributetype ( 2.5.4.14 NAME 'searchGuide'\n" + + " DESC 'RFC2256: search guide, obsoleted by enhancedSearchGuide'\n" + + " SYNTAX 1.3.6.1.4.1.1466.115.121.1.25 )"; + + parser.parse( attributeTypeData ); + Map attributeTypes = parser.getAttributeTypes(); + AttributeTypeLiteral type = ( AttributeTypeLiteral ) attributeTypes.get( "2.5.4.14" ); + + assertNotNull( type ); + assertEquals( "2.5.4.14", type.getOid() ); + assertEquals( "searchGuide", type.getNames()[0] ); + assertEquals( "RFC2256: search guide, obsoleted by enhancedSearchGuide", type.getDescription() ); + assertEquals( "1.3.6.1.4.1.1466.115.121.1.25", type.getSyntax() ); + } + + public void testSimpleAttributeTypeParse() throws Exception { String attributeTypeData = "# adding a comment \n" + @@ -112,5 +131,109 @@ assertEquals( "telephoneNumber", objectClass.getMay()[1] ); assertEquals( "seeAlso", objectClass.getMay()[2] ); assertEquals( "description", objectClass.getMay()[3] ); + } + + + public void testObjectClassMultipleNames() throws Exception + { + String objectClassData = "objectclass ( 0.9.2342.19200300.100.4.4\n" + + "\tNAME ( 'pilotPerson' 'newPilotPerson' )\n" + + "\tSUP person STRUCTURAL\n" + + "\tMAY ( userid $ textEncodedORAddress $ rfc822Mailbox $\n" + + "\t\tfavouriteDrink $ roomNumber $ userClass $\n" + + "\t\thomeTelephoneNumber $ homePostalAddress $ secretary $\n" + + "\t\tpersonalTitle $ preferredDeliveryMethod $ businessCategory $\n" + + "\t\tjanetMailbox $ otherMailbox $ mobileTelephoneNumber $\n" + + "\t\tpagerTelephoneNumber $ organizationalStatus $\n" + + "\t\tmailPreferenceOption $ personalSignature )\n" + + "\t)"; + parser.parse( objectClassData ); + Map objectClasses = parser.getObjectClassTypes(); + ObjectClassLiteral objectClass = ( ObjectClassLiteral ) + objectClasses.get( "0.9.2342.19200300.100.4.4" ); + + assertNotNull( objectClass ); + assertEquals( "0.9.2342.19200300.100.4.4", objectClass.getOid() ); + assertEquals( "pilotPerson", objectClass.getNames()[0] ); + assertEquals( "newPilotPerson", objectClass.getNames()[1] ); + assertEquals( ObjectClassTypeEnum.STRUCTURAL, objectClass.getClassType() ); + assertEquals( "person", objectClass.getSuperiors()[0] ); + + assertEquals( "userid", objectClass.getMay()[0] ); + assertEquals( "textEncodedORAddress", objectClass.getMay()[1] ); + assertEquals( "rfc822Mailbox", objectClass.getMay()[2] ); + assertEquals( "favouriteDrink", objectClass.getMay()[3] ); + assertEquals( "roomNumber", objectClass.getMay()[4] ); + assertEquals( "userClass", objectClass.getMay()[5] ); + assertEquals( "homeTelephoneNumber", objectClass.getMay()[6] ); + assertEquals( "homePostalAddress", objectClass.getMay()[7] ); + assertEquals( "secretary", objectClass.getMay()[8] ); + assertEquals( "personalTitle", objectClass.getMay()[9] ); + assertEquals( "preferredDeliveryMethod", objectClass.getMay()[10] ); + assertEquals( "businessCategory", objectClass.getMay()[11] ); + assertEquals( "janetMailbox", objectClass.getMay()[12] ); + assertEquals( "otherMailbox", objectClass.getMay()[13] ); + assertEquals( "mobileTelephoneNumber", objectClass.getMay()[14] ); + assertEquals( "pagerTelephoneNumber", objectClass.getMay()[15] ); + assertEquals( "organizationalStatus", objectClass.getMay()[16] ); + assertEquals( "mailPreferenceOption", objectClass.getMay()[17] ); + assertEquals( "personalSignature", objectClass.getMay()[18] ); + + } + + + public void testAutoFsSchemaFile() throws Exception + { + InputStream in = getClass().getResourceAsStream( "autofs.schema" ); + parser.parse( in ); + } + + + public void testCoreSchemaFile() throws Exception + { + InputStream in = getClass().getResourceAsStream( "core.schema" ); + parser.parse( in ); + } + + + public void testCorbaSchemaFile() throws Exception + { + InputStream in = getClass().getResourceAsStream( "corba.schema" ); + parser.parse( in ); + } + + + public void testCosineSchemaFile() throws Exception + { + InputStream in = getClass().getResourceAsStream( "cosine.schema" ); + parser.parse( in ); + } + + + public void testInetOrgPersonSchemaFile() throws Exception + { + InputStream in = getClass().getResourceAsStream( "inetorgperson.schema" ); + parser.parse( in ); + } + + + public void testJavaSchemaFile() throws Exception + { + InputStream in = getClass().getResourceAsStream( "java.schema" ); + parser.parse( in ); + } + + + public void testMiscSchemaFile() throws Exception + { + InputStream in = getClass().getResourceAsStream( "misc.schema" ); + parser.parse( in ); + } + + + public void testNisSchemaFile() throws Exception + { + InputStream in = getClass().getResourceAsStream( "nis.schema" ); + parser.parse( in ); } }