You are viewing a plain text version of this content. The canonical link for it is here.
Posted to wsrf-commits@ws.apache.org by sc...@apache.org on 2005/08/22 20:28:04 UTC

svn commit: r239214 - /webservices/wsrf/trunk/src/java/org/apache/ws/util/jndi/XmlBeanJndiUtils.java

Author: scamp
Date: Mon Aug 22 11:28:03 2005
New Revision: 239214

URL: http://svn.apache.org/viewcvs?rev=239214&view=rev
Log: (empty)

Modified:
    webservices/wsrf/trunk/src/java/org/apache/ws/util/jndi/XmlBeanJndiUtils.java

Modified: webservices/wsrf/trunk/src/java/org/apache/ws/util/jndi/XmlBeanJndiUtils.java
URL: http://svn.apache.org/viewcvs/webservices/wsrf/trunk/src/java/org/apache/ws/util/jndi/XmlBeanJndiUtils.java?rev=239214&r1=239213&r2=239214&view=diff
==============================================================================
--- webservices/wsrf/trunk/src/java/org/apache/ws/util/jndi/XmlBeanJndiUtils.java (original)
+++ webservices/wsrf/trunk/src/java/org/apache/ws/util/jndi/XmlBeanJndiUtils.java Mon Aug 22 11:28:03 2005
@@ -15,8 +15,8 @@
  *=============================================================================*/
 package org.apache.ws.util.jndi;
 
-import org.apache.axis.components.logger.LogFactory;
 import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.ws.resource.JndiConstants;
 import org.apache.ws.util.jndi.tools.ConfigContext;
 import org.apache.ws.util.jndi.tools.Environment;
@@ -38,6 +38,7 @@
 
 import javax.naming.Context;
 import javax.naming.InitialContext;
+import javax.naming.NameAlreadyBoundException;
 import javax.naming.NameNotFoundException;
 import javax.naming.NamingException;
 import java.io.File;
@@ -58,638 +59,649 @@
  * setup of JNDI, it loads the JNDI config file and registers instances of services.
  *
  * @author Sal Campana
- *
- * TODO: remove Axis deps
  */
 public class XmlBeanJndiUtils
 {
-   private static Log LOG = LogFactory.getLog( XmlBeanJndiUtils.class.getName(  ) );
+    private static Log LOG = LogFactory.getLog(XmlBeanJndiUtils.class.getName());
+
+    /**
+     * Apache JNDI URL Package Prefix
+     */
+    public static final String APACHE_URL_PKG_PREFIX = "org.apache.naming";
+
+    /**
+     * Apache JNDI Initial Context Factory Prefix
+     */
+    public static final String APACHE_INITIAL_CONTEXT_FACTORY = "org.apache.naming.java.javaURLContextFactory";
+
+    /**
+     * The file name of the jndi-config file.
+     */
+    public static final String JNDI_CONFIG_FILENAME = "jndi-config.xml";
+    private static final String PROP_FACTORY = "factory";
+    private static boolean s_configLoaded;
+    private static boolean s_jndiInitialized;
+    private static DefaultParameters s_defaultParams;
 
-   /**
-    * Apache JNDI URL Package Prefix
-    */
-   public static final String APACHE_URL_PKG_PREFIX = "org.apache.naming";
-
-   /**
-    * Apache JNDI Initial Context Factory Prefix
-    */
-   public static final String APACHE_INITIAL_CONTEXT_FACTORY = "org.apache.naming.java.javaURLContextFactory";
-
-   /**
-    * The file name of the jndi-config file.
-    */
-   public static final String       JNDI_CONFIG_FILENAME = "jndi-config.xml";
-   private static final String      PROP_FACTORY      = "factory";
-   private static boolean           s_configLoaded;
-   private static boolean           s_jndiInitialized;
-   private static DefaultParameters s_defaultParams;
-
-   /**
-    * Initializes JNDI from a directory tree which contains the jndi-config.xml files....
-    *
-    * @param configDir
-    * @return
-    * @throws Exception
-    */
-   public static synchronized Context initFromDir( String configDir )
-   throws Exception
-   {
-      if ( !s_configLoaded )
-      {
-         LOG.debug( "Initializing JNDI from config directory: " + configDir + " ..." );
-
-         initJNDI(  );
-
-         File   fDir = new File( configDir );
-         File[] dirs =
-            fDir.listFiles( new FileFilter(  )
-               {
-                  public boolean accept( File path )
-                  {
-                     return path.isDirectory(  );
-                  }
-               } );
-
-         for ( int i = 0; i < dirs.length; i++ )
-         {
-            processJNDIFile( dirs[i], JNDI_CONFIG_FILENAME );
-         }
-
-         s_configLoaded = true;
-      }
-
-      return new InitialContext(  );
-   }
-
-   /**
-    * Initializes JNDI given a File name which will attempt to be loaded.
-    *
-    * @param configFilename
-    * @return
-    * @throws Exception
-    */
-   public static synchronized Context initFromFile( String configFilename )
-   throws Exception
-   {
-      LOG.debug( "Initializing JNDI from file: " + configFilename );
-      if ( !s_configLoaded )
-      {
-         initJNDI(  );
-
-         InputStream configInput;
-         try
-         {
-            LOG.debug( "Trying to load JNDI configuration from file: " + configFilename );
-            configInput = new FileInputStream( configFilename );
-         }
-         catch ( FileNotFoundException fnfe )
-         {
-            LOG.debug( "Trying to load JNDI configuration from classloader resource: " + configFilename );
-            configInput = XmlBeanJndiUtils.class.getClassLoader(  ).getResourceAsStream( configFilename );
-            if ( configInput == null )
-            {
-               throw new IOException( "jndiConfigNotFound" );
-            }
-         }
-
-         Context context = new InitialContext(  );
-         parseJNDIConfig( context, configInput );
-         s_configLoaded = true;
-      }
-
-      return new InitialContext(  );
-   }
-
-   /**
-    * Initializes JNDI from a given InputStream to a jndi-config.xml file.
-    *
-    * @param inputStream
-    * @return JNDI Context
-    * @throws Exception
-    */
-   public static synchronized Context initFromInputStream( InputStream inputStream )
-   throws Exception
-   {
-      if ( !s_configLoaded )
-      {
-         initJNDI(  );
-         LOG.debug( "Trying to load JNDI configuration from inputstream" );
-         parseJNDIConfig( new InitialContext(  ),
-                          inputStream );
-         s_configLoaded = true;
-      }
-
-      return new InitialContext(  );
-   }
-
-   /**
-    * Configure JNDI with the Apache Tomcat naming service classes and
-    * create the WSRF context.
-    *
-    * @return the WSRF context
-    * @throws Exception
-    */
-   public static synchronized Context initJNDI(  )
-   throws Exception
-   {
-      if ( !s_jndiInitialized )
-      {
-         initJndiImpl(  );
-         initWsrfContext(  );
-         s_jndiInitialized = true;
-      }
-
-      return new InitialContext(  );
-   }
-
-   /**
-    * Called via parseJNDIConfig(InputStream)
-    * <p/>
-    * Parse the given JNDI configuration and populate the JNDI registry using the parsed configuration
-    *
-    * @param configStream The configuration stream to parse
-    * @throws Exception
-    */
-   public static void parseJNDIConfig( Context     initContext,
-                                       InputStream configStream )
-   throws Exception
-   {
-      if ( configStream == null )
-      {
-         throw new IllegalArgumentException( "nullJNDIConfigInput" );
-      }
-
-      if ( initContext == null )
-      {
-         throw new IllegalArgumentException(  );
-      }
-
-      //get the global context
-      Context              envContext    = (Context) initContext.lookup( JndiConstants.CONTEXT_NAME_GLOBAL );
-      XmlBeanNamingContext namingContext = new XmlBeanNamingContext( envContext );
-
-      //load the config file
-      JndiConfigDocument jndiConfigDoc = (JndiConfigDocument) XmlObject.Factory.parse( configStream );
-      validateJndiConfig( jndiConfigDoc );
-      JndiConfigDocument.JndiConfig jndiConfig = jndiConfigDoc.getJndiConfig(  );
-      GlobalDocument.Global         global = jndiConfig.getGlobal(  );
-
-      //setup the global jndi elements
-      addGlobalElements( namingContext, global );
-
-      //get the service context
-      envContext       = (Context) initContext.lookup( JndiConstants.CONTEXT_NAME_SERVICES );
-      namingContext    = new XmlBeanNamingContext( envContext );
-
-      //setup the service jndi elements
-      ServiceDocument.Service[] serviceArray = jndiConfig.getServiceArray(  );
-      addServiceElements( namingContext, serviceArray );
-   }
-
-   private static void setDefaultParameterValues( ResourceParameters params )
-   {
-      if ( params.getParameter( PROP_FACTORY ) == null )
-      {
-         params.addParameter( PROP_FACTORY,
-                              s_defaultParams.getFactory(  ) );
-      }
-   }
-
-   private static DefaultParameters getDefaultProperties( GlobalDocument.Global global )
-   throws IllegalAccessException, 
-          InstantiationException, 
-          ClassNotFoundException
-   {
-      ResourceDocument.Resource   defaultConfig = null;
-      ResourceDocument.Resource[] resourceArray = global.getResourceArray(  );
-      for ( int i = 0; i < resourceArray.length; i++ )
-      {
-         ResourceDocument.Resource resource = resourceArray[i];
-         if ( DefaultParameters.class.getName(  ).equals( resource.getType(  ) ) )
-         {
-            defaultConfig = resource;
-            break;
-         }
-      }
-
-      return setupDefaultParams( defaultConfig );
-   }
-
-   private static Environment[] getEnvironmentArray( EnvironmentDocument.Environment[] environmentArray )
-   {
-      List envList = new ArrayList(  );
-
-      if ( environmentArray != null )
-      {
-         for ( int i = 0; i < environmentArray.length; i++ )
-         {
-            EnvironmentDocument.Environment environment = environmentArray[i];
-            Environment                     env = new Environment(  );
-            env.setDescription( environment.getDescription(  ) );
-            env.setName( environment.getName(  ) );
-            env.setType( environment.getType(  ) );
-            env.setValue( environment.getValue(  ) );
-            envList.add( env );
-         }
-      }
-
-      return (Environment[]) envList.toArray( new Environment[0] );
-   }
-
-   private static ResourceParameters getParameters( ResourceParamsDocument.ResourceParams resourceParams )
-   {
-      ResourceParameters params = new ResourceParameters(  );
-      if ( resourceParams != null )
-      {
-         ParameterDocument.Parameter[] parameterArray = resourceParams.getParameterArray(  );
-         for ( int i = 0; i < parameterArray.length; i++ )
-         {
-            ParameterDocument.Parameter parameter = parameterArray[i];
-            params.addParameter( parameter.getName(  ),
-                                 parameter.getValue(  ) );
-         }
-      }
-
-      return params;
-   }
-
-   private static Resource[] getResourceArray( ResourceDocument.Resource[] resourceArray,
-                                               String                      name,
-                                               XmlBeanNamingContext        namingContext )
-   {
-      List resources = new ArrayList(  );
-      if ( resourceArray != null )
-      {
-         for ( int i = 0; i < resourceArray.length; i++ )
-         {
-            ResourceDocument.Resource resourceDoc = resourceArray[i];
-
-            //special type of resource....metatdata...handle differently....
-            MetadataConfigDocument.MetadataConfig metadataConfig = resourceDoc.getMetadataConfig(  );
-            if ( metadataConfig != null )
-            {
-               try
-               {
-                  Class       metaConfigClass = Class.forName( resourceDoc.getType(  ) );
-                  Constructor constructor =
-                     metaConfigClass.getConstructor( new Class[]
-                                                     {
-                                                        MetadataConfigDocument.MetadataConfig.class
-                                                     } );
-                  MetadataConfig metaConfig =
-                     (MetadataConfig) constructor.newInstance( new Object[]
-                                                               {
-                                                                  metadataConfig
-                                                               } );
-                  String contextName = null;
-                  if ( name != null )
-                  {
-                     namingContext.getContext(  ).createSubcontext( name ); //add subcontext
-                     contextName = name + "/";
-                  }
-
-                  contextName = contextName + resourceDoc.getName(  );
-
-                  namingContext.bind( contextName, metaConfig );
-                  continue;
-               }
-               catch ( Exception e )
-               {
-                  LOG.error( "Unable to find constructor which takes: " + metadataConfig.getClass(  ).getName(  )
-                             + ", in MetadataConfig object: " + resourceDoc.getType(  )
-                             + ".  The metadata will be ignored!  Cause:" + e );
-               }
-            }
-
-            Resource resource = new Resource(  );
-            resource.setName( resourceDoc.getName(  ) );
-            resource.setAuth( resourceDoc.getAuth(  ) );
-            resource.setDescription( resourceDoc.getDescription(  ) );
-            resource.setType( resourceDoc.getType(  ) );
-            resource.setScope( resourceDoc.getScope(  ) );
-            resource.setParameters( getParameters( resourceDoc.getResourceParams(  ) ) );
-            resources.add( resource );
-         }
-      }
-
-      return (Resource[]) resources.toArray( new Resource[0] );
-   }
-
-   private static ResourceLink[] getResourceLinkArray( ResourceLinkDocument.ResourceLink[] resourceLinkArray )
-   {
-      List resourceLinks = new ArrayList(  );
-      if ( resourceLinkArray != null )
-      {
-         for ( int i = 0; i < resourceLinkArray.length; i++ )
-         {
-            ResourceLinkDocument.ResourceLink resourceLink = resourceLinkArray[i];
-            ResourceLink                      link = new ResourceLink(  );
-            link.setName( resourceLink.getName(  ) );
-            link.setTarget( resourceLink.getTarget(  ) );
-            resourceLinks.add( link );
-         }
-      }
-
-      return (ResourceLink[]) resourceLinks.toArray( new ResourceLink[0] );
-   }
-
-   private static ConfigContext[] getServiceArray( ServiceDocument.Service[] serviceArray,
-                                                   XmlBeanNamingContext      namingContext )
-   {
-      List services = new ArrayList(  );
-      if ( serviceArray != null )
-      {
-         for ( int i = 0; i < serviceArray.length; i++ )
-         {
-            ServiceDocument.Service service = serviceArray[i];
-            ConfigContext           context = new ConfigContext(  );
-            context.setName( service.getName(  ) );
-            Environment[] environmentArray = getEnvironmentArray( service.getEnvironmentArray(  ) );
-            for ( int j = 0; j < environmentArray.length; j++ )
-            {
-               context.addEnvironment( environmentArray[j] );
-            }
-
-            Resource[] resourceArray =
-               getResourceArray( service.getResourceArray(  ),
-                                 service.getName(  ),
-                                 namingContext );
-            for ( int j = 0; j < resourceArray.length; j++ )
-            {
-               Resource           resource = resourceArray[j];
-               ResourceParameters params = resource.getParameters(  );
-               setDefaultParameterValues( params );
-               validateParameterValues( params );
-            }
-
-            for ( int j = 0; j < resourceArray.length; j++ )
-            {
-               context.addResource( resourceArray[j] );
-            }
-
-            ResourceLink[] resourceLinkArray = getResourceLinkArray( service.getResourceLinkArray(  ) );
-            for ( int j = 0; j < resourceLinkArray.length; j++ )
-            {
-               context.addResourceLink( resourceLinkArray[j] );
-            }
-
-            services.add( context );
-         }
-      }
-
-      return (ConfigContext[]) services.toArray( new ConfigContext[0] );
-   }
-
-   private static ConfigContext[] getServiceSubContextArray( ConfigContext service )
-   {
-      List subContexts = new ArrayList(  );
-      if ( service != null )
-      {
-         Set      subContextNames = service.getSubContextNames(  );
-         Iterator iterator = subContextNames.iterator(  );
-
-         while ( iterator.hasNext(  ) )
-         {
-            subContexts.add( service.getSubContext( (String) iterator.next(  ) ) );
-         }
-      }
-
-      return (ConfigContext[]) subContexts.toArray( new ConfigContext[0] );
-   }
-
-   private static void addGlobalElements( XmlBeanNamingContext  namingContext,
-                                          GlobalDocument.Global global )
-   throws NamingException, 
-          IllegalAccessException, 
-          ClassNotFoundException, 
-          InstantiationException
-   {
-      if ( global != null )
-      {
-         s_defaultParams = getDefaultProperties( global );
-
-         Environment[] environmentArray = getEnvironmentArray( global.getEnvironmentArray(  ) );
-
-         for ( int i = 0; i < environmentArray.length; i++ )
-         {
-            namingContext.addEnvironment( environmentArray[i] );
-         }
-
-         ConfigContext[] subContext = getServiceArray( global.getServiceArray(  ),
-                                                       namingContext );
-         for ( int i = 0; i < subContext.length; i++ )
-         {
-            namingContext.addSubContext( subContext[i] );
-         }
-
-         Resource[] resourceArray = getResourceArray( global.getResourceArray(  ),
-                                                      null,
-                                                      namingContext );
-         for ( int i = 0; i < resourceArray.length; i++ )
-         {
-            namingContext.addResource( resourceArray[i] );
-         }
-
-         ResourceLink[] resourceLinkArray = getResourceLinkArray( global.getResourceLinkArray(  ) );
-         for ( int i = 0; i < resourceLinkArray.length; i++ )
-         {
-            namingContext.addResourceLink( resourceLinkArray[i] );
-         }
-      }
-   }
-
-   private static void addServiceElements( XmlBeanNamingContext      namingContext,
-                                           ServiceDocument.Service[] serviceArray )
-   throws NamingException
-   {
-      if ( serviceArray != null )
-      {
-         ConfigContext[] services = getServiceArray( serviceArray, namingContext );
-         for ( int i = 0; i < services.length; i++ )
-         {
-            ConfigContext service = services[i];
-            namingContext.addService( service );
-            ConfigContext[] serviceSubContextArray = getServiceSubContextArray( service );
-            for ( int j = 0; j < serviceSubContextArray.length; j++ )
-            { //todo not sure if defaults bubble down here...
-               namingContext.addSubContext( serviceSubContextArray[j] );
-            }
-         }
-      }
-   }
-
-   private static void checkValueIsNonEmpty( ResourceParameters params,
-                                             String             paramName )
-   {
-      String paramValue = params.getParameter( paramName );
-      if ( paramValue.trim(  ).equals( "" ) )
-      {
-         throw new RuntimeException( paramName + " parameter must have a non-empty value!" );
-      }
-   }
-
-   private static void initJndiImpl(  )
-   {
-      String apacheUrlPrefix      = APACHE_URL_PKG_PREFIX;
-      String systemUrlPrefix      = System.getProperty( Context.URL_PKG_PREFIXES );
-      String systemContextFactory = System.getProperty( Context.INITIAL_CONTEXT_FACTORY );
-
-      if ( ( systemContextFactory == null ) && ( systemUrlPrefix == null ) )
-      {
-         System.setProperty( Context.URL_PKG_PREFIXES, apacheUrlPrefix );
-         System.setProperty( Context.INITIAL_CONTEXT_FACTORY, APACHE_INITIAL_CONTEXT_FACTORY );
-      }
-   }
-
-   private static Context initWsrfContext(  )
-   throws NamingException
-   {
-      Context        wsrfContext;
-      InitialContext initialContext = new InitialContext(  );
-      try
-      {
-         wsrfContext = (Context) initialContext.lookup( JndiConstants.CONTEXT_NAME_BASE );
-      }
-      catch ( NameNotFoundException nnfe )
-      {
-         LOG.debug( "Initializing WSRF JNDI context..." );
-         LOG.debug( "Creating JNDI subcontext: " + JndiConstants.CONTEXT_NAME_BASE + " ..." );
-         wsrfContext = initialContext.createSubcontext( JndiConstants.CONTEXT_NAME_BASE );
-         LOG.debug( "Creating JNDI subcontext: " + JndiConstants.CONTEXT_SERVICES_BASE + " ..." );
-         wsrfContext.createSubcontext( JndiConstants.CONTEXT_SERVICES_BASE );
-         LOG.debug( "Creating JNDI subcontext: " + JndiConstants.CONTEXT_GLOBAL_BASE + " ..." );
-         wsrfContext.createSubcontext( JndiConstants.CONTEXT_GLOBAL_BASE );
-      }
-
-      return wsrfContext;
-   }
-
-   private static void processJNDIFile( File   dir,
-                                        String configFile )
-   throws Exception
-   {
-      Context context = new InitialContext(  );
-      File    file = new File( dir, configFile );
-      if ( !file.exists(  ) )
-      {
-         return;
-      }
-
-      LOG.debug( "Loading JNDI configuration from file: " + file + " ..." );
-
-      InputStream in = null;
-      try
-      {
-         in = new FileInputStream( file );
-         parseJNDIConfig( context, in );
-      }
-      finally
-      {
-         if ( in != null )
-         {
+    /**
+     * Initializes JNDI from a directory tree which contains the jndi-config.xml files....
+     *
+     * @param configDir
+     * @return
+     * @throws Exception
+     */
+    public static synchronized Context initFromDir(String configDir)
+            throws Exception
+    {
+        if (!s_configLoaded)
+        {
+            LOG.debug("Initializing JNDI from config directory: " + configDir + " ...");
+
+            initJNDI();
+
+            File fDir = new File(configDir);
+            File[] dirs =
+                    fDir.listFiles(new FileFilter()
+                    {
+                        public boolean accept(File path)
+                        {
+                            return path.isDirectory();
+                        }
+                    });
+
+            for (int i = 0; i < dirs.length; i++)
+            {
+                processJNDIFile(dirs[i], JNDI_CONFIG_FILENAME);
+            }
+
+            s_configLoaded = true;
+        }
+
+        return new InitialContext();
+    }
+
+    /**
+     * Initializes JNDI given a File name which will attempt to be loaded.
+     *
+     * @param configFilename
+     * @return
+     * @throws Exception
+     */
+    public static synchronized Context initFromFile(String configFilename)
+            throws Exception
+    {
+        LOG.debug("Initializing JNDI from file: " + configFilename);
+        if (!s_configLoaded)
+        {
+            initJNDI();
+
+            InputStream configInput;
             try
             {
-               in.close(  );
+                LOG.debug("Trying to load JNDI configuration from file: " + configFilename);
+                configInput = new FileInputStream(configFilename);
             }
-            catch ( IOException ioe )
+            catch (FileNotFoundException fnfe)
             {
-               // ignore
+                LOG.debug("Trying to load JNDI configuration from classloader resource: " + configFilename);
+                configInput = XmlBeanJndiUtils.class.getClassLoader().getResourceAsStream(configFilename);
+                if (configInput == null)
+                {
+                    throw new IOException("jndiConfigNotFound");
+                }
             }
-         }
-      }
-   }
-
-   private static DefaultParameters setupDefaultParams( ResourceDocument.Resource defaultConfig )
-   throws ClassNotFoundException, 
-          IllegalAccessException, 
-          InstantiationException
-   {
-      DefaultParameters defaultParams = null;
-      if ( defaultConfig != null )
-      {
-         Object defaultConf = Class.forName( defaultConfig.getType(  ) ).newInstance(  );
-         if ( defaultConf instanceof DefaultParameters )
-         {
-            defaultParams = (DefaultParameters) defaultConf;
-            ResourceParamsDocument.ResourceParams resourceParams = defaultConfig.getResourceParams(  );
-            ParameterDocument.Parameter[]         parameterArray = resourceParams.getParameterArray(  );
-            for ( int i = 0; i < parameterArray.length; i++ )
-            {
-               ParameterDocument.Parameter parameter = parameterArray[i];
-               String                      name  = parameter.getName(  );
-               String                      value = parameter.getValue(  );
-
-               if ( ( value != null ) && !value.equals( "" ) )
-               {
-                  if ( PROP_FACTORY.equals( name ) )
-                  {
-                     defaultParams.setFactory( value );
-                  }
-               }
-            }
-         }
-      }
-
-      return defaultParams;
-   }
-
-   private static void validateJndiConfig( XmlObject requestXBean )
-   {
-      XmlOptions validateOptions = new XmlOptions(  );
-      List       errorList = new ArrayList(  );
-      validateOptions.setErrorListener( errorList );
-      boolean isValid = requestXBean.validate( validateOptions );
-      if ( !isValid )
-      {
-         StringBuffer strBuf = new StringBuffer( "jndi-config.xml is not valid as per its schema: \n\n" );
-         for ( int i = 0; i < errorList.size(  ); i++ )
-         {
-            strBuf.append( "\t\t" );
-            strBuf.append( i + 1 );
-            strBuf.append( ") " );
-            strBuf.append( errorList.get( i ) );
-            strBuf.append( "\n" );
-         }
-
-         strBuf.append( "\n" );
-         LOG.fatal( strBuf.toString(  ) );
-      }
-   }
-
-   private static void validateParameterValues( ResourceParameters params )
-   {
-      checkValueIsNonEmpty( params, PROP_FACTORY );
-   }
+
+            Context context = new InitialContext();
+            parseJNDIConfig(context, configInput);
+            s_configLoaded = true;
+        }
+
+        return new InitialContext();
+    }
+
+    /**
+     * Initializes JNDI from a given InputStream to a jndi-config.xml file.
+     *
+     * @param inputStream
+     * @return JNDI Context
+     * @throws Exception
+     */
+    public static synchronized Context initFromInputStream(InputStream inputStream)
+            throws Exception
+    {
+        if (!s_configLoaded)
+        {
+            initJNDI();
+            LOG.debug("Trying to load JNDI configuration from inputstream");
+            parseJNDIConfig(new InitialContext(),
+                            inputStream);
+            s_configLoaded = true;
+        }
+
+        return new InitialContext();
+    }
+
+    /**
+     * Configure JNDI with the Apache Tomcat naming service classes and
+     * create the WSRF context.
+     *
+     * @return the WSRF context
+     * @throws Exception
+     */
+    public static synchronized Context initJNDI()
+            throws Exception
+    {
+        if (!s_jndiInitialized)
+        {
+            initJndiImpl();
+            initWsrfContext();
+            s_jndiInitialized = true;
+        }
+
+        return new InitialContext();
+    }
+
+    /**
+     * Called via parseJNDIConfig(InputStream)
+     * <p/>
+     * Parse the given JNDI configuration and populate the JNDI registry using the parsed configuration
+     *
+     * @param configStream The configuration stream to parse
+     * @throws Exception
+     */
+    public static void parseJNDIConfig(Context initContext,
+                                       InputStream configStream)
+            throws Exception
+    {
+        if (configStream == null)
+        {
+            throw new IllegalArgumentException("nullJNDIConfigInput");
+        }
+
+        if (initContext == null)
+        {
+            throw new IllegalArgumentException();
+        }
+
+        //get the global context
+        Context envContext = (Context) initContext.lookup(JndiConstants.CONTEXT_NAME_GLOBAL);
+        XmlBeanNamingContext namingContext = new XmlBeanNamingContext(envContext);
+
+        //load the config file
+        JndiConfigDocument jndiConfigDoc = (JndiConfigDocument) XmlObject.Factory.parse(configStream);
+        validateJndiConfig(jndiConfigDoc);
+        JndiConfigDocument.JndiConfig jndiConfig = jndiConfigDoc.getJndiConfig();
+        GlobalDocument.Global global = jndiConfig.getGlobal();
+
+        //setup the global jndi elements
+        addGlobalElements(namingContext, global);
+
+        //get the service context
+        envContext = (Context) initContext.lookup(JndiConstants.CONTEXT_NAME_SERVICES);
+        namingContext = new XmlBeanNamingContext(envContext);
+
+        //setup the service jndi elements
+        ServiceDocument.Service[] serviceArray = jndiConfig.getServiceArray();
+        addServiceElements(namingContext, serviceArray);
+    }
+
+    private static void setDefaultParameterValues(ResourceParameters params)
+    {
+        if (params.getParameter(PROP_FACTORY) == null)
+        {
+            params.addParameter(PROP_FACTORY,
+                                s_defaultParams.getFactory());
+        }
+    }
+
+    private static DefaultParameters getDefaultProperties(GlobalDocument.Global global)
+            throws IllegalAccessException,
+                   InstantiationException,
+                   ClassNotFoundException
+    {
+        ResourceDocument.Resource defaultConfig = null;
+        ResourceDocument.Resource[] resourceArray = global.getResourceArray();
+        for (int i = 0; i < resourceArray.length; i++)
+        {
+            ResourceDocument.Resource resource = resourceArray[i];
+            if (DefaultParameters.class.getName().equals(resource.getType()))
+            {
+                defaultConfig = resource;
+                break;
+            }
+        }
+
+        return setupDefaultParams(defaultConfig);
+    }
+
+    private static Environment[] getEnvironmentArray(EnvironmentDocument.Environment[] environmentArray)
+    {
+        List envList = new ArrayList();
+
+        if (environmentArray != null)
+        {
+            for (int i = 0; i < environmentArray.length; i++)
+            {
+                EnvironmentDocument.Environment environment = environmentArray[i];
+                Environment env = new Environment();
+                env.setDescription(environment.getDescription());
+                env.setName(environment.getName());
+                env.setType(environment.getType());
+                env.setValue(environment.getValue());
+                envList.add(env);
+            }
+        }
+
+        return (Environment[]) envList.toArray(new Environment[0]);
+    }
+
+    private static ResourceParameters getParameters(ResourceParamsDocument.ResourceParams resourceParams)
+    {
+        ResourceParameters params = new ResourceParameters();
+        if (resourceParams != null)
+        {
+            ParameterDocument.Parameter[] parameterArray = resourceParams.getParameterArray();
+            for (int i = 0; i < parameterArray.length; i++)
+            {
+                ParameterDocument.Parameter parameter = parameterArray[i];
+                params.addParameter(parameter.getName(),
+                                    parameter.getValue());
+            }
+        }
+
+        return params;
+    }
+
+    private static Resource[] getResourceArray(ResourceDocument.Resource[] resourceArray,
+                                               String name,
+                                               XmlBeanNamingContext namingContext)
+    {
+        List resources = new ArrayList();
+        if (resourceArray != null)
+        {
+            for (int i = 0; i < resourceArray.length; i++)
+            {
+                ResourceDocument.Resource resourceDoc = resourceArray[i];
+
+                //special type of resource....metatdata...handle differently....
+                MetadataConfigDocument.MetadataConfig metadataConfig = resourceDoc.getMetadataConfig();
+                if (metadataConfig != null)
+                {
+                    Constructor constructor = null;
+                    MetadataConfig metaConfig = null;
+                    try
+                    {
+                        Class metaConfigClass = Class.forName(resourceDoc.getType());
+                        constructor =
+                        metaConfigClass.getConstructor(new Class[]
+                        {
+                            MetadataConfigDocument.MetadataConfig.class
+                        });
+                        metaConfig =
+                        (MetadataConfig) constructor.newInstance(new Object[]
+                        {
+                            metadataConfig
+                        });
+                    }
+                    catch (Exception e)
+                    {
+                        LOG.error("Unable to find constructor which takes: " + metadataConfig.getClass().getName()
+                                  + ", in MetadataConfig object: " + resourceDoc.getType()
+                                  + ".  The metadata will be ignored!", e);
+                    }
+
+                    if (metaConfig != null)
+                    {
+                        String contextName = null;
+                        if (name != null)
+                        {
+
+                            try
+                            {
+                                createSubcontexts(namingContext.getContext(), name); //add subcontext
+                                contextName = contextName + resourceDoc.getName();
+                                namingContext.bind(contextName, metaConfig);
+                            }
+                            catch (NamingException e)
+                            {
+                                LOG.error("A NamingException occurred when creating sbucontexts for the Metadataconfig.", e);
+                            }
+                            contextName = name + "/";
+                        }
+                    }
+                    continue;
+                }
+
+                Resource resource = new Resource();
+                resource.setName(resourceDoc.getName());
+                resource.setAuth(resourceDoc.getAuth());
+                resource.setDescription(resourceDoc.getDescription());
+                resource.setType(resourceDoc.getType());
+                resource.setScope(resourceDoc.getScope());
+                resource.setParameters(getParameters(resourceDoc.getResourceParams()));
+                resources.add(resource);
+            }
+        }
+
+        return (Resource[]) resources.toArray(new Resource[0]);
+    }
+
+    private static ResourceLink[] getResourceLinkArray(ResourceLinkDocument.ResourceLink[] resourceLinkArray)
+    {
+        List resourceLinks = new ArrayList();
+        if (resourceLinkArray != null)
+        {
+            for (int i = 0; i < resourceLinkArray.length; i++)
+            {
+                ResourceLinkDocument.ResourceLink resourceLink = resourceLinkArray[i];
+                ResourceLink link = new ResourceLink();
+                link.setName(resourceLink.getName());
+                link.setTarget(resourceLink.getTarget());
+                resourceLinks.add(link);
+            }
+        }
+
+        return (ResourceLink[]) resourceLinks.toArray(new ResourceLink[0]);
+    }
+
+    private static ConfigContext[] getServiceArray(ServiceDocument.Service[] serviceArray,
+                                                   XmlBeanNamingContext namingContext)
+    {
+        List services = new ArrayList();
+        if (serviceArray != null)
+        {
+            for (int i = 0; i < serviceArray.length; i++)
+            {
+                ServiceDocument.Service service = serviceArray[i];
+                ConfigContext context = new ConfigContext();
+                context.setName(service.getName());
+                Environment[] environmentArray = getEnvironmentArray(service.getEnvironmentArray());
+                for (int j = 0; j < environmentArray.length; j++)
+                {
+                    context.addEnvironment(environmentArray[j]);
+                }
+
+                Resource[] resourceArray =
+                        getResourceArray(service.getResourceArray(),
+                                         service.getName(),
+                                         namingContext);
+                for (int j = 0; j < resourceArray.length; j++)
+                {
+                    Resource resource = resourceArray[j];
+                    ResourceParameters params = resource.getParameters();
+                    setDefaultParameterValues(params);
+                    validateParameterValues(params);
+                }
+
+                for (int j = 0; j < resourceArray.length; j++)
+                {
+                    context.addResource(resourceArray[j]);
+                }
+
+                ResourceLink[] resourceLinkArray = getResourceLinkArray(service.getResourceLinkArray());
+                for (int j = 0; j < resourceLinkArray.length; j++)
+                {
+                    context.addResourceLink(resourceLinkArray[j]);
+                }
+
+                services.add(context);
+            }
+        }
+
+        return (ConfigContext[]) services.toArray(new ConfigContext[0]);
+    }
+
+    private static ConfigContext[] getServiceSubContextArray(ConfigContext service)
+    {
+        List subContexts = new ArrayList();
+        if (service != null)
+        {
+            Set subContextNames = service.getSubContextNames();
+            Iterator iterator = subContextNames.iterator();
+
+            while (iterator.hasNext())
+            {
+                subContexts.add(service.getSubContext((String) iterator.next()));
+            }
+        }
+
+        return (ConfigContext[]) subContexts.toArray(new ConfigContext[0]);
+    }
+
+    private static void addGlobalElements(XmlBeanNamingContext namingContext,
+                                          GlobalDocument.Global global)
+            throws NamingException,
+                   IllegalAccessException,
+                   ClassNotFoundException,
+                   InstantiationException
+    {
+        if (global != null)
+        {
+            s_defaultParams = getDefaultProperties(global);
+
+            Environment[] environmentArray = getEnvironmentArray(global.getEnvironmentArray());
+
+            for (int i = 0; i < environmentArray.length; i++)
+            {
+                namingContext.addEnvironment(environmentArray[i]);
+            }
+
+            ConfigContext[] subContext = getServiceArray(global.getServiceArray(),
+                                                         namingContext);
+            for (int i = 0; i < subContext.length; i++)
+            {
+                namingContext.addSubContext(subContext[i]);
+            }
+
+            Resource[] resourceArray = getResourceArray(global.getResourceArray(),
+                                                        null,
+                                                        namingContext);
+            for (int i = 0; i < resourceArray.length; i++)
+            {
+                namingContext.addResource(resourceArray[i]);
+            }
+
+            ResourceLink[] resourceLinkArray = getResourceLinkArray(global.getResourceLinkArray());
+            for (int i = 0; i < resourceLinkArray.length; i++)
+            {
+                namingContext.addResourceLink(resourceLinkArray[i]);
+            }
+        }
+    }
+
+    private static void addServiceElements(XmlBeanNamingContext namingContext,
+                                           ServiceDocument.Service[] serviceArray)
+            throws NamingException
+    {
+        if (serviceArray != null)
+        {
+            ConfigContext[] services = getServiceArray(serviceArray, namingContext);
+            for (int i = 0; i < services.length; i++)
+            {
+                ConfigContext service = services[i];
+                namingContext.addService(service);
+                ConfigContext[] serviceSubContextArray = getServiceSubContextArray(service);
+                for (int j = 0; j < serviceSubContextArray.length; j++)
+                { //todo not sure if defaults bubble down here...
+                    namingContext.addSubContext(serviceSubContextArray[j]);
+                }
+            }
+        }
+    }
+
+    private static void checkValueIsNonEmpty(ResourceParameters params,
+                                             String paramName)
+    {
+        String paramValue = params.getParameter(paramName);
+        if (paramValue.trim().equals(""))
+        {
+            throw new RuntimeException(paramName + " parameter must have a non-empty value!");
+        }
+    }
+
+    private static void initJndiImpl()
+    {
+        String apacheUrlPrefix = APACHE_URL_PKG_PREFIX;
+        String systemUrlPrefix = System.getProperty(Context.URL_PKG_PREFIXES);
+        String systemContextFactory = System.getProperty(Context.INITIAL_CONTEXT_FACTORY);
+
+        if ((systemContextFactory == null) && (systemUrlPrefix == null))
+        {
+            System.setProperty(Context.URL_PKG_PREFIXES, apacheUrlPrefix);
+            System.setProperty(Context.INITIAL_CONTEXT_FACTORY, APACHE_INITIAL_CONTEXT_FACTORY);
+        }
+    }
+
+    private static Context initWsrfContext()
+            throws NamingException
+    {
+        Context wsrfContext;
+        InitialContext initialContext = new InitialContext();
+        try
+        {
+            wsrfContext = (Context) initialContext.lookup(JndiConstants.CONTEXT_NAME_BASE);
+        }
+        catch (NameNotFoundException nnfe)
+        {
+            LOG.debug("Initializing WSRF JNDI context...");
+            LOG.debug("Creating JNDI subcontext: " + JndiConstants.CONTEXT_NAME_BASE + " ...");
+            wsrfContext = initialContext.createSubcontext(JndiConstants.CONTEXT_NAME_BASE);
+            LOG.debug("Creating JNDI subcontext: " + JndiConstants.CONTEXT_SERVICES_BASE + " ...");
+            wsrfContext.createSubcontext(JndiConstants.CONTEXT_SERVICES_BASE);
+            LOG.debug("Creating JNDI subcontext: " + JndiConstants.CONTEXT_GLOBAL_BASE + " ...");
+            wsrfContext.createSubcontext(JndiConstants.CONTEXT_GLOBAL_BASE);
+        }
+
+        return wsrfContext;
+    }
+
+    private static void processJNDIFile(File dir,
+                                        String configFile)
+            throws Exception
+    {
+        Context context = new InitialContext();
+        File file = new File(dir, configFile);
+        if (!file.exists())
+        {
+            return;
+        }
+
+        LOG.debug("Loading JNDI configuration from file: " + file + " ...");
+
+        InputStream in = null;
+        try
+        {
+            in = new FileInputStream(file);
+            parseJNDIConfig(context, in);
+        }
+        finally
+        {
+            if (in != null)
+            {
+                try
+                {
+                    in.close();
+                }
+                catch (IOException ioe)
+                {
+                    // ignore
+                }
+            }
+        }
+    }
+
+    private static DefaultParameters setupDefaultParams(ResourceDocument.Resource defaultConfig)
+            throws ClassNotFoundException,
+                   IllegalAccessException,
+                   InstantiationException
+    {
+        DefaultParameters defaultParams = null;
+        if (defaultConfig != null)
+        {
+            Object defaultConf = Class.forName(defaultConfig.getType()).newInstance();
+            if (defaultConf instanceof DefaultParameters)
+            {
+                defaultParams = (DefaultParameters) defaultConf;
+                ResourceParamsDocument.ResourceParams resourceParams = defaultConfig.getResourceParams();
+                ParameterDocument.Parameter[] parameterArray = resourceParams.getParameterArray();
+                for (int i = 0; i < parameterArray.length; i++)
+                {
+                    ParameterDocument.Parameter parameter = parameterArray[i];
+                    String name = parameter.getName();
+                    String value = parameter.getValue();
+
+                    if ((value != null) && !value.equals(""))
+                    {
+                        if (PROP_FACTORY.equals(name))
+                        {
+                            defaultParams.setFactory(value);
+                        }
+                    }
+                }
+            }
+        }
+
+        return defaultParams;
+    }
+
+    private static void validateJndiConfig(XmlObject requestXBean)
+    {
+        XmlOptions validateOptions = new XmlOptions();
+        List errorList = new ArrayList();
+        validateOptions.setErrorListener(errorList);
+        boolean isValid = requestXBean.validate(validateOptions);
+        if (!isValid)
+        {
+            StringBuffer strBuf = new StringBuffer("jndi-config.xml is not valid as per its schema: \n\n");
+            for (int i = 0; i < errorList.size(); i++)
+            {
+                strBuf.append("\t\t");
+                strBuf.append(i + 1);
+                strBuf.append(") ");
+                strBuf.append(errorList.get(i));
+                strBuf.append("\n");
+            }
+
+            strBuf.append("\n");
+            LOG.fatal(strBuf.toString());
+        }
+    }
+
+    private static void validateParameterValues(ResourceParameters params)
+    {
+        checkValueIsNonEmpty(params, PROP_FACTORY);
+    }
 
     /**
      * Create all intermediate subcontexts.
      */
-    public static Context createSubcontexts( Context currentContext,
-                                             String  name )
-    throws NamingException
-    {
-       StringTokenizer tokenizer = new StringTokenizer( name, "/" );
-
-       while ( tokenizer.hasMoreTokens(  ) )
-       {
-          String token = tokenizer.nextToken(  );
-          if ( ( !token.equals( "" ) ) && ( tokenizer.hasMoreTokens(  ) ) )
-          {
-             try
-             {
-                currentContext = currentContext.createSubcontext( token );
-             }
-             catch ( NamingException e )
-             {
-                // Silent catch. Probably an object is already bound in
-                // the context.
-                currentContext = (Context) currentContext.lookup( token );
-             }
-          }
-       }
+    public static Context createSubcontexts(Context currentContext,
+                                            String name)
+            throws NamingException
+    {
+        StringTokenizer tokenizer = new StringTokenizer(name, "/");
 
-       return currentContext;
+        while (tokenizer.hasMoreTokens())
+        {
+            String token = tokenizer.nextToken();
+            if ((!token.equals("")) && (tokenizer.hasMoreTokens()))
+            {
+                try
+                {
+                    currentContext = currentContext.createSubcontext(token);
+                }
+                catch (NameAlreadyBoundException e)
+                {
+                    // Silent catch. Probably an object is already bound in
+                    // the context.
+                    currentContext = (Context) currentContext.lookup(token);
+                }
+            }
+        }
+
+        return currentContext;
     }
+
     /**
      * Retrieves the named object on the specified context. The object returned must be of assignable from the type
      * specified.
@@ -698,30 +710,30 @@
      * @param name    the name of the object to lookup
      * @param type    the expected type of the object returned
      */
-    public static Object lookup( Context context,
-                                 String  name,
-                                 Class   type )
-    throws NamingException
-    {
-       if ( context == null )
-       {
-          throw new IllegalArgumentException( "nullArgument:context" );
-       }
-
-       if ( type == null )
-       {
-          throw new IllegalArgumentException( "nullArgument:type" );
-       }
-
-       Object tmp = context.lookup( name );
-       if ( type.isAssignableFrom( tmp.getClass(  ) ) )
-       {
-          return tmp;
-       }
-       else
-       {
-          throw new NamingException( "expectedType " + type.getName(  ) );
-       }
+    public static Object lookup(Context context,
+                                String name,
+                                Class type)
+            throws NamingException
+    {
+        if (context == null)
+        {
+            throw new IllegalArgumentException("nullArgument:context");
+        }
+
+        if (type == null)
+        {
+            throw new IllegalArgumentException("nullArgument:type");
+        }
+
+        Object tmp = context.lookup(name);
+        if (type.isAssignableFrom(tmp.getClass()))
+        {
+            return tmp;
+        }
+        else
+        {
+            throw new NamingException("expectedType " + type.getName());
+        }
     }
 
 }