/*-----------------------------------------------------------------------------*/
        /// <summary>
        /// processes a dgn model to see if it has embedded schema
        /// </summary>
        /// <param name="oModel">the model to check</param>
        /// <returns>true that the model was processed and does not have a schema.</returns>
/*-----------------------------------------------------------------------------*/
        public static bool ProcessModel(BCOM.ModelReference oModel)
        {
            List <string> schemaList   = new List <string>();
            bool          m_debugMode  = false;
            bool          m_silentMode = false;
            string        errMessage   = "ERROR";
            bool          bStatus      = true;

            ECSR.RepositoryConnection connection = null;
            CSVReporter.CreateReport(string.Format("SC_{0}.csv", DateTime.Now.ToString("yyyy-dd-MM")));
            if (m_debugMode)
            {
                BVSchemaChecker.ComApp.MessageCenter.AddMessage("created csv file",
                                                                string.Format("created report file at {0}", CSVReporter.FileName),
                                                                BCOM.MsdMessageCenterPriority.Info, m_debugMode);
            }
            try
            {
                ECSS.ECSession ecSession = ECSS.SessionManager.CreateSession(true);
                connection = BVSchemaChecker.OpenConnectionToModel(oModel, ecSession);

                if (BVSchemaChecker.FindEmbededSchemas(connection, schemaList))
                {
                    BVSchemaChecker.ComApp.MessageCenter.AddMessage("found schema in the file",
                                                                    "found Schema",
                                                                    BCOM.MsdMessageCenterPriority.Error,
                                                                    m_silentMode);
                    BVSchemaChecker.iSchemaFoundCount++;
                    SchemaListForm sform = new SchemaListForm();
                    sform.SetSchemaNames(schemaList);
                    sform.ShowDialog();
                    bStatus = false;
                }
                else
                {
                    BVSchemaChecker.ComApp.MessageCenter.AddMessage("no schema in the file",
                                                                    "nothing found",
                                                                    BCOM.MsdMessageCenterPriority.Info,
                                                                    m_silentMode);
                }
            }
            catch (Exception e)
            {
                BVSchemaChecker.ComApp.MessageCenter.AddMessage(e.Message, e.Message,
                                                                BCOM.MsdMessageCenterPriority.Error,
                                                                !BVSchemaChecker.bUseLogFile);
                errMessage = e.Message;
                bStatus    = false;
            }
            finally
            {
                if (null == connection)
                {
                    CSVReporter.writeLine(BVSchemaChecker.strCurrentProjectName,
                                          BVSchemaChecker.ComApp.ActiveDesignFile.Name,
                                          BVSchemaChecker.ComApp.ActiveModelReference.Name,
                                          errMessage, false);
                }
                else
                {
                    BVSchemaChecker.CloseConnection(connection);
                }

                CSVReporter.close();
            }
            return(bStatus);
        }
/*-----------------------------------------------------------------------------*/
        /// <summary>
        /// The command to process the active file.  It will attempt to create a session
        /// and open the connection to the active model.
        /// If the connection cannot be opened it will error out.
        /// The findEmbeded method to look at the file for embedded schemas
        /// </summary>
        /// <param name="unparsed">not used.</param>
/*-----------------------------------------------------------------------------*/
        public static void BVSchemaCheckerCommand(System.String unparsed)
        {
            string        errMessage = "ERROR";
            List <string> schemaList = new List <string>();

            //set to silent mode
            m_silentMode = false;
            if (1 == BVSchemaChecker.mdlSystem_startedAsAutomationServer() && ((null != unparsed) && unparsed == "FROM_HOOK"))
            {
                return;
            }
            //if an unparsed string is sent in then set silent to true
            if (1 != BVSchemaChecker.mdlSystem_startedAsAutomationServer() && ((null != unparsed) && (unparsed.Length > 0)))
            {
                m_silentMode = true;
            }
            //see if it is an imodel if so then don't check.
            if (1 == BVSchemaChecker.IsIModel(BVSchemaChecker.ComApp.ActiveModelReference.MdlModelRefP()))
            {
                BVSchemaChecker.ComApp.MessageCenter.AddMessage("this is an i-model", "i-models are not processed", BCOM.MsdMessageCenterPriority.Info, false);
                return;
            }
            //if there are references then we process special.
            if (BVSchemaChecker.ComApp.ActiveModelReference.Attachments.Count > 0)
            {//if the references are imodels then notify the users.
                if (BVSchemaChecker.HasIModelReference(BVSchemaChecker.ComApp.ActiveModelReference))
                {
                    BVSchemaChecker.ComApp.MessageCenter.AddMessage("Has IModel Attached",
                                                                    "This file has an imodel in the attachment set",
                                                                    BCOM.MsdMessageCenterPriority.Info, false);
                }

                BCOM.DesignFile workFile = BVSchemaChecker.ComApp.OpenDesignFileForProgram(
                    BVSchemaChecker.ComApp.ActiveDesignFile.FullName, true);
                //create a model in the file that has no references
                //proces the new model.  this will avoid using the references as part
                //of the ec repository.
                //delete the model after the processing.
                try
                {
                    BCOM.ModelReference workModel = workFile.Models.Add(
                        workFile.DefaultModelReference,
                        "working", "working",
                        BCOM.MsdModelType.Normal, true);

                    int iAttachmentCount = workModel.Attachments.Count;
                    for (int i = iAttachmentCount; i > 0; --i)
                    {
                        BCOM.Attachment oAtt = workModel.Attachments[i];
                        workModel.Attachments.Remove(oAtt);
                    }

                    BVSchemaChecker.ProcessModel(workModel);
                    workFile.Models.Delete(workModel);
                }
                catch (Exception e)
                {
                    Console.WriteLine("unable to wrtie to file");
                }
                workFile.Close();
                return;
            }

            //if I am a simple file with normal dgn references
            ECSR.RepositoryConnection connection = null;
            CSVReporter.CreateReport(string.Format("SC_{0}.csv", DateTime.Now.ToString("yyyy-dd-MM")));
            if (m_debugMode)
            {
                BVSchemaChecker.ComApp.MessageCenter.AddMessage("created csv file",
                                                                string.Format("created report file at {0}", CSVReporter.FileName),
                                                                BCOM.MsdMessageCenterPriority.Info, m_debugMode);
            }

            if (m_usesSelector)
            {
                m_selectorForm.SetMessage("Processing File " + BVSchemaChecker.ComApp.ActiveDesignFile.Name);
            }

            try
            {
                ECSS.ECSession ecSession = ECSS.SessionManager.CreateSession(true);
                connection = BVSchemaChecker.OpenConnectionToActiveModel(ecSession);

                if (BVSchemaChecker.FindEmbededSchemas(connection, schemaList))
                {
                    BVSchemaChecker.ComApp.MessageCenter.AddMessage("Found schema in this file. \n Please contact the Bentley Execution team with the Schema list provided on the following dialog box. \n Select Ok to get a list of the schema you will need to provide",
                                                                    "Found Schema",
                                                                    BCOM.MsdMessageCenterPriority.Error,
                                                                    m_silentMode);
                    BVSchemaChecker.iSchemaFoundCount++;
                    //show the list...
                    if (m_silentMode)
                    {
                        SchemaListForm sform = new SchemaListForm();
                        sform.SetSchemaNames(schemaList);
                        sform.ShowDialog();
                    }
                }
                else
                {
                    BVSchemaChecker.ComApp.MessageCenter.AddMessage("no schema in the file",
                                                                    "nothing found",
                                                                    BCOM.MsdMessageCenterPriority.Info,
                                                                    (unparsed != "FROM_HOOK"));
                }
            }
            catch (Exception e)
            {
                BVSchemaChecker.ComApp.MessageCenter.AddMessage(e.Message, e.Message,
                                                                BCOM.MsdMessageCenterPriority.Error,
                                                                !BVSchemaChecker.bUseLogFile);
                errMessage = e.Message;
            }
            finally
            {
                if (null == connection)
                {
                    CSVReporter.writeLine(BVSchemaChecker.strCurrentProjectName,
                                          BVSchemaChecker.ComApp.ActiveDesignFile.Name,
                                          BVSchemaChecker.ComApp.ActiveModelReference.Name,
                                          errMessage, false);
                }
                else
                {
                    BVSchemaChecker.CloseConnection(connection);
                }

                CSVReporter.close();
            }
        }
/*-----------------------------------------------------------------------------*/
        /// <summary>
        /// checks the active model
        /// does simple walk of  the  dgn file to look for schema that are not managed by the plugin.
        /// </summary>
        /// <param name="connection">The connection to  the  active dgn file.</param>
        /// <returns>true if a schema is found in model</returns>
/*-----------------------------------------------------------------------------*/
        public static bool FindEmbededSchemas(ECSR.RepositoryConnection connection,
                                              List <string> schemas)
        {
            bool bStatus = false;

            System.Collections.Generic.IList <ECOS.IECSchema> schemaList;
            schemaList = new System.Collections.Generic.List <ECOS.IECSchema>();
            ECPS.PersistenceService pService = ECPS.PersistenceServiceFactory.GetService();
            string[] schemaNames             = pService.GetSchemaFullNames(connection);
            object   schemaContext           = pService.GetSchemaContext(connection);

            bool bFirstOne = true;

            if ((schemaNames.Length <= 0) || (schemaNames.Length == 2) &&
                IsOPMBaseSchema(schemaNames))
            {
                CSVReporter.writeLine(strCurrentProjectName,
                                      BVSchemaChecker.ComApp.ActiveDesignFile.Name,
                                      BVSchemaChecker.ComApp.ActiveModelReference.Name,
                                      "", true);
                return(bStatus);
            }
            else
            {
                //if the file is openned in OPM then OpenPlant and OpenPlant_3D are available by default.
                //if OPM host then schemacontext.managed <3 or those not in there are are OP and OP3D
                bStatus = false;
                foreach (string fullSchemaName in schemaNames)
                {
                    ECOS.IECSchema schema = Bentley.ECObjects.ECObjects.LocateSchema(
                        fullSchemaName, ECOS.SchemaMatchType.LatestCompatible, null, schemaContext);
                    BDGNP.PersistenceStrategy pStrategy;
                    pStrategy = BDGNP.DgnECPersistence.GetPersistenceStrategiesForSchema(connection, schema);

                    if (bFirstOne)
                    {
                        bFirstOne = false;
                        if (bUseLogFile)
                        {
                            LogWriter.writeLine(
                                string.Format("FAILED: Processing File: {0} Model: {1}",
                                              BVSchemaChecker.ComApp.ActiveDesignFile.FullName,
                                              BVSchemaChecker.ComApp.ActiveModelReference.Name), true);
                        }
                    }
                    if ((!IsOnWhiteList(schema.Name)) && (!IsABDBaseSchema(schema.Name)) &&
                        (!IsOPMSchema(schema.Name)) && (!IsBRCMSchema(schema.Name)))
                    {
                        if ((s_bIsUSTN) || ((s_bIsOPM) && (((schema.Name.CompareTo("OpenPlant") != 0) &&
                                                            (schema.Name.CompareTo("OpenPlant_3D") != 0)))))
                        {
                            BVSchemaChecker.ComApp.MessageCenter.AddMessage(
                                string.Format("found {0}_{1}_{2}", schema.Name,
                                              schema.VersionMajor, schema.VersionMinor),
                                "found " + fullSchemaName, BCOM.MsdMessageCenterPriority.Info,
                                false);
                            bStatus = true;
                        }
                        if (bUseLogFile)
                        {
                            LogWriter.writeLine(string.Format("\t Found Schema {0} in the file", fullSchemaName), false);
                        }
                        //this is a FAILED line
                        if ((s_bIsUSTN) || ((s_bIsOPM) && (((schema.Name.CompareTo("OpenPlant") != 0) &&
                                                            (schema.Name.CompareTo("OpenPlant_3D") != 0)))))
                        {
                            CSVReporter.writeLine(strCurrentProjectName,
                                                  BVSchemaChecker.ComApp.ActiveDesignFile.Name,
                                                  BVSchemaChecker.ComApp.ActiveModelReference.Name,
                                                  fullSchemaName, false);
                        }
                    }

                    if (!IsOnWhiteList(schema.Name) &&
                        !IsABDBaseSchema(schema.Name) && !IsOPMSchema(schema.Name) &&
                        !IsBRCMSchema(schema.Name))
                    {
                        schemas.Add(fullSchemaName);
                    }
                }
            }
            return(bStatus);
        }