/// <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); }
/// <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; }