Author: rjung Date: Sun Aug 27 08:13:11 2006 New Revision: 437381 URL: http://svn.apache.org/viewvc?rev=437381&view=rev Log: Implement hierarchical worker configuration via attribute "reference". Documentation still needed.
Modified: tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c tomcat/connectors/trunk/jk/native/common/jk_map.c tomcat/connectors/trunk/jk/native/common/jk_map.h Modified: tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c?rev=437381&r1=437380&r2=437381&view=diff ============================================================================== --- tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c (original) +++ tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c Sun Aug 27 08:13:11 2006 @@ -2180,6 +2180,10 @@ ap_add_version_component(JK_EXPOSED_VERSION); #endif + if (jk_map_resolve_references(JK_WORKER_NAME_TAG ".", 1, 1) == JK_FALSE) { + jk_error_exit(APLOG_MARK, APLOG_EMERG, s, p, "Error in resolving configuration references"); + } + /* we add the URI->WORKER MAP since workers using AJP14 will feed it */ worker_env.uri_to_worker = conf->uw_map; worker_env.virtual = "*"; /* for now */ Modified: tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c?rev=437381&r1=437380&r2=437381&view=diff ============================================================================== --- tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c (original) +++ tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c Sun Aug 27 08:13:11 2006 @@ -2430,6 +2430,10 @@ } } + if (jk_map_resolve_references(init_map, "worker.", 1, 1, conf->log) == JK_FALSE) { + jk_error_exit(APLOG_MARK, APLOG_EMERG, s, pconf, "Error in resolving configuration references"); + } + /* we add the URI->WORKER MAP since workers using AJP14 will feed it */ worker_env.uri_to_worker = conf->uw_map; Modified: tomcat/connectors/trunk/jk/native/common/jk_map.c URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_map.c?rev=437381&r1=437380&r2=437381&view=diff ============================================================================== --- tomcat/connectors/trunk/jk/native/common/jk_map.c (original) +++ tomcat/connectors/trunk/jk/native/common/jk_map.c Sun Aug 27 08:13:11 2006 @@ -29,8 +29,11 @@ #include "jk_util.h" #include "jk_map.h" -#define CAPACITY_INC_SIZE (50) -#define LENGTH_OF_LINE (8192) +#define CAPACITY_INC_SIZE (50) +#define LENGTH_OF_LINE (8192) +#define JK_MAP_RECURSION (20) +#define JK_MAP_REFERENCE (".reference") +#define JK_MAP_REFERENCE_SZ (strlen(JK_MAP_REFERENCE)) #ifdef AS400 #define CASE_MASK 0xbfbfbfbf @@ -309,6 +312,27 @@ return ar; } +int jk_map_add(jk_map_t *m, const char *name, const void *value) +{ + int rc = JK_FALSE; + + if (m && name) { + unsigned int key; + COMPUTE_KEY_CHECKSUM(name, key) + map_realloc(m); + + if (m->size < m->capacity) { + m->values[m->size] = value; + m->names[m->size] = jk_pool_strdup(&m->p, name); + m->keys[m->size] = key; + m->size++; + rc = JK_TRUE; + } + } + + return rc; +} + int jk_map_put(jk_map_t *m, const char *name, const void *value, void **old) { int rc = JK_FALSE; @@ -330,15 +354,7 @@ rc = JK_TRUE; } else { - map_realloc(m); - - if (m->size < m->capacity) { - m->values[m->size] = value; - m->names[m->size] = jk_pool_strdup(&m->p, name); - m->keys[m->size] = key; - m->size++; - rc = JK_TRUE; - } + rc = jk_map_add(m, name, value); } } @@ -600,5 +616,104 @@ } } + return rc; +} + +/** + * Resolve references + * + */ +int jk_map_resolve_references(jk_map_t *m, const char *prefix, + int wildcard, int depth, jk_logger_t *l) +{ + int rc = JK_FALSE; + + JK_TRACE_ENTER(l); + + if (m && prefix && depth <= JK_MAP_RECURSION) { + size_t prelen = strlen(prefix); + unsigned int i; + rc = JK_TRUE; + if (JK_IS_DEBUG_LEVEL(l)) + jk_log(l, JK_LOG_DEBUG, + "Checking for references with prefix %s with%s wildcard (recursion %d)", + prefix, wildcard? "" : "out", depth); + for (i = 0; i < m->size; i++) { + if (m->values[i] && !strncmp(m->names[i], prefix, prelen)) { + size_t remain = strlen(m->names[i]) - prelen; + if ((remain == JK_MAP_REFERENCE_SZ ) || (wildcard && remain > JK_MAP_REFERENCE_SZ)) { + remain = strlen(m->names[i]) - JK_MAP_REFERENCE_SZ; + if (!strncmp(m->names[i] + remain, JK_MAP_REFERENCE, JK_MAP_REFERENCE_SZ)) { + char *from = jk_pool_alloc(&m->p, + (sizeof(char) * + (strlen(m->values[i]) + 2))); + char *to = jk_pool_alloc(&m->p, + (sizeof(char) * + (remain + 2))); + if (!from || !to) { + rc = JK_FALSE; + break; + } + strcpy(from, m->values[i]); + *(from+strlen(m->values[i])) = '.'; + *(from+strlen(m->values[i])+1) = '\0'; + strncpy(to, m->names[i], remain); + *(to+remain) = '.'; + *(to+remain+1) = '\0'; + + rc = jk_map_resolve_references(m, m->values[i], 0, ++depth, l); + if (rc == JK_FALSE) { + break; + } + if (JK_IS_DEBUG_LEVEL(l)) + jk_log(l, JK_LOG_DEBUG, + "Copying values from %s to %s", + from, to); + rc = jk_map_inherit_properties(m, from, to); + if (rc == JK_FALSE) { + break; + } + m->values[i] = NULL; + } + } + } + } + } + JK_TRACE_EXIT(l); + return rc; +} + +/** + * Inherit properties + * + */ +int jk_map_inherit_properties(jk_map_t *m, const char *from, const char *to) +{ + int rc = JK_FALSE; + + if (m && from && to) { + unsigned int i; + rc = JK_TRUE; + for (i = 0; i < m->size; i++) { + if (!strncmp(m->names[i], from, strlen(from))) { + const char *prp = m->names[i] + strlen(from); + char *to_prp = jk_pool_alloc(&m->p, + (sizeof(char) * + (strlen(to) + + strlen(prp) + 1))); + if (!to_prp) { + break; + } + strcpy(to_prp, to); + strcat(to_prp, prp); + if (jk_map_get_id(m, to_prp) < 0 ) { + rc = jk_map_add(m, to_prp, m->values[i]); + if (rc == JK_FALSE) { + break; + } + } + } + } + } return rc; } Modified: tomcat/connectors/trunk/jk/native/common/jk_map.h URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_map.h?rev=437381&r1=437380&r2=437381&view=diff ============================================================================== --- tomcat/connectors/trunk/jk/native/common/jk_map.h (original) +++ tomcat/connectors/trunk/jk/native/common/jk_map.h Sun Aug 27 08:13:11 2006 @@ -57,6 +57,8 @@ const char *name, unsigned *list_len, const char *def); +int jk_map_add(jk_map_t *m, const char *name, const void *value); + int jk_map_put(jk_map_t *m, const char *name, const void *value, void **old); int jk_map_read_property(jk_map_t *m, const char *str, jk_logger_t *l); @@ -74,6 +76,10 @@ * */ char *jk_map_replace_properties(jk_map_t *m, const char *value); + +int jk_map_resolve_references(jk_map_t *m, const char *prefix, int wildcard, int depth, jk_logger_t *l); + +int jk_map_inherit_properties(jk_map_t *m, const char *from, const char *to); #ifdef __cplusplus } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]