donaldp     2002/07/05 21:21:46

  Added:       util/src/java/org/apache/excalibur/configuration
                        NamingConfigurationBuilder.java
  Removed:     all/src/scratchpad/org/apache/avalon/excalibur/configuration
                        NamingConfigurationBuilder.java
  Log:
  Move Naming configuration builder to util.
  
  Revision  Changes    Path
  1.1                  
jakarta-avalon-excalibur/util/src/java/org/apache/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.excalibur.configuration;
  
  import java.util.Hashtable;
  import javax.naming.Binding;
  import javax.naming.Context;
  import javax.naming.Name;
  import javax.naming.NameParser;
  import javax.naming.NamingEnumeration;
  import javax.naming.NamingException;
  import javax.naming.directory.Attribute;
  import javax.naming.directory.Attributes;
  import javax.naming.directory.DirContext;
  import javax.naming.directory.InitialDirContext;
  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:[EMAIL PROTECTED]";>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:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to