/** * Redistribution and use of this software and associated documentation * ("Software"), with or without modification, are permitted provided * that the following conditions are met: * * 1. Redistributions of source code must retain copyright * statements and notices. Redistributions must also contain a * copy of this document. * * 2. Redistributions in binary form must reproduce the * above copyright notice, this list of conditions and the * following disclaimer in the documentation and/or other * materials provided with the distribution. * * 3. The name "Exolab" must not be used to endorse or promote * products derived from this Software without prior written * permission of Intalio, Inc. For written permission, * please contact info@exolab.org. * * 4. Products derived from this Software may not be called "Exolab" * nor may "Exolab" appear in their names without prior written * permission of Intalio, Inc. Exolab is a registered * trademark of Intalio, Inc. * * 5. Due credit should be given to the Exolab Project * (http://www.exolab.org/). * * THIS SOFTWARE IS PROVIDED BY INTALIO, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * INTALIO, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright 1999 (C) Intalio, Inc. All Rights Reserved. * * $Id$ */ package org.exolab.castor.dsml.mozilla; import java.util.Enumeration; import org.xml.sax.DocumentHandler; import org.xml.sax.SAXException; import org.xml.sax.helpers.AttributeListImpl; import netscape.ldap.LDAPEntry; import netscape.ldap.LDAPAttribute; import netscape.ldap.LDAPAttributeSet; import netscape.ldap.LDAPSchema; import netscape.ldap.LDAPAttributeSchema; import netscape.ldap.LDAPObjectClassSchema; import netscape.ldap.LDAPSearchResults; import org.castor.core.util.Base64Encoder; import org.exolab.castor.dsml.Producer; import org.exolab.castor.dsml.XML; /** * * * @author <a href="mailto:arkin@intalio.com">Assaf Arkin</a> * @version $Revision$ $Date: 2005-08-05 13:58:36 -0600 (Fri, 05 Aug 2005) $ */ public class MozillaProducer extends Producer { public MozillaProducer( DocumentHandler docHandler, boolean namespace ) { super( docHandler, namespace ); } public void produce( LDAPEntry entry ) throws SAXException { AttributeListImpl attrList; LDAPAttributeSet attrSet; LDAPAttribute attr; Enumeration enumeration; Enumeration values; byte[] value; leaveSchema(); enterDirectory(); // dsml:entry dn attrList = new AttributeListImpl(); attrList.addAttribute( XML.Entries.Attributes.DN, "CDATA", entry.getDN() ); // dsml:entry _docHandler.startElement( prefix( XML.Entries.Elements.ENTRY ), attrList ); attrSet = entry.getAttributeSet(); if ( attrSet != null ) { attr = attrSet.getAttribute( "objectclass" ); if ( attr != null ) { // dsml:objectclass attrList = new AttributeListImpl(); _docHandler.startElement( prefix( XML.Entries.Elements.OBJECT_CLASS ), attrList ); values = attr.getStringValues(); while ( values.hasMoreElements() ) { char[] chars; // dsml:oc-value chars = ( (String) values.nextElement() ).toCharArray(); attrList = new AttributeListImpl(); _docHandler.startElement( prefix( XML.Entries.Elements.OBJECT_CLASS_VALUE ), attrList ); _docHandler.characters( chars, 0, chars.length ); _docHandler.endElement( prefix( XML.Entries.Elements.OBJECT_CLASS_VALUE ) ); } _docHandler.endElement( prefix( XML.Entries.Elements.OBJECT_CLASS ) ); } enumeration = attrSet.getAttributes(); while ( enumeration.hasMoreElements() ) { // dsml:attr attr = (LDAPAttribute) enumeration.nextElement(); if ( attr.getName().equals( "objectclass" ) ) continue; attrList = new AttributeListImpl(); attrList.addAttribute( XML.Entries.Attributes.NAME, "CDATA", attr.getName() ); _docHandler.startElement( prefix( XML.Entries.Elements.ATTRIBUTE ), attrList ); values = attr.getByteValues(); while ( values.hasMoreElements() ) { char[] chars; int i; // dsml:value value = (byte[]) values.nextElement(); attrList = new AttributeListImpl(); if ( value == null ) { chars = new char[ 0 ]; } else { // XXX We have no way of knowing if the attribute is // string or binary, so we do this stupid check // to determine and print it as ASCII text or // base 64 encoding. // (note: OpenLDAP does not provide the attributes // schema as one would hope) for ( i = 0 ; i < value.length ; ++i ) { if ( value[ i ] < 0x20 || value[ i ] == 0x7f ) break; } if ( i == value.length ) { chars = new char[ value.length ]; for ( i = 0 ; i < value.length ; ++i ) chars[ i ] = (char) value[ i ]; } else { chars = Base64Encoder.encode(value); attrList.addAttribute( XML.Entries.Attributes.ENCODING, "NMTOKEN", XML.Entries.Attributes.Encodings.BASE64 ); } } _docHandler.startElement( prefix( XML.Entries.Elements.VALUE ), attrList ); _docHandler.characters( chars, 0, chars.length ); _docHandler.endElement( prefix( XML.Entries.Elements.VALUE ) ); } _docHandler.endElement( prefix( XML.Entries.Elements.ATTRIBUTE ) ); } } _docHandler.endElement( prefix( XML.Entries.Elements.ENTRY ) ); } public void produce( Enumeration entries ) throws SAXException { while ( entries.hasMoreElements() ) { produce( (LDAPEntry) entries.nextElement() ); } } public void produce( LDAPSearchResults entries ) throws SAXException { while ( entries.hasMoreElements() ) { produce( (LDAPEntry) entries.nextElement() ); } } public void produce( LDAPSchema schema ) throws SAXException { Enumeration enumeration; enumeration = schema.getObjectClasses(); while ( enumeration.hasMoreElements() ) { produce( (LDAPObjectClassSchema) enumeration.nextElement() ); } enumeration = schema.getAttributes(); while ( enumeration.hasMoreElements() ) { produce( (LDAPAttributeSchema) enumeration.nextElement() ); } } public void produce( LDAPObjectClassSchema schema ) throws SAXException { AttributeListImpl attrList; String superiors[]; String superior; int i; Enumeration enumeration; leaveDirectory(); enterSchema(); attrList = new AttributeListImpl(); // dsml:class id attrList.addAttribute( XML.Schema.Attributes.ID, "ID", schema.getName() ); // dsml:class superior superiors = schema.getSuperiors(); superior = null; for ( i = 0 ; i < superiors.length ; ++i ) { if ( i == 0 ) superior = superiors[ i ]; else superior = superior + "," + superiors[ i ]; } if ( i > 0 ) attrList.addAttribute( XML.Schema.Attributes.SUPERIOR, "CDATA", superior ); // dsml:class obsolete attrList.addAttribute( XML.Schema.Attributes.OBSOLETE, null, schema.isObsolete() ? "true" : "false" ); // dsml:class type switch ( schema.getType() ) { case LDAPObjectClassSchema.STRUCTURAL: attrList.addAttribute( XML.Schema.Attributes.TYPE, null, XML.Schema.Attributes.Types.STRUCTURAL ); break; case LDAPObjectClassSchema.ABSTRACT: attrList.addAttribute( XML.Schema.Attributes.TYPE, null, XML.Schema.Attributes.Types.ABSTRACT ); break; case LDAPObjectClassSchema.AUXILIARY: attrList.addAttribute( XML.Schema.Attributes.TYPE, null, XML.Schema.Attributes.Types.AUXILIARY ); break; } // dsml:class _docHandler.startElement( prefix( XML.Schema.Elements.CLASS ), attrList ); // dsml:class name if ( schema.getName() != null ) { attrList = new AttributeListImpl(); _docHandler.startElement( prefix( XML.Schema.Elements.NAME ), attrList ); _docHandler.characters( schema.getName().toCharArray(), 0, schema.getName().length() ); _docHandler.endElement( prefix( XML.Schema.Elements.NAME ) ); } // dsml:class description if ( schema.getDescription() != null ) { attrList = new AttributeListImpl(); _docHandler.startElement( prefix( XML.Schema.Elements.DESCRIPTION ), attrList ); _docHandler.characters( schema.getDescription().toCharArray(), 0, schema.getDescription().length() ); _docHandler.endElement( prefix( XML.Schema.Elements.DESCRIPTION ) ); } // dsml:class object-identifier if ( schema.getID() != null ) { attrList = new AttributeListImpl(); _docHandler.startElement( prefix( XML.Schema.Elements.OID ), attrList ); _docHandler.characters( schema.getID().toCharArray(), 0, schema.getID().length() ); _docHandler.endElement( prefix( XML.Schema.Elements.OID ) ); } // dsml:class attribute required=false enumeration = schema.getOptionalAttributes(); while ( enumeration.hasMoreElements() ) { attrList = new AttributeListImpl(); attrList.addAttribute( XML.Schema.Attributes.REF, "CDATA", "#" + (String) enumeration.nextElement() ); attrList.addAttribute( XML.Schema.Attributes.REQUIRED, null, "false" ); _docHandler.startElement( prefix( XML.Schema.Elements.ATTRIBUTE) , attrList ); _docHandler.endElement( prefix( XML.Schema.Elements.ATTRIBUTE ) ); } // dsml:class attribute required=true enumeration = schema.getRequiredAttributes(); while ( enumeration.hasMoreElements() ) { attrList = new AttributeListImpl(); attrList.addAttribute( XML.Schema.Attributes.REF, "CDATA", "#" + (String) enumeration.nextElement() ); attrList.addAttribute( XML.Schema.Attributes.REQUIRED, null, "true" ); _docHandler.startElement( prefix( XML.Schema.Elements.ATTRIBUTE) , attrList ); _docHandler.endElement( prefix( XML.Schema.Elements.ATTRIBUTE ) ); } _docHandler.endElement( prefix( XML.Schema.Elements.CLASS ) ); } public void produce( LDAPAttributeSchema schema ) throws SAXException { AttributeListImpl attrList; leaveDirectory(); enterSchema(); attrList = new AttributeListImpl(); // dsml:attribute id attrList.addAttribute( XML.Schema.Attributes.ID, "ID", schema.getName() ); // dsml:attribute superior if ( schema.getSuperior() != null ) { attrList.addAttribute( XML.Schema.Attributes.SUPERIOR, "CDATA", "#" + schema.getSuperior() ); } // dsml:attribute obsolete attrList.addAttribute( XML.Schema.Attributes.OBSOLETE, null, schema.isObsolete() ? "true" : "false" ); // dsml:attribute single-value attrList.addAttribute( XML.Schema.Attributes.SINGLE_VALUE, null, schema.isSingleValued() ? "true" : "false" ); // dsml:attribute user-modification // XXX // dsml:attribute _docHandler.startElement( prefix( XML.Schema.Elements.ATTRIBUTE_TYPE) , attrList ); // dsml:attribute name if ( schema.getName() != null ) { attrList = new AttributeListImpl(); _docHandler.startElement( prefix( XML.Schema.Elements.NAME ), attrList ); _docHandler.characters( schema.getName().toCharArray(), 0, schema.getName().length() ); _docHandler.endElement( prefix( XML.Schema.Elements.NAME ) ); } // dsml:attribute description if ( schema.getDescription() != null ) { attrList = new AttributeListImpl(); _docHandler.startElement( prefix( XML.Schema.Elements.DESCRIPTION ), attrList ); _docHandler.characters( schema.getDescription().toCharArray(), 0, schema.getDescription().length() ); _docHandler.endElement( prefix( XML.Schema.Elements.DESCRIPTION ) ); } // dsml:attribute object-identifier if ( schema.getID() != null ) { attrList = new AttributeListImpl(); _docHandler.startElement( prefix( XML.Schema.Elements.OID ), attrList ); _docHandler.characters( schema.getID().toCharArray(), 0, schema.getID().length() ); _docHandler.endElement( prefix( XML.Schema.Elements.OID ) ); } // dsml:attribute syntax if ( schema.getSyntaxString() != null ) { attrList = new AttributeListImpl(); _docHandler.startElement( prefix( XML.Schema.Elements.SYNTAX ), attrList ); _docHandler.characters( schema.getSyntaxString().toCharArray(), 0, schema.getSyntaxString().length() ); _docHandler.endElement( prefix( XML.Schema.Elements.SYNTAX ) ); } // dsml:attribute equality // XXX // dsml:attribute ordering // XXX // dsml:attribute substring // XXX _docHandler.endElement( prefix( XML.Schema.Elements.ATTRIBUTE_TYPE ) ); } }