Пример #1
0
        /// <summary>
        /// Download the file(s) to the local folder.
        /// </summary>
        private static void downloadFile(VDF.Vault.Currency.Connections.Connection connection, VDF.Vault.Currency.Entities.FileIteration fileIter, string folderPath, string topAssemblyName)
        {
            VDF.Vault.Settings.AcquireFilesSettings settings =
                new VDF.Vault.Settings.AcquireFilesSettings(connection);
            settings.AddEntityToAcquire(fileIter);
            settings.OptionsRelationshipGathering.FileRelationshipSettings.IncludeChildren = true;
            settings.OptionsRelationshipGathering.FileRelationshipSettings.RecurseChildren = true;
            settings.LocalPath = new VDF.Currency.FolderPathAbsolute(folderPath);
            settings.DefaultAcquisitionOption =
                VDF.Vault.Settings.AcquireFilesSettings.AcquisitionOption.Download;

            VDF.Vault.Results.AcquireFilesResults myAcqFilesResults =
                connection.FileManager.AcquireFiles(settings);

            fileList = new List <string>();
            foreach (VDF.Vault.Results.FileAcquisitionResult myFileAcquistionResult in myAcqFilesResults.FileResults)
            {
                if (myFileAcquistionResult.File.EntityName == topAssemblyName)
                {
                    fileList.Insert(0, myFileAcquistionResult.LocalPath.FullPath);
                    continue;
                }
                fileList.Add(myFileAcquistionResult.LocalPath.FullPath);
            }
        }
        /// <summary>
        /// Download Vault file using full file path, e.g. "$/Designs/Base.ipt".
        /// Preset Options: Download Children (recursively) = Enabled, Enforce Overwrite = True
        /// </summary>
        /// <param name="conn">Current Vault Connection</param>
        /// <param name="VaultFullFileName">FullFilePath</param>
        /// <returns>Local path/filename</returns>
        public string mGetFileByFullFileName(VDF.Vault.Currency.Connections.Connection conn, string VaultFullFileName)
        {
            List <string> mFiles = new List <string>();

            mFiles.Add(VaultFullFileName);
            AWS.File[] wsFiles = conn.WebServiceManager.DocumentService.FindLatestFilesByPaths(mFiles.ToArray());
            VDF.Vault.Currency.Entities.FileIteration mFileIt = new VDF.Vault.Currency.Entities.FileIteration(conn, (wsFiles[0]));

            VDF.Vault.Settings.AcquireFilesSettings settings = new VDF.Vault.Settings.AcquireFilesSettings(conn);
            settings.DefaultAcquisitionOption = VCF.Vault.Settings.AcquireFilesSettings.AcquisitionOption.Download;
            settings.OptionsRelationshipGathering.FileRelationshipSettings.IncludeChildren        = true;
            settings.OptionsRelationshipGathering.FileRelationshipSettings.RecurseChildren        = true;
            settings.OptionsRelationshipGathering.FileRelationshipSettings.VersionGatheringOption = VDF.Vault.Currency.VersionGatheringOption.Latest;
            settings.OptionsRelationshipGathering.IncludeLinksSettings.IncludeLinks = false;
            VCF.Vault.Settings.AcquireFilesSettings.AcquireFileResolutionOptions mResOpt = new VCF.Vault.Settings.AcquireFilesSettings.AcquireFileResolutionOptions();
            mResOpt.OverwriteOption           = VCF.Vault.Settings.AcquireFilesSettings.AcquireFileResolutionOptions.OverwriteOptions.ForceOverwriteAll;
            mResOpt.SyncWithRemoteSiteSetting = VCF.Vault.Settings.AcquireFilesSettings.SyncWithRemoteSite.Always;
            settings.AddFileToAcquire(mFileIt, VDF.Vault.Settings.AcquireFilesSettings.AcquisitionOption.Download);
            VDF.Vault.Results.AcquireFilesResults results = conn.FileManager.AcquireFiles(settings);
            if (results != null)
            {
                VDF.Vault.Results.FileAcquisitionResult mFilesDownloaded = results.FileResults.Last();
                return(mFilesDownloaded.LocalPath.FullPath.ToString());
            }
            return("FileNotFound");
        }
 private static void downloadFile(VDF.Vault.Currency.Connections.Connection connection, VDF.Vault.Currency.Entities.FileIteration file, string folderPath)
 {
     VDF.Vault.Settings.AcquireFilesSettings settings = new VDF.Vault.Settings.AcquireFilesSettings(connection);
     settings.AddEntityToAcquire(file);
     settings.LocalPath = new VDF.Currency.FolderPathAbsolute(folderPath);
     connection.FileManager.AcquireFiles(settings);
 }
Пример #4
0
        private void get()
        {
            // FilestoreService filestoreService = m_conn.WebServiceManager.FilestoreService;
            // DocumentService documentService = m_conn.WebServiceManager.DocumentService;
            // Vault.Currency.Entities.IEntity selectedItem = m_model.SelectedContent.FirstOrDefault();
            // // download ticket
            // long fileId = selectedItem.EntityIterationId;
            // ByteArray[] downloadTicket = documentService.GetDownloadTicketsByFileIds(new long[] { fileId });
            // byte[] downloadTicketByte = downloadTicket[0].Bytes;
            // long firstByte =0;
            // long lastByte = 52418559;
            //filestoreService.DownloadFilePart(downloadTicketByte, firstByte, lastByte, true);


            Vault.Settings.AcquireFilesSettings setting = new Vault.Settings.AcquireFilesSettings(m_conn, true);
            long selectedItemId = m_model.SelectedContent.FirstOrDefault().EntityIterationId;

            Vault.Currency.Entities.FileIteration selectedItem = m_conn.FileManager.GetFilesByIterationIds(new long[] { selectedItemId }).FirstOrDefault().Value;



            setting.AddFileToAcquire(selectedItem, Vault.Settings.AcquireFilesSettings.AcquisitionOption.Download);

            m_conn.FileManager.AcquireFiles(setting);
        }
Пример #5
0
        private void get()
        {
            Vault.Settings.AcquireFilesSettings setting = new Vault.Settings.AcquireFilesSettings(m_conn, true);
            long selectedItemId = m_model.SelectedContent.FirstOrDefault().EntityIterationId;

            Vault.Currency.Entities.FileIteration selectedItem = m_conn.FileManager.GetFilesByIterationIds(new long[] { selectedItemId }).FirstOrDefault().Value;
            setting.AddFileToAcquire(selectedItem, Vault.Settings.AcquireFilesSettings.AcquisitionOption.Download);

            m_conn.FileManager.AcquireFiles(setting);
        }
        // prints each sheet of the idw(fileIter) to it's own pdf file.
        // if there's more than one sheet referencing the same assembly, they will be combined in one multi-page pdf

        // this is not at all tested yet....
        private Boolean PrintPDF(VDF.Vault.Currency.Entities.FileIteration fileIter, VDF.Vault.Currency.Connections.Connection connection, ref string errMessage, ref string logMessage)
        {
            try
            {
                if (fileIter.EntityName.EndsWith(".idw")) // only print idws
                {
                    // make sure folder exists for downloading idw into.
                    logMessage += "Checking Target Directory...";
                    System.IO.DirectoryInfo targetDir = new System.IO.DirectoryInfo(TargetFolder);
                    if (!targetDir.Exists)
                    {
                        targetDir.Create();
                    }
                    logMessage += "OK" + "\r\n";

                    // download the idw from the vault
                    logMessage += "Downloading idw from the vault...";
                    VDF.Vault.Settings.AcquireFilesSettings downloadSettings = new VDF.Vault.Settings.AcquireFilesSettings(connection)
                    {
                        LocalPath = new VDF.Currency.FolderPathAbsolute(targetDir.FullName),
                    };
                    downloadSettings.AddFileToAcquire(fileIter, VDF.Vault.Settings.AcquireFilesSettings.AcquisitionOption.Download);
                    connection.FileManager.AcquireFiles(downloadSettings);

                    string fileName = downloadSettings.LocalPath.ToString() + @"\" + fileIter.ToString();

                    PrintObject printOb = new PrintObject();
                    string      errMsg  = "";
                    string      logMsg  = "";

                    if (!printOb.printToPDF(fileName, PDFPath, PDFPrinterName, PS2PDFProgrameName, GSWorkingFolder, ref errMsg, ref logMsg))
                    {
                        return(false);
                    }
                    else
                    {
                        return(true);
                    }
                }
                else
                {
                    logMessage += "File is not an idw, nothing to print.";
                    return(true);
                }
            }
            catch (Exception)
            {
                errMessage += "Unknown Error in function PrintPDF\r\n";
                return(false);
            }
        }
        private void Publish(VDF.Vault.Currency.Entities.FileIteration fileIter, VDF.Vault.Currency.Connections.Connection connection)
        {
            System.IO.DirectoryInfo targetDir = new System.IO.DirectoryInfo(TargetFolder);
            if (!targetDir.Exists)
            {
                targetDir.Create();
            }

            VDF.Vault.Settings.AcquireFilesSettings downloadSettings = new VDF.Vault.Settings.AcquireFilesSettings(connection)
            {
                LocalPath = new VDF.Currency.FolderPathAbsolute(targetDir.FullName),
            };
            downloadSettings.AddFileToAcquire(fileIter, VDF.Vault.Settings.AcquireFilesSettings.AcquisitionOption.Download);
            connection.FileManager.AcquireFiles(downloadSettings);
        }
 private VDF.Vault.Settings.AcquireFilesSettings CreateAcquireSettings(bool CheckOut)
 {
     VDF.Vault.Settings.AcquireFilesSettings settings = new VDF.Vault.Settings.AcquireFilesSettings(mConnection);
     if (CheckOut)
     {
         settings.DefaultAcquisitionOption = VDF.Vault.Settings.AcquireFilesSettings.AcquisitionOption.Checkout;
     }
     else
     {
         settings.DefaultAcquisitionOption = VDF.Vault.Settings.AcquireFilesSettings.AcquisitionOption.Download;
         settings.OptionsRelationshipGathering.FileRelationshipSettings.IncludeChildren        = true;
         settings.OptionsRelationshipGathering.FileRelationshipSettings.RecurseChildren        = true;
         settings.OptionsRelationshipGathering.FileRelationshipSettings.IncludeAttachments     = true;
         settings.OptionsRelationshipGathering.FileRelationshipSettings.IncludeLibraryContents = true;
         settings.OptionsRelationshipGathering.FileRelationshipSettings.ReleaseBiased          = true;
         settings.OptionsRelationshipGathering.FileRelationshipSettings.VersionGatheringOption = VDF.Vault.Currency.VersionGatheringOption.Revision;
         settings.OptionsRelationshipGathering.IncludeLinksSettings.IncludeLinks = false;
         settings.OptionsResolution.OverwriteOption           = VDF.Vault.Settings.AcquireFilesSettings.AcquireFileResolutionOptions.OverwriteOptions.ForceOverwriteAll;
         settings.OptionsResolution.SyncWithRemoteSiteSetting = VDF.Vault.Settings.AcquireFilesSettings.SyncWithRemoteSite.Always;
         settings.OptionsResolution.UpdateReferencesModel.UpdateVaultStatus = true;
         settings.CreateMetaDataFile = true;
     }
     return(settings);
 }
Пример #9
0
        private void GetFiles()
        {
            topAssemblyName = selectedFile.EntityName;
            VDF.Vault.Settings.AcquireFilesSettings acquireFileSettings = new VDF.Vault.Settings.AcquireFilesSettings(vaultConnection);
            acquireFileSettings.AddFileToAcquire(selectedFile, acquireFileSettings.DefaultAcquisitionOption);
            acquireFileSettings.OptionsRelationshipGathering.FileRelationshipSettings.IncludeChildren = true;
            acquireFileSettings.OptionsRelationshipGathering.FileRelationshipSettings.RecurseChildren = true;
            acquireFileSettings.DefaultAcquisitionOption = VDF.Vault.Settings.AcquireFilesSettings.AcquisitionOption.Download;
            FilesResults = vaultConnection.FileManager.AcquireFiles(acquireFileSettings);

            foreach (VDF.Vault.Results.FileAcquisitionResult fileResults in FilesResults.FileResults)
            {
                if (fileResults.File.EntityName == topAssemblyName)
                {
                    if (!InList(fileResults.File.EntityName, referenceDocs))
                    {
                        ReferenceDoc newDoc = new ReferenceDoc();
                        newDoc.PartName         = fileResults.File.EntityName;
                        newDoc.PartPath         = fileResults.LocalPath.ToString();
                        newDoc.DrawingName      = System.IO.Path.ChangeExtension(fileResults.File.EntityName, ".idw");
                        newDoc.DrawingPath      = System.IO.Path.ChangeExtension(fileResults.LocalPath.ToString(), ".idw");
                        newDoc.VaultDrawingPath = newDoc.DrawingPath.Replace("C:\\_Vault_Working_Folder", "$").Replace("\\", "/");
                        referenceDocs.Add(newDoc);
                    }
                    VDF.Currency.FilePathAbsolute filePathAbs = fileResults.LocalPath;
                    assemblyPath = filePathAbs.ToString();
                }

                if (IsDoc(fileResults.File.EntityName) && fileResults.File.EntityName != topAssemblyName)
                {
                    if (!InList(fileResults.File.EntityName, referenceDocs))
                    {
                        ReferenceDoc newDoc = new ReferenceDoc();
                        newDoc.PartName         = fileResults.File.EntityName;
                        newDoc.PartPath         = fileResults.LocalPath.ToString();
                        newDoc.DrawingName      = System.IO.Path.ChangeExtension(fileResults.File.EntityName, ".idw");
                        newDoc.DrawingPath      = System.IO.Path.ChangeExtension(fileResults.LocalPath.ToString(), ".idw");
                        newDoc.VaultDrawingPath = newDoc.DrawingPath.Replace("C:\\_Vault_Working_Folder", "$").Replace("\\", "/");
                        referenceDocs.Add(newDoc);
                    }
                }
            }

            referenceDocs.Sort((x, y) => x.DrawingName.CompareTo(y.DrawingName));

            string[] vaultDrawingFiles = new string[referenceDocs.Count];
            int      i = 0;

            foreach (ReferenceDoc rd in referenceDocs)
            {
                if (CheckForDups(rd.DrawingName, referenceDocs))
                {
                    vaultDrawingFiles[i] = rd.VaultDrawingPath;
                    i++;
                }
            }

            drawingFiles = vaultConnection.WebServiceManager.DocumentService.FindLatestFilesByPaths(vaultDrawingFiles);

            List <VDF.Vault.Currency.Entities.FileIteration> fileIters = new List <VDF.Vault.Currency.Entities.FileIteration>();

            foreach (ACW.File vFile in drawingFiles)
            {
                if (vFile.Name != null)
                {
                    fileIters.Add(new VDF.Vault.Currency.Entities.FileIteration(vaultConnection, vFile));
                }
            }

            VDF.Vault.Settings.AcquireFilesSettings drawingFileSetting = new VDF.Vault.Settings.AcquireFilesSettings(vaultConnection);

            foreach (VDF.Vault.Currency.Entities.FileIteration fi in fileIters)
            {
                if (fi.EntityName != null)
                {
                    drawingFileSetting.AddFileToAcquire(fi, VDF.Vault.Settings.AcquireFilesSettings.AcquisitionOption.Download);
                }
            }

            VDF.Vault.Results.AcquireFilesResults drawingFileResults = vaultConnection.FileManager.AcquireFiles(drawingFileSetting);

            foreach (ReferenceDoc rd in referenceDocs)
            {
                InventorApprentice.ApprenticeServerDocument doc;
                doc         = apprentice.Open(rd.PartPath);
                rd.Revision = GetRevision(doc);
                rd.PDFName  = System.IO.Path.GetFileNameWithoutExtension(rd.PartName) + "rev--" + rd.Revision + ".pdf";
            }
        }
        //  use ERP names instead of file names.
        private Boolean PDFfileUpdate(VDF.Vault.Currency.Entities.FileIteration fileIter, VDF.Vault.Currency.Connections.Connection connection, ref string logMessage, ref string errMessage)
        {
            try
            {
                // download the file
                System.IO.DirectoryInfo targetDir = new System.IO.DirectoryInfo(m_TargetFolder);
                if (!targetDir.Exists)
                {
                    targetDir.Create();
                }

                VDF.Vault.Settings.AcquireFilesSettings downloadSettings = new VDF.Vault.Settings.AcquireFilesSettings(connection)
                {
                    LocalPath = new VDF.Currency.FolderPathAbsolute(targetDir.FullName),
                };
                downloadSettings.AddFileToAcquire(fileIter, VDF.Vault.Settings.AcquireFilesSettings.AcquisitionOption.Download);

                VDF.Vault.Results.AcquireFilesResults results =
                    connection.FileManager.AcquireFiles(downloadSettings);

                string fileName = downloadSettings.LocalPath.ToString() + @"\" + fileIter.ToString();

                // ipts and iams are easier to deal with than idws
                if (fileName.EndsWith(".ipt") || fileName.EndsWith(".iam"))
                {
                    PrintObject printOb = new PrintObject();

                    if (printOb.deletePDF(fileName, m_PDFPath, ref logMessage, ref errMessage))
                    {
                        return(true);
                    }
                    else
                    {
                        return(false);
                    }
                }
                else if (fileName.EndsWith(".idw")) // for idws we have to loop through each drawing sheet
                {
                    try
                    {
                        string modelName = "";

                        // set up lists for storing the actual model names the sheets are referencing
                        List <string> modelNames = new List <string>();
                        List <VDF.Vault.Currency.Entities.FileIteration> fIterations = new List <VDF.Vault.Currency.Entities.FileIteration>();

                        VDF.Vault.Currency.Properties.PropertyDefinitionDictionary propDefs =
                            new VDF.Vault.Currency.Properties.PropertyDefinitionDictionary();
                        Inventor.ApprenticeServerComponent       oApprentice = new ApprenticeServerComponent();
                        Inventor.ApprenticeServerDrawingDocument drgDoc;
                        drgDoc = (Inventor.ApprenticeServerDrawingDocument)oApprentice.Document;
                        oApprentice.Open(fileName);
                        drgDoc = (Inventor.ApprenticeServerDrawingDocument)oApprentice.Document;
                        ACW.PropDef[] filePropDefs =
                            connection.WebServiceManager.PropertyService.GetPropertyDefinitionsByEntityClassId("FILE");
                        ACW.PropDef vaultNamePropDef = filePropDefs.Single(n => n.SysName == "Name");

                        // for each sheet in the idw, search the vault for the sheet's corresponding ipt or iam
                        foreach (Sheet sh in drgDoc.Sheets)
                        {
                            if (sh.DrawingViews.Count > 0)  // I added this line because one pdf with a BOM only sheet
                                                            // kept failing.  This line fixed the problemf or that file
                                                            // but it is definitely not well tested...
                            {
                                errMessage += " " + sh.DrawingViews[1].ReferencedDocumentDescriptor.DisplayName + "found";
                                if (sh.DrawingViews.Count > 0)
                                {
                                    modelName = sh.DrawingViews[1].ReferencedDocumentDescriptor.DisplayName;

                                    PrintObject printOb = new PrintObject();
                                    if (printOb.deletePDF(modelName, m_PDFPath, ref logMessage, ref errMessage))
                                    {
                                        //logMessage += "Deleted PDF: " + pair.Value.Value.ToString() + "\r\n";
                                        //we already logged a message in the deletePDF function
                                    }
                                    else
                                    {
                                        logMessage += logMessage;
                                        errMessage += "Can not delete PDF Error1 in function FileUpdate\r\n";
                                        return(false);
                                    }
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        logMessage += logMessage;
                        errMessage += "Can not delete PDF Error2 in function FileUpdate\r\n" + ex.Message + "\r\n";
                        return(false);
                    }
                }
                return(true);
            }

            catch (Exception)
            {
                logMessage += logMessage;
                errMessage += errMessage;
                return(false);
            }
        }
        /// <summary>
        /// Find file by 1 to many search criteria as property/value pairs.
        /// Downloads the first file matching all search criterias; include many as required to get the unique file.
        /// Preset Search Operator Options: [Property] is (exactly) [Value]; multiple conditions link up using AND condition.
        /// Preset Download Options: Download Children (recursively) = Enabled, Enforce Overwrite = True
        /// </summary>
        /// <param name="conn">Current Vault Connection</param>
        /// <param name="SearchCriteria">Dictionary of property/value pairs</param>
        /// <returns>Local path/filename</returns>
        public string mGetFilebySearchCriteria(VDF.Vault.Currency.Connections.Connection conn, Dictionary <string, string> SearchCriteria)
        {
            AWS.PropDef[] mFilePropDefs = conn.WebServiceManager.PropertyService.GetPropertyDefinitionsByEntityClassId("FILE");
            //iterate mSearchcriteria to get property definitions and build AWS search criteria
            List <AWS.SrchCond> mSrchConds = new List <AWS.SrchCond>();
            int             i            = 0;
            List <AWS.File> totalResults = new List <AWS.File>();

            foreach (var item in SearchCriteria)
            {
                AWS.PropDef  mFilePropDef = mFilePropDefs.Single(n => n.DispName == item.Key);
                AWS.SrchCond mSearchCond  = new AWS.SrchCond();
                {
                    mSearchCond.PropDefId = mFilePropDef.Id;
                    mSearchCond.PropTyp   = AWS.PropertySearchType.SingleProperty;
                    mSearchCond.SrchOper  = 1; //equals
                    if (i == 0)
                    {
                        mSearchCond.SrchRule = AWS.SearchRuleType.May;
                    }
                    else
                    {
                        mSearchCond.SrchRule = AWS.SearchRuleType.Must;
                    }
                    mSearchCond.SrchTxt = item.Value;
                }
                mSrchConds.Add(mSearchCond);
                i++;
            }
            string bookmark = string.Empty;

            AWS.SrchStatus status = null;

            while (status == null || totalResults.Count < status.TotalHits)
            {
                AWS.File[] mSrchResults = conn.WebServiceManager.DocumentService.FindFilesBySearchConditions(
                    mSrchConds.ToArray(), null, null, false, true, ref bookmark, out status);
                if (mSrchResults != null)
                {
                    totalResults.AddRange(mSrchResults);
                }
                else
                {
                    break;
                }
            }
            //if results not empty
            if (totalResults.Count == 1)
            {
                AWS.File wsFile = totalResults.First <AWS.File>();
                VDF.Vault.Currency.Entities.FileIteration mFileIt = new VDF.Vault.Currency.Entities.FileIteration(conn, (wsFile));

                VDF.Vault.Settings.AcquireFilesSettings settings = new VDF.Vault.Settings.AcquireFilesSettings(conn);
                settings.DefaultAcquisitionOption = VCF.Vault.Settings.AcquireFilesSettings.AcquisitionOption.Download;
                settings.OptionsRelationshipGathering.FileRelationshipSettings.IncludeChildren        = true;
                settings.OptionsRelationshipGathering.FileRelationshipSettings.RecurseChildren        = true;
                settings.OptionsRelationshipGathering.FileRelationshipSettings.VersionGatheringOption = VDF.Vault.Currency.VersionGatheringOption.Latest;
                settings.OptionsRelationshipGathering.IncludeLinksSettings.IncludeLinks = false;
                VCF.Vault.Settings.AcquireFilesSettings.AcquireFileResolutionOptions mResOpt = new VCF.Vault.Settings.AcquireFilesSettings.AcquireFileResolutionOptions();
                mResOpt.OverwriteOption           = VCF.Vault.Settings.AcquireFilesSettings.AcquireFileResolutionOptions.OverwriteOptions.ForceOverwriteAll;
                mResOpt.SyncWithRemoteSiteSetting = VCF.Vault.Settings.AcquireFilesSettings.SyncWithRemoteSite.Always;
                settings.AddFileToAcquire(mFileIt, VDF.Vault.Settings.AcquireFilesSettings.AcquisitionOption.Download);
                VDF.Vault.Results.AcquireFilesResults results = conn.FileManager.AcquireFiles(settings);
                if (results != null)
                {
                    VDF.Vault.Results.FileAcquisitionResult mFilesDownloaded = results.FileResults.Last();
                    return(mFilesDownloaded.LocalPath.FullPath.ToString());
                }
                else
                {
                    return("FileNotFound");
                }
            }
            else
            {
                return("FileNotFound");
            }
        }
Пример #12
0
        private void AddFileEvents_Post(object sender, AddFileCommandEventArgs e)
        {
            var service = sender as IWebService;

            if (service == null)
            {
                return;
            }

            var wsm        = service.WebServiceManager;
            var connection = new VDF.Vault.Currency.Connections.Connection(
                wsm,
                wsm.WebServiceCredentials.VaultName,
                service.SecurityHeader.UserId,
                wsm.WebServiceCredentials.ServerIdentities.DataServer,
                VDF.Vault.Currency.Connections.AuthenticationFlags.Standard);

            var file = e.ReturnValue;

            var localFilePath = string.Empty;
            var fileExtension = System.IO.Path.GetExtension(file.Name);

            if (fileExtension == null ||
                !new[] { ".ipt", ".iam", ".ipn", ".idw", ".dwg" }.Contains(fileExtension.ToLower()))
            {
                return;
            }

            #region Application detection
            var isExplorer   = false;
            var isCopyDesign = false;
            var isInventor   = false;
            try
            {
                var entryAssembly = Assembly.GetEntryAssembly();
                if (entryAssembly != null && entryAssembly.Location.StartsWith(
                        @"C:\Program Files\Autodesk\Vault Professional 2018\Explorer\Connectivity.Vault",
                        StringComparison.OrdinalIgnoreCase))
                {
                    isExplorer = true;

                    var regex = new Regex(@"Copy of file \'.*\' version \'.*'\. \(.*\)");
                    var match = regex.Match(file.Comm);
                    if (match.Success)
                    {
                        isCopyDesign = true;
                    }
                }
                else if (entryAssembly != null && entryAssembly.Location.Equals(
                             @"C:\Program Files\Autodesk\Vault Professional 2018\Explorer\CopyDesign.exe",
                             StringComparison.OrdinalIgnoreCase))
                {
                    isCopyDesign = true;
                }
                else
                {
                    var callingAssembly = Assembly.GetCallingAssembly();
                    if (callingAssembly.Location.Equals(
                            @"C:\Program Files\Autodesk\Inventor 2018\Bin\Autodesk.Connectivity.WebServices.dll",
                            StringComparison.OrdinalIgnoreCase))
                    {
                        isInventor = true;
                    }
                }
            }
            catch (Exception)
            {
                isExplorer = false;
            }
            #endregion

            if (isInventor)
            {
                try
                {
                    #region Download file (VDF)
                    var fileIteration = new VDF.Vault.Currency.Entities.FileIteration(
                        connection, file);

                    var folderPathAbsolute = new VDF.Currency.FolderPathAbsolute(@"C:\temp\");
                    var acquireSettings    = new VDF.Vault.Settings.AcquireFilesSettings(connection)
                    {
                        DefaultAcquisitionOption =
                            VDF.Vault.Settings.AcquireFilesSettings.AcquisitionOption.Download,
                        LocalPath = folderPathAbsolute
                    };
                    acquireSettings.AddEntityToAcquire(fileIteration);

                    var acquireFiles = connection.FileManager.AcquireFiles(acquireSettings);
                    var fileResult   = acquireFiles.FileResults.First();
                    localFilePath = fileResult.LocalPath.FullPath;
                    #endregion

                    #region Download file (WebServiceManager)
                    //localFilePath = string.Format(@"C:\temp\{0}", file.Name);

                    //var fileSize = file.FileSize;
                    //var maxPartSize = wsm.FilestoreService.GetMaximumPartSize();
                    //var ticket = wsm.DocumentService.GetDownloadTicketsByMasterIds(
                    //    new[] { file.MasterId })[0];
                    //byte[] bytes;

                    //using (var stream = new System.IO.MemoryStream())
                    //{
                    //    var startByte = 0;
                    //    while (startByte < fileSize)
                    //    {
                    //        var endByte = startByte + maxPartSize;
                    //        if (endByte > fileSize)
                    //            endByte = fileSize;

                    //        using (var filePart =
                    //            wsm.FilestoreService.DownloadFilePart(
                    //            ticket.Bytes, startByte, endByte, true))
                    //        {
                    //            byte[] buffer = StreamToByteArray(filePart);
                    //            stream.Write(buffer, 0, buffer.Length);
                    //            startByte += buffer.Length;
                    //        }
                    //    }

                    //    bytes = new byte[stream.Length];
                    //    stream.Seek(0, System.IO.SeekOrigin.Begin);
                    //    stream.Read(bytes, 0, (int)stream.Length);

                    //    stream.Close();
                    //}

                    //System.IO.File.WriteAllBytes(localFilePath, bytes);
                    #endregion

                    #region Get InternalName and iProperty Class
                    var documentInfo = Apprentice.GetDocumentInfo(localFilePath);
                    #endregion

                    #region Update properties
                    var propDefs = wsm.PropertyService.GetPropertyDefinitionsByEntityClassId("FILE");
                    var propDef  = propDefs.SingleOrDefault(p => p.DispName.Equals("Internal ID"));
                    if (propDef == null)
                    {
                        return;
                    }

                    var util = Autodesk.Connectivity.Explorer.ExtensibilityTools.ExplorerLoader.LoadExplorerUtil(
                        wsm.WebServiceCredentials.ServerIdentities.DataServer,
                        wsm.WebServiceCredentials.VaultName,
                        service.SecurityHeader.UserId,
                        service.SecurityHeader.Ticket);

                    var properties = new Dictionary <PropDef, object> {
                        { propDef, documentInfo.InternalName }
                    };
                    util.UpdateFileProperties(file, properties);
                    #endregion

                    #region Assign file to custom entity 'Class'
                    if (!string.IsNullOrEmpty(documentInfo.Class))
                    {
                        var custEnt = GetClassCustEntByName(wsm, documentInfo.Class);
                        if (custEnt != null)
                        {
                            wsm.DocumentService.AddLink(custEnt.Id, "FILE", file.Id, null);
                        }
                    }
                    #endregion
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                }
                finally
                {
                    #region Delete local file
                    if (System.IO.File.Exists(localFilePath))
                    {
                        try
                        {
                            System.IO.File.Delete(localFilePath);
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex);
                        }
                    }
                    #endregion
                }
            }

            if (isExplorer)
            {
                // file is added by Vault Explorer
            }

            if (isCopyDesign)
            {
                // file is added by CopyDesign
            }
        }
        public JobOutcome Execute(IJobProcessorServices context, IJob job)
        {
            try
            {
                Inventor.InventorServer mInv = context.InventorObject as InventorServer;

                #region validate execution rules

                //pick up this job's context
                mConnection = context.Connection;
                Autodesk.Connectivity.WebServicesTools.WebServiceManager mWsMgr = mConnection.WebServiceManager;
                long   mEntId    = Convert.ToInt64(job.Params["EntityId"]);
                string mEntClsId = job.Params["EntityClassId"];

                // only run the job for files; handle the scenario, that an item lifecycle transition accidently submitted the job
                if (mEntClsId != "FILE")
                {
                    context.Log(null, "This job type is for files only.");
                    return(JobOutcome.Failure);
                }

                // only run the job for ipt and iam file types,
                List <string> mFileExtensions = new List <string> {
                    ".ipt", ".iam", "idw", "dwg"
                };
                ACW.File mFile = mWsMgr.DocumentService.GetFileById(mEntId);
                if (!mFileExtensions.Any(n => mFile.Name.EndsWith(n)))
                {
                    context.Log(null, "Skipped Job execution as file type did not match iLogic enabled files (ipt, iam, idw/dwg");
                    return(JobOutcome.Success);
                }
                //run iLogic for Inventor DWG file types/skip AutoCAD DWG files
                ACW.PropDef[] mPropDefs = mWsMgr.PropertyService.GetPropertyDefinitionsByEntityClassId("FILE");
                ACW.PropDef   mPropDef  = null;
                ACW.PropInst  mPropInst = null;
                if (mFile.Name.EndsWith(".dwg"))
                {
                    mPropDef  = mPropDefs.Where(n => n.SysName == "Provider").FirstOrDefault();
                    mPropInst = (mWsMgr.PropertyService.GetPropertiesByEntityIds("FILE", new long[] { mFile.Id })).Where(n => n.PropDefId == mPropDef.Id).FirstOrDefault();
                    if (mPropInst.Val.ToString() != "Inventor DWG")
                    {
                        context.Log(null, "Skipped Job execution as DWG type did not match Inventor DWG");
                        return(JobOutcome.Success);
                    }
                }

                ApplicationAddIns mInvSrvAddIns = mInv.ApplicationAddIns;
                ApplicationAddIn  iLogicAddIn   = mInvSrvAddIns.ItemById["{3BDD8D79-2179-4B11-8A5A-257B1C0263AC}"];

                if (iLogicAddIn != null && iLogicAddIn.Activated != true)
                {
                    iLogicAddIn.Activate();
                }

                dynamic mAutomation = iLogicAddIn.Automation;

                if (mAutomation == null)
                {
                    Trace.WriteLine("iLogic-AddIn automation is not available; exiting job processing");
                    context.Log(null, "iLogic-AddIn automation is not available");
                    return(JobOutcome.Failure);
                }

                #endregion validate execution rules

                #region VaultInventorServer IPJ activation

                //override InventorServer default project settings by your Vault specific ones
                Inventor.DesignProjectManager mInvIpjManager;
                Inventor.DesignProject        mInvDfltProject, mInvVltProject;
                String   mIpjPath      = "";
                String   mWfPath       = "";
                String   mIpjLocalPath = "";
                ACW.File mIpj;
                VDF.Vault.Currency.Entities.FileIteration mIpjFileIter = null;

                //validate ipj setting, a single, enforced ipj is expected
                if (mWsMgr.DocumentService.GetEnforceWorkingFolder() && mWsMgr.DocumentService.GetEnforceInventorProjectFile())
                {
                    mIpjPath = mWsMgr.DocumentService.GetInventorProjectFileLocation();
                    mWfPath  = mWsMgr.DocumentService.GetRequiredWorkingFolderLocation();
                    //Set mWfPath to alternate temporary working folder if needed, e.g. to delete all files after job execution
                }
                else
                {
                    context.Log(null, "Job requires both settings enabled: 'Enforce Workingfolder' and 'Enforce Inventor Project'.");
                    return(JobOutcome.Failure);
                }
                //download and activate the Inventor Project file in VaultInventorServer
                mIpj = (mWsMgr.DocumentService.FindLatestFilesByPaths(new string[] { mIpjPath })).FirstOrDefault();

                try
                {
                    String[] mIpjFullFileName = mIpjPath.Split(new string[] { "/" }, StringSplitOptions.None);
                    String   mIpjFileName     = mIpjFullFileName.LastOrDefault();

                    //define download settings for the project file
                    VDF.Vault.Settings.AcquireFilesSettings mAcqrIpjSettings = new VDF.Vault.Settings.AcquireFilesSettings(mConnection);
                    mAcqrIpjSettings.LocalPath = new VDF.Currency.FolderPathAbsolute(mWfPath);
                    mIpjFileIter = new VDF.Vault.Currency.Entities.FileIteration(mConnection, mIpj);
                    mAcqrIpjSettings.AddFileToAcquire(mIpjFileIter, VDF.Vault.Settings.AcquireFilesSettings.AcquisitionOption.Download);

                    //download project file and get local path
                    VDF.Vault.Results.AcquireFilesResults   mDownLoadResult;
                    VDF.Vault.Results.FileAcquisitionResult fileAcquisitionResult;
                    mDownLoadResult       = mConnection.FileManager.AcquireFiles(mAcqrIpjSettings);
                    fileAcquisitionResult = mDownLoadResult.FileResults.FirstOrDefault();
                    mIpjLocalPath         = fileAcquisitionResult.LocalPath.FullPath;

                    //activate this Vault's ipj
                    mInvIpjManager  = mInv.DesignProjectManager;
                    mInvDfltProject = mInvIpjManager.ActiveDesignProject;
                    mInvVltProject  = mInvIpjManager.DesignProjects.AddExisting(mIpjLocalPath);
                    mInvVltProject.Activate();

                    //[Optionally:] get Inventor Design Data settings and download all related files ---------
                }
                catch
                {
                    context.Log(null, "Job was not able to activate Inventor project file. - Note: The ipj must not be checked out by another user.");
                    return(JobOutcome.Failure);
                }
                #endregion VaultInventorServer IPJ activation


                #region download source file(s)

                //build download options including DefaultAcquisitionOptions
                VDF.Vault.Currency.Entities.FileIteration mFileIteration    = new VDF.Vault.Currency.Entities.FileIteration(mConnection, mFile);
                VDF.Vault.Currency.Entities.FileIteration mNewFileIteration = null;
                VDF.Vault.Settings.AcquireFilesSettings   mAcqrFlsSettings;
                VDF.Vault.Results.AcquireFilesResults     mAcqrFlsResults2;
                VDF.Vault.Results.FileAcquisitionResult   mFileAcqsResult2;
                string mLocalFileFullName = "", mExt = "";

                if (mFileIteration.IsCheckedOut == true && mFileIteration.IsCheckedOutToCurrentUser == false)
                {
                    //exit the job, as the job user is not able to edit the file reserved to another user
                    mInvDfltProject.Activate();
                    context.Log(null, "Job stopped execution as the source file to process is checked-out by another user.");
                    return(JobOutcome.Failure);
                }
                //download only
                if (mFileIteration.IsCheckedOut == true && mFileIteration.IsCheckedOutToCurrentUser == true)
                {
                    mAcqrFlsSettings = CreateAcquireSettings(false);
                    mAcqrFlsSettings.AddFileToAcquire(mFileIteration, mAcqrFlsSettings.DefaultAcquisitionOption);
                    mAcqrFlsResults2   = this.mConnection.FileManager.AcquireFiles(mAcqrFlsSettings);
                    mNewFileIteration  = mFileIteration;
                    mFileAcqsResult2   = mAcqrFlsResults2.FileResults.Where(n => n.File.EntityName == mFileIteration.EntityName).FirstOrDefault();
                    mLocalFileFullName = mFileAcqsResult2.LocalPath.FullPath;
                    mExt = System.IO.Path.GetExtension(mLocalFileFullName);
                }
                //checkout and download
                if (mFileIteration.IsCheckedOut == false)
                {
                    try
                    {
                        mAcqrFlsSettings = CreateAcquireSettings(true); //checkout (don't checkout related children)
                        mAcqrFlsSettings.AddFileToAcquire(mFileIteration, mAcqrFlsSettings.DefaultAcquisitionOption);
                        mAcqrFlsResults2  = this.mConnection.FileManager.AcquireFiles(mAcqrFlsSettings);
                        mFileAcqsResult2  = mAcqrFlsResults2.FileResults.Where(n => n.File.EntityName == mFileIteration.EntityName).FirstOrDefault();
                        mNewFileIteration = mFileAcqsResult2.NewFileIteration;
                        mAcqrFlsSettings  = null;
                        mAcqrFlsSettings  = CreateAcquireSettings(false);//download (include related children)
                        mAcqrFlsSettings.AddFileToAcquire(mNewFileIteration, mAcqrFlsSettings.DefaultAcquisitionOption);
                        mAcqrFlsResults2   = this.mConnection.FileManager.AcquireFiles(mAcqrFlsSettings);
                        mLocalFileFullName = mFileAcqsResult2.LocalPath.FullPath;
                        mExt = System.IO.Path.GetExtension(mLocalFileFullName);
                    }
                    catch (Exception)
                    {
                        mInvDfltProject.Activate();
                        context.Log(null, "Job stopped execution as the source file to process did not download or check-out.");
                        return(JobOutcome.Failure);
                    }
                }

                #endregion download source file(s)

                #region capture dependencies
                //we need to return all relationships during later check-in
                List <ACW.FileAssocParam> mFileAssocParams = new List <ACW.FileAssocParam>();
                ACW.FileAssocArray        mFileAssocArray  = mWsMgr.DocumentService.GetLatestFileAssociationsByMasterIds(new long[] { mFile.MasterId },
                                                                                                                         ACW.FileAssociationTypeEnum.None, false, ACW.FileAssociationTypeEnum.All, false, false, false, true).FirstOrDefault();
                if (mFileAssocArray.FileAssocs != null)
                {
                    foreach (ACW.FileAssoc item in mFileAssocArray.FileAssocs)
                    {
                        ACW.FileAssocParam mFileAssocParam = new ACW.FileAssocParam();
                        mFileAssocParam.CldFileId         = item.CldFile.Id;
                        mFileAssocParam.ExpectedVaultPath = item.ExpectedVaultPath;
                        mFileAssocParam.RefId             = item.RefId;
                        mFileAssocParam.Source            = item.Source;
                        mFileAssocParam.Typ = item.Typ;
                        mFileAssocParams.Add(mFileAssocParam);
                    }
                }

                #endregion capture dependencies

                #region iLogic Configuration

                //avoid unplanned rule execution triggered by the document itself
                mAutomation.RulesOnEventsEnabled = false;
                mAutomation.RulesEnabled         = false;

                //set the iLogic Advanced Configuration Settings
                dynamic mFileOptions = mAutomation.FileOptions;
                mFileOptions.AddinDirectory = mSettings.iLogicAddinDLLs;
                //add the job extension app path and configured external rule directories to the FileOptions.ExternalRuleDirectories for iLogic
                List <string> mExtRuleDirs = new List <string>();
                mExtRuleDirs.Add(mAppPath);
                mExtRuleDirs.AddRange(mSettings.ExternalRuleDirectories.Split(',').ToList <string>());
                mFileOptions.ExternalRuleDirectories = mExtRuleDirs.ToArray();

                //enable iLogic logging
                dynamic mLogCtrl = mAutomation.LogControl;
                switch (mSettings.iLogicLogLevel)
                {
                case "None":
                    mLogCtrl.Level = 0;
                    break;

                case "Trace":
                    mLogCtrl.Level = 1;
                    break;

                case "Debug":
                    mLogCtrl.Level = 2;
                    break;

                case "Info":
                    mLogCtrl.Level = 3;
                    break;

                case "Warn":
                    mLogCtrl.Level = 4;
                    break;

                case "Error":
                    mLogCtrl.Level = 5;
                    break;

                case "Fatal":
                    mLogCtrl.Level = 6;
                    break;

                default:
                    mLogCtrl.Level = 5;
                    break;
                }

                //enable iLogic to save a log file for each job Id.
                string mILogicLogFileFullName = "";
                if (mLogCtrl.Level != 0)
                {
                    string mLogName = job.Id + "_" + mFile.Name + "_iLogicSampleJob.log";
                    System.IO.DirectoryInfo mLogDirInfo = new System.IO.DirectoryInfo(mSettings.iLogicLogDir);
                    if (mLogDirInfo.Exists == false)
                    {
                        mLogDirInfo = System.IO.Directory.CreateDirectory(mSettings.iLogicLogDir);
                    }
                    mILogicLogFileFullName = System.IO.Path.Combine(mLogDirInfo.FullName, mLogName);
                }



                //read rule execution settings
                string mVaultRule       = mSettings.VaultRuleFullFileName;
                string mExtRule         = mSettings.ExternalRuleName;
                string mExtRuleFullName = null;
                string mIntRulesOption  = mSettings.InternalRulesOption;

                if (mVaultRule != "")
                {
                    ACW.File mRuleFile = mWsMgr.DocumentService.FindLatestFilesByPaths(new string[] { mVaultRule }).FirstOrDefault();
                    //build download options including DefaultAcquisitionOptions
                    VDF.Vault.Currency.Entities.FileIteration mRuleFileIter = new VDF.Vault.Currency.Entities.FileIteration(mConnection, mRuleFile);

                    VDF.Vault.Settings.AcquireFilesSettings mAcqrRuleSettings = CreateAcquireSettings(false);

                    mAcqrRuleSettings.AddFileToAcquire(mRuleFileIter, mAcqrRuleSettings.DefaultAcquisitionOption);

                    //download
                    VDF.Vault.Results.AcquireFilesResults mAcqrRuleResults = this.mConnection.FileManager.AcquireFiles(mAcqrRuleSettings);
                    //pick-up the new file iteration in case of check-out
                    VDF.Vault.Results.FileAcquisitionResult mRuleAcqResult = mAcqrRuleResults.FileResults.Where(n => n.File.EntityName == mRuleFileIter.EntityName).FirstOrDefault();
                    if (mRuleAcqResult.LocalPath != null)
                    {
                        mExtRuleFullName = mRuleAcqResult.LocalPath.FullPath;
                        System.IO.FileInfo fileInfo = new System.IO.FileInfo(mExtRuleFullName);
                        if (fileInfo.Exists == false)
                        {
                            context.Log(null, "Job downloaded rule file but exited due to missing rule file: " + mExtRuleFullName + ".");
                            mConnection.FileManager.UndoCheckoutFile(mNewFileIteration);
                            return(JobOutcome.Failure);
                        }
                        else
                        {
                            mExtRule = fileInfo.Name;
                            if (!mExtRuleDirs.Any(n => fileInfo.DirectoryName.Equals(n)))
                            {
                                context.Log(null, "Job downloaded rule file but exited due to missing iLogic External Rule Directory configuration: Add the path"
                                            + fileInfo.DirectoryName + " to the list of External Rule Directories.");
                                mConnection.FileManager.UndoCheckoutFile(mNewFileIteration);
                                return(JobOutcome.Failure);
                            }
                        }
                    }
                    else
                    {
                        context.Log(null, "Job could not download configured rule file and exited. Compare the 'VaultRuleFullFileName' setting and available rule in Vault.");
                        return(JobOutcome.Failure);
                    }
                }

                #endregion iLogic Configuration

                #region Run iLogic Rule(s)

                //Open Inventor Document
                Document mDoc = mInv.Documents.Open(mLocalFileFullName);

                //use case  - apply external rule with arguments; additional Vault UDP, status or any information might fill rule arguments
                if (mExtRule != "")
                {
                    //required rule arguments to continue Vault interaction within the rule (iLogic-Vault library)
                    NameValueMap ruleArguments = mInv.TransientObjects.CreateNameValueMap();
                    ruleArguments.Add("ServerName", mConnection.Server);
                    ruleArguments.Add("VaultName", mConnection.Vault);
                    ruleArguments.Add("UserId", mConnection.UserID);
                    ruleArguments.Add("Ticket", mConnection.Ticket);

                    //additional rule arguments to build rule conditions evaluating Vault lifecycle information, properties, etc.
                    if (mSettings.PropagateProps == "True")
                    {
                        ACW.PropInst[] mSourcePropInsts = mWsMgr.PropertyService.GetPropertiesByEntityIds("FILE", new long[] { mFileIteration.EntityIterationId });
                        string         mPropDispName;
                        string         mThumbnailDispName = mPropDefs.Where(n => n.SysName == "Thumbnail").FirstOrDefault().DispName;
                        foreach (ACW.PropInst item in mSourcePropInsts)
                        {
                            mPropDispName = mPropDefs.Where(n => n.Id == item.PropDefId).FirstOrDefault().DispName;
                            //filter thumbnail property, as iLogic RuleArguments will fail reading it.
                            if (mPropDispName != mThumbnailDispName)
                            {
                                ruleArguments.Add(mPropDispName, item.Val);
                            }
                        }
                    }

                    //call external rule with arguments; return value = 0 in case of successful execution
                    mRuleSuccess = mAutomation.RunExternalRuleWithArguments(mDoc, mExtRule, ruleArguments);
                    if (mRuleSuccess != 0)
                    {
                        context.Log(null, "Job failed due to failure in external rule: " + mExtRule + ".");
                        mDoc.Close(true);
                        mConnection.FileManager.UndoCheckoutFile(mNewFileIteration);
                        mLogCtrl.SaveLogAs(mILogicLogFileFullName);
                        return(JobOutcome.Failure);
                    }
                    else
                    {
                        mAllRulesTextWrp = "External Rule: " + mExtRule;
                    }
                    mDoc.Save2(false);
                }


                //use case - run all, all active or filtered document rules
                dynamic        mDocRules    = mAutomation.Rules(mDoc);
                List <dynamic> mRulesToExec = new List <dynamic>();

                switch (mSettings.InternalRulesOption)
                {
                case "None":
                    break;

                case "Active":
                    if (mDocRules != null)
                    {
                        foreach (dynamic rule in mDocRules)
                        {
                            if (rule.IsActive == true)
                            {
                                mRulesToExec.Add(rule);
                            }
                        }
                    }
                    break;

                case "All":
                    if (mDocRules != null)
                    {
                        foreach (dynamic rule in mDocRules)
                        {
                            mRulesToExec.Add(rule);
                        }
                    }
                    break;

                default:
                    foreach (dynamic rule in mDocRules)
                    {
                        if (rule.Name.Contains(mSettings.InternalRulesOption))
                        {
                            mRulesToExec.Add(rule);
                        }
                    }
                    break;
                }
                if (mRulesToExec.Count >= 1)
                {
                    foreach (dynamic rule in mRulesToExec)
                    {
                        mRuleSuccess = mAutomation.RunRule(mDoc, rule.Name);
                        if (mRuleSuccess != 0)
                        {
                            context.Log(null, "Job failed due to failure in internal rule: " + rule.Name + ".");
                            mDoc.Close(true);
                            mConnection.FileManager.UndoCheckoutFile(mNewFileIteration);
                            mLogCtrl.SaveLogAs(mILogicLogFileFullName);
                            return(JobOutcome.Failure);
                        }
                        else
                        {
                            mAllRules.Add(rule.Name);
                        }
                    }
                }

                mDoc.Save2(false);
                mDoc.Close(true);
                mLogCtrl.SaveLogAs(mILogicLogFileFullName);

                if (mAllRules.Count > 0)
                {
                    mAllRulesTextWrp += "\n\r Internal Rule(s):";
                    foreach (string name in mAllRules)
                    {
                        mAllRulesTextWrp += "\r\n " + name;
                    }
                }

                #endregion Run iLogic Rules


                #region Check-in result

                // checkin new file version
                VDF.Currency.FilePathAbsolute vdfPath = new VDF.Currency.FilePathAbsolute(mLocalFileFullName);
                FileIteration mUploadedFile           = null;
                try
                {
                    if (mFileAssocParams.Count > 0)
                    {
                        mUploadedFile = mConnection.FileManager.CheckinFile(mNewFileIteration, "Created by Custom Job executing iLogic : " + mAllRulesTextWrp,
                                                                            false, mFileAssocParams.ToArray(), null, true, null, mFileIteration.FileClassification, false, vdfPath);
                    }
                    else
                    {
                        mUploadedFile = mConnection.FileManager.CheckinFile(mNewFileIteration, "Created by Custom Job executing iLogic : " + mAllRulesTextWrp,
                                                                            false, null, null, false, null, mFileIteration.FileClassification, false, vdfPath);
                    }
                }
                catch
                {
                    context.Log(null, "Job could not check-in updated file: " + mUploadedFile.EntityName + ".");
                    return(JobOutcome.Failure);
                }
                #endregion check-in result

                #region reset

                mInvDfltProject.Activate();
                //delete temporary working folder if imlemented here

                #endregion reset

                return(JobOutcome.Success);
            }
            catch (Exception ex)
            {
                context.Log(ex, "Job failed by unhandled exception: " + ex.ToString() + " ");
                return(JobOutcome.Failure);
            }
        }
        /*****************************************************************************************/
        public static bool SetProperty(VDF.Vault.Currency.Connections.Connection connection, AWS.File file, string propertyName, object value, string tempPath)
        {
            long userId = connection.UserID;

            if (((file.CheckedOut) && (userId != file.CkOutUserId)) || (file.Locked))
            {
                return(false);
            }
            Option <AWS.PropDef> definition = PropertyOperations.GetPropertyDefinition(connection, propertyName);

            if (definition.IsNone)
            {
                return(false);
            }

            VDF.Vault.Currency.Entities.FileIteration fileIteration = new VDF.Vault.Currency.Entities.FileIteration(connection, file);

            Option <List <AWS.FileAssocLite> > oldAssociations = FileOperations.GetFileChildrenAssocsLite(connection, fileIteration);

            if (oldAssociations.IsNone)
            {
                return(false);
            }

            AWS.FileAssocArray[] files  = connection.WebServiceManager.DocumentService.GetLatestFileAssociationsByMasterIds(new long[] { file.MasterId }, AWS.FileAssociationTypeEnum.None, false, AWS.FileAssociationTypeEnum.Dependency, true, true, true, true);
            bool childCheckedOutByOther = false;

            foreach (AWS.FileAssocArray tempFiles in files)
            {
                try
                {
                    foreach (AWS.FileAssoc tempFile in tempFiles.FileAssocs)
                    {
                        if ((tempFile.CldFile.CheckedOut) && (tempFile.CldFile.CkOutUserId == userId))
                        {
                            VDF.Vault.Currency.Entities.FileIteration tempIteration = new VDF.Vault.Currency.Entities.FileIteration(connection, tempFile.CldFile);
                            connection.FileManager.UndoCheckoutFile(tempIteration);
                        }
                        else if ((tempFile.CldFile.CheckedOut))
                        {
                            childCheckedOutByOther = true;
                        }
                    }
                }
                catch { }
            }

            if (childCheckedOutByOther)
            {
                return(false);
            }



            VDF.Vault.Settings.AcquireFilesSettings acquireFilesSettings = new VDF.Vault.Settings.AcquireFilesSettings(connection, true);
            acquireFilesSettings.OptionsResolution.OverwriteOption = VDF.Vault.Settings.AcquireFilesSettings.AcquireFileResolutionOptions.OverwriteOptions.ForceOverwriteAll;
            acquireFilesSettings.OptionsRelationshipGathering.FileRelationshipSettings.IncludeAttachments          = false;
            acquireFilesSettings.OptionsRelationshipGathering.FileRelationshipSettings.IncludeChildren             = false; // true?
            acquireFilesSettings.OptionsRelationshipGathering.FileRelationshipSettings.IncludeRelatedDocumentation = true;
            acquireFilesSettings.OptionsRelationshipGathering.FileRelationshipSettings.RecurseChildren             = false; // true?
            acquireFilesSettings.OptionsRelationshipGathering.FileRelationshipSettings.VersionGatheringOption      = VDF.Vault.Currency.VersionGatheringOption.Latest;;
            acquireFilesSettings.LocalPath = new VDF.Currency.FolderPathAbsolute(tempPath);
            acquireFilesSettings.AddFileToAcquire(fileIteration, /*VDF.Vault.Settings.AcquireFilesSettings.AcquisitionOption.Checkout | VDF.Vault.Settings.AcquireFilesSettings.AcquisitionOption.Download*/ file.CheckedOut ? VDF.Vault.Settings.AcquireFilesSettings.AcquisitionOption.Download : VDF.Vault.Settings.AcquireFilesSettings.AcquisitionOption.Checkout);

            try
            {
                VDF.Vault.Results.AcquireFilesResults acquireFilesResults = connection.FileManager.AcquireFiles(acquireFilesSettings);
                if (acquireFilesResults.FileResults.First().Status != VDF.Vault.Results.FileAcquisitionResult.AcquisitionStatus.Success)
                {
                    return(false);
                }


                AWS.PropInstParam property = new AWS.PropInstParam {
                    PropDefId = definition.Get().Id, Val = value
                };

                connection.WebServiceManager.DocumentService.UpdateFileProperties(new long[] { file.MasterId }, new AWS.PropInstParamArray[] { new AWS.PropInstParamArray {
                                                                                                                                                   Items = new AWS.PropInstParam[] { property }
                                                                                                                                               } });
                List <AWS.FileAssocParam> newAssociations = FileOperations.UpdateFileAssociations(connection, fileIteration, oldAssociations.Get());

                connection.FileManager.CheckinFile(fileIteration,
                                                   comment: "Updated property: " + propertyName + " to " + value.ToString(),
                                                   keepCheckedOut: false,
                                                   associations: newAssociations.ToArray(),
                                                   bom: null,
                                                   copyBom: false,
                                                   newFileName: null,
                                                   classification: fileIteration.FileClassification,
                                                   hidden: false,
                                                   filePath: new VDF.Currency.FilePathAbsolute(tempPath + "/" + file.Name));

                return(true);
            }
            catch (Exception ex)
            {
                connection.FileManager.UndoCheckoutFile(fileIteration);
                throw new ErrorMessageException("Child is checked out.");
            }
        }
        /*****************************************************************************************/
        public static Option <VDF.Vault.Results.AcquireFilesResults> CheckOutFile(VDF.Vault.Currency.Connections.Connection connection, AWS.File file, string localDirectoryPath, List <AWS.FileAssocLite> oldAssociations)
        {
            long userId = connection.UserID;

            if (((file.CheckedOut) && (userId != file.CkOutUserId)) || (file.Locked))
            {
                return(Option.None);
            }

            VDF.Vault.Currency.Entities.FileIteration fileIteration = new VDF.Vault.Currency.Entities.FileIteration(connection, file);

            Option <List <AWS.FileAssocLite> > oldAssocs = FileOperations.GetFileChildrenAssocsLite(connection, fileIteration);

            if (oldAssocs.IsNone)
            {
                return(Option.None);
            }

            oldAssociations.AddRange(oldAssocs.Get());

            AWS.FileAssocArray[] files  = connection.WebServiceManager.DocumentService.GetLatestFileAssociationsByMasterIds(new long[] { file.MasterId }, AWS.FileAssociationTypeEnum.None, false, AWS.FileAssociationTypeEnum.Dependency, true, true, true, true);
            bool childCheckedOutByOther = false;

            foreach (AWS.FileAssocArray tempFiles in files)
            {
                try
                {
                    foreach (AWS.FileAssoc tempFile in tempFiles.FileAssocs)
                    {
                        if ((tempFile.CldFile.CheckedOut) && (tempFile.CldFile.CkOutUserId == userId))
                        {
                            VDF.Vault.Currency.Entities.FileIteration tempIteration = new VDF.Vault.Currency.Entities.FileIteration(connection, tempFile.CldFile);
                            connection.FileManager.UndoCheckoutFile(tempIteration);
                        }
                        else if ((tempFile.CldFile.CheckedOut))
                        {
                            childCheckedOutByOther = true;
                        }
                    }
                }
                catch { }
            }

            if (childCheckedOutByOther)
            {
                return(Option.None);
            }

            VDF.Vault.Settings.AcquireFilesSettings acquireFilesSettings = new VDF.Vault.Settings.AcquireFilesSettings(connection, true);
            acquireFilesSettings.OptionsResolution.OverwriteOption = VDF.Vault.Settings.AcquireFilesSettings.AcquireFileResolutionOptions.OverwriteOptions.ForceOverwriteAll;
            acquireFilesSettings.OptionsRelationshipGathering.FileRelationshipSettings.IncludeAttachments          = false;
            acquireFilesSettings.OptionsRelationshipGathering.FileRelationshipSettings.IncludeChildren             = false; // true?
            acquireFilesSettings.OptionsRelationshipGathering.FileRelationshipSettings.IncludeRelatedDocumentation = true;
            acquireFilesSettings.OptionsRelationshipGathering.FileRelationshipSettings.RecurseChildren             = false; // true?
            acquireFilesSettings.OptionsRelationshipGathering.FileRelationshipSettings.VersionGatheringOption      = VDF.Vault.Currency.VersionGatheringOption.Latest;;
            acquireFilesSettings.LocalPath = new VDF.Currency.FolderPathAbsolute(localDirectoryPath);
            acquireFilesSettings.AddFileToAcquire(fileIteration, file.CheckedOut ? VDF.Vault.Settings.AcquireFilesSettings.AcquisitionOption.Download : VDF.Vault.Settings.AcquireFilesSettings.AcquisitionOption.Checkout);

            try
            {
                VDF.Vault.Results.AcquireFilesResults acquireFilesResults = connection.FileManager.AcquireFiles(acquireFilesSettings);
                if (acquireFilesResults.FileResults.First().Status != VDF.Vault.Results.FileAcquisitionResult.AcquisitionStatus.Success)
                {
                    return(Option.None);
                }

                return(acquireFilesResults.AsOption());
            }
            catch
            {
                connection.FileManager.UndoCheckoutFile(fileIteration);
                throw new ErrorMessageException("Child is checked out.");
            }
        }