示例#1
0
        public void AddUndefinedObjects(ISchemaDefinition src,
                                        ISchemaDefinition edustructuresSchema)
        {
            IDictionary srcHash = src.GetAllEnums();

            foreach (string enumKey in srcHash.Keys)
            {
                if (edustructuresSchema.GetEnum(enumKey) == null)
                {
                    // Exclude YesNo enums
                    EnumDef srcDef = src.GetEnum(enumKey);
                    if (srcDef.Values.Count < 4 && srcDef.ContainsValue("Yes") && srcDef.ContainsValue("No"))
                    {
                        continue;
                    }


                    AddUndefinedEnum(srcHash[enumKey] as EnumDef, edustructuresSchema.Version);
                }
            }

            srcHash = src.GetAllObjects();
            foreach (string key in srcHash.Keys)
            {
                if (key.StartsWith("State") || key.StartsWith("Country"))
                {
                    continue;
                }
                System.Diagnostics.Debug.Assert(key != "LAInfo");
                if (edustructuresSchema.GetObject(key) == null)
                {
                    AddUndefinedObject(srcHash[key] as ObjectDef, edustructuresSchema.Version);
                }
            }


            saveChanges();
        }
示例#2
0
        private static void CompareEnumDef(EnumDef def1,
                                           string source1,
                                           EnumDef def2,
                                           string source2,
                                           ICompareOutput output)
        {
            foreach (ValueDef def in def1.Values)
            {
                if (!def2.ContainsValue(def.Value))
                {
                    output.ComparisonMissing
                        (source1, def1.Name, def.Name, source2, def1.SourceLocation);
                }
            }

            foreach (ValueDef val in def2.Values)
            {
                if (!def1.ContainsValue(val.Value))
                {
                    output.ComparisonMissing
                        (source2, def2.Name, val.Name, source1, def2.SourceLocation);
                }
            }
        }
示例#3
0
        /// <summary>  Merge the definitions of this DB into another DB
        /// </summary>
        public virtual void mergeInto(DB target)
        {
            Console.Out.WriteLine
                ("Merging metadata for \"" + this.fVersion + "\" into \"" +
                target.Version + "\"...");

            Console.Out.WriteLine("- Processing enumerated types...");
            for (IEnumerator e = fEnums.Keys.GetEnumerator(); e.MoveNext();)
            {
                String key = (String)e.Current;
                Object val = fEnums[key];

                EnumDef targetEnum = (EnumDef)target.fEnums[key];
                if (targetEnum == null)
                {
                    //  Add the missing EnumDef to the target
                    Console.Out.WriteLine("  (+) \"" + key + "\" not found in target; adding");
                    target.fEnums[key] = val;
                }
                else
                {
                    //  Visit all values in the target's enumeration and add values
                    //  for any that are new in this version of SIF

                    foreach (ValueDef def in ((EnumDef)val).Values)
                    {
                        if (!targetEnum.ContainsValue(def.Value))
                        {
                            Console.Out.WriteLine
                                ("  (~) \"" + key + "::" + def.Value + "\" not found in target; adding");
                            targetEnum.DefineValue(def.Name, def.Value, def.Desc);
                        }
                    }
                }
            }

            //  Update the target's SifVersion range
            for (IEnumerator e = target.fEnums.Keys.GetEnumerator(); e.MoveNext();)
            {
                String  key     = (String)e.Current;
                EnumDef enumDef = (EnumDef)target.fEnums[key];
                enumDef.LatestVersion = fVersion;
                Console.Out.WriteLine
                    ("Enum " + enumDef.Name + " now has SifVersion range of " +
                    enumDef.EarliestVersion + ".." + enumDef.LatestVersion);
            }

            for (IEnumerator e = target.fObjects.Keys.GetEnumerator(); e.MoveNext();)
            {
                String    key    = (String)e.Current;
                ObjectDef objDef = (ObjectDef)target.fObjects[key];
                objDef.LatestVersion = fVersion;
                Console.Out.WriteLine
                    ("Object " + objDef.Name + " now has SifVersion range of " +
                    objDef.EarliestVersion + ".." + objDef.LatestVersion);

                for (IEnumerator e2 = objDef.fFields.Keys.GetEnumerator(); e2.MoveNext();)
                {
                    key = (String)e2.Current;
                    FieldDef fldDef = objDef.fFields[key];
                    fldDef.LatestVersion = fVersion;
                    Console.Out.WriteLine
                        ("  Field " + fldDef.Name + " now has SifVersion range of " +
                        fldDef.EarliestVersion + ".." + fldDef.LatestVersion);
                }
            }


            Console.Out.WriteLine("- Processing object definitions...");
            for (IEnumerator e = fObjects.Keys.GetEnumerator(); e.MoveNext();)
            {
                String    key = (String)e.Current;
                ObjectDef val = (ObjectDef)fObjects[key];

                ObjectDef targetObj = (ObjectDef)target.fObjects[key];
                if (targetObj == null)
                {
                    //  Add the missing ObjectDef to the target
                    Console.Out.WriteLine
                        ("  (+) \"" + key + "\" (" + val.Fields.Length +
                        " fields) not found in target; adding");
                    target.fObjects[key] = val;
                }
                else
                {
                    //  Do some sanity checking
                    if (!targetObj.LocalPackage.Equals(val.LocalPackage))
                    {
                        throw new MergeException
                                  ("Target and source have different package values (target=\"" +
                                  targetObj.Name + "\", package=\"" + targetObj.LocalPackage +
                                  "\", source=\"" + val.Name + "\", package=\"" + val.LocalPackage +
                                  "\"");
                    }
                    if (!targetObj.Superclass.Equals(val.Superclass))
                    {
                        throw new MergeException
                                  ("Target and source have different superclass values (target=\"" +
                                  targetObj.Name + "\", superclass=\"" + targetObj.Superclass +
                                  "\", source=\"" + val.Name + "\", superclass=\"" + val.Superclass +
                                  "\"");
                    }

                    //  Append this fExtrasFile to the target's if necessary
                    if (val.ExtrasFile != null)
                    {
                        Console.Out.WriteLine("  (+) \"" + key + "\" has an Extras File; adding");
                        targetObj.ExtrasFile = targetObj.ExtrasFile + ";" + val.ExtrasFile;
                    }

                    //  Determine if the object's key fields (required elements and
                    //  attributes) differ
                    StringBuilder keyCmp1s = new StringBuilder();
                    FieldDef[]    keyCmp1  = val.Key;
                    for (int n = 0; n < keyCmp1.Length; n++)
                    {
                        keyCmp1s.Append(keyCmp1[n].Name == null ? "null" : keyCmp1[n].Name);
                        if (n != keyCmp1.Length - 1)
                        {
                            keyCmp1s.Append('+');
                        }
                    }

                    StringBuilder keyCmp2s = new StringBuilder();
                    FieldDef[]    keyCmp2  = targetObj.Key;
                    for (int n = 0; n < keyCmp2.Length; n++)
                    {
                        keyCmp2s.Append(keyCmp2[n].Name == null ? "null" : keyCmp2[n].Name);
                        if (n != keyCmp2.Length - 1)
                        {
                            keyCmp2s.Append('+');
                        }
                    }

                    if (!keyCmp1s.ToString().Equals(keyCmp2s.ToString()))
                    {
                        throw new MergeException
                                  ("\"" + key +
                                  "\" target and source have different key signature; merge not yet supported by adkgen." +
                                  " Target=\"" + keyCmp2s + "\"; Source=\"" +
                                  keyCmp1s + "\"");
                    }

                    targetObj.LatestVersion = Version;

                    //  Determine if any of the object's fields differ in their definition
                    for (IEnumerator k = val.fFields.Keys.GetEnumerator(); k.MoveNext();)
                    {
                        String   key2   = (String)k.Current;
                        FieldDef srcFld = val.fFields[key2];
                        FieldDef targetFld;
                        targetFld = targetObj.fFields[key2];

                        if (targetFld == null)
                        {
                            Console.Out.WriteLine
                                ("  (+) Field \"" + key + "::" + key2 +
                                "\" not found in target; adding");
                            targetObj.fFields[key2] = srcFld;
                        }
                        else
                        {
                            bool methodDiff = false;
                            bool attrDiff   = false;

                            //  Check the field for differences...
                            if (!Equals(srcFld.FieldType, targetFld.FieldType))
                            {
                                Console.Out.WriteLine
                                    ("    (~) Field \"" + key + "::" + key2 +
                                    "\" has different ClassType; adding version-specific field");
                                methodDiff = true;
                            }


                            if (!targetFld.Tag.Equals(srcFld.Tag))
                            {
                                Console.Out.WriteLine
                                    ("    (~) Field \"" + key + "::" + key2 +
                                    "\" has different tag; adding alias");
                                Console.Out.WriteLine("        " + fVersion + " -> " + srcFld.Tag);
                                Console.Out.WriteLine
                                    ("        " + target.Version + " -> " + targetFld.Tag);
                                attrDiff = true;
                            }

                            if (targetFld.Sequence != srcFld.Sequence)
                            {
                                Console.Out.WriteLine
                                    ("    (~) Field \"" + key + "::" + key2 +
                                    "\" has different sequence number; adding alias");
                                Console.Out.WriteLine
                                    ("        " + fVersion + " -> " + srcFld.Sequence);
                                Console.Out.WriteLine
                                    ("        " + target.Version + " -> " + targetFld.Sequence);
                                attrDiff = true;
                            }

                            if (methodDiff)
                            {
                                //  If there were any differences that would result in new
                                //  methods to the implementation class, create a new FieldDef
                                Console.Out.WriteLine("*** DIFF ***");
                                throw new MergeException("Method merge not yet supported");
                            }
                            else if (attrDiff)
                            {
                                //  If there were any differences in tag name or sequence
                                //  number, add an alias to the FieldDef
                                targetFld.addAlias(fVersion, srcFld.Tag, srcFld.Sequence);
                            }
                            else
                            {
                                targetFld.LatestVersion = fVersion;
                            }
                        }
                    }
                }
            }
        }