コード例 #1
0
        public T Create(string xukLN, string xukNS)
        {
            //string qname = String.Format("{0}:{1}", xukNS, xukLN);
            UglyPrettyName name  = new UglyPrettyName(!PrettyFormat ? xukLN : null, PrettyFormat ? xukLN : null);
            QualifiedName  qname = new QualifiedName(name, xukNS);

            Type t = LookupType(qname);

            if (t == null)
            {
#if DEBUG
                Debugger.Break();
#endif
                return(null);
            }

            T obj = Create(t);

            TypeAndQNames tt = LookupTypeAndQNames(qname);
            DebugFix.Assert(tt != null);
            if (tt.Type == null)
            {
                // not real type of qname => type of first available ancestor in the type inheritance chain.
                obj.MissingTypeOriginalXukedName = tt.QName;
            }

            return(obj);
        }
コード例 #2
0
        private Type LookupType(QualifiedName qname)
        {
            if (qname == null)
            {
#if DEBUG
                Debugger.Break();
#endif
                return(null);
            }

            TypeAndQNames typeAndQNames = LookupTypeAndQNames(qname);
            if (typeAndQNames != null)
            {
                if (typeAndQNames.Type != null)
                {
                    return(typeAndQNames.Type);
                }
#if DEBUG
                Debugger.Break();
#endif
                return(LookupType(typeAndQNames.BaseQName));
            }
#if DEBUG
            Debugger.Break();
#endif
            return(null);
        }
コード例 #3
0
        private TypeAndQNames RegisterType(Type t)
        {
            if (!typeof(T).IsAssignableFrom(t))
            {
                string msg = String.Format(
                    "Only Types inheriting {0} can be registered with the factory", typeof(T).FullName);
                throw new MethodParameterIsWrongTypeException(msg);
            }
            if (t.IsAbstract)
            {
                string msg = String.Format(
                    "The abstract Type {0} cannot be registered with the factory", t.FullName);
                throw new MethodParameterIsWrongTypeException(msg);
            }
            TypeAndQNames tq = new TypeAndQNames();

            tq.QName        = GetXukQualifiedName(t);
            tq.Type         = t;
            tq.ClassName    = t.FullName;
            tq.AssemblyName = t.Assembly.GetName();

tryAgain:
            if (t.BaseType != null && typeof(T).IsAssignableFrom(t.BaseType)) // && t.BaseType != typeof(T))
            {
                if (t.BaseType.IsAbstract)
                {
                    t = t.BaseType;
                    goto tryAgain;
                }

                TypeAndQNames existing = typeAlreadyRegistered(t.BaseType);
                if (existing == null)
                {
                    QualifiedName qCheck = XukAble.GetXukQualifiedName(t.BaseType);
                    if (string.IsNullOrEmpty(qCheck.NamespaceUri) ||
                        qCheck.LocalName == null ||
                        string.IsNullOrEmpty(qCheck.LocalName.Pretty) ||
                        string.IsNullOrEmpty(qCheck.LocalName.Ugly))
                    {
#if DEBUG
                        Debugger.Break();
#endif
                        t = t.BaseType;
                        goto tryAgain;
                    }

                    existing = RegisterType(t.BaseType);
                }

                if (existing != null)
                {
                    tq.BaseQName = new QualifiedName(
                        new UglyPrettyName(existing.QName.LocalName.Ugly, existing.QName.LocalName.Pretty),
                        existing.QName.NamespaceUri);
                }
            }

            RegisterType(tq);
            return(tq);
        }
コード例 #4
0
        protected void XukInRegisteredType(XmlReader source)
        {
            if (Type_NAME.Match(source.LocalName) &&
                source.NamespaceURI == XukAble.XUK_NS)
            {
                TypeAndQNames tq = new TypeAndQNames();

                readTypeAndQNamesFromXmlReader(tq, source, PrettyFormat);

                if (tq.Type == null)
                {
#if DEBUG
                    Debugger.Break();
#endif
                    RegisterType(tq);
                }
                else
                {
                    TypeAndQNames tq_ = RegisterType(tq.Type);

                    DebugFix.Assert(tq_.AssemblyName.Name == tq.AssemblyName.Name);
                    //DebugFix.Assert(tq_.AssemblyName.Version == tq.AssemblyName.Version);

                    DebugFix.Assert(tq_.ClassName == tq.ClassName);
                    DebugFix.Assert(tq_.Type == tq.Type);

                    DebugFix.Assert(tq_.QName.NamespaceUri == tq.QName.NamespaceUri);

                    DebugFix.Assert(tq_.QName.LocalName.Ugly == tq.QName.LocalName.Ugly);
                    DebugFix.Assert(tq_.QName.LocalName.Pretty == tq.QName.LocalName.Pretty);

                    if (tq_.BaseQName != null && tq.BaseQName != null)
                    {
                        DebugFix.Assert(tq_.BaseQName.NamespaceUri == tq.BaseQName.NamespaceUri);

                        if (!String.IsNullOrEmpty(tq.BaseQName.LocalName.Ugly))
                        {
                            DebugFix.Assert(tq_.BaseQName.LocalName.Ugly == tq.BaseQName.LocalName.Ugly);
                        }

                        if (!String.IsNullOrEmpty(tq.BaseQName.LocalName.Pretty))
                        {
                            DebugFix.Assert(tq_.BaseQName.LocalName.Pretty == tq.BaseQName.LocalName.Pretty);
                        }
                    }
                }
            }
            if (!source.IsEmptyElement)
            {
                source.ReadSubtree().Close();
            }
        }
コード例 #5
0
        private void readTypeAndQNamesFromXmlReader(TypeAndQNames tq, XmlReader rd, bool pretty)
        {
            tq.AssemblyName = new AssemblyName(ReadXukAttribute(rd, AssemblyName_NAME));

            if (ReadXukAttribute(rd, AssemblyVersion_NAME) != null)
            {
                tq.AssemblyName.Version = new Version(ReadXukAttribute(rd, AssemblyVersion_NAME));
            }

            tq.ClassName = ReadXukAttribute(rd, FullName_NAME);

            if (tq.AssemblyName != null && tq.ClassName != null)
            {
                try
                {
                    Assembly a = Assembly.Load(tq.AssemblyName);
                    try
                    {
                        tq.Type = a.GetType(tq.ClassName);
                    }
                    catch (Exception ex)
                    {
#if DEBUG
                        Debugger.Break();
#endif
                        Console.WriteLine("ClassName: " + tq.ClassName);
                        Console.WriteLine(ex.Message);
                        Console.WriteLine(ex.StackTrace);

                        tq.Type = null;
                    }
                }
                catch (Exception ex)
                {
#if DEBUG
                    Debugger.Break();
#endif
                    Console.WriteLine("AssemblyName: " + tq.AssemblyName);
                    Console.WriteLine(ex.Message);
                    Console.WriteLine(ex.StackTrace);
                    tq.Type = null;
                }
            }
            else
            {
#if DEBUG
                Debugger.Break();
#endif
                Console.WriteLine("Type XukIn error?!");
                Console.WriteLine("AssemblyName: " + tq.AssemblyName);
                Console.WriteLine("ClassName: " + tq.ClassName);

                tq.Type = null;
            }

            string xukLocalName = ReadXukAttribute(rd, XukLocalName_NAME);

            UglyPrettyName name = null;

            if (tq.Type != null)
            {
                UglyPrettyName nameCheck = GetXukName(tq.Type);
                DebugFix.Assert(nameCheck != null);

                if (nameCheck != null)
                {
                    if (pretty)
                    {
                        DebugFix.Assert(xukLocalName == nameCheck.Pretty);
                    }
                    else
                    {
                        DebugFix.Assert(xukLocalName == nameCheck.Ugly);
                    }

                    name = nameCheck;
                }
            }

            DebugFix.Assert(name != null);
            if (name == null)
            {
                name = new UglyPrettyName(
                    !pretty ? xukLocalName : null,
                    pretty ? xukLocalName : null);
            }

            tq.QName = new QualifiedName(
                name,
                ReadXukAttribute(rd, XukNamespaceUri_NAME) ?? "");

            string baseXukLocalName = ReadXukAttribute(rd, BaseXukLocalName_NAME);
            if (!string.IsNullOrEmpty(baseXukLocalName))
            {
                UglyPrettyName nameBase = new UglyPrettyName(
                    !pretty ? baseXukLocalName : null,
                    pretty ? baseXukLocalName : null);

                tq.BaseQName = new QualifiedName(
                    nameBase,
                    ReadXukAttribute(rd, BaseXukNamespaceUri_NAME) ?? "");
            }
            else
            {
                tq.BaseQName = null;
            }
        }
コード例 #6
0
        //public void RefreshQNames()
        //{
        //    foreach (TypeAndQNames tq in mRegisteredTypeAndQNames)
        //    {
        //        if (tq.Type != null)
        //        {
        //            tq.QName = GetXukQualifiedName(tq.Type);

        //            if (tq.BaseQName != null
        //                && tq.Type.BaseType != null)
        //            {
        //                tq.BaseQName = GetXukQualifiedName(tq.Type.BaseType);
        //            }
        //        }
        //    }
        //    {
        //        Dictionary<string, TypeAndQNames> newDict = new Dictionary<string, TypeAndQNames>();
        //        Dictionary<string, TypeAndQNames>.Enumerator enu = mRegisteredTypeAndQNamesByQualifiedName.GetEnumerator();
        //        while (enu.MoveNext())
        //        {
        //            KeyValuePair<string, TypeAndQNames> pair = enu.Current;
        //            TypeAndQNames tq = new TypeAndQNames();
        //            if (pair.Value.Type != null)
        //            {
        //                tq.QName = GetXukQualifiedName(pair.Value.Type);
        //                tq.Type = pair.Value.Type;
        //                tq.ClassName = pair.Value.Type.FullName;
        //                tq.AssemblyName = pair.Value.Type.Assembly.GetName();
        //                if (pair.Value.BaseQName != null)
        //                {
        //                    tq.BaseQName = GetXukQualifiedName(pair.Value.Type.BaseType);
        //                }
        //            }
        //            else
        //            {
        //                tq.QName = new QualifiedName(pair.Value.QName.LocalName, pair.Value.QName.NamespaceUri);
        //                tq.Type = null;
        //                tq.ClassName = pair.Value.ClassName;
        //                tq.AssemblyName = pair.Value.AssemblyName;
        //                if (pair.Value.BaseQName != null)
        //                {
        //                    tq.BaseQName = new QualifiedName(pair.Value.BaseQName.LocalName, pair.Value.BaseQName.NamespaceUri);
        //                }
        //            }
        //            newDict.Add(tq.QName.FullyQualifiedName, tq);
        //        }
        //        mRegisteredTypeAndQNamesByQualifiedName.Clear();
        //        mRegisteredTypeAndQNamesByQualifiedName = newDict;
        //    }

        //    {
        //        Dictionary<Type, TypeAndQNames> newDict = new Dictionary<Type, TypeAndQNames>();
        //        Dictionary<Type, TypeAndQNames>.Enumerator enu = mRegisteredTypeAndQNamesByType.GetEnumerator();
        //        while (enu.MoveNext())
        //        {
        //            KeyValuePair<Type, TypeAndQNames> pair = enu.Current;
        //            TypeAndQNames tq = new TypeAndQNames();

        //            if (pair.Value.Type != null)
        //            {
        //                tq.QName = GetXukQualifiedName(pair.Value.Type);
        //                tq.Type = pair.Value.Type;
        //                tq.ClassName = pair.Value.Type.FullName;
        //                tq.AssemblyName = pair.Value.Type.Assembly.GetName();
        //                if (pair.Value.BaseQName != null)
        //                {
        //                    tq.BaseQName = GetXukQualifiedName(pair.Value.Type.BaseType);
        //                }
        //                newDict.Add(pair.Value.Type, tq);
        //            }
        //        }
        //        mRegisteredTypeAndQNamesByType.Clear();
        //        mRegisteredTypeAndQNamesByType = newDict;
        //    }
        //}

        private void RegisterType(TypeAndQNames tq)
        {
            DebugFix.Assert(tq.Type != null);

            bool isTypeAlreadyRegistered = false;

            if (tq.Type != null)
            {
                isTypeAlreadyRegistered = typeAlreadyRegistered(tq.Type) != null;
            }

            foreach (TypeAndQNames typeAndQNames in mRegisteredTypeAndQNames)
            {
                // Does this QName resolve an existing registered BaseQName?
                if (typeAndQNames.BaseQName != null

                    && (string.IsNullOrEmpty(typeAndQNames.BaseQName.LocalName.Ugly) ||
                        string.IsNullOrEmpty(typeAndQNames.BaseQName.LocalName.Pretty))

                    && typeAndQNames.BaseQName.NamespaceUri == tq.QName.NamespaceUri

                    && (tq.QName.LocalName.Ugly != null && typeAndQNames.BaseQName.LocalName.Ugly == tq.QName.LocalName.Ugly ||
                        tq.QName.LocalName.Pretty != null && typeAndQNames.BaseQName.LocalName.Pretty == tq.QName.LocalName.Pretty)
                    )
                {
#if DEBUG
                    Debugger.Break();
#endif
                    string ugly   = typeAndQNames.BaseQName.LocalName.Ugly ?? tq.QName.LocalName.Ugly;
                    string pretty = typeAndQNames.BaseQName.LocalName.Pretty ?? tq.QName.LocalName.Pretty;

                    DebugFix.Assert(!string.IsNullOrEmpty(ugly));
                    DebugFix.Assert(!string.IsNullOrEmpty(pretty));

                    typeAndQNames.BaseQName = new QualifiedName(new UglyPrettyName(ugly, pretty), typeAndQNames.BaseQName.NamespaceUri);
                }

                // Can this BaseQName be resolved by an existing registered QName?
                if (tq.BaseQName != null

                    && (string.IsNullOrEmpty(tq.BaseQName.LocalName.Ugly) ||
                        string.IsNullOrEmpty(tq.BaseQName.LocalName.Pretty))

                    && tq.BaseQName.NamespaceUri == typeAndQNames.QName.NamespaceUri

                    && (typeAndQNames.QName.LocalName.Ugly != null && tq.BaseQName.LocalName.Ugly == typeAndQNames.QName.LocalName.Ugly ||
                        typeAndQNames.QName.LocalName.Pretty != null && tq.BaseQName.LocalName.Pretty == typeAndQNames.QName.LocalName.Pretty)
                    )
                {
#if DEBUG
                    Debugger.Break();
#endif
                    string ugly   = tq.BaseQName.LocalName.Ugly ?? typeAndQNames.QName.LocalName.Ugly;
                    string pretty = tq.BaseQName.LocalName.Pretty ?? typeAndQNames.QName.LocalName.Pretty;

                    DebugFix.Assert(!string.IsNullOrEmpty(ugly));
                    DebugFix.Assert(!string.IsNullOrEmpty(pretty));

                    tq.BaseQName = new QualifiedName(new UglyPrettyName(ugly, pretty), tq.BaseQName.NamespaceUri);
                }
            }

            //DebugFix.Assert(!isTypeAlreadyRegistered);

            if (!isTypeAlreadyRegistered)
            {
                mRegisteredTypeAndQNames.Add(tq);
            }
        }