예제 #1
0
파일: APIBase.cs 프로젝트: radtek/safeid
        /// <summary>
        /// Método stático que realiza a criação da instância da classe derivada que precessará o método em questão
        /// O método passado pela requisição JSON será no seguinte formato 'classe.metodo' ex.: 'user.login'
        /// Onde 'user' é o nome da classe obrigatoriamente derivada daesta classe 'APIBase' e
        /// 'login' é o método que a classe 'user' deverá executar.
        ///
        /// Esta chamada fará os seguintes passos:
        /// 1 - Varredura em todos os assembly contidos nesta dll
        /// 2 - Busca todos que são derivados desta classe 'APIBase'
        /// 3 - Verifica se o nome da classe é igual ao nome passado no parâmetro 'method'
        /// </summary>
        /// <param name="method">Método que deverá ser executado no formato classe.metodo</param>
        public static APIBase CreateInstance(String method)
        {
            method = method.ToLower();
            String[] mp = method.Split(".".ToCharArray(), 2);

            if (mp.Length != 2)
            {
                return(null);
            }

            try
            {
                List <Type> types = new List <Type>();

                //Seleciona todos os tipos de todos os assemblies carregados
                //Filtrado se é classe e pelo nome do método desejado
                foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies())
                {
                    try
                    {
                        types.AddRange(from t in asm.GetTypes()
                                       where t.IsClass && t.Name.ToLower() == mp[0]
                                       select t
                                       );
                    }
                    catch { }
                }

                foreach (Type type in types)
                {
                    if (!type.IsClass)
                    {
                        continue;
                    }

                    if (type.Name.ToLower() == mp[0])
                    {
                        Type baseType = type.BaseType;
                        while (baseType != null)
                        {
                            if (baseType.Equals(typeof(APIBase)))
                            {
                                object  obj = Activator.CreateInstance(type);
                                APIBase t   = (APIBase)obj;
                                return(t);
                            }
                            baseType = baseType.BaseType;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                //Console.WriteLine("PluginManager error: " + ex.Message);
            }

            return(null);
        }
예제 #2
0
        /// <summary>
        /// Método pricado que executa cada uma das requisições separadamente.
        /// </summary>
        private void _executeCall(Controller controller)
        {
            Dictionary <String, Object> request = controller.Request;

            String id = "";

            if (request.ContainsKey("id"))
            {
                id = request["id"].ToString();
            }

            if (!validate(request))
            {
                return;
            }

            Dictionary <String, Object> _parameters = new Dictionary <string, object>();

            try
            {
                _parameters = (Dictionary <String, Object>)request["parameters"];
            }
            catch { }
            String _auth = (request.ContainsKey("auth") ? (String)request["auth"] : "");

            //Cria a instancia da classe com base no método requerido
            APIBase processor = APIBase.CreateInstance(request["method"].ToString());

            if (processor == null)
            {
                _setError(id, ErrorType.InvalidRequest, "JSON-rpc method class is unknow.", "", null, true);
                return;
            }

            Error onError = new Error(delegate(ErrorType type, String data, String debug, Dictionary <String, Object> additionslReturn)
            {
                _setError(id, type, data, debug, additionslReturn, false);
            });

            ExternalAccessControl eAuth = new ExternalAccessControl(delegate(String method, String auth, AccessControl preCtrl, Dictionary <String, Object> paramters)
            {
                return(ExternalAccessControl(method, auth, preCtrl, paramters));
            });

            //Define os eventos
            processor.Error += onError;
            if (ExternalAccessControl != null)
            {
                processor.ExternalAccessControl += eAuth;
            }

            //Realiza o processamento
            Object oResult = null;

            try
            {
                oResult = processor.Process(this._database, this._enterpriseId, request["method"].ToString(), _auth, _parameters);
            }
            catch (Exception ex) {
                _setError(id, ErrorType.InternalError, null, ex.Message + ex.StackTrace, null, false);
            }

            //Limpa os eventos
            processor.Error -= onError;
            if (ExternalAccessControl != null)
            {
                processor.ExternalAccessControl += eAuth;
            }
            onError = null;
            eAuth   = null;

            //Define o retorno
            if (!this.IsError)
            {
                _setResponse(id, oResult);
            }

            controller.acl = processor.Acl;
        }