costin      02/03/18 10:33:55

  Modified:    jk/native2/common jk_workerEnv.c
  Log:
  Update workerEnv for the new config system.
  
  Note that object creation and management is now centralized in jk_env/jk_config.
  
  WorkerEnv, uriMap are no longer creating workers, uris - instead
  of createWorker() we now use addWorker().
  
  This is simpler ( == less code ), but require a bit more attention to
  the initialization ( i.e. we may have to add a 'state' information, and
  pay attention to the init ).
  
  Another problem is that when a worker is created in a generic way, it
  is harder to register it with the workerEnv. One solution is to
  have worker-specific code that will call addWorker, another is to
  have the worker register itself ( by calling getInstance( "workerEnv ") )
  
  Revision  Changes    Path
  1.19      +88 -286   jakarta-tomcat-connectors/jk/native2/common/jk_workerEnv.c
  
  Index: jk_workerEnv.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_workerEnv.c,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- jk_workerEnv.c    2 Mar 2002 06:13:09 -0000       1.18
  +++ jk_workerEnv.c    18 Mar 2002 18:33:55 -0000      1.19
  @@ -59,272 +59,69 @@
    * Description: Workers controller                                         *
    * Author:      Gal Shachor <[EMAIL PROTECTED]>                           *
    * Author:      Henri Gomez <[EMAIL PROTECTED]>                               *
  - * Version:     $Revision: 1.18 $                                           *
  + * Version:     $Revision: 1.19 $                                           *
    ***************************************************************************/
   
  -#include "jk_workerEnv.h" 
   #include "jk_env.h"
  +#include "jk_workerEnv.h" 
  +#include "jk_config.h"
   #include "jk_worker.h"
   #include "jk_channel.h"
  +#include "jk_registry.h"
   
   #define DEFAULT_WORKER              ("ajp13")
   
  -int JK_METHOD jk2_workerEnv_factory(jk_env_t *env, jk_pool_t *pool,
  -                                    void **result,
  -                                    const char *type, const char *name);
  -
   static void jk2_workerEnv_close(jk_env_t *env, jk_workerEnv_t *wEnv);
   static void jk2_workerEnv_initHandlers(jk_env_t *env, jk_workerEnv_t *wEnv);
   static int  jk2_workerEnv_init1(jk_env_t *env, jk_workerEnv_t *wEnv);
   
   /* ==================== Setup ==================== */
   
  -static int jk2_workerEnv_setWorkerFile( struct jk_env *env,
  -                                        struct jk_workerEnv *wEnv,
  -                                         char *workerFile)
  +
  +static int jk2_workerEnv_setAttribute( struct jk_env *env, struct jk_bean *mbean,
  +                                       char *name, void *valueP)
   {
  -    struct stat statbuf;
  -    int err;
  -    jk_map_t *props;
  -    int i;
  -    
  -    /* We should make it relative to JK_HOME or absolute path.
  -       ap_server_root_relative(cmd->pool,opt); */
  -    
  -    /* Avoid recursivity */
  -    for( i=0; i<wEnv->initData->size( env, wEnv->initData); i++ ) {
  -        char *name=wEnv->initData->nameAt(env, wEnv->initData, i);
  -        char *val=wEnv->initData->valueAt(env, wEnv->initData, i);
  -        if( strcmp( name, "workerFile" )==0 &&
  -            strcmp( val, workerFile ) == 0 ) {
  -            env->l->jkLog(env, env->l, JK_LOG_ERROR,
  -                          "Recursive init - already read %s", workerFile );
  -            return JK_FALSE;
  -        }
  -    }
  +    jk_workerEnv_t *wEnv=mbean->object;
  +    char *value=valueP;
   
  -    if (stat(workerFile, &statbuf) == -1) {
  -        env->l->jkLog(env, env->l, JK_LOG_ERROR,
  -                      "Can't find the workers file %s", workerFile );
  -        return JK_FALSE;
  -    }
  -    
  -    /** Read worker files
  +    /** XXX Should it be per/uri ?
        */
  -    env->l->jkLog(env, env->l, JK_LOG_DEBUG, "Reading properties %s %d\n",
  -                  workerFile,
  -                  wEnv->initData->size(env, wEnv->initData) );
  -    
  -    jk2_map_default_create(env, &props, wEnv->pool);
  -    
  -    err=jk2_map_readFileProperties(env, props, workerFile );
  -    
  -    if( err==JK_TRUE ) {
  -        env->l->jkLog(env, env->l, JK_LOG_INFO, 
  -                      "mod_jk.initJk() Reading worker properties %s %d\n",
  -                      workerFile, props->size( env, props ) );
  -    } else {
  -        env->l->jkLog(env, env->l, JK_LOG_ERROR,
  -                      "mod_jk.initJk() Error reading worker properties %s\n",
  -                      workerFile );
  -        return JK_FALSE;
  -    }
  -
  -    for( i=0; i<props->size( env, props); i++ ) {
  -        char *name=props->nameAt(env, props, i);
  -        char *val=props->valueAt(env, props, i);
  -
  -        wEnv->setProperty( env, wEnv, name, val );
  -    }
  -    
  -    return JK_TRUE;
  -}
  -
  -
  -static int jk2_workerEnv_setLogLevel( struct jk_env *env,
  -                                      struct jk_workerEnv *wEnv,
  -                                      char *level)
  -{
  -     if(0 == strcasecmp(level, JK_LOG_INFO_VERB)) {
  -         env->l->level=JK_LOG_INFO_LEVEL;
  -     }
  -     if(0 == strcasecmp(level, JK_LOG_DEBUG_VERB)) {
  -         env->l->level=JK_LOG_DEBUG_LEVEL;
  -     }
  -     return JK_TRUE;
  -}
  -
  -/** XXX make them ssl.property ?
  - */
  -static int jk2_workerEnv_setSSLProperty( struct jk_env *env,
  -                                         struct jk_workerEnv *wEnv,
  -                                         char *name, char *opt)
  -{
       if( strcmp( name, "sslEnable" )==0 ) {
           wEnv->ssl_enable = JK_TRUE;
       } else if( strcmp( name, "httpsIndicator" )==0 ) {
  -        wEnv->https_indicator = opt;
  +        wEnv->https_indicator = value;
       } else if( strcmp( name, "certsIndicator" )==0 ) {
  -        wEnv->certs_indicator = opt;
  +        wEnv->certs_indicator = value;
       } else if( strcmp( name, "cipherIndicator" )==0 ) {
  -        wEnv->cipher_indicator = opt;
  +        wEnv->cipher_indicator = value;
       } else if( strcmp( name, "sessionIndicator" )==0 ) {
  -        wEnv->session_indicator = opt;
  +        wEnv->session_indicator = value;
       } else if( strcmp( name, "keySizeIndicator" )==0 ) {
  -        wEnv->key_size_indicator = opt;
  -    } else if( strcmp( name, "ForwardKeySize" ) == 0 ) {
  -        /* XXX if( opt == TRUE ) */
  +        wEnv->key_size_indicator = value;
  +    } else if( strcmp( name, "forwardKeySize" ) == 0 ) {
           wEnv->options |= JK_OPT_FWDKEYSIZE;
  -    } else {
  -        return JK_FALSE;
  -    }
  -    /* One of the options was recognized */
  -    return JK_TRUE;
  -}
  -
  -/** XXX make them forward.property ?
  - */
  -static int jk2_workerEnv_setForwardProperty( struct jk_env *env,
  -                                             struct jk_workerEnv *wEnv,
  -                                             char *name, char *opt)
  -{
       /* Small change in how we treat options: we have a default,
          and assume that any option declared by user has the intention
          of overriding the default ( "-Option == no option, leave the
          default
       */
  -    if( strcmp( name, "ForwardURICompat" )==0 ) {
  +    } else  if( strcmp( name, "forwardURICompat" )==0 ) {
           wEnv->options &= ~JK_OPT_FWDURIMASK;
           wEnv->options |=JK_OPT_FWDURICOMPAT;
  -    } else if( strcmp( name, "ForwardURICompatUnparsed" )==0 ) {
  +    } else if( strcmp( name, "forwardURICompatUnparsed" )==0 ) {
           wEnv->options &= ~JK_OPT_FWDURIMASK;
           wEnv->options |=JK_OPT_FWDURICOMPATUNPARSED;
  -    } else if( strcmp( name, "ForwardURIEscaped" )==0 ) {
  +    } else if( strcmp( name, "forwardURIEscaped" )==0 ) {
           wEnv->options &= ~JK_OPT_FWDURIMASK;
           wEnv->options |= JK_OPT_FWDURIESCAPED;
       } else {
           return JK_FALSE;
       }
  -    return JK_TRUE;
  -}
  -
  -static int jk2_workerEnv_setWorkerList( struct jk_env *env,
  -                                        struct jk_workerEnv *wEnv,
  -                                        char *wlist)
  -{
  -    wEnv->worker_list=jk2_map_split( env, wEnv->initData, wEnv->pool,
  -                                          wlist, NULL, & wEnv->declared_workers );
  -}
  -
  -static int jk2_workerEnv_setWorkerProperty( struct jk_env *env,
  -                                        struct jk_workerEnv *wEnv,
  -                                        char *name, char *val)
  -
  -{
  -    jk_worker_t *w = NULL;
  -    char *wname=NULL;
  -    char *pname=NULL;
  -    char *dot=0;
  -    int i;
  -
  -    if( strncmp( name, "worker.", 7 ) != 0 )
  -        return JK_FALSE;
  -
  -    wname=wEnv->pool->pstrdup( env, wEnv->pool, name + 7);
  -    /* env->l->jkLog(env, env->l, JK_LOG_ERROR, "wname= %s\n", wname);     */
  -    dot=strchr( wname, '.' );
  -    if( dot== NULL )
  -        return JK_FALSE;
  -    *dot='\0';
  -    pname= dot+1;
  -    /*env->l->jkLog(env, env->l, JK_LOG_ERROR, "wname1= %s pname=%s\n", wname, 
pname); */
  -    
  -    w=wEnv->getWorkerForName( env, wEnv, wname );
  -
  -    if( w != NULL ) {
  -        /* If we have an object with that name, set the prop */
  -        return w->setProperty( env, w, pname, val );
  -    }
  -
  -    /** Unknown worker. It may be the first option, create it
  -     */
  -    if( strcmp( pname, "type" ) != 0 ) {
  -        env->l->jkLog(env, env->l, JK_LOG_ERROR,
  -                      "The first worker property must be type %s %s\n", wname, 
pname);
  -        return JK_FALSE;
  -    } else {
  -        
  -        /* We know the worker type, create it and set previous props
  -         */
  -        w=wEnv->createWorker(env, wEnv, wname, val );
  -        
  -        if( w==NULL ) {
  -            env->l->jkLog(env, env->l, JK_LOG_ERROR,
  -                          "init failed to create worker %s\n", wname);
  -            return JK_FALSE;
  -        }
  -        
  -        if( wEnv->defaultWorker == NULL )
  -            wEnv->defaultWorker=w;
  -    }
  -    return JK_TRUE;
  -}
   
  -
  -static int jk2_workerEnv_setProperty( struct jk_env *env,
  -                                      struct jk_workerEnv *wEnv,
  -                                      const char *name, char *value)
  -{
  -    jk_map_t *initData=wEnv->initData;
  -    int status;
  -
  -    value = jk2_map_replaceProperties(env, initData, initData->pool, value);
  -
  -    /** XXX Do we need this ? How about removing/runtime changes/single value ?
  -     */
  -    initData->add( env, initData, name, value );
  -
  -    if( strcmp( name, "workerFile" ) == 0 ) {
  -        return jk2_workerEnv_setWorkerFile(env, wEnv, value);
  -    } else if( strcmp( name, "logLevel") == 0 ) {
  -        return jk2_workerEnv_setLogLevel( env, wEnv, value );
  -    } else if( strcmp( name, "worker.list") == 0 ) {
  -        /* Note that worker list is what we init at startup
  -           in jk2 all declared workers will be configured and
  -           enabled on demand
  -        */        
  -        return jk2_workerEnv_setWorkerList( env, wEnv, value );
  -    } else if( strncmp( name, "worker.", 7) == 0 ) {
  -        return jk2_workerEnv_setWorkerProperty( env, wEnv, name, value );
  -    } else if( strncmp( name, "uriMap.", 7) == 0 ||
  -               strncmp( name, "uri.", 4) == 0 ||
  -               name[0]=='/'  ) {
  -        /** XXX pre-process it ? */
  -        wEnv->uriMap->setProperty( env, wEnv->uriMap, name, value );
  -    }
  -
  -    /* Is it a ssl-related property ? */
  -    if( jk2_workerEnv_setSSLProperty( env, wEnv, name, value )==JK_TRUE ) {
  -        return JK_TRUE;
  -    }
  -    if( jk2_workerEnv_setForwardProperty( env, wEnv, name, value )==JK_TRUE ) {
  -        return JK_TRUE;
  -    }
  -    
       return JK_TRUE;
   }
   
   
  -     
  -static char *jk2_workerEnv_getProperty( struct jk_env *env,
  -                                       struct jk_workerEnv *wEnv,
  -                                       const char *name)
  -{
  -
  -    return NULL;
  -}
  -
  -
   static void jk2_workerEnv_close(jk_env_t *env, jk_workerEnv_t *wEnv)
   {
       int sz;
  @@ -347,27 +144,6 @@
       wEnv->worker_map->clear(env, wEnv->worker_map);
   }
   
  -static jk_worker_t *jk2_workerEnv_getWorkerForName(jk_env_t *env,
  -                                                   jk_workerEnv_t *wEnv,
  -                                                   const char *name )
  -{
  -    jk_worker_t * rc;
  -    
  -    if(!name) {
  -        env->l->jkLog(env, env->l, JK_LOG_ERROR,
  -                      "workerEnv.getWorkerForName() NullPointerException\n");
  -        return NULL;
  -    }
  -
  -    rc = wEnv->worker_map->get(env, wEnv->worker_map, name);
  -
  -    /*     if( rc==NULL ) { */
  -    /*         l->jkLog(l, JK_LOG_INFO, */
  -    /*  "workerEnv.getWorkerForName(): no worker found for %s \n", name); */
  -    /*     }  */
  -    return rc;
  -}
  -
   static void jk2_workerEnv_checkSpace(jk_env_t *env, jk_pool_t *pool,
                                        void ***tableP, int *sizeP, int id)
   {
  @@ -403,12 +179,12 @@
               if( w->destroy != NULL ) 
                   w->destroy(env, w);
               env->l->jkLog(env, env->l, JK_LOG_ERROR,
  -                          "workerEnv.createWorker() init failed for %s\n", 
  +                          "workerEnv.initWorkers() init failed for %s\n", 
                             name); 
           }
       
           env->l->jkLog(env, env->l, JK_LOG_INFO,
  -                      "workerEnv.createWorker(): init ok %s\n", name);
  +                      "workerEnv.initWorkers(): init ok %s\n", name);
       }
       return JK_TRUE;
   }
  @@ -424,47 +200,45 @@
       
       for( i=0; i<size; i++ ) {
           jk_handler_t *handler;
  -        jk_map_t *localHandlers;
           int rc;
   
           char *name= registry->nameAt( env, registry, i );
  -        if( strstr( name, "handler" ) == name ) {
  -            char *type=name+ strlen( "handler" ) +1;
  -            localHandlers=(jk_map_t *)env->getInstance(env, wEnv->pool,
  -                                                       "handler", type );
  -            if( localHandlers==NULL ) continue;
  -            
  -            for( j=0; j< localHandlers->size( env, localHandlers ); j++ ) {
  -                handler=(jk_handler_t *)localHandlers->valueAt( env, localHandlers, 
j );
  -                jk2_workerEnv_checkSpace( env, wEnv->pool,
  -                                         (void ***)&wEnv->handlerTable,
  -                                         &wEnv->lastMessageId,
  -                                         handler->messageId );
  -                wEnv->handlerTable[ handler->messageId ]=handler;
  -                /*wEnv->l->jkLog( wEnv->l, JK_LOG_INFO, "Registered %s %d\n",*/
  -                /*           handler->name, handler->messageId); */
  -            }
  +        if( strncmp( name, "handler.", 8 ) == 0 ) {
  +            handler=(jk_handler_t *)env->createInstance(env, wEnv->pool, name, name 
 );
  +            if( handler!=NULL )
  +                handler->init( env, handler, wEnv );
           }
       }
   }
   
  +
  +static void jk2_workerEnv_registerHandler(jk_env_t *env, jk_workerEnv_t *wEnv,
  +                                          jk_handler_t *handler)
  +{
  +    jk2_workerEnv_checkSpace( env, wEnv->pool,
  +                              (void ***)&wEnv->handlerTable,
  +                              &wEnv->lastMessageId,
  +                              handler->messageId );
  +    wEnv->handlerTable[ handler->messageId ]=handler;
  +    /*wEnv->l->jkLog( wEnv->l, JK_LOG_INFO, "Registered %s %d\n",*/
  +    /*           handler->name, handler->messageId); */
  +}
  +
   static int jk2_workerEnv_init(jk_env_t *env, jk_workerEnv_t *wEnv)
   {
       int err;
       char *opt;
       int options;
   
  -    env->l->jkLog(env, env->l, JK_LOG_INFO, "mod_jk.init_jk()\n" );
  +    env->l->init( env, env->l );
   
  -    /** This will eventuall read logFile.
  -        XXX Config per 'component', log.level, log.file, etc
  -    */
  -    env->l->open( env, env->l, wEnv->initData );
  +    env->l->jkLog(env, env->l, JK_LOG_INFO, "mod_jk.init_jk()\n" );
   
       jk2_workerEnv_initWorkers( env, wEnv );
       jk2_workerEnv_initHandlers( env, wEnv );
       
  -    err=wEnv->uriMap->init(env, wEnv->uriMap );
  +    wEnv->uriMap->init(env, wEnv->uriMap );
  +
       return JK_TRUE;
   }
   
  @@ -607,10 +381,36 @@
   }
   
   
  +static int jk2_workerEnv_addWorker(jk_env_t *env, jk_workerEnv_t *wEnv,
  +                                   jk_worker_t *w) 
  +{
  +    int err=JK_TRUE;
  +    jk_worker_t *oldW = NULL;
  +
  +    w->rPoolCache= jk2_objCache_create( env, w->pool  );
  +
  +    err=w->rPoolCache->init( env, w->rPoolCache,
  +                             1024 ); /* XXX make it unbound */
  +
  +    wEnv->worker_map->put(env, wEnv->worker_map, w->mbean->name, w, (void *)&oldW);
  +            
  +    if(oldW!=NULL) {
  +        env->l->jkLog(env, env->l, JK_LOG_ERROR,
  +                      "workerEnv.addWorker() duplicated %s worker \n",
  +                      w->mbean->name);
  +        if( w->destroy != NULL )
  +            oldW->destroy(env, oldW);
  +    }
  +    
  +    if( wEnv->defaultWorker == NULL )
  +        wEnv->defaultWorker=w;
  +    
  +    return JK_TRUE;
  +}
  +
   static jk_worker_t *jk2_workerEnv_createWorker(jk_env_t *env,
  -                                               jk_workerEnv_t *wEnv,
  -                                               const char *name, 
  -                                               char *type)
  +                                            jk_workerEnv_t *wEnv,
  +                                               char *type, char *name) 
   {
       int err=JK_TRUE;
       jk_env_objectFactory_t fac;
  @@ -619,7 +419,7 @@
       jk_pool_t *workerPool;
   
       /* First find if it already exists */
  -    w=wEnv->getWorkerForName( env, wEnv, name );
  +    w=env->getByName( env, name );
       if( w != NULL ) {
           env->l->jkLog(env, env->l, JK_LOG_INFO,
                         "workerEnv.createWorker(): Using existing worker %s\n",
  @@ -633,8 +433,7 @@
       if( type == NULL ) type="ajp13";
       
   
  -    w=(jk_worker_t *)env->getInstance(env, workerPool, "worker",
  -                                      type );
  +    w=(jk_worker_t *)env->createInstance(env, workerPool, type, name );
   
       if( w == NULL ) {
           env->l->jkLog(env, env->l, JK_LOG_ERROR,
  @@ -643,8 +442,6 @@
           return NULL;
       }
   
  -    w->type=type;
  -    w->name=(char *)name;
       w->pool=workerPool;
       w->workerEnv=wEnv;
   
  @@ -666,7 +463,7 @@
   
   
   int JK_METHOD jk2_workerEnv_factory(jk_env_t *env, jk_pool_t *pool,
  -                                    void **result,
  +                                    jk_bean_t *result,
                                       const char *type, const char *name)
   {
       jk_workerEnv_t *wEnv;
  @@ -676,8 +473,12 @@
       env->l->jkLog(env, env->l, JK_LOG_DEBUG, "Creating workerEnv \n");
   
       wEnv=(jk_workerEnv_t *)pool->calloc( env, pool, sizeof( jk_workerEnv_t ));
  +
  +    result->object=wEnv;
  +    wEnv->mbean=result;
  +    result->setAttribute=&jk2_workerEnv_setAttribute;
  +    
       wEnv->pool=pool;
  -    *result=wEnv;
   
       wEnv->initData = NULL;
       jk2_map_default_create(env, & wEnv->initData, pool);
  @@ -745,7 +546,7 @@
   
       uriMapPool = wEnv->pool->create(env, wEnv->pool, HUGE_POOL_SIZE);
       
  -    wEnv->uriMap=env->getInstance(env, uriMapPool,"uriMap", "default");
  +    wEnv->uriMap=env->createInstance(env, uriMapPool,"uriMap", "uriMap");
   
       if( wEnv->uriMap==NULL ) {
           env->l->jkLog(env, env->l, JK_LOG_ERROR,
  @@ -753,22 +554,23 @@
           return JK_FALSE;
       }
   
  +    wEnv->config=env->createInstance(env, pool,"config", "config");
  +    wEnv->config->workerEnv = wEnv;
  +    wEnv->config->map = wEnv->initData;
  +    
  +
       wEnv->uriMap->workerEnv = wEnv;
       wEnv->perThreadWorker=0;
       
       /* methods */
       wEnv->init=&jk2_workerEnv_init;
  -    wEnv->getWorkerForName=&jk2_workerEnv_getWorkerForName;
       wEnv->close=&jk2_workerEnv_close;
  -    wEnv->createWorker=&jk2_workerEnv_createWorker;
  +    wEnv->addWorker=&jk2_workerEnv_addWorker;
  +    wEnv->registerHandler=&jk2_workerEnv_registerHandler;
       wEnv->processCallbacks=&jk2_workerEnv_processCallbacks;
       wEnv->dispatch=&jk2_workerEnv_dispatch;
  -    wEnv->setProperty=&jk2_workerEnv_setProperty;
  -    wEnv->getProperty=&jk2_workerEnv_getProperty;
  -
  -    wEnv->rootWebapp=wEnv->uriMap->createUriEnv( env, wEnv->uriMap, NULL, "/" );
   
       wEnv->globalEnv=env;
  -    
  +
       return JK_TRUE;
   }
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to