public NodeReadConverter(CustomNodeManager manager, LibraryServices libraryServices, bool isTestMode = false)
 {
     this.manager         = manager;
     this.libraryServices = libraryServices;
     this.isTestMode      = isTestMode;
     // We only do this in test mode because it should not be required-
     // see comment below in NodeReadConverter.ReadJson - and it could be slow.
     if (this.isTestMode)
     {
         this.loadedAssemblies = this.buildMapOfLoadedAssemblies();
     }
 }
示例#2
0
        internal PackageManagerClient(IGregClient client, string rootPackageDirectory, CustomNodeManager customNodeManager)
        {
            this.rootPackageDirectory = rootPackageDirectory;
            this.customNodeManager    = customNodeManager;
            this.client       = client;
            this.authProvider = this.client.AuthProvider;

            if (this.authProvider != null)
            {
                this.authProvider.LoginStateChanged += OnLoginStateChanged;
            }
        }
        private PackagePathViewModel CreatePackagePathViewModel(PreferenceSettings setting)
        {
            PackageLoader     loader     = new PackageLoader(setting.CustomPackageFolders);
            LoadPackageParams loadParams = new LoadPackageParams
            {
                Preferences = setting,
                PathManager = Model.PathManager
            };
            CustomNodeManager customNodeManager = Model.CustomNodeManager;

            return(new PackagePathViewModel(loader, loadParams, customNodeManager));
        }
示例#4
0
 public void LoadCustomNodesAndPackages(LoadPackageParams loadPackageParams, CustomNodeManager customNodeManager)
 {
     foreach (var path in loadPackageParams.Preferences.CustomPackageFolders)
     {
         customNodeManager.AddUninitializedCustomNodesInPath(path, false, false);
         if (!this.packagesDirectories.Contains(path))
         {
             this.packagesDirectories.Add(path);
         }
     }
     LoadAll(loadPackageParams);
 }
示例#5
0
        /// <summary>
        ///     Class constructor
        /// </summary>
        public DynamoController(ExecutionEnvironment env,
                                Type viewModelType, string context, string commandFilePath)
        {
            DynamoLogger.Instance.StartLogging();

            dynSettings.Controller = this;

            this.Context = context;

            //Start heartbeat reporting
            Services.InstrumentationLogger.Start();

            //create the view model to which the main window will bind
            //the DynamoModel is created therein
            this.DynamoViewModel = (DynamoViewModel)Activator.CreateInstance(
                viewModelType, new object[] { this, commandFilePath });

            // custom node loader
            string directory   = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            string pluginsPath = Path.Combine(directory, "definitions");

            CustomNodeManager = new CustomNodeManager(pluginsPath);

            SearchViewModel = new SearchViewModel();

            dynSettings.PackageLoader = new PackageLoader();

            dynSettings.PackageLoader.DoCachedPackageUninstalls();
            dynSettings.PackageLoader.LoadPackages();

            FSchemeEnvironment = env;

            DynamoViewModel.Model.CurrentWorkspace.X = 0;
            DynamoViewModel.Model.CurrentWorkspace.Y = 0;

            DynamoLogger.Instance.Log(String.Format(
                                          "Dynamo -- Build {0}",
                                          Assembly.GetExecutingAssembly().GetName().Version));

            DynamoLoader.ClearCachedAssemblies();
            DynamoLoader.LoadBuiltinTypes();

            //run tests
            if (FScheme.RunTests(DynamoLogger.Instance.Log))
            {
                DynamoLogger.Instance.Log("All Tests Passed. Core library loaded OK.");
            }

            this.InfoBubbleViewModel = new InfoBubbleViewModel();

            AddPythonBindings();
        }
示例#6
0
        internal void RefreshCustomNodesFromDirectory(CustomNodeManager customNodeManager, bool isTestMode)
        {
            LoadedCustomNodes.Clear();

            var reloadedCustomNodes = customNodeManager.AddUninitializedCustomNodesInPath(
                CustomNodeDirectory,
                isTestMode,
                new PackageInfo(Name, new Version(versionName)));

            foreach (var x in reloadedCustomNodes)
            {
                LoadedCustomNodes.Add(x);
            }
        }
示例#7
0
        /// <summary>
        ///     Class constructor
        /// </summary>
        public DynamoController(ExecutionEnvironment env, Type viewModelType, string context)
        {
            dynSettings.Controller = this;

            this.Context = context;

            //Start heartbeat reporting
            Services.InstrumentationLogger.Start();

            //create the view model to which the main window will bind
            //the DynamoModel is created therein
            this.DynamoViewModel = (DynamoViewModel)Activator.CreateInstance(viewModelType, new object[] { this });

            // custom node loader
            string directory   = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            string pluginsPath = Path.Combine(directory, "definitions");

            CustomNodeManager = new CustomNodeManager(pluginsPath);

            SearchViewModel                  = new SearchViewModel();
            PackageManagerClient             = new PackageManagerClient();
            dynSettings.PackageManagerClient = PackageManagerClient;
            PublishPackageViewModel          = new PublishPackageViewModel(PackageManagerClient);

            dynSettings.PackageLoader = new PackageLoader();

            dynSettings.PackageLoader.DoCachedPackageUninstalls();
            dynSettings.PackageLoader.LoadPackages();

            FSchemeEnvironment = env;

            DynamoViewModel.Model.CurrentSpace.X = DynamoView.CANVAS_OFFSET_X;
            DynamoViewModel.Model.CurrentSpace.Y = DynamoView.CANVAS_OFFSET_Y;

            dynSettings.Controller.DynamoViewModel.Log(String.Format(
                                                           "Dynamo -- Build {0}",
                                                           Assembly.GetExecutingAssembly().GetName().Version));

            DynamoLoader.ClearCachedAssemblies();
            DynamoLoader.LoadBuiltinTypes();

            //run tests
            if (FScheme.RunTests(dynSettings.Controller.DynamoViewModel.Log))
            {
                dynSettings.Controller.DynamoViewModel.Log("All Tests Passed. Core library loaded OK.");
            }

            NodeSubmittedForRendering += new EventHandler(Controller_NodeSubmittedForRendering);
            NodeRemovedFromRendering  += new EventHandler(Controller_NodeRemovedFromRendering);
        }
示例#8
0
        private static void RemapCustomNodeFilePaths(CustomNodeManager customNodeManager, IEnumerable <string> filePaths, string dyfRoot)
        {
            var defList = filePaths
                          .Where(x => x.EndsWith(".dyf"))
                          .Select(customNodeManager.GuidFromPath)
                          .Select(customNodeManager.GetFunctionDefinition)
                          .ToList();

            defList.ForEach(func =>
            {
                var newPath = Path.Combine(dyfRoot, Path.GetFileName(func.WorkspaceModel.FileName));
                func.WorkspaceModel.FileName = newPath;
                customNodeManager.SetNodePath(func.FunctionId, newPath);
            });
        }
示例#9
0
        public PackagePathViewModel(PackageLoader loader, LoadPackageParams loadParams, CustomNodeManager customNodeManager)
        {
            this.packageLoader     = loader;
            this.loadPackageParams = loadParams;
            this.customNodeManager = customNodeManager;
            RootLocations          = new ObservableCollection <string>(setting.CustomPackageFolders);

            AddPathCommand      = new DelegateCommand(p => InsertPath());
            DeletePathCommand   = new DelegateCommand(p => RemovePathAt((int)p), CanDelete);
            MovePathUpCommand   = new DelegateCommand(p => SwapPath((int)p, ((int)p) - 1), CanMoveUp);
            MovePathDownCommand = new DelegateCommand(p => SwapPath((int)p, ((int)p) + 1), CanMoveDown);
            UpdatePathCommand   = new DelegateCommand(p => UpdatePathAt((int)p));
            SaveSettingCommand  = new DelegateCommand(CommitChanges);

            SelectedIndex = 0;
        }
示例#10
0
        private PackagePathViewModel CreatePackagePathViewModel(PreferenceSettings setting)
        {
            var pathManager = new Mock <IPathManager>();

            pathManager.SetupGet(x => x.PackagesDirectories).Returns(
                () => setting.CustomPackageFolders);

            PackageLoader loader = new PackageLoader(pathManager.Object);

            LoadPackageParams loadParams = new LoadPackageParams
            {
                Preferences = setting,
            };
            CustomNodeManager customNodeManager = Model.CustomNodeManager;

            return(new PackagePathViewModel(loader, loadParams, customNodeManager));
        }
示例#11
0
        private PackagePathViewModel CreatePackagePathViewModel(PreferenceSettings settings)
        {
            var pathManager = new PathManager(new PathManagerParams {
            })
            {
                Preferences = settings
            };

            PackageLoader loader = new PackageLoader(pathManager);

            LoadPackageParams loadParams = new LoadPackageParams
            {
                Preferences = settings,
            };
            CustomNodeManager customNodeManager = Model.CustomNodeManager;

            return(new PackagePathViewModel(loader, loadParams, customNodeManager));
        }
示例#12
0
        private static void RemapCustomNodeFilePaths(CustomNodeManager customNodeManager, IEnumerable <string> filePaths, string dyfRoot, bool isTestMode)
        {
            var defList = filePaths.Where(x => x.EndsWith(".dyf"))
                          .Select(customNodeManager.GuidFromPath)
                          .Select(
                id =>
            {
                CustomNodeWorkspaceModel def;
                return
                (new { Success = customNodeManager.TryGetFunctionWorkspace(id, isTestMode, out def), Workspace = def });
            }).Where(result => result.Success).Select(result => result.Workspace);

            foreach (var func in defList)
            {
                var newPath = Path.Combine(dyfRoot, Path.GetFileName(func.FileName));
                func.FileName = newPath;
            }
        }
示例#13
0
        /// <summary>
        /// Helper function to load new custom nodes and packages.
        /// </summary>
        /// <param name="newPaths">New package paths to load custom nodes and packages from.</param>
        /// <param name="preferences">Can be a temporary local preferences object.</param>
        /// <param name="customNodeManager"></param>
        private void LoadCustomNodesAndPackagesHelper(IEnumerable <string> newPaths, IPreferences preferences,
                                                      CustomNodeManager customNodeManager)
        {
            foreach (var path in preferences.CustomPackageFolders)
            {
                // Append the definitions subdirectory for custom nodes.
                var dir = path == DynamoModel.BuiltInPackagesToken ? PathManager.BuiltinPackagesDirectory : path;
                dir = TransformPath(dir, PathManager.DefinitionsDirectoryName);

                customNodeManager.AddUninitializedCustomNodesInPath(dir, false, false);
            }
            foreach (var path in newPaths)
            {
                if (DynamoModel.IsDisabledPath(path, preferences))
                {
                    Log(string.Format(Resources.PackagesDirectorySkipped, path));
                    continue;
                }
                else
                {
                    ScanPackageDirectories(path, preferences);
                }
            }

            if (pathManager != null)
            {
                foreach (var pkg in LocalPackages)
                {
                    if (Directory.Exists(pkg.BinaryDirectory))
                    {
                        pathManager.AddResolutionPath(pkg.BinaryDirectory);
                    }
                }
            }

            if (LocalPackages.Any())
            {
                // Load only those recently addeed local packages (that are located in any of the new paths)
                var newPackages = LocalPackages.Where(x => newPaths.Any(y => x.RootDirectory.Contains(y)));
                LoadPackages(newPackages);
            }
        }
示例#14
0
        /// <summary>
        /// This method is used when custom nodes and packages need to be loaded from new package paths
        /// that have been added to preference settings.
        /// </summary>
        /// <param name="newPaths">New package paths to load custom nodes and packages from.</param>
        /// <param name="customNodeManager"></param>
        internal void LoadNewCustomNodesAndPackages(IEnumerable <string> newPaths, CustomNodeManager customNodeManager)
        {
            if (newPaths == null || !newPaths.Any())
            {
                return;
            }

            var preferences       = (pathManager as PathManager).Preferences;
            var packageDirsToScan = new List <string>();

            foreach (var path in newPaths)
            {
                var packageDirectory = pathManager.PackagesDirectories.FirstOrDefault(x => x.StartsWith(path));
                if (packageDirectory != null)
                {
                    packageDirsToScan.Add(packageDirectory);
                }
            }
            LoadCustomNodesAndPackagesHelper(packageDirsToScan, preferences, customNodeManager);
        }
示例#15
0
文件: Package.cs 项目: whztt07/Dynamo
        internal void UninstallCore(CustomNodeManager customNodeManager, PackageLoader packageLoader, IPreferences prefs, ILogger logger)
        {
            if (this.LoadedAssemblies.Any())
            {
                this.MarkForUninstall(prefs);
                return;
            }

            try
            {
                LoadedCustomNodes.ToList().ForEach(x => customNodeManager.RemoveFromDynamo(x.Guid));
                packageLoader.LocalPackages.Remove(this);
                Directory.Delete(this.RootDirectory, true);
            }
            catch (Exception e)
            {
                logger.Log("Exception when attempting to uninstall the package " + this.Name + " from " + this.RootDirectory);
                logger.Log(e.GetType() + ": " + e.Message);
                throw e;
            }
        }
示例#16
0
        internal void UninstallCore(CustomNodeManager customNodeManager, PackageLoader packageLoader, IPreferences prefs)
        {
            if (LoadedAssemblies.Any())
            {
                MarkForUninstall(prefs);
                return;
            }

            try
            {
                LoadedCustomNodes.ToList().ForEach(x => customNodeManager.Remove(x.FunctionId));
                packageLoader.Remove(this);
                Directory.Delete(RootDirectory, true);
            }
            catch (Exception e)
            {
                Log("Exception when attempting to uninstall the package " + Name + " from " + RootDirectory);
                Log(e.GetType() + ": " + e.Message);
                throw;
            }
        }
示例#17
0
        /// <summary>
        ///     Scan the PackagesDirectory for packages and attempt to load all of them.  Beware! Fails silently for duplicates.
        /// </summary>
        public void LoadPackagesIntoDynamo(
            IPreferences preferences, LibraryServices libraryServices, DynamoLoader loader, string context,
            bool isTestMode, CustomNodeManager customNodeManager)
        {
            ScanAllPackageDirectories(preferences);

            foreach (var pkg in LocalPackages)
            {
                DynamoPathManager.Instance.AddResolutionPath(pkg.BinaryDirectory);
            }

            foreach (var pkg in LocalPackages)
            {
                pkg.LoadIntoDynamo(
                    loader,
                    AsLogger(),
                    libraryServices,
                    context,
                    isTestMode,
                    customNodeManager);
            }
        }
 private void Setup()
 {
     try
       {
     m_ViewModel.ProducerRestart = new RestartCommand(Current.Restart);
     Current.ConfigurationFactory = new ProducerConfigurationFactory();
     CustomNodeManager _simulator = new CustomNodeManager();
     m_ToDispose.Add(_simulator);
     Current.BindingFactory = _simulator;
     Current.EncodingFactory = _simulator;
     Current.MessageHandlerFactory = new ProducerMessageHandlerFactory(x => m_ToDispose.Add(x), m_Trace, m_ViewModel);
     Current.Initialize();
     Current.Run();
     _simulator.Run();
     m_ViewModel.ProducerErrorMessage = "Running";
       }
       catch (Exception ex)
       {
     m_ViewModel.ProducerErrorMessage = String.Format("Error: {0}", ex.Message);
     Dispose();
       }
 }
示例#19
0
        /// <summary>
        /// Load the Package into Dynamo.
        /// </summary>
        /// <param name="loader"></param>
        /// <param name="logger"></param>
        /// <param name="libraryServices"></param>
        /// <param name="context"></param>
        /// <param name="isTestMode"></param>
        /// <param name="customNodeManager"></param>
        public void LoadIntoDynamo(
            DynamoLoader loader, ILogger logger, LibraryServices libraryServices, string context,
            bool isTestMode, CustomNodeManager customNodeManager)
        {
            // Prevent duplicate loads
            if (Loaded)
            {
                return;
            }

            try
            {
                LoadAssembliesIntoDynamo(loader, libraryServices, context);
                LoadCustomNodesIntoDynamo(customNodeManager, isTestMode);
                EnumerateAdditionalFiles();
                Loaded = true;
            }
            catch (Exception e)
            {
                Log("Exception when attempting to load package " + Name + " from " + RootDirectory);
                Log(e.GetType() + ": " + e.Message);
            }
        }
示例#20
0
        private bool VerifyFuncId(ref Guid funcId, string nickname)
        {
            if (funcId == null)
            {
                return(false);
            }

            // if the dyf does not exist on the search path...
            if (this.dynamoModel.CustomNodeManager.Contains(funcId))
            {
                return(true);
            }

            CustomNodeManager manager = this.dynamoModel.CustomNodeManager;

            // if there is a node with this name, use it instead
            if (!manager.Contains(nickname))
            {
                return(false);
            }

            funcId = manager.GetGuidFromName(nickname);
            return(true);
        }
示例#21
0
        internal void UninstallCore(CustomNodeManager customNodeManager, PackageLoader packageLoader, IPreferences prefs)
        {
            if (LoadedAssemblies.Any())
            {
                MarkForUninstall(prefs);
                return;
            }

            try
            {
                LoadedCustomNodes.ToList().ForEach(x => customNodeManager.Remove(x.FunctionId));
                if (BuiltInPackage)
                {
                    LoadState.SetAsUnloaded();
                    Analytics.TrackEvent(Actions.BuiltInPackageConflict, Categories.PackageManagerOperations, $"{Name } {versionName} set unloaded");

                    RaisePropertyChanged(nameof(LoadState));

                    if (!prefs.PackageDirectoriesToUninstall.Contains(RootDirectory))
                    {
                        prefs.PackageDirectoriesToUninstall.Add(RootDirectory);
                    }
                }
                else
                {
                    packageLoader.Remove(this);
                    Directory.Delete(RootDirectory, true);
                }
            }
            catch (Exception e)
            {
                Log("Exception when attempting to uninstall the package " + Name + " from " + RootDirectory);
                Log(e.GetType() + ": " + e.Message);
                throw;
            }
        }
示例#22
0
        private bool VerifyFuncId(ref Guid funcId)
        {
            if (funcId == null)
            {
                return(false);
            }

            // if the dyf does not exist on the search path...
            if (Workspace.DynamoModel.CustomNodeManager.Contains(funcId))
            {
                return(true);
            }

            CustomNodeManager manager = Workspace.DynamoModel.CustomNodeManager;

            // if there is a node with this name, use it instead
            if (manager.Contains(NickName))
            {
                funcId = manager.GetGuidFromName(NickName);
                return(true);
            }

            return(false);
        }
示例#23
0
        // Use this for initialization
        void Start()
        {
            WorkModels       = new List <GraphModel>();
            LoadedNodeModels = new List <Type>();
            LoadedFunctions  = new Dictionary <string, FunctionDescription>();
            //create a nodeModelloader for this instance of appmodel
            var nodeloaderinst   = new NodeModelLoader();
            var ZTnodeloaderinst = new ZTsubsetLoader();


            //on program start, we load a home screen into the main canvas
            //var maincanvas = GameObject.Find("Canvas");
            //the home screen comtains, run, save(possibly), and the library component

            //TODO for now find the object, but we should load it here instead
            var homescreen = GameObject.Find("HomeCanvas");

            NodeLibrary           = homescreen.GetComponentInChildren <Library>();
            this.PropertyChanged += NodeLibrary.HandleAppModelChanges;

            LoadedNodeModels = nodeloaderinst.LoadNodeModels("Nodes", true);
            Debug.Log("loaded " + LoadedNodeModels.Count.ToString() + " nodes");

            LoadedNodeModels = LoadedNodeModels.Concat(ZTnodeloaderinst.LoadNodeModels("ZTNodes", false)).ToList();
            Debug.Log("loaded " + LoadedNodeModels.Count.ToString() + " nodes");

            LoadedFunctions = LoadedFunctions.Concat(ZTnodeloaderinst.functions).ToDictionary(x => x.Key, x => x.Value);
            Debug.Log("loaded " + LoadedFunctions.Keys.Count.ToString() + " function pointers");
            //the load screen will have some callbacks here that create graphmodels
            // either by loading them and passing the string to parse back, or by creating a new one
            CollapsedCustomGraphNodeManager              = new CustomNodeManager(this);
            CollapsedCustomGraphNodeManager.InfoUpdated += HandleInfoUpdated;
            CollapsedCustomGraphNodeManager.AddUninitializedCustomNodesInPath(Path.Combine(Application.dataPath, "testGraphs/customnodes"), false);
            Debug.Log("loaded " + CollapsedCustomGraphNodeManager.LoadedDefinitions.Count().ToString() + "cusotm node functions");
            //TODO inspect logic for firing repopulation of library...
        }
示例#24
0
        private static string DoPackageFileOperationsAndZip(string rootPkgDir, CustomNodeManager customNodeManager, PackageUploadRequestBody header, Package pkg, List <string> files, PackageUploadHandle uploadHandle, bool isTestMode)
        {
            uploadHandle.UploadState = PackageUploadHandle.State.Copying;

            DirectoryInfo rootDir, dyfDir, binDir, extraDir;

            FormPackageDirectory(rootPkgDir, pkg.Name, out rootDir, out dyfDir, out binDir, out extraDir);  // shouldn't do anything for pkg versions
            pkg.RootDirectory = rootDir.FullName;
            WritePackageHeader(header, rootDir);
            CopyFilesIntoPackageDirectory(files, dyfDir, binDir, extraDir);
            RemoveDyfFiles(files, dyfDir);
            RemapCustomNodeFilePaths(customNodeManager, files, dyfDir.FullName, isTestMode);

            uploadHandle.UploadState = PackageUploadHandle.State.Compressing;

            string   zipPath;
            FileInfo info;

            try
            {
                zipPath = Greg.Utility.FileUtilities.Zip(rootDir.FullName);
                info    = new FileInfo(zipPath);
            }
            catch
            {
                // give nicer error
                throw new Exception(Properties.Resources.CouldNotCompressFile);
            }

            if (info.Length > 100 * 1024 * 1024)
            {
                throw new Exception(Properties.Resources.PackageTooLarge);
            }

            return(zipPath);
        }
示例#25
0
 public void DisplayFunction(object parameters)
 {
     CustomNodeManager.GetFunctionDefinition((Guid)parameters);
 }
示例#26
0
        /// <summary>
        /// Deserializes and returns the nodeModel that is represented by the original content of this DummyNode.
        /// If this node cannot be resolved, returns a new DummyNode
        /// </summary>
        /// <param name="json"></param>
        /// <param name="libraryServices"></param>
        /// <param name="factory"></param>
        /// <param name="isTestMode"></param>
        /// <param name="manager"></param>
        internal NodeModel GetNodeModelForDummyNode(string json, LibraryServices libraryServices,
                                                    NodeFactory factory, bool isTestMode, CustomNodeManager manager)
        {
            var settings = new JsonSerializerSettings
            {
                Error = (sender, args) =>
                {
                    args.ErrorContext.Handled = true;
                    Console.WriteLine(args.ErrorContext.Error);
                },
                ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
                TypeNameHandling      = TypeNameHandling.Auto,
                Formatting            = Newtonsoft.Json.Formatting.Indented,
                Culture    = CultureInfo.InvariantCulture,
                Converters = new List <JsonConverter> {
                    new NodeReadConverter(manager, libraryServices, factory, isTestMode),
                    new TypedParameterConverter()
                },
                ReferenceResolverProvider = () => { return(new IdReferenceResolver()); }
            };

            var result            = SerializationExtensions.ReplaceTypeDeclarations(json, true);
            var resolvedNodeModel = JsonConvert.DeserializeObject <NodeModel>(result, settings);

            // If the resolved node model is not a dummy node, then copy the node view properties from the dummy node to the resolved version of that node.
            if (!(resolvedNodeModel is DummyNode))
            {
                SetNodeViewDataOnResolvedNode(this, resolvedNodeModel);
            }
            else
            {
                this.Log(string.Format("This graph has a node with id:{0} and name:{1}, but it could not be resolved",
                                       resolvedNodeModel.GUID, resolvedNodeModel.Name)
                         , WarningLevel.Moderate);
            }

            return(resolvedNodeModel);
        }
示例#27
0
        protected DynamoModel(IStartConfiguration config)
        {
            ClipBoard = new ObservableCollection<ModelBase>();

            pathManager = new PathManager(new PathManagerParams
            {
                CorePath = config.DynamoCorePath,
                PathResolver = config.PathResolver
            });

            // Ensure we have all directories in place.
            pathManager.EnsureDirectoryExistence();

            Context = config.Context;
            IsTestMode = config.StartInTestMode;
            DebugSettings = new DebugSettings();
            Logger = new DynamoLogger(DebugSettings, pathManager.LogDirectory);

            MigrationManager = new MigrationManager(DisplayFutureFileMessage, DisplayObsoleteFileMessage);
            MigrationManager.MessageLogged += LogMessage;
            MigrationManager.MigrationTargets.Add(typeof(WorkspaceMigrations));

            var thread = config.SchedulerThread ?? new DynamoSchedulerThread();
            Scheduler = new DynamoScheduler(thread, IsTestMode);
            Scheduler.TaskStateChanged += OnAsyncTaskStateChanged;

            geometryFactoryPath = config.GeometryFactoryPath;

            IPreferences preferences = CreateOrLoadPreferences(config.Preferences);
            var settings = preferences as PreferenceSettings;
            if (settings != null)
            {
                PreferenceSettings = settings;
                PreferenceSettings.PropertyChanged += PreferenceSettings_PropertyChanged;
            }

            InitializePreferences(preferences);
            InitializeInstrumentationLogger();

            if (!isTestMode && this.PreferenceSettings.IsFirstRun)
            {
                DynamoMigratorBase migrator = null;

                try
                {
                    migrator = DynamoMigratorBase.MigrateBetweenDynamoVersions(pathManager, config.PathResolver);
                }
                catch (Exception e)
                {
                    Logger.Log(e.Message);
                }

                if (migrator != null)
                {
                    var isFirstRun = this.PreferenceSettings.IsFirstRun;
                    this.PreferenceSettings = migrator.PreferenceSettings;

                    // Preserve the preference settings for IsFirstRun as this needs to be set 
                    // only by UsageReportingManager
                    this.PreferenceSettings.IsFirstRun = isFirstRun;
                }
            }

            SearchModel = new NodeSearchModel();
            SearchModel.ItemProduced +=
                node => ExecuteCommand(new CreateNodeCommand(node, 0, 0, true, true));

            NodeFactory = new NodeFactory();
            NodeFactory.MessageLogged += LogMessage;

            CustomNodeManager = new CustomNodeManager(NodeFactory, MigrationManager);
            InitializeCustomNodeManager();

            extensionManager = new ExtensionManager();
            extensionManager.MessageLogged += LogMessage;
            var extensions = config.Extensions ?? ExtensionManager.ExtensionLoader.LoadDirectory(pathManager.ExtensionsDirectory);

            if (extensions.Any())
            {
                var startupParams = new StartupParams(config.AuthProvider,
                    pathManager, CustomNodeManager);

                foreach (var ext in extensions)
                {
                    ext.Startup(startupParams);
                    ext.Load(preferences, pathManager);
                    ext.RequestLoadNodeLibrary += LoadNodeLibrary;
                    ExtensionManager.Add(ext);
                }
            }

            Loader = new NodeModelAssemblyLoader();
            Loader.MessageLogged += LogMessage;

            DisposeLogic.IsShuttingDown = false;

            // Create a core which is used for parsing code and loading libraries
            var libraryCore =
                new ProtoCore.Core(new Options { RootCustomPropertyFilterPathName = string.Empty });

            libraryCore.Compilers.Add(Language.kAssociative, new Compiler(libraryCore));
            libraryCore.Compilers.Add(Language.kImperative, new ProtoImperative.Compiler(libraryCore));
            libraryCore.ParsingMode = ParseMode.AllowNonAssignment;

            LibraryServices = new LibraryServices(libraryCore, pathManager);
            LibraryServices.MessageLogged += LogMessage;
            LibraryServices.LibraryLoaded += LibraryLoaded;

            ResetEngineInternal();

            AddHomeWorkspace();

            AuthenticationManager = new AuthenticationManager(config.AuthProvider);

            UpdateManager = config.UpdateManager ?? new DefaultUpdateManager(null);
            UpdateManager.Log += UpdateManager_Log;
            if (!IsTestMode)
            {
                DefaultUpdateManager.CheckForProductUpdate(UpdateManager);
            }
            
            Logger.Log(string.Format("Dynamo -- Build {0}", 
                                        Assembly.GetExecutingAssembly().GetName().Version));

            InitializeNodeLibrary(preferences);

            LogWarningMessageEvents.LogWarningMessage += LogWarningMessage;

            StartBackupFilesTimer();

            TraceReconciliationProcessor = this; 
            
            foreach (var ext in ExtensionManager.Extensions)
            {
                try
                {
                    ext.Ready(new ReadyParams());
                }
                catch (Exception ex)
                {
                    Logger.Log(ex.Message);
                }
            }
        }
示例#28
0
        /// <summary>
        ///     Class constructor
        /// </summary>
        public DynamoController(string context, IUpdateManager updateManager,
            IWatchHandler watchHandler, IPreferences preferences, string corePath)
        {
            DebugSettings = new DebugSettings();

            IsCrashing = false;

            dynSettings.Controller = this;

            Context = context;

            
            PreferenceSettings = preferences;
            ((PreferenceSettings) PreferenceSettings).PropertyChanged += PreferenceSettings_PropertyChanged;

            SIUnit.LengthUnit = PreferenceSettings.LengthUnit;
            SIUnit.AreaUnit = PreferenceSettings.AreaUnit;
            SIUnit.VolumeUnit = PreferenceSettings.VolumeUnit;
            SIUnit.NumberFormat = PreferenceSettings.NumberFormat;

            UpdateManager = updateManager;
            UpdateManager.CheckForProductUpdate(new UpdateRequest(new Uri(Configurations.UpdateDownloadLocation),dynSettings.DynamoLogger, UpdateManager.UpdateDataAvailable));

            WatchHandler = watchHandler;

            //Start heartbeat reporting
            //This needs to be done after the update manager has been initialised
            //so that the version number can be reported
            InstrumentationLogger.Start();

            //create the model
            DynamoModel = new DynamoModel ();
            DynamoModel.AddHomeWorkspace();

            SearchViewModel = new SearchViewModel(DynamoModel);

            DynamoModel.CurrentWorkspace = DynamoModel.HomeSpace;
            DynamoModel.CurrentWorkspace.X = 0;
            DynamoModel.CurrentWorkspace.Y = 0;

            // custom node loader
            CustomNodeManager = new CustomNodeManager(DynamoPathManager.Instance.UserDefinitions);

            dynSettings.PackageLoader = new PackageLoader();

            dynSettings.PackageLoader.DoCachedPackageUninstalls();
            dynSettings.PackageLoader.LoadPackages();

            DisposeLogic.IsShuttingDown = false;

            EngineController = new EngineController(this);
            CustomNodeManager.RecompileAllNodes(EngineController);

            //This is necessary to avoid a race condition by causing a thread join
            //inside the vm exec
            //TODO(Luke): Push this into a resync call with the engine controller
            ResetEngine();

            dynSettings.DynamoLogger.Log(String.Format(
                "Dynamo -- Build {0}",
                Assembly.GetExecutingAssembly().GetName().Version));

            DynamoLoader.ClearCachedAssemblies();
            DynamoLoader.LoadNodeModels();

            MigrationManager.Instance.MigrationTargets.Add(typeof(WorkspaceMigrations));

            Runner = new DynamoRunner();
        }
示例#29
0
        /// <summary>
        ///     Class constructor
        /// </summary>
        public DynamoController(string context, IUpdateManager updateManager,
                                IWatchHandler watchHandler, IPreferences preferences)
        {
            DebugSettings = new DebugSettings();

            IsCrashing = false;

            dynSettings.Controller = this;

            Context = context;

            //Start heartbeat reporting
            InstrumentationLogger.Start();

            PreferenceSettings = preferences;
            ((PreferenceSettings)PreferenceSettings).PropertyChanged += PreferenceSettings_PropertyChanged;

            SIUnit.LengthUnit   = PreferenceSettings.LengthUnit;
            SIUnit.AreaUnit     = PreferenceSettings.AreaUnit;
            SIUnit.VolumeUnit   = PreferenceSettings.VolumeUnit;
            SIUnit.NumberFormat = PreferenceSettings.NumberFormat;

            UpdateManager = updateManager;
            UpdateManager.UpdateDownloaded  += updateManager_UpdateDownloaded;
            UpdateManager.ShutdownRequested += updateManager_ShutdownRequested;
            UpdateManager.CheckForProductUpdate(new UpdateRequest(new Uri(Configurations.UpdateDownloadLocation), dynSettings.DynamoLogger, UpdateManager.UpdateDataAvailable));

            WatchHandler = watchHandler;

            //create the model
            DynamoModel = new DynamoModel();
            DynamoModel.AddHomeWorkspace();
            DynamoModel.CurrentWorkspace   = DynamoModel.HomeSpace;
            DynamoModel.CurrentWorkspace.X = 0;
            DynamoModel.CurrentWorkspace.Y = 0;

            // custom node loader
            string directory   = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            string pluginsPath = Path.Combine(directory, "definitions");

            CustomNodeManager = new CustomNodeManager(pluginsPath);

            SearchViewModel = new SearchViewModel();

            dynSettings.PackageLoader = new PackageLoader();

            dynSettings.PackageLoader.DoCachedPackageUninstalls();
            dynSettings.PackageLoader.LoadPackages();

            DisposeLogic.IsShuttingDown = false;

            EngineController = new EngineController(this);

            //This is necessary to avoid a race condition by causing a thread join
            //inside the vm exec
            //TODO(Luke): Push this into a resync call with the engine controller
            ResetEngine();

            dynSettings.DynamoLogger.Log(String.Format(
                                             "Dynamo -- Build {0}",
                                             Assembly.GetExecutingAssembly().GetName().Version));

            DynamoLoader.ClearCachedAssemblies();
            DynamoLoader.LoadNodeModels();

            MigrationManager.Instance.MigrationTargets.Add(typeof(WorkspaceMigrations));

            Runner = new DynamoRunner();
        }
示例#30
0
 public PackagePathViewModel(PackageLoader loader, LoadPackageParams loadParams, CustomNodeManager customNodeManager)
 {
     this.packageLoader     = loader;
     this.loadPackageParams = loadParams;
     this.customNodeManager = customNodeManager;
     InitializeRootLocations();
     InitializeCommands();
 }
示例#31
0
        NodeModel GetNodeFromCommand(CreateNodeCommand command)
        {
            if (command.Node != null)
            {
                return(command.Node);
            }

            if (command.NodeXml != null)
            {
                // command was deserialized, we must create the node directly
                return(NodeFactory.CreateNodeFromXml(command.NodeXml, SaveContext.File));
            }

            // legacy command, hold on to your butts
            var name   = command.Name;
            var nodeId = command.NodeId;

            // find nodes with of the same type with the same GUID
            var query = CurrentWorkspace.Nodes.Where(n => n.GUID.Equals(nodeId) && n.Name.Equals(name));

            // safely ignore a node of the same type with the same GUID
            if (query.Any())
            {
                return(query.First());
            }

            // To be used in the event it's a custom node we're making.
            Guid customNodeId;

            if (command is CreateProxyNodeCommand)
            {
                var proxyCommand = command as CreateProxyNodeCommand;

                return(NodeFactory.CreateProxyNodeInstance(nodeId, name,
                                                           proxyCommand.NickName, proxyCommand.Inputs, proxyCommand.Outputs));
            }

            // Then, we have to figure out what kind of node to make, based on the name.

            NodeModel node;

            // First, we check for a DSFunction by looking for a FunctionDescriptor
            var functionItem = LibraryServices.GetFunctionDescriptor(name);

            if (functionItem != null)
            {
                node = (functionItem.IsVarArg)
                    ? new DSVarArgFunction(functionItem) as NodeModel
                    : new DSFunction(functionItem);
                node.GUID = nodeId;
                return(node);
            }

            // If that didn't work, let's try using the NodeFactory
            if (NodeFactory.CreateNodeFromTypeName(name, out node))
            {
                node.GUID = nodeId;
                return(node);
            }

            // And if that didn't work, then it must be a custom node.
            if (Guid.TryParse(name, out customNodeId))
            {
                node      = CustomNodeManager.CreateCustomNodeInstance(customNodeId);
                node.GUID = nodeId;
                return(node);
            }

            // We're out of ideas, log an error.
            Logger.LogError("Could not create instance of node with name: " + name);
            return(null);
        }
示例#32
0
 public void LoadCustomNodesAndPackages(LoadPackageParams loadPackageParams, CustomNodeManager customNodeManager)
 {
     foreach(var path in loadPackageParams.Preferences.CustomPackageFolders){
         customNodeManager.AddUninitializedCustomNodesInPath(path, false, false);
         if (!this.packagesDirectories.Contains(path))
         {
             this.packagesDirectories.Add(path);
         }
     }
     LoadAll(loadPackageParams);
 }
示例#33
0
        /// <summary>
        /// LoadCustomNodesAndPackages can be used to load custom nodes and packages
        /// from temporary paths that do not need to be added to preference settings.
        /// To load from temporary custom paths, initialize a local PreferenceSettings object
        /// and add the paths to its CustomPackageFolders property, then initialize a new
        /// LoadPackageParams with this preferences object and use as input to this method.
        /// To load from custom paths that need to be persisted to the preferences,
        /// initialize a LoadPackageParams from an existing preferences object.
        /// </summary>
        /// <param name="loadPackageParams">LoadPackageParams initialized with local PreferenceSettings object containing custom package path.</param>
        /// <param name="customNodeManager"></param>
        public void LoadCustomNodesAndPackages(LoadPackageParams loadPackageParams, CustomNodeManager customNodeManager)
        {
            var preferences = loadPackageParams.Preferences;

            LoadCustomNodesAndPackagesHelper(preferences.CustomPackageFolders, preferences, customNodeManager);
        }
示例#34
0
        internal void UninstallCore(CustomNodeManager customNodeManager, PackageLoader packageLoader, IPreferences prefs)
        {
            if (LoadedAssemblies.Any())
            {
                MarkForUninstall(prefs);
                return;
            }

            try
            {
                LoadedCustomNodes.ToList().ForEach(x => customNodeManager.Remove(x.FunctionId));
                packageLoader.Remove(this);
                Directory.Delete(RootDirectory, true);
            }
            catch (Exception e)
            {
                Log("Exception when attempting to uninstall the package " + Name + " from " + RootDirectory);
                Log(e.GetType() + ": " + e.Message);
                throw;
            }
        }
示例#35
0
 public NodeModelConverter(CustomNodeManager manager, LibraryServices libraryServices)
 {
     this.manager = manager;
     this.libraryServices = libraryServices;
 }
示例#36
0
        internal void RefreshCustomNodesFromDirectory(CustomNodeManager customNodeManager, bool isTestMode)
        {
            LoadedCustomNodes.Clear();

            foreach (var x in customNodeManager.AddUninitializedCustomNodesInPath(CustomNodeDirectory, isTestMode))
                LoadedCustomNodes.Add(x);
        }
示例#37
0
        /// <summary>
        /// Default constructor for DynamoModel
        /// </summary>
        /// <param name="config">Start configuration</param>
        protected DynamoModel(IStartConfiguration config)
        {
            ClipBoard = new ObservableCollection<ModelBase>();

            pathManager = new PathManager(new PathManagerParams
            {
                CorePath = config.DynamoCorePath,
                HostPath = config.DynamoHostPath,
                PathResolver = config.PathResolver
            });

            // Ensure we have all directories in place.
            var exceptions = new List<Exception>();
            pathManager.EnsureDirectoryExistence(exceptions);

            Context = config.Context;
            IsTestMode = config.StartInTestMode;

            var config2 = config as IStartConfiguration2;
            IsHeadless = (config2 != null) ? config2.IsHeadless : false;

            DebugSettings = new DebugSettings();
            Logger = new DynamoLogger(DebugSettings, pathManager.LogDirectory);

            foreach (var exception in exceptions)
            {
                Logger.Log(exception); // Log all exceptions.
            }

            MigrationManager = new MigrationManager(DisplayFutureFileMessage, DisplayObsoleteFileMessage);
            MigrationManager.MessageLogged += LogMessage;
            MigrationManager.MigrationTargets.Add(typeof(WorkspaceMigrations));

            var thread = config.SchedulerThread ?? new DynamoSchedulerThread();
            Scheduler = new DynamoScheduler(thread, config.ProcessMode);
            Scheduler.TaskStateChanged += OnAsyncTaskStateChanged;

            geometryFactoryPath = config.GeometryFactoryPath;

            IPreferences preferences = CreateOrLoadPreferences(config.Preferences);
            var settings = preferences as PreferenceSettings;
            if (settings != null)
            {
                PreferenceSettings = settings;
                PreferenceSettings.PropertyChanged += PreferenceSettings_PropertyChanged;
            }

            InitializeInstrumentationLogger();

            if (!IsTestMode && PreferenceSettings.IsFirstRun)
            {
                DynamoMigratorBase migrator = null;

                try
                {
                    var dynamoLookup = config.UpdateManager != null && config.UpdateManager.Configuration != null
                        ? config.UpdateManager.Configuration.DynamoLookUp : null;

                    migrator = DynamoMigratorBase.MigrateBetweenDynamoVersions(pathManager, dynamoLookup);
                }
                catch (Exception e)
                {
                    Logger.Log(e.Message);
                }

                if (migrator != null)
                {
                    var isFirstRun = PreferenceSettings.IsFirstRun;
                    PreferenceSettings = migrator.PreferenceSettings;

                    // Preserve the preference settings for IsFirstRun as this needs to be set
                    // only by UsageReportingManager
                    PreferenceSettings.IsFirstRun = isFirstRun;
                }
            }
            InitializePreferences(PreferenceSettings);

            // At this point, pathManager.PackageDirectories only has 1 element which is the directory
            // in AppData. If list of PackageFolders is empty, add the folder in AppData to the list since there
            // is no additional location specified. Otherwise, update pathManager.PackageDirectories to include
            // PackageFolders
            if (PreferenceSettings.CustomPackageFolders.Count == 0)
                PreferenceSettings.CustomPackageFolders = new List<string> {pathManager.UserDataDirectory};

            //Make sure that the default package folder is added in the list if custom packages folder.
            var userDataFolder = pathManager.GetUserDataFolder(); //Get the default user data path
            if (Directory.Exists(userDataFolder) && !PreferenceSettings.CustomPackageFolders.Contains(userDataFolder))
            {
                PreferenceSettings.CustomPackageFolders.Add(userDataFolder);
            }

            pathManager.Preferences = PreferenceSettings;


            SearchModel = new NodeSearchModel();
            SearchModel.ItemProduced +=
                node => ExecuteCommand(new CreateNodeCommand(node, 0, 0, true, true));

            NodeFactory = new NodeFactory();
            NodeFactory.MessageLogged += LogMessage;

            CustomNodeManager = new CustomNodeManager(NodeFactory, MigrationManager);
            InitializeCustomNodeManager();

            extensionManager = new ExtensionManager();
            extensionManager.MessageLogged += LogMessage;
            var extensions = config.Extensions ?? LoadExtensions();

            Loader = new NodeModelAssemblyLoader();
            Loader.MessageLogged += LogMessage;

            // Create a core which is used for parsing code and loading libraries
            var libraryCore = new ProtoCore.Core(new Options());

            libraryCore.Compilers.Add(Language.Associative, new Compiler(libraryCore));
            libraryCore.Compilers.Add(Language.Imperative, new ProtoImperative.Compiler(libraryCore));
            libraryCore.ParsingMode = ParseMode.AllowNonAssignment;

            LibraryServices = new LibraryServices(libraryCore, pathManager, PreferenceSettings);
            LibraryServices.MessageLogged += LogMessage;
            LibraryServices.LibraryLoaded += LibraryLoaded;

            ResetEngineInternal();

            AddHomeWorkspace();

            AuthenticationManager = new AuthenticationManager(config.AuthProvider);

            UpdateManager = config.UpdateManager ?? new DefaultUpdateManager(null);

            // config.UpdateManager has to be cast to IHostUpdateManager in order to extract the HostVersion and HostName
            // see IHostUpdateManager summary for more details 
            var hostUpdateManager = config.UpdateManager as IHostUpdateManager;
          
            if (hostUpdateManager != null)
            {
                HostName = hostUpdateManager.HostName;
                HostVersion = hostUpdateManager.HostVersion == null ? null : hostUpdateManager.HostVersion.ToString();
            }
            else
            {
                HostName = string.Empty;
                HostVersion = null;
            }
            
            UpdateManager.Log += UpdateManager_Log;
            if (!IsTestMode && !IsHeadless)
            {
                DefaultUpdateManager.CheckForProductUpdate(UpdateManager);
            }

            Logger.Log(string.Format("Dynamo -- Build {0}",
                                        Assembly.GetExecutingAssembly().GetName().Version));

            InitializeNodeLibrary(PreferenceSettings);

            if (extensions.Any())
            {
                var startupParams = new StartupParams(config.AuthProvider,
                    pathManager, new ExtensionLibraryLoader(this), CustomNodeManager,
                    GetType().Assembly.GetName().Version, PreferenceSettings);

                foreach (var ext in extensions)
                {
                    var logSource = ext as ILogSource;
                    if (logSource != null)
                        logSource.MessageLogged += LogMessage;

                    try
                    {
                        ext.Startup(startupParams);
                    }
                    catch (Exception ex)
                    {
                        Logger.Log(ex.Message);
                    }

                    ExtensionManager.Add(ext);
                }
            }

            LogWarningMessageEvents.LogWarningMessage += LogWarningMessage;

            StartBackupFilesTimer();

            TraceReconciliationProcessor = this;

            foreach (var ext in ExtensionManager.Extensions)
            {
                try
                {
                    ext.Ready(new ReadyParams(this));
                }
                catch (Exception ex)
                {
                    Logger.Log(ex.Message);
                }
            }
        }
示例#38
0
 public NodeModelConverter(CustomNodeManager manager, LibraryServices libraryServices)
 {
     this.manager         = manager;
     this.libraryServices = libraryServices;
 }