/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * The contents of this file are subject to the Netscape Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/NPL/ * * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * The Original Code is mozilla.org code. * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): */ package netscape.ldap.util; import java.util.*; import netscape.ldap.*; import java.io.*; /** * Class for outputting LDAP entries to a stream as DSML. * * @version 1.0 */ public class DSMLWriter extends LDAPWriter { // static final long serialVersionUID = -2710382547996750924L; /** * Constructs a DSMLWriter object to output entries * to a stream as DSML. * * @param pw output stream */ public DSMLWriter( PrintWriter pw ) { super( pw ); } /** * Prints the schema from an entry containing subschema * * entry entry containing schema definitions */ public void printSchema( LDAPEntry entry ) { LDAPSchema schema = new LDAPSchema( entry ); printString( " " ); printObjectClassSchema( schema ); printAttributeSchema( schema ); printString( " " ); } /** * Prints the object class schema from a schema object * * schema schema elements */ protected void printObjectClassSchema( LDAPSchema schema ) { Enumeration en = schema.getObjectClasses(); while( en.hasMoreElements() ) { LDAPObjectClassSchema s = (LDAPObjectClassSchema)en.nextElement(); printString( " " ); if ( s.isObsolete() ) { printString( " obsolete=true" ); } printString( " " + s.getName() + "" ); printString( " " + s.getDescription() + "" ); Enumeration attrs = s.getRequiredAttributes(); while( attrs.hasMoreElements() ) { printString( " " ); } attrs = s.getOptionalAttributes(); while( attrs.hasMoreElements() ) { printString( " " ); } printString( " " ); } } /** * Prints the attribute schema from a schema object * * schema schema elements */ protected void printAttributeSchema( LDAPSchema schema ) { Enumeration en = schema.getAttributes(); while( en.hasMoreElements() ) { LDAPAttributeSchema s = (LDAPAttributeSchema)en.nextElement(); printString( " 0) ) { printString( " equality=" + vals[0] ); } vals = s.getQualifier( s.ORDERING ); if ( (vals != null) && (vals.length > 0) ) { printString( " ordering=" + vals[0] ); } vals = s.getQualifier( s.SUBSTR ); if ( (vals != null) && (vals.length > 0) ) { printString( " substring=" + vals[0] ); } printString( " " + s.getName() + "" ); printString( " " + s.getDescription() + "" ); printString( " " + s.getSyntaxString() + "" ); printString( " " ); } } /** * Print an attribute of an entry * * @param attr the attribute to format to the output stream */ protected void printAttribute( LDAPAttribute attr ) { String attrName = attr.getName(); // Object classes are treated differently in DSML. Also, they // are always String-valued if ( attrName.equalsIgnoreCase( "objectclass" ) ) { Enumeration enumVals = attr.getStringValues(); if ( enumVals != null ) { while ( enumVals.hasMoreElements() ) { String s = (String)enumVals.nextElement(); printString( " " + s + "" ); } } return; } printString( " " ); /* Loop on values for this attribute */ Enumeration enumVals = attr.getByteValues(); if ( enumVals != null ) { while ( enumVals.hasMoreElements() ) { byte[] b = (byte[])enumVals.nextElement(); String s; if ( LDIF.isPrintable(b) ) { try { s = new String( b, "UTF8" ); } catch ( UnsupportedEncodingException e ) { s = ""; } printEscapedValue( " ", s, "" ); } else { s = getPrintableValue( b ); if ( s.length() > 0 ) { printString( " " + "" ); printString( " " + s ); printString( " " ); } } } } printString( " " ); } /** * Print prologue to entry * * @param dn the DN of the entry */ protected void printEntryStart( String dn ) { if ( dn == null ) { dn = ""; } printString( " " ); } /** * Print epilogue to entry * * @param dn the DN of the entry */ protected void printEntryEnd( String dn ) { printString( " " ); } /** * Print the element start, the value with escaping of special * characters, and the element end * * @param prolog element start * @param value value to be escaped * @param epilog element end */ protected void printEscapedValue( String prolog, String value, String epilog ) { m_pw.print( prolog ); int l = value.length(); char[] text = new char[l]; value.getChars( 0, l, text, 0 ); for ( int i = 0; i < l; i++ ) { char c = text[i]; switch (c) { case '<' : m_pw.print( "<" ); break; case '&' : m_pw.print( "&" ); break; default : m_pw.print( c ); } } m_pw.print( epilog); m_pw.print( '\n' ); } protected void printString( String value ) { m_pw.print( value ); m_pw.print( '\n' ); } }