Allow the socketservertestcase to be run on Windows
diff --git a/src/test/cpp/CMakeLists.txt b/src/test/cpp/CMakeLists.txt
index 8d5cfbe..91e7a93 100644
--- a/src/test/cpp/CMakeLists.txt
+++ b/src/test/cpp/CMakeLists.txt
@@ -61,7 +61,7 @@
         set(LOG4CXX_DLL_DIR "$<SHELL_PATH:$<TARGET_FILE_DIR:log4cxx>>")
         if(${testName} STREQUAL socketservertestcase)
             set_tests_properties(socketservertestcase PROPERTIES
-                ENVIRONMENT "SOCKET_SERVER_COMMAND=$<JOIN:${START_SOCKET_SERVER_COMMAND}, >;PATH=${LOG4CXX_DLL_DIR}\;${APR_DLL_DIR}\;${APR_UTIL_DLL_DIR}"
+                ENVIRONMENT "SOCKET_SERVER_PARAMETER_FILE=${START_SOCKET_SERVER_PARAMETER_FILE};PATH=${LOG4CXX_DLL_DIR}\;${APR_DLL_DIR}\;${APR_UTIL_DLL_DIR}"
             )
         else()
            set_tests_properties(${testName} PROPERTIES
@@ -71,7 +71,7 @@
     else()
         if(${testName} STREQUAL socketservertestcase)
             set_tests_properties(socketservertestcase PROPERTIES
-                ENVIRONMENT "SOCKET_SERVER_COMMAND=$<JOIN:${START_SOCKET_SERVER_COMMAND}, >"
+                ENVIRONMENT "SOCKET_SERVER_PARAMETER_FILE=${START_SOCKET_SERVER_PARAMETER_FILE}"
             )
         else()
            set_tests_properties(${testName} PROPERTIES
diff --git a/src/test/cpp/net/socketserverstarter.cpp b/src/test/cpp/net/socketserverstarter.cpp
index 59ac0f8..fbb24c4 100644
--- a/src/test/cpp/net/socketserverstarter.cpp
+++ b/src/test/cpp/net/socketserverstarter.cpp
@@ -23,7 +23,7 @@
 #include <apr_strings.h>
 #include <apr_time.h>
 #include <log4cxx/helpers/pool.h>
-
+#include <fstream>
 
 using namespace log4cxx;
 
@@ -48,56 +48,114 @@
      apr_pool_t* pool = p.getAPRPool();
      char* cmd = NULL;
      apr_status_t stat = apr_env_get(&cmd, "SOCKET_SERVER_COMMAND", pool);
+     char* param_file = NULL;
+     stat = apr_env_get(&param_file, "SOCKET_SERVER_PARAMETER_FILE", pool);
+
+     // prepare to launch the server
+     //
+     apr_proc_t server_pid;
+     apr_procattr_t* attr = NULL;
+     stat = apr_procattr_create(&attr, pool);
+     if (stat != APR_SUCCESS)
+         LOGUNIT_FAIL("apr_procattr_create failed");
+     stat = apr_procattr_io_set(attr, APR_NO_PIPE, APR_NO_PIPE, APR_NO_PIPE);
+     if (stat != APR_SUCCESS)
+         LOGUNIT_FAIL("apr_procattr_io_set failed");
+
+     //fprintf(stdout, "SOCKET_SERVER_COMMAND=%s\n", cmd);
+     stat = apr_procattr_cmdtype_set(attr, APR_PROGRAM);
+     if (stat != APR_SUCCESS)
+         LOGUNIT_FAIL("apr_procattr_cmdtype_set failed");
 
      if (cmd && *cmd)
      {
-          // prepare to launch the server
-          //
-          apr_proc_t server_pid;
-          apr_procattr_t* attr = NULL;
-          stat = apr_procattr_create(&attr, pool);
-          LOGUNIT_ASSERT(stat == APR_SUCCESS);
-          stat = apr_procattr_io_set(attr, APR_NO_PIPE, APR_NO_PIPE, APR_NO_PIPE);
-          LOGUNIT_ASSERT(stat == APR_SUCCESS);
-
-          //fprintf(stdout, "SOCKET_SERVER_COMMAND=%s\n", cmd);
-#ifdef SHELL_CMD_TYPE_WORKS
-          stat = apr_procattr_cmdtype_set(attr, APR_SHELLCMD);
-          LOGUNIT_ASSERT(stat == APR_SUCCESS);
-          stat = apr_proc_create(&server_pid, cmd, NULL, NULL, attr, pool);
-#else
-          stat = apr_procattr_cmdtype_set(attr, APR_PROGRAM);
-          LOGUNIT_ASSERT(stat == APR_SUCCESS);
           // convert the space separated cmd string to the argument list
           //
-          char** args = (char**)apr_palloc(pool, 15 * sizeof(*args));
+          static const int MaxArgumentCount = 14;
+          char** argv = (char**)apr_palloc(pool, MaxArgumentCount + 1 * sizeof(*argv));
           char* pcmd = apr_pstrdup(pool, cmd);
           int i = 0;
-          for (; i < 14 && pcmd && *pcmd; ++i)
+          char separ = ' ';
+          for (; i < MaxArgumentCount && pcmd && *pcmd; ++i)
           {
-              args[i] = pcmd;
-              if (NULL != (pcmd = strchr(pcmd, ';')))
+              while(' ' == *pcmd)
               {
-                while(';' == *pcmd)
+                *pcmd = 0;
+                ++pcmd;
+              }
+              if ('"' == *pcmd || '\'' == *pcmd)
+              {
+                 separ = *pcmd;
+                 ++pcmd;
+              }
+              else
+                separ = ' ';
+              argv[i] = pcmd;
+              if (NULL != (pcmd = strchr(pcmd, separ)))
+              {
+                *pcmd = 0;
+                ++pcmd;
+                while(' ' == *pcmd)
                 {
                   *pcmd = 0;
                   ++pcmd;
                 }
               }
           }
-          args[i] = 0;
-          //fprintf(stdout, "starting=%s with %d arguments\n", args[0], i);
-          stat = apr_proc_create(&server_pid, args[0], args, NULL, attr, pool);
-#endif
+          argv[i] = 0;
+          stat = apr_proc_create(&server_pid, argv[0], argv, NULL, attr, pool);
 
 
           if (stat == APR_SUCCESS) // Allow server time to load
               apr_sleep(1000000); // 1 seconds
+          else
+              fprintf(stderr, "apr_proc_create failed to start %s\n", argv[0]);
+     }
+     else if (param_file && *param_file)
+     {
+          // Build the argument list from param_file
+          //
+          //fprintf(stderr, "Processing: %s\n", param_file);
+          std::ifstream in(param_file);
+          std::vector<std::string> params;
+          while (in)
+          {
+              params.push_back(std::string());
+              std::string& line = params.back();
+              std::getline(in, line);
+              while (!line.empty() && ' ' == line.back())
+                 line.pop_back();
+              if (line.empty())
+                  params.pop_back();
+          }
+          const char** argv = (const char**)apr_palloc(pool, params.size() + 1 * sizeof(*argv));
+          int i = 0;
+          for (; i < params.size(); ++i)
+          {
+              argv[i] = params[i].c_str();
+              //fprintf(stderr, "argv[%i]: %s\n", i, argv[i]);
+          }
+          argv[i] = 0;
+          stat = apr_proc_create(&server_pid, argv[0], argv, NULL, attr, pool);
+
+
+          if (stat == APR_SUCCESS) // Allow server time to load
+              apr_sleep(1000000); // 1 seconds
+          else
+              fprintf(stderr, "apr_proc_create failed to start %s\n", argv[0]);
       }
       else
-          fputs("The environment variable SOCKET_SERVER_COMMAND"
+      {
+          fputs("Either:\n", stderr);
+          fputs(" The environment variable SOCKET_SERVER_COMMAND"
                " must contain the server process path"
                " followed by space separated command arguments\n", stderr);
+          fputs("Or:\n", stderr);
+          fputs(" The file named in the environment variable SOCKET_SERVER_PARAMETER_FILE"
+               " must contain a line per argument starting with the server process path"
+               " followed by lines containing command arguments\n", stderr);
+          stat = -1;
+      }
 
       LOGUNIT_ASSERT(stat == APR_SUCCESS);
    }
diff --git a/src/test/java/CMakeLists.txt b/src/test/java/CMakeLists.txt
index ff4af4b..ee93ab6 100644
--- a/src/test/java/CMakeLists.txt
+++ b/src/test/java/CMakeLists.txt
@@ -14,5 +14,20 @@
           --class-path "${log4j_CLASSPATH}" ${SOCKET_SERVER_SOURCES}
   WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
 )
-set(SOCKET_SERVER_CLASSPATH "${CMAKE_CURRENT_BINARY_DIR}:${log4j_CLASSPATH}" )
-set(START_SOCKET_SERVER_COMMAND ${Java_JAVA_EXECUTABLE} --class-path ${SOCKET_SERVER_CLASSPATH} org.apache.log4j.net.ShortSocketServer 8 input/socketServer PARENT_SCOPE)
+if(WIN32)
+  set(SOCKET_SERVER_CLASSPATH "${CMAKE_CURRENT_BINARY_DIR};${log4j_CLASSPATH}")
+else()
+  set(SOCKET_SERVER_CLASSPATH "${CMAKE_CURRENT_BINARY_DIR}:${log4j_CLASSPATH}")
+endif()
+
+# Use a parameter file to avoid issues with processing ';'
+file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/StartSocketServerParams.txt
+"${Java_JAVA_EXECUTABLE}
+-classpath
+${SOCKET_SERVER_CLASSPATH}
+org.apache.log4j.net.ShortSocketServer
+8
+input/socketServer
+"
+)
+set(START_SOCKET_SERVER_PARAMETER_FILE ${CMAKE_CURRENT_BINARY_DIR}/StartSocketServerParams.txt PARENT_SCOPE)