122 lines
4.7 KiB
C#
122 lines
4.7 KiB
C#
// /**
|
|
// * File: ManagedObjectDescriptor.cs
|
|
// * Author: haraldwolff
|
|
// *
|
|
// * This file and it's content is copyrighted by the Author and / or copyright holder.
|
|
// * Any use wihtout proper permission is illegal and may lead to legal actions.
|
|
// *
|
|
// *
|
|
// **/
|
|
using System;
|
|
using System.Reflection;
|
|
using ln.json;
|
|
using ln.types.net;
|
|
using ln.json.attributes;
|
|
namespace ln.manage
|
|
{
|
|
public class PropertyDescriptorAttribute : Attribute
|
|
{
|
|
public string Group { get; set; }
|
|
public string Alias { get; set; }
|
|
public bool ReadOnly { get; set; }
|
|
public string LookupPath { get; set; }
|
|
|
|
public bool Identity { get; set; }
|
|
}
|
|
|
|
public class PropertyDescriptor
|
|
{
|
|
public IManagedContainer Container { get; }
|
|
|
|
public string PropertyGroup { get; }
|
|
public string PropertyName { get; }
|
|
public Type PropertyType { get; }
|
|
|
|
public bool ReadOnly { get; }
|
|
public string LookupPath { get; }
|
|
|
|
public bool Identity { get; }
|
|
|
|
public PropertyDescriptor(IManagedContainer container, string propertyGoup, string propertyName, Type propertyType, bool readOnly, string lookupPath, bool identity)
|
|
{
|
|
Container = container;
|
|
PropertyGroup = propertyGoup;
|
|
PropertyName = propertyName;
|
|
PropertyType = propertyType;
|
|
ReadOnly = readOnly;
|
|
LookupPath = lookupPath;
|
|
Identity = identity;
|
|
}
|
|
public PropertyDescriptor(IManagedContainer container, FieldInfo fieldInfo)
|
|
: this(container, fieldInfo.GetCustomAttribute<PropertyDescriptorAttribute>()?.Group, fieldInfo.GetCustomAttribute<PropertyDescriptorAttribute>()?.Alias ?? fieldInfo.Name, fieldInfo.FieldType, fieldInfo.GetCustomAttribute<PropertyDescriptorAttribute>()?.ReadOnly ?? fieldInfo.IsInitOnly, fieldInfo.GetCustomAttribute<PropertyDescriptorAttribute>()?.LookupPath, fieldInfo.GetCustomAttribute<PropertyDescriptorAttribute>()?.Identity ?? false)
|
|
{ }
|
|
public PropertyDescriptor(IManagedContainer container, PropertyInfo propertyInfo)
|
|
: this(container, propertyInfo.GetCustomAttribute<PropertyDescriptorAttribute>()?.Group, propertyInfo.GetCustomAttribute<PropertyDescriptorAttribute>()?.Alias ?? propertyInfo.Name, propertyInfo.PropertyType, propertyInfo.GetCustomAttribute<PropertyDescriptorAttribute>()?.ReadOnly ?? !propertyInfo.CanWrite, propertyInfo.GetCustomAttribute<PropertyDescriptorAttribute>()?.LookupPath, propertyInfo.GetCustomAttribute<PropertyDescriptorAttribute>()?.Identity ?? false)
|
|
{ }
|
|
|
|
public JSONObject CreateJsonDescriptor()
|
|
{
|
|
JSONObject descriptor = new JSONObject();
|
|
|
|
descriptor["name"] = PropertyName;
|
|
descriptor["readonly"] = ReadOnly;
|
|
|
|
if (typeof(string).Equals(PropertyType))
|
|
{
|
|
descriptor["type"] = "string";
|
|
}
|
|
else if (typeof(int).Equals(PropertyType))
|
|
{
|
|
descriptor["type"] = "int";
|
|
}
|
|
else if (typeof(double).Equals(PropertyType))
|
|
{
|
|
descriptor["type"] = "double";
|
|
}
|
|
else if (typeof(IPv4).Equals(PropertyType))
|
|
{
|
|
descriptor["type"] = "ip4";
|
|
}
|
|
else if (typeof(IPv6).Equals(PropertyType))
|
|
{
|
|
descriptor["type"] = "ip6";
|
|
}
|
|
else if (typeof(MAC).Equals(PropertyType))
|
|
{
|
|
descriptor["type"] = "mac";
|
|
}
|
|
else if (PropertyType.IsEnum)
|
|
{
|
|
if (PropertyType.GetCustomAttribute<FlagsAttribute>() != null)
|
|
{
|
|
JSONObject type = new JSONObject();
|
|
string[] names = Enum.GetNames(PropertyType);
|
|
int[] values = (int[])Enum.GetValues(PropertyType);
|
|
for (int n = 0; n < names.Length; n++)
|
|
type[names[n]] = values[n];
|
|
descriptor["type"] = type;
|
|
}
|
|
else
|
|
{
|
|
JSONArray type = new JSONArray();
|
|
string[] symbols = Enum.GetNames(PropertyType);
|
|
foreach (string symbol in symbols)
|
|
type.Add(symbol);
|
|
descriptor["type"] = type;
|
|
}
|
|
}
|
|
else if (LookupPath != null)
|
|
{
|
|
// ToDo: Implement Referenced Objects
|
|
throw new NotImplementedException();
|
|
}
|
|
else
|
|
{
|
|
throw new NotSupportedException();
|
|
}
|
|
|
|
return descriptor;
|
|
}
|
|
}
|
|
}
|