costin      2003/02/27 21:02:24

  Modified:    jk/native2/common jk_worker_status.c
  Log:
  Few more improvements to allow easier parsing on the java side.
  
  jkstatus now supports 4 new operations:
   lst -> will list all the beans ( well - C beans ) and the attributes ( get and set )
   dmp -> will display all attributes for one or more beans ( using a prefix )
   get -> returns exactly one attribute value
   set -> set one attribute. Some attributes have side effect - so this is also used 
as invoke()
     ( like in SNMP world )
  
  Revision  Changes    Path
  1.34      +224 -107  jakarta-tomcat-connectors/jk/native2/common/jk_worker_status.c
  
  Index: jk_worker_status.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_worker_status.c,v
  retrieving revision 1.33
  retrieving revision 1.34
  diff -u -r1.33 -r1.34
  --- jk_worker_status.c        17 Feb 2003 02:09:58 -0000      1.33
  +++ jk_worker_status.c        28 Feb 2003 05:02:24 -0000      1.34
  @@ -414,7 +414,196 @@
       }
       s->jkprintf( env,s , "</table>\n" );
   }
  - 
  +
  +static int JK_METHOD jk2_worker_status_list(jk_env_t *env,
  +                                            jk_worker_t *w, 
  +                                            jk_ws_service_t *s)
  +{
  +    char *cName=s->query_string + 4;
  +    int i;
  +    int qryLen=0;
  +    int exact=1;
  +    
  +        /* Dump all attributes for the beans */
  +    if( strcmp( cName, "*" )==0 ) {
  +        *cName='\0';
  +        qryLen=0;
  +    } else {
  +        qryLen=strlen( cName );
  +    }
  +    if( qryLen >0 ) {
  +        if( cName[strlen(cName)] == '*' ) {
  +            printf("Exact match off %s\n", cName );
  +            cName[strlen(cName)]='\0';
  +            exact=0;
  +        }
  +    }
  +    for( i=0; i < env->_objects->size( env, env->_objects ); i++ ) {
  +        char *name=env->_objects->nameAt( env, env->_objects, i );
  +        jk_bean_t *mbean=env->_objects->valueAt( env, env->_objects, i );
  +        char **getAtt=mbean->getAttributeInfo;
  +        char **setAtt=mbean->setAttributeInfo;
  +        
  +        /* That's a bad name, created for backward compat. It should be 
deprecated.. */
  +        if( strchr( name, ':' )==NULL )
  +            continue;
  +        
  +        /* Prefix */
  +        if( ! exact  && qryLen != 0 && strncmp( name, cName, qryLen )!= 0 )
  +            continue;
  +        
  +        /* Exact */
  +        if( exact && qryLen != 0 && strcmp( name, cName )!= 0 )
  +            continue;
  +        
  +        if( mbean==NULL ) 
  +            continue;
  +        s->jkprintf(env, s, "N:%s:%s\n", mbean->type, name);
  +        
  +        while( getAtt != NULL && *getAtt != NULL && **getAtt!='\0' ) {
  +            s->jkprintf(env, s, "G:%s:%s\n", name, *getAtt);
  +            getAtt++;
  +        }
  +        
  +        while( setAtt != NULL && *setAtt != NULL && **setAtt!='\0' ) {
  +            s->jkprintf(env, s, "S:%s:%s\n", name, *setAtt);
  +            setAtt++;
  +        }
  +        
  +    }
  +    return JK_OK;
  +}
  +
  +static int JK_METHOD jk2_worker_status_dmp(jk_env_t *env,
  +                                           jk_worker_t *w, 
  +                                           jk_ws_service_t *s)
  +{
  +    char *cName=s->query_string + 4;
  +    int i;
  +    int qryLen=0;
  +    int exact=1;
  +    
  +    /* Dump all attributes for the beans */
  +    if( strcmp( cName, "*" )==0 ) {
  +        *cName='\0';
  +        qryLen=0;
  +    } else {
  +        qryLen=strlen( cName );
  +    }
  +    if( qryLen >0 ) {
  +        if( cName[strlen(cName)] == '*' ) {
  +            printf("Exact match off %s\n", cName );
  +            cName[strlen(cName)]='\0';
  +            exact=0;
  +        }
  +    }
  +    for( i=0; i < env->_objects->size( env, env->_objects ); i++ ) {
  +        char *name=env->_objects->nameAt( env, env->_objects, i );
  +        jk_bean_t *mbean=env->_objects->valueAt( env, env->_objects, i );
  +        char **getAtt=mbean->getAttributeInfo;
  +        char **setAtt=mbean->setAttributeInfo;
  +        
  +        /* That's a bad name, created for backward compat. It should be 
deprecated.. */
  +        if( strchr( name, ':' )==NULL )
  +            continue;
  +        
  +        /* Prefix */
  +        if( ! exact  && qryLen != 0 && strncmp( name, cName, qryLen )!= 0 )
  +            continue;
  +        
  +        /* Exact */
  +        if( exact && qryLen != 0 && strcmp( name, cName )!= 0 )
  +            continue;
  +        
  +        if( mbean==NULL ) 
  +            continue;
  +        s->jkprintf(env, s, "P:%s:%s:%lp\n", mbean->type, name, mbean->object );
  +        
  +        while( getAtt != NULL && *getAtt != NULL && **getAtt!='\0' ) {
  +            char *attName=*getAtt;
  +            char *val=mbean->getAttribute(env, mbean, *getAtt );
  +            s->jkprintf(env, s, "G:%s:%s:%s\n", name, *getAtt, (val==NULL)? "NULL": 
val);
  +                getAtt++;
  +        }
  +    }
  +    return JK_OK;
  +}
  +
  +static int JK_METHOD jk2_worker_status_get(jk_env_t *env,
  +                                           jk_worker_t *w, 
  +                                           jk_ws_service_t *s)
  +{
  +    char *cName=s->query_string + 4;
  +    char *attName=rindex(cName, ':' );
  +    int i;
  +    
  +    if( attName == NULL ) {
  +        s->jkprintf( env, s, "ERROR: no attribute value found %s\n", cName);
  +        return JK_OK;
  +    }
  +    *attName='\0';
  +    attName++;
  +    
  +    for( i=0; i < env->_objects->size( env, env->_objects ); i++ ) {
  +        char *name=env->_objects->nameAt( env, env->_objects, i );
  +        jk_bean_t *mbean=env->_objects->valueAt( env, env->_objects, i );
  +        
  +        if( mbean==NULL ) 
  +            continue;
  +        
  +        if( strcmp( name, cName ) == 0 &&
  +            mbean->getAttribute != NULL ) {
  +            void *result=mbean->getAttribute( env, mbean, attName );
  +            s->jkprintf( env, s, "OK:%s:%s", cName, attName );
  +            s->jkprintf( env, s, "%s", result );
  +            return JK_OK;
  +        }
  +    }
  +    s->jkprintf( env, s, "ERROR: mbean not found %s\n", cName );
  +    return JK_OK;
  +}
  +
  +static int JK_METHOD jk2_worker_status_set(jk_env_t *env,
  +                                           jk_worker_t *w, 
  +                                           jk_ws_service_t *s)
  +{
  +    char *cName=s->query_string + 4;
  +    char *attVal=rindex(cName, ':' );
  +    char *attName;
  +    int i;
  +    
  +    if( attVal == NULL ) {
  +        s->jkprintf( env, s, "ERROR: no attribute value found %s\n", cName);
  +        return JK_OK;
  +    }
  +    *attVal='\0';
  +    attVal++;
  +    
  +    attName=rindex( cName, ':' );
  +    if( attName == NULL ) {
  +        s->jkprintf( env, s, "ERROR: attribute name not found\n", cName);
  +        return JK_OK;
  +    }
  +    *attName='\0';
  +    attName++;
  +    for( i=0; i < env->_objects->size( env, env->_objects ); i++ ) {
  +        char *name=env->_objects->nameAt( env, env->_objects, i );
  +        jk_bean_t *mbean=env->_objects->valueAt( env, env->_objects, i );
  +        
  +        if( mbean==NULL ) 
  +            continue;
  +        
  +        if( strcmp( name, cName ) == 0 &&
  +            mbean->setAttribute != NULL ) {
  +            int res=mbean->setAttribute( env, mbean, attName, attVal );
  +            s->jkprintf( env, s, "OK:%s:%s:%d", cName, attName, res );
  +            return JK_OK;
  +        }
  +    }
  +    s->jkprintf( env, s, "ERROR: mbean not found %s\n", cName );
  +    return JK_OK;
  +}
  +
   static int JK_METHOD jk2_worker_status_service(jk_env_t *env,
                                                  jk_worker_t *w, 
                                                  jk_ws_service_t *s)
  @@ -441,119 +630,47 @@
   
       if( strcmp( s->query_string, "scoreboard.reset" ) == 0 ) {
           jk2_worker_status_resetScoreboard(env, s, s->workerEnv );
  +        s->jkprintf(env, s, "Scoreboard reset\n"  );
       }
   
  -    if( strncmp( s->query_string, "get=", 4) == 0 ) {
  -        /* Get a jmx-like attribute. Very inefficient ( only one attribute per req 
) - but it doesn't
  -           happen too often. We should do a POST */
  -        char *cName=s->query_string + 4;
  -        char *attName=rindex(cName, ':' );
  -        int i;
  +    /* Reset the scoreboard */
  +    if( strncmp( s->query_string, "rst=",4 ) == 0 ) {
  +        jk2_worker_status_resetScoreboard(env, s, s->workerEnv );
  +        s->jkprintf(env, s, "Scoreboard reset\n"  );
  +        return JK_OK;
  +    }
  +
  +    /* Increment the scoreboard version counter, reload */
  +    if( strncmp( s->query_string, "rld=",4 ) == 0 ) {
  +        jk_shm_t *shm=w->workerEnv->shm;
           
  -        if( attName == NULL ) {
  -            s->jkprintf( env, s, "ERROR: no attribute found %s\n", cName);
  -            return JK_OK;
  -        }
  -        *attName='\0';
  -        attName++;
  -        for( i=0; i < env->_objects->size( env, env->_objects ); i++ ) {
  -            char *name=env->_objects->nameAt( env, env->_objects, i );
  -            jk_bean_t *mbean=env->_objects->valueAt( env, env->_objects, i );
  -
  -            if( mbean==NULL ) 
  -                continue;
  -
  -            if( strcmp( name, cName ) == 0 &&
  -                mbean->getAttribute != NULL ) {
  -                char *value=mbean->getAttribute( env, mbean, attName );
  -                if( value!=NULL && (*value != '\0') ) {
  -                    s->jkprintf( env, s, "%s", value );
  -                } else {
  -                    s->jkprintf( env, s, "NULL" );
  -                }
  -                return JK_OK;
  -            }
  -        }
  -        s->jkprintf( env, s, "ERROR: attribute not found %s %s", cName, attName );
  +        /* Update the scoreboard's version - all other
  +           jk2 processes will see this and update
  +        */
  +        if( shm!=NULL && shm->head!=NULL )
  +            shm->head->lbVer++;
  +        s->jkprintf(env, s, "Updated config version to %d\n", shm->head->lbVer  );
           return JK_OK;
       }
  -    if( strncmp( s->query_string, "qry=", 4) == 0 ) {
  -        char *cName=s->query_string + 4;
  -        int i,j;
  -        
  -        if( *cName== '\0' ) {
  -            /* No string - list all components */
  -            for( i=0; i < env->_objects->size( env, env->_objects ); i++ ) {
  -                char *name=env->_objects->nameAt( env, env->_objects, i );
  -                jk_bean_t *mbean=env->_objects->valueAt( env, env->_objects, i );
  -                char **getAtt=mbean->getAttributeInfo;
  -                char **setAtt=mbean->setAttributeInfo;
  -                
  -                if( mbean==NULL ) 
  -                    continue;
  -                
  -                s->jkprintf(env, s, "%s %s\n", name, mbean->type );
  -            } 
  -        } else {
  -            /* List all attributes of an object */
  -
  -            for( i=0; i < env->_objects->size( env, env->_objects ); i++ ) {
  -                char *name=env->_objects->nameAt( env, env->_objects, i );
  -                jk_bean_t *mbean=env->_objects->valueAt( env, env->_objects, i );
  -                char **getAtt=mbean->getAttributeInfo;
  -                char **setAtt=mbean->setAttributeInfo;
  -
  -                if( mbean==NULL || getAtt==NULL ) 
  -                    continue;
  -                 
  -                if( strcmp( name, cName ) == 0 ) {
  -                    while( getAtt != NULL && *getAtt != NULL && **getAtt!='\0' ) {
  -                        char *attName=*getAtt;
  -                        char *val=mbean->getAttribute(env, mbean, *getAtt );
  -                        s->jkprintf(env, s, "%s %s %s\n", name, *getAtt, 
(val==NULL)? "NULL": val);
  -                        getAtt++;
  -                    }
  -                }
  -            } 
  -        }
  -        return JK_OK;  
  +
  +    /** list all mbeans and their attributes  */
  +    if( strncmp( s->query_string, "lst=", 4) == 0 ) {
  +        return jk2_worker_status_list(env, w, s);
  +    }
  +
  +    /** Dump multiple attributes  */
  +    if( strncmp( s->query_string, "dmp=", 4) == 0 ) {
  +        return jk2_worker_status_dmp(env, w, s);
       }
  +
  +    /** Get a single attribute. This also works for attributes that are not listed 
in getAtt **/
  +    if( strncmp( s->query_string, "get=", 4) == 0 ) {
  +        return jk2_worker_status_get(env, w, s);
  +    }
  +
  +    /** Set an attribute. Works for attributes that are not listed in setAtt **/
       if( strncmp( s->query_string, "set=", 4) == 0 ) {
  -        char *cName=s->query_string + 4;
  -        char *attVal=rindex(cName, ':' );
  -        char *attName;
  -        int i;
  -        
  -        if( attVal == NULL ) {
  -            s->jkprintf( env, s, "ERROR: no attribute value found %s\n", cName);
  -            return JK_OK;
  -        }
  -        *attVal='\0';
  -        attVal++;
  -        
  -        attName=rindex( cName, ':' );
  -        if( attName == NULL ) {
  -            s->jkprintf( env, s, "ERROR: attribute name not found\n", cName);
  -            return JK_OK;
  -        }
  -        *attName='\0';
  -        attName++;
  -        for( i=0; i < env->_objects->size( env, env->_objects ); i++ ) {
  -            char *name=env->_objects->nameAt( env, env->_objects, i );
  -            jk_bean_t *mbean=env->_objects->valueAt( env, env->_objects, i );
  -
  -            if( mbean==NULL ) 
  -                continue;
  -
  -            if( strcmp( name, cName ) == 0 &&
  -                mbean->getAttribute != NULL ) {
  -                int res=mbean->setAttribute( env, mbean, attName, attVal );
  -                s->jkprintf( env, s, "%d", res );
  -                return JK_OK;
  -            }
  -        }
  -        s->jkprintf( env, s, "ERROR: mbean not found %d\n", cName );
  -        return JK_OK;
  +        return jk2_worker_status_set(env, w, s);
       }
   
       w->workerEnv->config->update( env, w->workerEnv->config, &didUpdate );
  
  
  

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

Reply via email to