You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@avalon.apache.org by mi...@apache.org on 2002/02/15 05:23:06 UTC

cvs commit: jakarta-avalon-excalibur/src/scratchpad/org/apache/avalon/excalibur/configuration NamingConfigurationBuilder.java

mirceatoma    02/02/14 20:23:06

  Added:       src/scratchpad/org/apache/avalon/excalibur/configuration
                        NamingConfigurationBuilder.java
  Log:
  Build configurations from JNDI/LDAP trees.
  
  Revision  Changes    Path
  1.1                  jakarta-avalon-excalibur/src/scratchpad/org/apache/avalon/excalibur/configuration/NamingConfigurationBuilder.java
  
  Index: NamingConfigurationBuilder.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE.txt file.
   */
  package org.apache.avalon.excalibur.configuration;
  
  import java.util.Hashtable;
  import javax.naming.Context;
  import javax.naming.Name;
  import javax.naming.NameParser;
  import javax.naming.NamingEnumeration;
  import javax.naming.Binding;
  import javax.naming.NamingException;
  import javax.naming.directory.Attribute;
  import javax.naming.directory.Attributes;
  import javax.naming.directory.InitialDirContext;
  import javax.naming.directory.DirContext;
  import org.apache.avalon.framework.configuration.Configuration;
  import org.apache.avalon.framework.configuration.DefaultConfiguration;
  
  /**
   * A NamingConfigurationBuilder builds <code>Configuration</code>s from JNDI or
   * LDAP directory trees.
   *
   * @author <a href="mailto:mirceatoma@apache.org">Mircea Toma</a>
   */
  public class NamingConfigurationBuilder
  {    
      private final boolean m_enableNamespaces;
      
      /**
       * Create a Configuration Builder that ignores namespaces.
       */
      public NamingConfigurationBuilder()
      {
          this(false);
      }
      
      /**
       * Create a Configuration Builder, specifying a flag that determines
       * namespace support.
       *
       * @param enableNamespaces If <code>true</code>, a configuration with
       * namespace information is built.
       */
      public NamingConfigurationBuilder( final boolean enableNamespaces )
      {
          m_enableNamespaces = enableNamespaces;
      }
      
      /**
       * Build a configuration object using an URI
       */
      public Configuration build( final String uri ) throws NamingException
      {
          final Hashtable env = new Hashtable();
          env.put( Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory" );
          env.put( Context.SECURITY_AUTHENTICATION, "none" );
          env.put( Context.PROVIDER_URL, uri );
          
          final DirContext context = new InitialDirContext( env );
          
          return build(context);
      }
      
      /**
       * Build a configuration object using a naming context.
       */
      public Configuration build( final Context context ) throws NamingException
      {
          final DefaultConfiguration configuration;
          
          final String absoluteName = context.getNameInNamespace();
          final NameParser parser = context.getNameParser( absoluteName );
          final Name parsedName = parser.parse( absoluteName );
          
          String name = absoluteName;
          String prefix = "";
          //if composite name, use only the relative name.
          final int position = parsedName.size();
          if ( position > 0 )
          {
              name = parsedName.get( position - 1 );
          }
          
          if ( context instanceof DirContext )
          {
              //extract element name, and namespace prefix
              final Attributes attrs = ((DirContext)context).getAttributes( "" );
              
              final NamingEnumeration attributes = attrs.getAll();            
              while ( attributes.hasMore() )
              {
                  final Attribute attribute = (Attribute)attributes.next();
                  final String id = attribute.getID();
                  if ( name.startsWith( id ) )
                  {
                      name = (String)attribute.get();
                      if ( m_enableNamespaces ) prefix = id;
                      attrs.remove( id );
                      break;
                  }
              }
              
              configuration = new DefaultConfiguration( name, null, "", prefix );
              copyAttributes( attrs, configuration );
          }
          else configuration = new DefaultConfiguration( name, null, "", prefix );
          
          final NamingEnumeration bindings = context.listBindings( "" );        
          while ( bindings.hasMore() )
          {
              final Binding binding = (Binding)bindings.next();
              final Object object = binding.getObject();
              
              if (( object instanceof Number ) ||
                  ( object instanceof String ))
              {
                  configuration.setValue( object.toString() );
              }
              
              if ( object instanceof Context )
              {
                  final Context child = (Context)object;                
                  configuration.addChild( build( child ) );
              }
          }
          
          return configuration;
      }
      
      private void copyAttributes( final Attributes attrs, final DefaultConfiguration configuration ) throws NamingException
      {
          final NamingEnumeration attributes = attrs.getAll();        
          while ( attributes.hasMore() )
          {
              final Attribute attribute = (Attribute)attributes.next();
              final String attrName = attribute.getID();
              final Object attrValue = attribute.get();
              configuration.setAttribute( attrName, attrValue.toString() );
          }
      }
  }
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>