示例#1
0
        private IfdBase CreateDescription(string langid, string desc)
        {
            try
            {
                string         url     = this.m_uri + "api/4.0/IfdDescription?languageGuid=" + langid + "&description=" + desc + "&descriptionType=DEFINITION";
                HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
                request.Method        = "POST";
                request.ContentType   = "application/x-www-form-urlencoded";
                request.ContentLength = 0;
                request.Accept        = "application/json";
                request.Headers.Add("cookie", "peregrineapisessionid=" + this.m_session);
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                Stream          stream   = response.GetResponseStream();

                DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(IfdBase));
                IfdBase ifdRoot = (IfdBase)ser.ReadObject(stream);
                return(ifdRoot);
            }
            catch (Exception xx)
            {
                System.Diagnostics.Debug.WriteLine(xx.Message);
            }

            return(null);
        }
示例#2
0
        private IfdBase CreateDescription(string langid, string desc)
        {
            try
            {
                // convert to form parameter...
                if (desc.Length > 8000)
                {
                    //if (encodedesc.Length > 8000)//8192)
                    //encodedesc = "!BSDD DATA TRANSFER ERROR -- description too large to encode within URL";

                    desc = "[TRUNCATED] " + desc.Substring(0, 8000);// +"||TRUNCATED||";
                }

                string         url     = this.m_uri + "api/4.0/IfdDescription?languageGuid=" + langid + "&description=" + desc + "&descriptionType=DEFINITION";
                HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
                request.Method        = "POST";
                request.ContentType   = "application/x-www-form-urlencoded";
                request.ContentLength = 0;
                request.Accept        = "application/json";
                request.Headers.Add("cookie", "peregrineapisessionid=" + this.m_session);
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                Stream          stream   = response.GetResponseStream();

                DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(IfdBase));
                IfdBase ifdRoot = (IfdBase)ser.ReadObject(stream);
                return(ifdRoot);
            }
            catch (Exception xx)
            {
                System.Diagnostics.Debug.WriteLine(xx.Message);
            }

            return(null);
        }
示例#3
0
        /// <summary>
        /// Writes a data type and all public instance properties.
        /// Such type may correspond to an IFC entity or a ConceptRoot of a model view definition (which may also correspond to a property set)
        /// The type is nested according to namespace tokens.
        /// The type is linked to superclass according to base type.
        /// The type is expanded into subclasses if the last property is an enumeration for a classification (e.g. PredefinedType).
        /// Any referenced types are also retrieved and written if they don't yet exist.
        /// Localized names and descriptions are extracted from .NET resources.
        /// </summary>
        /// <param name="type"></param>
        public void WriteType(Type type)
        {
            if (type == null)
            {
                return;
            }

            if (m_mapTypes.ContainsKey(type))
            {
                return; // already written
            }
            string name = type.Name;
            DisplayNameAttribute attrName = (DisplayNameAttribute)type.GetCustomAttribute <DisplayNameAttribute>();

            if (attrName != null)
            {
                name = attrName.DisplayName;
            }

            string desc = null;
            DescriptionAttribute attrDesc = (DescriptionAttribute)type.GetCustomAttribute <DescriptionAttribute>();

            if (attrDesc != null)
            {
                desc = attrDesc.Description;
            }

            IfdConceptTypeEnum      conctype = IfdConceptTypeEnum.SUBJECT;
            IfdRelationshipTypeEnum relbase  = IfdRelationshipTypeEnum.SPECIALIZES;

            if (type.Name.StartsWith("Pset") || type.Name.StartsWith("Qto"))
            {
                // hack
                conctype = IfdConceptTypeEnum.BAG;
                relbase  = IfdRelationshipTypeEnum.ASSIGNS_COLLECTIONS;
            }
            else if (type.IsValueType || type.IsEnum)
            {
                conctype = IfdConceptTypeEnum.MEASURE;
            }

            // retrieve existing -- enable once final uploaded correctly!
#if false
            IfdConcept conc = SearchConcept(type.Name, conctype);
            if (conc != null)
            {
                this.m_mapTypes.Add(type, conc.guid);
                return;
            }
#endif

            DisplayAttribute[] localize = (DisplayAttribute[])type.GetCustomAttributes(typeof(DisplayAttribute), false);
            IfdBase            ifdThis  = CreateConcept(type.Name, name, desc, conctype, localize);
            if (ifdThis == null)
            {
                return;
            }

            this.m_mapTypes.Add(type, ifdThis.guid);

            // get namespace
            string[] namespaces       = type.Namespace.Split('.');
            string   guidSchemaParent = null;
            string   guidSchemaChild  = null;
            for (int iNS = 0; iNS < namespaces.Length; iNS++)
            {
                string ns = namespaces[iNS];
                if (!this.m_mapNamespaces.TryGetValue(ns, out guidSchemaChild))
                {
                    StringBuilder sbQual = new StringBuilder();
                    for (int x = 0; x <= iNS; x++)
                    {
                        if (x > 0)
                        {
                            sbQual.Append(".");
                        }
                        sbQual.Append(namespaces[x]);
                    }
                    string qualname = sbQual.ToString();

                    // call server to find namespace
                    IfdConcept ifdNamespace = SearchConcept(qualname, IfdConceptTypeEnum.BAG);
                    if (ifdNamespace != null)
                    {
                        guidSchemaChild = ifdNamespace.guid;
                    }
                    else
                    {
                        IfdBase ifdNS = CreateConcept(qualname, ns, String.Empty, IfdConceptTypeEnum.BAG, null);
                        guidSchemaChild = ifdNS.guid;
                    }

                    this.m_mapNamespaces.Add(ns, guidSchemaChild);

                    if (guidSchemaParent != null)
                    {
                        CreateRelationship(guidSchemaParent, guidSchemaChild, IfdRelationshipTypeEnum.COLLECTS);
                    }
                }

                if (iNS == namespaces.Length - 1)
                {
                    CreateRelationship(guidSchemaChild, ifdThis.guid, IfdRelationshipTypeEnum.COLLECTS);
                }

                guidSchemaParent = guidSchemaChild;
            }

            // get base type
            if (type.IsClass && type.BaseType != typeof(object))
            {
                WriteType(type.BaseType);

                string guidbase = null;
                if (m_mapTypes.TryGetValue(type.BaseType, out guidbase))
                {
                    CreateRelationship(guidbase, ifdThis.guid, relbase);
                }
            }

            //PropertyInfo[] props = type.GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public);
            //foreach (PropertyInfo prop in props)
            FieldInfo[] fields = type.GetFields(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public);
            foreach (FieldInfo prop in fields)
            {
                // write the property itself

                // resolve property type
                Type typeProp = prop.FieldType;
                if (typeProp.IsGenericType && typeProp.GetGenericTypeDefinition() == typeof(Nullable <>))
                {
                    typeProp = typeProp.GetGenericArguments()[0];
                }

                if (typeProp.IsGenericType && typeProp.GetGenericTypeDefinition() == typeof(IList <>))
                {
                    typeProp = typeProp.GetGenericArguments()[0];
                }

                if (typeProp.IsGenericType && typeProp.GetGenericTypeDefinition() == typeof(ISet <>))
                {
                    typeProp = typeProp.GetGenericArguments()[0];
                }

                if (typeProp.IsArray)
                {
                    typeProp = typeProp.GetElementType();
                }

                // special case for specialization
                if (prop.Name.Equals("_PredefinedType"))
                {
                    FieldInfo[] enumvals = typeProp.GetFields(BindingFlags.Public | BindingFlags.Static);
                    foreach (FieldInfo f in enumvals)
                    {
                        if (f.Name != "USERDEFINED" && f.Name != "NOTDEFINED")
                        {
                            string fname = f.Name;
                            DisplayNameAttribute attrFName = (DisplayNameAttribute)f.GetCustomAttribute <DisplayNameAttribute>();
                            if (attrName != null)
                            {
                                fname = attrName.DisplayName;
                            }

                            string fdesc = null;
                            DescriptionAttribute attrFDesc = (DescriptionAttribute)f.GetCustomAttribute <DescriptionAttribute>();
                            if (attrDesc != null)
                            {
                                fdesc = attrDesc.Description;
                            }

                            DisplayAttribute[] localizePredef = (DisplayAttribute[])f.GetCustomAttributes(typeof(DisplayAttribute), false);
                            IfdBase            ifdPredef      = CreateConcept(type.Name + "." + f.Name, fname, fdesc, IfdConceptTypeEnum.SUBJECT, localizePredef);
                            if (ifdPredef != null)
                            {
                                CreateRelationship(ifdThis.guid, ifdPredef.guid, IfdRelationshipTypeEnum.SPECIALIZES);
                            }
                        }
                    }
                }
                else if (conctype == IfdConceptTypeEnum.BAG)// psetprop.FieldType.IsValueType) //!!!
                {
                    name     = type.Name;
                    attrName = (DisplayNameAttribute)prop.GetCustomAttribute <DisplayNameAttribute>();
                    if (attrName != null)
                    {
                        name = attrName.DisplayName;
                    }

                    desc     = null;
                    attrDesc = (DescriptionAttribute)prop.GetCustomAttribute <DescriptionAttribute>();
                    if (attrDesc != null)
                    {
                        desc = attrDesc.Description;
                    }

                    string  propidentifier = type.Name + "." + prop.Name.Substring(1);
                    IfdBase ifdProp        = CreateConcept(propidentifier, name, desc, IfdConceptTypeEnum.PROPERTY, null);
                    if (ifdProp == null)
                    {
                        return;
                    }

                    // include the property
                    CreateRelationship(ifdThis.guid, ifdProp.guid, IfdRelationshipTypeEnum.COLLECTS);

                    WriteType(typeProp);

                    if (typeProp.IsValueType)
                    {
                        string guidDataType = null;
                        if (m_mapTypes.TryGetValue(typeProp, out guidDataType))
                        {
                            CreateRelationship(ifdProp.guid, guidDataType, IfdRelationshipTypeEnum.ASSIGNS_MEASURES);//...verify
                        }
                    }
                }
            }
        }
示例#4
0
        private IfdBase CreateConcept(string identifier, string name, string desc, IfdConceptTypeEnum conctype, DisplayAttribute[] localize)
        {
            System.Diagnostics.Debug.WriteLine(DateTime.Now + " " + conctype.ToString() + " " + identifier + " START");

            List <IfdName> listNames = new List <IfdName>();
            List <IfdBase> listDescs = new List <IfdBase>();

            // create name for IFC
            IfdName ifdNameIFC = CreateName(LanguageID, identifier);

            if (ifdNameIFC == null)
            {
                return(null);
            }

            listNames.Add(ifdNameIFC);

            // localization
            bool hasEnglishName = false;
            bool hasEnglishDesc = false;

            if (localize != null)
            {
                foreach (DisplayAttribute docLoc in localize)
                {
                    string locale = docLoc.ShortName;

                    // look up language id
                    string langid = GetLanguageId(locale);
                    if (langid != null)
                    {
                        if (!String.IsNullOrEmpty(docLoc.Name))
                        {
                            string  locname = HttpUtility.UrlEncode(docLoc.Name);
                            IfdName ifdName = CreateName(langid, locname);
                            if (ifdName == null)
                            {
                                return(null);
                            }

                            listNames.Add(ifdName);

                            if (langid == LanguageEN)
                            {
                                hasEnglishName = true;
                            }
                        }

                        if (!String.IsNullOrEmpty(docLoc.Description))
                        {
                            string  locdesc = HttpUtility.UrlEncode(docLoc.Description);
                            IfdBase ifdDesc = CreateDescription(langid, locdesc);
                            if (ifdDesc == null)
                            {
                                return(null);
                            }

                            listDescs.Add(ifdDesc);

                            if (langid == LanguageEN)
                            {
                                hasEnglishDesc = true;
                            }
                        }
                    }
                }
            }

            if (!hasEnglishName && !String.IsNullOrEmpty(name))
            {
                // add default english name
                IfdName ifdNameEN = CreateName(LanguageEN, name);
                if (ifdNameEN == null)
                {
                    return(null);
                }

                listNames.Add(ifdNameEN);
            }

            if (!hasEnglishDesc && !String.IsNullOrEmpty(desc))
            {
                if (desc.Length > 8192)
                {
                    desc = "!BSDD DATA TRANSFER ERROR -- description too large to encode within URL";
                }

                string  encodedesc = HttpUtility.UrlEncode(desc);
                IfdBase ifdDescEN  = CreateDescription(LanguageEN, encodedesc);
                if (ifdDescEN == null)
                {
                    return(null);
                }

                listDescs.Add(ifdDescEN);
            }

            // create concept
            StringBuilder sb = new StringBuilder();

            sb.Append(this.m_uri);
            sb.Append("api/4.0/IfdConcept?fullNameGuids=");
            for (int i = 0; i < listNames.Count; i++)
            {
                if (i != 0)
                {
                    sb.Append(",");
                }
                sb.Append(listNames[i].guid);
            }
            sb.Append("&conceptType=");
            sb.Append(conctype.ToString());

            if (listDescs.Count > 0)
            {
                sb.Append("&definitionGuids=");
                for (int i = 0; i < listDescs.Count; i++)
                {
                    if (i != 0)
                    {
                        sb.Append(",");
                    }
                    sb.Append(listDescs[i].guid);
                }
            }

            string url = sb.ToString();

            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);

            request.Method        = "POST";
            request.ContentType   = "application/x-www-form-urlencoded";
            request.ContentLength = 0;
            request.Accept        = "application/json";
            request.Headers.Add("cookie", "peregrineapisessionid=" + this.m_session);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream          stream   = response.GetResponseStream();

            DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(IfdBase));
            IfdBase ifdRoot = (IfdBase)ser.ReadObject(stream);

            System.Diagnostics.Debug.WriteLine(DateTime.Now + " " + conctype.ToString() + " " + identifier + " FINISH");

            return(ifdRoot);
        }