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]

Reply via email to