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]