📄 jk_config.c
字号:
} if( strcmp( name, "info" ) == 0 ) { /* do nothing, this is a comment */ return JK_OK; } if( (mbean == cfg->mbean) && (strcmp( name, "file" ) == 0 ) && cfg->file != NULL ) { /* 'file' property on ourself, avoid rec. */ if( cfg->mbean->debug > 0 ) env->l->jkLog(env, env->l, JK_LOG_DEBUG, "config.setAttribute() ignore %s %s %s\n", mbean->name, name, val ); return JK_OK; } if(mbean->setAttribute) { int rc= mbean->setAttribute( env, mbean, name, val ); if( rc != JK_OK ) { env->l->jkLog(env, env->l, JK_LOG_INFO, "config.setAttribute() Error setting %s %s %s\n", mbean->name, name, val ); } if( cfg->mbean->debug > 0 ) env->l->jkLog(env, env->l, JK_LOG_DEBUG, "config.setAttribute() %d setting %s %s %s\n", cfg->mbean->debug, mbean->name, name, val ); return rc; } return JK_ERR;}int jk2_config_setPropertyString(jk_env_t *env, jk_config_t *cfg, char *name, char *value){ jk_bean_t *mbean; jk_workerEnv_t *wEnv=cfg->workerEnv; jk_map_t *initData=cfg->map; int status; char *objName=NULL; char *propName=NULL; /* fprintf( stderr, "setPropertyString %s %s \n", name, value ); */ status=jk2_config_processBeanPropertyString(env, cfg, name, &objName, &propName ); if( status!=JK_OK ) { /* Unknown properties ends up in our config, as 'unclaimed' or global */ cfg->setProperty( env, cfg, cfg->mbean, name, value ); return status; } /** Replace properties in the object name */ objName = jk2_config_replaceProperties(env, cfg->map, cfg->map->pool, objName); mbean=env->getBean( env, objName ); if( mbean==NULL ) { mbean=env->createBean( env, cfg->pool, objName ); } if( mbean == NULL ) { /* Can't create it, save the value in our map */ cfg->setProperty( env, cfg, cfg->mbean, name, value ); return JK_ERR; } if( mbean->settings == NULL ) jk2_map_default_create(env, &mbean->settings, cfg->pool); return cfg->setProperty( env, cfg, mbean, propName, value );}/** * Replace $(property) in value. * */char *jk2_config_replaceProperties(jk_env_t *env, jk_map_t *m, struct jk_pool *resultPool, char *value){ char *rc; char *env_start; int rec = 0; int didReplace=JK_FALSE; rc = value; env_start = value; while(env_start = strstr(env_start, "${")) { char *env_end = strstr(env_start, "}"); if( rec++ > 20 ) return rc; if(env_end) { char env_name[LENGTH_OF_LINE + 1] = ""; char *env_value; strncpy(env_name, env_start + 2, (env_end-env_start)-2); env_value = m->get(env, m, env_name); if(env_value == NULL ) { env_value=getenv( env_name ); } /* fprintf(stderr, "XXXjk_map %s %s \n", env_name, env_value ); */ if(env_value != NULL ) { int offset=0; /* tmp allocations in tmpPool */ char *new_value = env->tmpPool->calloc(env, env->tmpPool, (strlen(rc) + strlen(env_value))); if(!new_value) { break; } if( env_start == rc ) { new_value[0]='\0'; } else { strncpy(new_value, rc, env_start-rc); } /* fprintf(stderr, "XXX %s %s %s\n", new_value, env_value, env_end + 1 ); */ strcat(new_value, env_value); strcat(new_value, env_end + 1); offset= env_start - rc + strlen( env_value ); rc = new_value; /* Avoid recursive subst */ env_start = rc + offset; didReplace=JK_TRUE; } else { env_start = env_end; } } else { break; } } if( didReplace && resultPool!=NULL && resultPool != env->tmpPool ) { /* Make sure the result is allocated in the right mempool. tmpPool will be reset for each request. */ rc=resultPool->pstrdup( env, resultPool, rc ); } return rc;}/* -------------------- Reconfiguration -------------------- *//** cfgData has component names as keys and a map of attributes as value. * We'll create the beans and call the setters. * If this is not firstTime, we create new componens and modify those * with a lower 'ver'. * * Note that _no_ object can be ever destroyed. You can 'disable' them, * but _never_ remove/destroy it. We work in a multithreaded environment, * and any removal may have disastrous consequences. Using critical * sections would drastically affect the performance. */int jk2_config_processConfigData(jk_env_t *env, jk_config_t *cfg,int firstTime ){ int i; int rc; for( i=0; i<cfg->cfgData->size( env, cfg->cfgData ); i++ ) { char *name=cfg->cfgData->nameAt(env, cfg->cfgData, i); rc=cfg->processNode(env, cfg , name, firstTime); } return rc;}int jk2_config_processNode(jk_env_t *env, jk_config_t *cfg, char *name, int firstTime ){ int j; jk_map_t *prefNode=cfg->cfgData->get(env, cfg->cfgData, name); jk_bean_t *bean; int ver; char *verString; if( cfg->mbean->debug > 5 ) env->l->jkLog(env, env->l, JK_LOG_DEBUG, "config.setConfig(): process %s\n", name ); bean=env->getBean( env, name ); if( bean==NULL ) { if( cfg->mbean->debug > 0 ) { env->l->jkLog(env, env->l, JK_LOG_DEBUG, "config.setConfig(): Creating %s\n", name ); } bean=env->createBean( env, cfg->pool, name ); } if( bean == NULL ) { /* Can't create it, save the value in our map */ env->l->jkLog(env, env->l, JK_LOG_ERROR, "config.update(): Can't create %s\n", name ); return JK_ERR; } verString= prefNode->get( env, prefNode, "ver" ); if( !firstTime ) { if( verString == NULL ) { return JK_OK; } ver=atoi( verString ); if( ver <= bean->ver) { /* Object didn't change */ return JK_OK; } } if( !firstTime ) env->l->jkLog(env, env->l, JK_LOG_INFO, "config.update(): Updating %s\n", name ); /* XXX Maybe we shoud destroy/init ? */ for( j=0; j<prefNode->size( env, prefNode ); j++ ) { char *pname=prefNode->nameAt(env, prefNode, j); char *pvalue=prefNode->valueAt(env, prefNode, j); cfg->setProperty( env, cfg, bean, pname, pvalue ); } return JK_OK;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -