mturk       2002/10/13 00:41:47

  Modified:    jk/native2/common jk_uriMap.c
  Log:
  Duplicate all global directives on each vhost that has
  inheritGlobals set. Directives are created using createBean only if
  not found. Beside directives, the webapps are duplicated to.
  
  Revision  Changes    Path
  1.52      +212 -35   jakarta-tomcat-connectors/jk/native2/common/jk_uriMap.c
  
  Index: jk_uriMap.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_uriMap.c,v
  retrieving revision 1.51
  retrieving revision 1.52
  diff -u -r1.51 -r1.52
  --- jk_uriMap.c       9 Oct 2002 17:08:09 -0000       1.51
  +++ jk_uriMap.c       13 Oct 2002 07:41:47 -0000      1.52
  @@ -292,17 +292,16 @@
               if (strcasecmp(name, vhost) == 0)
                   return uriEnv;
           }
  -    }
  -    /* Then for each vhost, check the aliases */
  -    for (i = 0 ; i < n ; i++) {
  -        jk_uriEnv_t *uriEnv = uriMap->vhosts->valueAt(env, uriMap->vhosts, i);
  -        name = uriMap->vhosts->nameAt(env, uriMap->vhosts, i);
  -        if (uriEnv->aliases && vhost) {
  -            int m = uriEnv->aliases->size(env, uriEnv->aliases);
  -            for (j = 0; j < m; j++) {
  -                name = uriEnv->aliases->nameAt(env, uriEnv->aliases, j);
  -                if (strcasecmp(name, hostname) == 0)
  -                    return uriEnv;
  +        /* Then for each vhost, check the aliases */
  +        for (i = 0 ; i < n ; i++) {
  +            jk_uriEnv_t *uriEnv = uriMap->vhosts->valueAt(env, uriMap->vhosts, i);
  +            if (uriEnv->aliases) {
  +                int m = uriEnv->aliases->size(env, uriEnv->aliases);
  +                for (j = 0; j < m; j++) {
  +                    name = uriEnv->aliases->nameAt(env, uriEnv->aliases, j);
  +                    if (strcasecmp(name, hostname) == 0)
  +                        return uriEnv;
  +                }
               }
           }
       }
  @@ -451,7 +450,7 @@
   
               env->l->jkLog(env, env->l, JK_LOG_INFO,
                             "uriMap: creating context %s\n", ctxname);
  -            mbean = env->getBean2(env, "uri", context);
  +            mbean = env->getBean2(env, "uri", ctxname);
               if (mbean == NULL)
                   mbean = env->createBean2(env, uriMap->pool,"uri", ctxname);
               if (mbean == NULL || mbean->object == NULL) {
  @@ -463,6 +462,8 @@
               ctxEnv->match_type = MATCH_TYPE_CONTEXT;
               ctxEnv->prefix = context;
               ctxEnv->prefix_len = strlen(context);
  +            ctxEnv->contextPath = context;
  +            ctxEnv->ctxt_len = strlen(context);
               hostEnv->webapps->put(env, hostEnv->webapps, context, ctxEnv, NULL);
               jk2_map_default_create(env, &ctxEnv->exactMatch, uriMap->pool);
               jk2_map_default_create(env, &ctxEnv->prefixMatch, uriMap->pool);
  @@ -472,35 +473,15 @@
   
   }
   
  -static int jk2_uriMap_init(jk_env_t *env, jk_uriMap_t *uriMap)
  +static int jk2_uriMap_createMappings(jk_env_t *env, jk_uriMap_t *uriMap)
   {
  -    int rc = JK_OK;
       int i;
  -    jk_workerEnv_t *workerEnv = uriMap->workerEnv;
  -    jk_bean_t *mbean = env->getBean2(env, "uri", "*");
  -
  -    /* create the default server */
  -    if (mbean == NULL) {
  -        mbean = env->createBean2(env, workerEnv->pool,"uri", "*");
  -        if (mbean == NULL || mbean->object == NULL) {
  -            env->l->jkLog(env, env->l, JK_LOG_ERROR,
  -                          "uriMap.factory() Fail to create default host\n");
  -            return JK_ERR;
  -        }
  -    }
  -
  -    /* Create virtual hosts and initialize them */
  -    jk2_uriMap_createHosts(env, uriMap);
  -
  -    /* Create webapps and initialize them */
  -    jk2_uriMap_createWebapps(env, uriMap);
   
       if (uriMap->mbean->debug > 5) 
           env->l->jkLog(env, env->l, JK_LOG_DEBUG,
                         "uriMap.init() processing mappings\n");
  -
  -    /* All other mappings are added in the right context leaf.
  -       XXX We should also sort prefix mappings and maybe use binary search - but
  +    
  +    /* XXX We should also sort prefix mappings and maybe use binary search - but
          it won't have too bigger benefits, the number of mappings per ctx is 
typically 
          small
        */
  @@ -560,6 +541,202 @@
                   break;
           }
       }
  +    return JK_OK;
  +}
  +
  +static jk_uriEnv_t* jk2_uriMap_duplicateUri(jk_env_t *env, jk_uriMap_t *uriMap,
  +                                            jk_uriEnv_t *uriEnv, jk_uriEnv_t 
*mapEnv)
  +{
  +    char *uriname;
  +    jk_uriEnv_t *newEnv;
  +    jk_bean_t *mbean;
  +
  +    uriname = uriEnv->pool->calloc(env, uriEnv->pool, strlen(uriEnv->name) + 
  +                                   strlen(mapEnv->uri) + 1 );
  +
  +    strcpy(uriname, uriEnv->name);
  +    strcat(uriname, mapEnv->uri);
  +
  +    env->l->jkLog(env, env->l, JK_LOG_INFO,
  +        "uriMap: creating duplicate of  uri %s\n", uriname);
  +    mbean = env->getBean2(env, "uri", uriname);
  +    if (mbean == NULL)
  +        mbean = env->createBean2(env, uriMap->pool,"uri", uriname);
  +    if (mbean == NULL || mbean->object == NULL) {
  +        env->l->jkLog(env, env->l, JK_LOG_ERROR,
  +            "uriMap: can't create uri object %s\n", uriname);
  +        return NULL;
  +    }
  +    newEnv = mbean->object;
  +    newEnv->match_type = mapEnv->match_type;
  +    newEnv->prefix = mapEnv->prefix;
  +    newEnv->prefix_len = mapEnv->prefix_len;
  +    newEnv->contextPath = mapEnv->contextPath;
  +    newEnv->ctxt_len = mapEnv->ctxt_len;
  +    newEnv->worker = mapEnv->worker;
  +    newEnv->workerName = mapEnv->workerName;
  +    newEnv->workerEnv = mapEnv->workerEnv;
  +    
  +    return newEnv;
  +}
  +
  +static jk_uriEnv_t* jk2_uriMap_duplicateContext(jk_env_t *env, jk_uriMap_t *uriMap,
  +                                            jk_uriEnv_t *uriEnv, jk_uriEnv_t 
*mapEnv)
  +{
  +    char *uriname;
  +    jk_uriEnv_t *newEnv;
  +    jk_bean_t *mbean;
  +
  +    uriname = uriEnv->pool->calloc(env, uriEnv->pool, strlen(uriEnv->name) + 
  +                                   strlen(mapEnv->contextPath) + 1 );
  +
  +    strcpy(uriname, uriEnv->name);
  +    strcat(uriname, mapEnv->contextPath);
  +
  +    env->l->jkLog(env, env->l, JK_LOG_INFO,
  +        "uriMap: creating duplicate of context %s\n", uriname);
  +    mbean = env->getBean2(env, "uri", uriname);
  +    if (mbean == NULL)
  +        mbean = env->createBean2(env, uriMap->pool,"uri", uriname);
  +    if (mbean == NULL || mbean->object == NULL) {
  +        env->l->jkLog(env, env->l, JK_LOG_ERROR,
  +            "uriMap: can't create uri object %s\n", uriname);
  +        return NULL;
  +    }
  +    newEnv = mbean->object;
  +    newEnv->match_type = mapEnv->match_type;
  +    newEnv->prefix = mapEnv->prefix;
  +    newEnv->prefix_len = mapEnv->prefix_len;
  +    newEnv->contextPath = mapEnv->contextPath;
  +    newEnv->ctxt_len = mapEnv->ctxt_len;
  +    newEnv->worker = mapEnv->worker;
  +    newEnv->workerName = mapEnv->workerName;
  +    newEnv->workerEnv = mapEnv->workerEnv;
  +
  +    jk2_map_default_create(env, &newEnv->exactMatch, uriMap->pool);
  +    jk2_map_default_create(env, &newEnv->prefixMatch, uriMap->pool);
  +    jk2_map_default_create(env, &newEnv->suffixMatch, uriMap->pool);
  +
  +    return newEnv;
  +}
  +
  +static int jk2_uriMap_createGlobals(jk_env_t *env, jk_uriMap_t *uriMap)
  +{
  +    int i, n;
  +    jk_uriEnv_t *globalEnv;
  +
  +    if (uriMap->mbean->debug > 5) 
  +        env->l->jkLog(env, env->l, JK_LOG_DEBUG,
  +                      "uriMap.init() creating global mappings\n");
  +    globalEnv = uriMap->vhosts->get(env, uriMap->vhosts, "*");
  +
  +    n = uriMap->vhosts->size(env, uriMap->vhosts);
  +    for (i = 0 ; i < n ; i++) {
  +        jk_uriEnv_t *uriEnv = uriMap->vhosts->valueAt(env, uriMap->vhosts, i);
  +        /* Duplicate globals for each vhost that has inheritGlobals set */
  +        if (uriEnv != globalEnv && uriEnv->inherit_globals) {
  +            int j, m;
  +            env->l->jkLog(env, env->l, JK_LOG_DEBUG,
  +                         "uriMap.init() global for %s\n",
  +                          uriEnv->name);
  +            m = globalEnv->webapps->size(env, globalEnv->webapps);
  +            for (j = 0; j < m; j++) {
  +                jk_uriEnv_t *ctxEnv;
  +                jk_uriEnv_t *appEnv;
  +                int k, l;
  +
  +                ctxEnv = globalEnv->webapps->valueAt(env, globalEnv->webapps, j);
  +                appEnv = uriEnv->webapps->get(env, uriEnv->webapps, 
ctxEnv->contextPath);
  +
  +                /* Create the webapp if it doesn't exists on the selected vhost */
  +                if (!appEnv) {
  +
  +                    appEnv = jk2_uriMap_duplicateContext(env, uriMap, uriEnv, 
ctxEnv);
  +                    uriEnv->webapps->put(env, uriEnv->webapps, appEnv->contextPath, 
appEnv, NULL);
  +                    env->l->jkLog(env, env->l, JK_LOG_DEBUG,
  +                                  "uriMap.init() creating global webapp %s for 
%s\n",
  +                                  appEnv->contextPath, uriEnv->name);
  +                }
  +                /* Fix the exact matches */
  +                l = ctxEnv->exactMatch->size(env, ctxEnv->exactMatch);
  +                for (k = 0; k < l; k++) {
  +                    jk_uriEnv_t *mapEnv;
  +                    jk_uriEnv_t *newEnv;
  +                    
  +                    mapEnv = ctxEnv->exactMatch->valueAt(env, ctxEnv->exactMatch, 
k);
  +                    newEnv = appEnv->exactMatch->get(env, appEnv->exactMatch, 
mapEnv->uri);
  +                    /* Create the new exact match uri */
  +                    if (!newEnv) {
  +                        newEnv = jk2_uriMap_duplicateUri(env, uriMap, uriEnv, 
mapEnv);
  +                        appEnv->exactMatch->put(env, appEnv->exactMatch, 
newEnv->name, newEnv, NULL);
  +                        
  +                    }
  +                }
  +                /* Fix the prefix matches */
  +                l = ctxEnv->prefixMatch->size(env, ctxEnv->prefixMatch);
  +                for (k = 0; k < l; k++) {
  +                    jk_uriEnv_t *mapEnv;
  +                    jk_uriEnv_t *newEnv;
  +                    
  +                    mapEnv = ctxEnv->prefixMatch->valueAt(env, ctxEnv->prefixMatch, 
k);
  +                    newEnv = appEnv->prefixMatch->get(env, appEnv->prefixMatch, 
mapEnv->uri);
  +                    /* Create the new prefix match uri */
  +                    if (!newEnv) {
  +                        newEnv = jk2_uriMap_duplicateUri(env, uriMap, uriEnv, 
mapEnv);
  +                        appEnv->prefixMatch->put(env, appEnv->prefixMatch, 
newEnv->name, newEnv, NULL);                        
  +                    }
  +                }
  +                /* Fix the suffix matches */
  +                l = ctxEnv->suffixMatch->size(env, ctxEnv->suffixMatch);
  +                for (k = 0; k < l; k++) {
  +                    jk_uriEnv_t *mapEnv;
  +                    jk_uriEnv_t *newEnv;
  +                    
  +                    mapEnv = ctxEnv->suffixMatch->valueAt(env, ctxEnv->suffixMatch, 
k);
  +                    newEnv = appEnv->suffixMatch->get(env, appEnv->suffixMatch, 
mapEnv->uri);
  +                    /* Create the new suffix match uri */
  +                    if (!newEnv) {
  +                        newEnv = jk2_uriMap_duplicateUri(env, uriMap, uriEnv, 
mapEnv);
  +                        appEnv->suffixMatch->put(env, appEnv->prefixMatch, 
newEnv->name, newEnv, NULL);                        
  +                    }
  +                }
  +                uriEnv->webapps->put(env, uriEnv->webapps, 
  +                                     appEnv->contextPath, appEnv, NULL);
  +            }
  +        }
  +    }
  +    return JK_OK;
  +}
  +
  +static int jk2_uriMap_init(jk_env_t *env, jk_uriMap_t *uriMap)
  +{
  +    int rc = JK_OK;
  +    jk_workerEnv_t *workerEnv = uriMap->workerEnv;
  +    jk_bean_t *mbean = env->getBean2(env, "uri", "*");
  +
  +    /* create the default server */
  +    if (mbean == NULL) {
  +        mbean = env->createBean2(env, workerEnv->pool,"uri", "*");
  +        if (mbean == NULL || mbean->object == NULL) {
  +            env->l->jkLog(env, env->l, JK_LOG_ERROR,
  +                          "uriMap.factory() Fail to create default host\n");
  +            return JK_ERR;
  +        }
  +    }
  +
  +    /* Create virtual hosts and initialize them */
  +    jk2_uriMap_createHosts(env, uriMap);
  +
  +    /* Create webapps and initialize them */
  +    jk2_uriMap_createWebapps(env, uriMap);
  +
  +    /* All other mappings are added in the right context leaf. */
  +    if ((rc = jk2_uriMap_createMappings(env, uriMap)) != JK_OK)
  +        return rc;
  +
  +    /* Fix the global mappings for virtual hosts */
  +    rc = jk2_uriMap_createGlobals(env, uriMap);
  +
       return rc;
   }
   
  
  
  

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

Reply via email to