code: public static ProcessOutput executeProcess(ConfigurationHolder configurationHolder,String command)
      {
          //get process executer class name
          String className=configurationHolder.getConfigurationValue(ProcessExecutor.PROCESS_EXECUTER_CLASS_NAME_PROPERTY_KEY);
          if(className==null)
          {
              className=DefaultProcessExecutor.class.getName();
          }
          
          //get process executer from cache
          ProcessExecutor processExecutor=ProcessExecutorHelper.PROCESS_EXECUTERS.get(className);
          if(processExecutor==null)
          {
              //create new process executer (no need to synchronize as it won't impact anything if we create more
              //than 1 process executer of same type)
              processExecutor=(ProcessExecutor)ReflectionHelper.createInstance(className);
              
              //put in cache
              ProcessExecutorHelper.PROCESS_EXECUTERS.put(className,processExecutor);
          }
  
          ProcessOutput processOutput=null;
          try
          {
              //execute process
              processOutput=processExecutor.executeProcess(configurationHolder,command);
          }
          catch(RuntimeException exception)
          {
              throw exception;
          }
          catch(Exception exception)
          {
              throw new FaxException("Error while invoking process, command: "+command,exception);
          }
          
          return processOutput;
      }
docs: This function executes the given command and returns the process output.
  
  @param   configurationHolder
  The configuration holder used when invoking the process
  @param   command
  The command to execute
  @return  The process output