public static IPromise<IEditorProxy> FromConn(ConnectionData conn)
    {
      Func<ConnectionData, IPromise<IEditorProxy>> factory;
      if (_factories.TryGetValue(conn.Type, out factory))
      {
        return factory.Invoke(conn);
      }
      else
      {
        switch (conn.Type)
        {
          case ConnectionType.Innovator:
            return conn.ArasLogin(true)
              .Convert(c => (IEditorProxy)new Editor.ArasEditorProxy(c, conn.ConnectionName)
              {
                ConnData = conn
              });
          case ConnectionType.Soap:
            var service = new Innovator.Client.Connection.DefaultHttpService();
            return service.Execute("GET", conn.Url, null, null, true, null)
              .Convert(r =>
              {
                ServiceDescription descrip;
                using (var reader = new StreamReader(r.AsStream))
                using (var xml = XmlReader.Create(reader))
                {
                  descrip = ServiceDescription.Read(xml);
                }

                return (IEditorProxy)new Editor.SoapEditorProxy(conn, descrip
                  , Editor.XmlSchemas.SchemasFromDescrip(descrip));
              });
          case ConnectionType.SqlServer:
            return Promises.Resolved<IEditorProxy>(new Editor.SqlEditorProxy(conn));
          case ConnectionType.Sharepoint:
            return new Editor.SharepointEditorProxy(conn).Initialize().ToPromise();
        }
        return Promises.Rejected<IEditorProxy>(new NotSupportedException("Unsupported connection type"));
      }
    }
    public Innovator.Client.IPromise<IResultObject> Process(ICommand request, bool async)
    {
      var soapCmd = request as SoapCommand;
      if (soapCmd == null)
        throw new InvalidOperationException("The request must be of type 'SoapCommand'");

      var http = new Innovator.Client.Connection.DefaultHttpService();
      return http.Execute("POST", _baseUrl, null, _cred, true, r =>
      {
        r.SetHeader("SOAPAction", "\"" + _actionUrls[soapCmd.Action] + "\"");
        r.SetContent(w => w.Write(soapCmd.Query), "text/xml;charset=UTF-8");
      }).Convert(r => (IResultObject)new SoapResult(r.AsStream));
    }