예제 #1
0
 public static void SetOrOverwriteValue(ServableItem serviceObj, object thisObj, object parentObj)
 {
     if (serviceObj.PropertyInfo != null)    // property
     {
         serviceObj.PropertyInfo.SetValue(serviceObj.Object, thisObj);
         // OK ... it really is set now ... but it won't show up in the next GET unless we update the reference
         serviceObj.Object = serviceObj.PropertyInfo.GetValue(parentObj); // this ref now points to where it is in the parent
     }
     else                                                                 // field
     {
         serviceObj.FieldInfo.SetValue(serviceObj.Object, thisObj);
         // OK ... it really is set now ... but it won't show up in the next GET unless we update the reference
         serviceObj.Object = serviceObj.FieldInfo.GetValue(parentObj); // this ref now points to where it is in the parent
     }
 }
예제 #2
0
        private List <ServableItem> ReflectServableItems()
        {
            // Find all GhostLine API attributes in other assemblies
            Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();

            // check out the assemblies
            foreach (var assembly in assemblies)
            {
                Log("Assembly found: " + assembly.FullName, LogLevel.Verbose);
                if (!assembly.FullName.StartsWith("System.") &&
                    !assembly.FullName.Equals("GhostLineAPI") &&
                    !assembly.FullName.StartsWith("Microsoft"))
                {
                    _monitoredAssemblies.Add(assembly);
                }
            }

            // look for the fields and properties
            foreach (var assembly in _monitoredAssemblies)
            {
                foreach (var typeObj in assembly.GetTypes())
                {
                    PropertyInfo[] props = typeObj.GetProperties();
                    foreach (PropertyInfo prop in props)
                    {
                        object[] attrs = prop.GetCustomAttributes(true);
                        foreach (object attr in attrs)
                        {
                            GhostReadAttribute      gra  = attr as GhostReadAttribute;
                            GhostWriteAttribute     gwa  = attr as GhostWriteAttribute;
                            GhostReadWriteAttribute grwa = attr as GhostReadWriteAttribute;
                            GhostAttribute          ga   = attr as GhostAttribute;
                            if (gra != null || gwa != null || grwa != null)
                            {
                                var servableItem = new ServableItem
                                {
                                    AssemblyFullName = assembly.FullName,
                                    Type             = prop.PropertyType,
                                    PropertyName     = prop.Name
                                };
                                servableItem.GenerateId();


                                var checkItem = _servableItems.FirstOrDefault(si => si.Id == servableItem.Id);

                                if (checkItem != null)
                                {
                                    servableItem = checkItem;
                                }
                                else
                                {
                                    // flesh out the rest
                                    if (_parentObj == null)
                                    {
                                        String message = "Must pass instance object (usually \"this\") when annotating properties due to .NET reflection access restrictions.";
                                        Log(message, LogLevel.Critical);
                                        throw new ArgumentException(message);
                                    }
                                    servableItem.Object       = prop.GetValue(_parentObj);
                                    servableItem.PropertyInfo = prop;
                                }

                                if (gra != null || grwa != null)
                                {
                                    servableItem.CanRead        = true;
                                    servableItem.Version        = ga.Version;
                                    servableItem.OverriddenName = ga.OverrideName;
                                }
                                if (gwa != null || grwa != null)
                                {
                                    servableItem.CanWrite       = true;
                                    servableItem.Version        = ga.Version;
                                    servableItem.OverriddenName = ga.OverrideName;
                                }
                                _servableItems.Add(servableItem);
                            }
                        }
                    }

                    FieldInfo[] fields = typeObj.GetFields();
                    foreach (FieldInfo field in fields)
                    {
                        object[] attrs = field.GetCustomAttributes(true);
                        foreach (object attr in attrs)
                        {
                            GhostReadAttribute      gra  = attr as GhostReadAttribute;
                            GhostWriteAttribute     gwa  = attr as GhostWriteAttribute;
                            GhostReadWriteAttribute grwa = attr as GhostReadWriteAttribute;
                            GhostAttribute          ga   = attr as GhostAttribute;
                            if (gra != null || gwa != null || grwa != null)
                            {
                                var servableItem = new ServableItem
                                {
                                    AssemblyFullName = assembly.FullName,
                                    Type             = field.FieldType,
                                    FieldName        = field.Name,
                                };
                                servableItem.GenerateId();

                                // check to see if this is already a servable item
                                var checkItem = _servableItems.FirstOrDefault(si => si.Id == servableItem.Id);
                                if (checkItem != null)
                                {
                                    servableItem = checkItem;
                                }
                                else
                                {
                                    // flesh out the rest
                                    if (_parentObj == null)
                                    {
                                        String message = "Must pass instance object (usually \"this\") when annotating properties due to .NET reflection access restrictions.";
                                        Log(message, LogLevel.Critical);
                                        throw new ArgumentException(message);
                                    }
                                    servableItem.Object    = field.GetValue(field.Name);
                                    servableItem.FieldInfo = field;
                                }

                                if (gra != null || grwa != null)
                                {
                                    servableItem.CanRead        = true;
                                    servableItem.Version        = ga.Version;
                                    servableItem.OverriddenName = ga.OverrideName;
                                }
                                if (gwa != null || grwa != null)
                                {
                                    servableItem.CanWrite       = true;
                                    servableItem.Version        = ga.Version;
                                    servableItem.OverriddenName = ga.OverrideName;
                                }
                                _servableItems.Add(servableItem);
                            }
                        }
                    }

                    // all properties and fields should now be in _servableItems
                }
            }
            return(_servableItems);
        }
예제 #3
0
        private bool HandleOneRequest(HttpListener listener, HttpListenerContext context, HttpListenerRequest request, HttpListenerResponse response)
        {
            bool done = false;
            // Note: The GetContext method blocks while waiting for a request.

            Stopwatch sw2 = new Stopwatch();

            sw2.Start();

            string payload = string.Empty;

            using (var reader = new StreamReader(request.InputStream, Encoding.UTF8))
            {
                payload = reader.ReadToEnd();
            }

            if (payload.Equals("DONE"))
            {
                done = true;
            }

            string responseString = "No response. Unable to pair request to existing data.";

            if (Authenticator == null || Authenticator(request))
            {
                if (Before != null)
                {
                    Before();
                }

                if (Validator != null)
                {
                    var validationResponse = Validator(request);
                    if (!validationResponse.Success ||
                        validationResponse.Messages.Any(m => m.ValidationType == ValidationMessageType.Failure))
                    {
                        response.StatusCode = (int)HttpStatusCode.BadRequest;
                        StringBuilder responseInfo = new StringBuilder();
                        foreach (var message in validationResponse.Messages)
                        {
                            responseInfo.Append($"{Enum.GetName(typeof(ValidationMessageType), message.ValidationType)} {message.Message} ");
                        }
                        responseString = responseInfo.ToString();
                    }
                }

                if (response.StatusCode != (int)HttpStatusCode.BadRequest)
                {
                    // get the value
                    var name = request.Url.ToString();     // {http://127.0.0.1:19001/UntrainedElkDogs} or {http://127.0.0.1:19001/v1/UntrainedElkDogs}
                    name = name.TrimEnd('/');
                    var tokens = name.Split('/');

                    // TODO: the version number isn't always a version number
                    var versionNumber = tokens[tokens.Length - 2];
                    var objectName    = tokens[tokens.Length - 1]; // the last one should correspond to the property or object name
                    if (objectName.Contains('?'))
                    {
                        objectName = objectName.Split("?")[0];
                    }

                    String fail = String.Empty;
                    if (!_servableItems.Any(si => si.AccessName.Equals(objectName)))
                    {
                        // try checking the next to last one (i.e. if there is a version number)
                        objectName = tokens[tokens.Length - 2];
                        if (!_servableItems.Any(si => si.AccessName.Equals(objectName)))
                        {
                            versionNumber = "v1";   // default
                        }
                        else
                        {
                            // no recognizable object name from the URL in servable itmes
                            fail = "No recognizable object name from the URL in servable itmes";
                        }
                    }

                    if (String.IsNullOrEmpty(fail))
                    {
                        var filterKeys = request.QueryString;
                        // get original name matches or overridden name matches
                        var check = _servableItems.Where(si => si.AccessName.Equals(objectName, StringComparison.InvariantCultureIgnoreCase));

                        var directmatches   = _servableItems.Where(si => si.AccessName.Equals(objectName, StringComparison.InvariantCultureIgnoreCase)).ToList();
                        var overrideMatches = _servableItems.Where(si =>
                                                                   (!String.IsNullOrWhiteSpace(si.OverriddenName) && si.OverriddenName.Equals(objectName, StringComparison.InvariantCultureIgnoreCase))).ToList();
                        var serviceObjs = directmatches.Union(overrideMatches).ToList();

                        ServableItem serviceObj = null;
                        if (serviceObjs.Count == 1)
                        {
                            // no ambiguity ... go with it
                            serviceObj = serviceObjs.First();
                        }
                        else
                        {
                            // use version number
                            serviceObj = serviceObjs.First(so => so.Version.Equals(versionNumber, StringComparison.InvariantCultureIgnoreCase));
                        }

                        var methodHandler = HandlerGenerator.GetHandler(request, filterKeys, serviceObj, payload);
                        methodHandler.Handle(ref response);
                        responseString = methodHandler.ResponseString;
                    }
                    else
                    {
                        responseString      = fail;
                        response.StatusCode = (int)HttpStatusCode.BadRequest;
                    }
                }
            }
            else
            {
                response.StatusCode = (int)HttpStatusCode.Forbidden;
            }

            if (After != null)
            {
                After();
            }

            // Construct a response.

            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
            // Get a response stream and write the response to it.
            response.ContentLength64 = buffer.Length;
            System.IO.Stream output = response.OutputStream;
            output.Write(buffer, 0, buffer.Length);
            // You must close the output stream.
            output.Close();
            Log($"Wrote: {responseString} with Http Code: {response.StatusCode}", LogLevel.Verbose);

            sw2.Stop();
            Log($"Response process time: {sw2.ElapsedMilliseconds} milliseconds", LogLevel.Info);

            return(done);
        }
예제 #4
0
        private void ReflectServableItems()
        {
            // Find all GhostLine API attributes in other assemblies
            Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();

            // check out the assemblies
            foreach (var assembly in assemblies)
            {
                //Console.WriteLine("Assembly found: " + assembly.FullName);
                if (!assembly.FullName.StartsWith("System.") && !assembly.FullName.Equals("GhostLineAPI"))
                {
                    _monitoredAssemblies.Add(assembly);
                }
            }

            // look for the fields and properties
            foreach (var assembly in _monitoredAssemblies)
            {
                foreach (var typeObj in assembly.GetTypes())
                {
//                    PropertyInfo[] props = typeObj.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);   // this clips out everything .. ?
                    PropertyInfo[] props = typeObj.GetProperties();
                    foreach (PropertyInfo prop in props)
                    {
                        object[] attrs = prop.GetCustomAttributes(true);
                        foreach (object attr in attrs)
                        {
                            GhostReadAttribute  gra = attr as GhostReadAttribute;
                            GhostWriteAttribute gwa = attr as GhostWriteAttribute;
                            if (gra != null || gwa != null)
                            {
                                var servableItem = new ServableItem
                                {
                                    AssemblyFullName = assembly.FullName,
                                    Type             = prop.PropertyType,
                                    PropertyName     = prop.Name
                                };
                                servableItem.GenerateId();

                                // check to see if this is already a servable item
                                //if (_servableItems.ContainsKey(servableItem.Id))
                                var checkItem = _servableItems.FirstOrDefault(si => si.Id == servableItem.Id);
                                //if (_servableItems.Any( si => si.Id == servableItem.Id))
                                if (checkItem != null)
                                {
                                    //servableItem = _servableItems[servableItem.Id];
                                    //servableItem = _servableItems.First(si => si.Id == servableItem.Id);
                                    servableItem = checkItem;
                                }
                                else
                                {
                                    // flesh out the rest
                                    if (_parentObj == null)
                                    {
                                        throw new ArgumentException("Must pass instance object (usually \"this\") as ParentObj when annotating properties due to .NET reflection access restrictions.");
                                    }
                                    servableItem.Object       = prop.GetValue(_parentObj);
                                    servableItem.PropertyInfo = prop;
                                }

                                if (gra != null)
                                {
                                    servableItem.CanRead = true;
                                }
                                if (gwa != null)
                                {
                                    servableItem.CanWrite = true;
                                }
                                _servableItems.Add(servableItem);
                            }
                        }
                    }

                    FieldInfo[] fields = typeObj.GetFields();
                    foreach (FieldInfo field in fields)
                    {
                        object[] attrs = field.GetCustomAttributes(true);
                        foreach (object attr in attrs)
                        {
                            GhostReadAttribute  gra = attr as GhostReadAttribute;
                            GhostWriteAttribute gwa = attr as GhostWriteAttribute;
                            if (gra != null || gwa != null)
                            {
                                var servableItem = new ServableItem
                                {
                                    AssemblyFullName = assembly.FullName,
                                    Type             = field.FieldType, //.PropertyType,
                                    FieldName        = field.Name       //prop.Name
                                };
                                servableItem.GenerateId();

                                // check to see if this is already a servable item
                                var checkItem = _servableItems.FirstOrDefault(si => si.Id == servableItem.Id);
                                if (checkItem != null)
                                {
                                    servableItem = checkItem;
                                }
                                else
                                {
                                    // flesh out the rest
                                    if (_parentObj == null)
                                    {
                                        throw new ArgumentException("Must pass instance object (usually \"this\") when annotating properties due to .NET reflection access restrictions.");
                                    }
                                    servableItem.Object    = field.GetValue(field.Name);
                                    servableItem.FieldInfo = field;
                                }

                                if (gra != null)
                                {
                                    servableItem.CanRead = true;
                                }
                                if (gwa != null)
                                {
                                    servableItem.CanWrite = true;
                                }
                                _servableItems.Add(servableItem);
                            }
                        }
                    }

                    // all properties and fields should now be in _servableItems
                }
            }
        }