Inheritance: ServerCredentials
 public void SetRepoId() {
     string repoId = "RepoId";
     var cred = new CmisRepoCredentials() {
         RepoId = repoId
     };
     Assert.AreEqual(repoId, cred.RepoId);
 }
示例#2
0
        /// <summary>
        /// Get the sub-folders of a particular CMIS folder.
        /// </summary>
        /// <returns>Full path of each sub-folder, including leading slash.</returns>
        static public string[] GetSubfolders(CmisRepoCredentials credentials, string path) {
            List<string> result = new List<string>();

            // Connect to the CMIS repository.
            Dictionary<string, string> cmisParameters = GetCmisParameters(credentials);
            SessionFactory factory = SessionFactory.NewInstance();
            ISession session = factory.CreateSession(cmisParameters);

            // Get the folder.
            IFolder folder;
            try {
                folder = (IFolder)session.GetObjectByPath(path);
            } catch (Exception ex) {
                Logger.Warn(string.Format("CmisUtils | exception when session GetObjectByPath for {0}: {1}", path, Utils.ToLogString(ex)));
                return result.ToArray();
            }

            // Debug the properties count, which allows to check whether a particular CMIS implementation is compliant or not.
            // For instance, IBM Connections is known to send an illegal count.
            Logger.Info("CmisUtils | folder.Properties.Count:" + folder.Properties.Count.ToString());

            // Get the folder's sub-folders.
            IItemEnumerable<ICmisObject> children = folder.GetChildren();

            // Return the full path of each of the sub-folders.
            foreach (var subfolder in children.OfType<IFolder>())
            {
                result.Add(subfolder.Path);
            }

            return result.ToArray();
        }
 public void DefaultConstructor() {
     var cred = new CmisRepoCredentials();
     Assert.IsNull(cred.Address);
     Assert.IsNull(cred.UserName);
     Assert.IsNull(cred.Password);
     Assert.IsNull(cred.RepoId);
 }
示例#4
0
 /// <summary>
 /// This class can be used to load children nodes asynchronous in another thread
 /// </summary>
 /// <param name="root">The repository Node</param>
 /// <param name="credentials">The server crendentials to load children for the given Cmis Repo</param>
 /// <param name="method">Function for loading nodes</param>
 public AsyncNodeLoader(RootFolder root, CmisRepoCredentials credentials, LoadChildrenDelegate method, CheckChildrenDelegate check)
 {
     this.root = root;
     repoCredentials = credentials;
     this.actualNode = null;
     this.worker = new BackgroundWorker();
     this.method = method;
     this.check = check;
     this.worker.WorkerReportsProgress = false;
     this.worker.WorkerSupportsCancellation = true;
     this.worker.DoWork += new DoWorkEventHandler(DoWork);
     this.worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(Finished);
 }
        // Call to load from the XIB/NIB file
        public EditWizardController (EditType type, CmisRepoCredentials credentials, string name, string remotePath, List<string> ignores, string localPath) : base ("EditWizard")
        {
            FolderName = name;
            this.Credentials = credentials;
            this.remotePath = remotePath;
            this.Ignores = new List<string>(ignores);
            this.localPath = localPath;
            this.type = type;

            Initialize ();

            Controller.OpenWindowEvent += () =>
            {
                InvokeOnMainThread (() =>
                {
                    this.Window.OrderFrontRegardless ();
                });
            };
        }
示例#6
0
        /// <summary>
        /// Constructor
        /// </summary>
        public Edit(EditType type, CmisRepoCredentials credentials, string name, string remotePath, List<string> ignores, string localPath)
        {
            this.FolderName = name;
            this.Credentials = credentials;
            this.remotePath = remotePath;
            this.Ignores = ignores;
            this.localPath = localPath;
            this.type = type;

            this.CreateEdit();

            this.Deletable = true;

            this.DeleteEvent += delegate(object sender, DeleteEventArgs args) {
                args.RetVal = false;
                this.Controller.CloseWindow();
            };

            this.Controller.OpenWindowEvent += delegate
            {
                this.ShowAll();
                this.Activate();
            };
        }
        public override void AwakeFromNib() {
            base.AwakeFromNib();

            bool firstRepo = true;
            this.Repositories = new List<RootFolder>();
            Loader = new Dictionary<string, AsyncNodeLoader>();
            foreach (var repository in Controller.repositories) {
                RootFolder repo = new RootFolder() {
                    Name = repository.Name,
                    Id = repository.Id,
                    Address = this.Controller.saved_address.ToString()
                };
                this.Repositories.Add(repo);
                if (firstRepo) {
                    repo.Selected = true;
                    firstRepo = false;
                } else {
                    repo.Selected = false;
                }

                CmisRepoCredentials cred = new CmisRepoCredentials() {
                    UserName = this.Controller.saved_user,
                    Password = this.Controller.saved_password,
                    Address = this.Controller.saved_address,
                    RepoId = repository.Id
                };
                //  GUI workaround to remove ignore folder {{
                //AsyncNodeLoader asyncLoader = new AsyncNodeLoader(repo, cred, PredefinedNodeLoader.LoadSubFolderDelegate, PredefinedNodeLoader.CheckSubFolderDelegate);
                //Loader.Add(repo.Id, asyncLoader);
                repo.Status = LoadingStatus.DONE;
                //  GUI workaround to remove ignore folder }}

            }

            this.DataSource = new CmisTree.CmisTreeDataSource(this.Repositories);
            this.DataDelegate = new OutlineViewDelegate ();
            Outline.DataSource = this.DataSource;
            Outline.Delegate = this.DataDelegate;

            ContinueButton.Enabled = this.Repositories.Count > 0;
//            ContinueButton.KeyEquivalent = "\r";

            this.BackButton.Title = Properties_Resources.Back;
            this.CancelButton.Title = Properties_Resources.Cancel;
            this.ContinueButton.Title = Properties_Resources.Continue;

            this.InsertEvent();

            //  must be called after InsertEvent()
            //  GUI workaround to remove ignore folder {{
            //foreach (RootFolder repo in Repositories) {
            //    Loader [repo.Id].Load (repo);
            //}
            //  GUI workaround to remove ignore folder }}
        }
示例#8
0
 /// <summary>
 /// Loads a tree of remote sub folder with the depth of 2
 /// </summary>
 /// <param name="credentials"></param>
 /// <param name="root"></param>
 /// <returns></returns>
 public static List<Node> LoadSubFolderDelegate(CmisRepoCredentials credentials, Node root)
 {
     CmisUtils.NodeTree tree = CmisUtils.GetSubfolderTree(credentials, root.Path, 2);
     List<Node> children = CreateSubTrees(tree.Children, null);
     foreach (Node child in children)
         child.Parent = root;
     return children;
 }
示例#9
0
 static public Dictionary<string, string> GetCmisParameters(CmisRepoCredentials credentials) {
     Dictionary<string, string> cmisParameters = GetCmisParameters((ServerCredentials)credentials);
     cmisParameters[SessionParameter.RepositoryId] = credentials.RepoId;
     return cmisParameters;
 }
示例#10
0
        /// <summary>
        /// Get the sub-folders of a particular CMIS folder.
        /// </summary>
        /// <returns>Full path of each sub-folder, including leading slash.</returns>
        static public NodeTree GetSubfolderTree(CmisRepoCredentials credentials, string path, int depth) {
            // Connect to the CMIS repository.
            Dictionary<string, string> cmisParameters = GetCmisParameters(credentials);
            SessionFactory factory = SessionFactory.NewInstance();
            ISession session = factory.CreateSession(cmisParameters);

            // Get the folder.
            IFolder folder;
            try {
                folder = (IFolder)session.GetObjectByPath(path);
            } catch (Exception ex) {
                Logger.Warn(string.Format("CmisUtils | exception when session GetObjectByPath for {0}: {1}", path, Utils.ToLogString(ex)));
                throw;
            }

            // Debug the properties count, which allows to check whether a particular CMIS implementation is compliant or not.
            // For instance, IBM Connections is known to send an illegal count.
            Logger.Info("CmisUtils | folder.Properties.Count:" + folder.Properties.Count.ToString());
            try {
                IList<ITree<IFileableCmisObject>> trees = folder.GetFolderTree(depth);
                return new NodeTree(trees, folder, depth);
            } catch (Exception e) {
                Logger.Info("CmisUtils getSubFolderTree | Exception " + e.Message, e);
                throw;
            }
        }
示例#11
0
        /// <summary>
        /// Constructor
        /// </summary>
        public Edit(EditType type, CmisRepoCredentials credentials, string name, string remotePath, List<string> ignores, string localPath)
        {
            FolderName = name;
            this.Credentials = credentials;
            this.remotePath = remotePath;
            this.Ignores = new List<string>(ignores);
            this.localPath = localPath;
            this.type = type;
            this.backgroundWorker.WorkerSupportsCancellation = true;
            this.backgroundWorker.DoWork += CheckPassword;
            this.backgroundWorker.RunWorkerCompleted += PasswordChecked;

            CreateTreeView();
            LoadEdit();
            switch (type)
            {
                case EditType.EditFolder:
                    //  GUI workaround to remove ignore folder {{
                    //tab.SelectedItem = tabItemSelection;
                    //break;
                    //  GUI workaround to remove ignore folder }}
                case EditType.EditCredentials:
                    tab.SelectedItem = tabItemCredentials;
                    break;
                default:
                    break;
            }

            this.Title = Properties_Resources.EditTitle;
            this.Description = "";
            this.ShowAll();

            // Defines how to show the setup window.
            Controller.OpenWindowEvent += delegate
            {
                Dispatcher.BeginInvoke((Action)delegate
                {
                    Show();
                    Activate();
                    BringIntoView();
                });
            };

            Controller.CloseWindowEvent += delegate
            {
                Close();
            };

            finishButton.Click += delegate
            {
                Ignores = NodeModelUtils.GetIgnoredFolder(repo);
                Credentials.Password = passwordBox.Password;
                Controller.SaveFolder();
                Controller.CloseWindow();
            };

            cancelButton.Click += delegate
            {
                Controller.CloseWindow();
            };

            Closed += delegate
            {
                Controller.CleanWindow();
            };
        }
示例#12
0
        private void ShowAdd2Page() {
            CmisTreeStore cmisStore = new CmisTreeStore();
            Gtk.TreeView treeView = new Gtk.TreeView(cmisStore);

            bool firstRepo = true;
            List<RootFolder> repositories = new List<RootFolder>();
            Dictionary<string, AsyncNodeLoader> loader = new Dictionary<string, AsyncNodeLoader>();
            foreach (var repository in this.controller.repositories) {
                RootFolder root = new RootFolder() {
                    Name = repository.Name,
                    Id = repository.Id,
                    Address = this.controller.saved_address.ToString()
                };
                if (firstRepo) {
                    root.Selected = true;
                    firstRepo = false;
                } else {
                    root.Selected = false;
                }

                repositories.Add(root);
                CmisRepoCredentials cred = new CmisRepoCredentials() {
                    UserName = this.controller.saved_user,
                    Password = this.controller.saved_password,
                    Address = this.controller.saved_address,
                    RepoId = repository.Id
                };
                AsyncNodeLoader asyncLoader = new AsyncNodeLoader(root, cred, PredefinedNodeLoader.LoadSubFolderDelegate, PredefinedNodeLoader.CheckSubFolderDelegate);
                asyncLoader.UpdateNodeEvent += delegate {
                    cmisStore.UpdateCmisTree(root);
                };
                cmisStore.UpdateCmisTree(root);
            }

            this.Header = Properties_Resources.Which;

            VBox layout_vertical   = new VBox(false, 12);

            Button cancel_button = new Button(this.cancelText);
            cancel_button.Clicked += delegate {
                foreach (AsyncNodeLoader task in loader.Values) {
                    task.Cancel();
                }

                this.controller.PageCancelled();
            };

            Button continue_button = new Button(this.continueText) {
                Sensitive = repositories.Count > 0
            };

            continue_button.Clicked += delegate {
                RootFolder root = repositories.Find(x => (x.Selected != false));
                if (root != null) {
                    foreach (AsyncNodeLoader task in loader.Values) {
                        task.Cancel();
                    }

                    this.controller.saved_repository = root.Id;
                    List<string> ignored = NodeModelUtils.GetIgnoredFolder(root);
                    List<string> selected = NodeModelUtils.GetSelectedFolder(root);
                    this.controller.Add2PageCompleted(root.Id, root.Path, ignored.ToArray(), selected.ToArray());
                }
            };

            Button back_button = new Button(this.backText) {
                Sensitive = true
            };

            back_button.Clicked += delegate {
                foreach (AsyncNodeLoader task in loader.Values) {
                    task.Cancel();
                }

                this.controller.BackToPage1();
            };

            treeView.HeadersVisible = false;
            treeView.Selection.Mode = SelectionMode.Single;

            TreeViewColumn column = new TreeViewColumn();
            column.Title = "Name";
            CellRendererToggle renderToggle = new CellRendererToggle();
            column.PackStart(renderToggle, false);
            renderToggle.Activatable = true;
            column.AddAttribute(renderToggle, "active", (int)CmisTreeStore.Column.ColumnSelected);
            column.AddAttribute(renderToggle, "inconsistent", (int)CmisTreeStore.Column.ColumnSelectedThreeState);
            column.AddAttribute(renderToggle, "radio", (int)CmisTreeStore.Column.ColumnRoot);
            renderToggle.Toggled += delegate(object render, ToggledArgs args) {
                TreeIter iterToggled;
                if (!cmisStore.GetIterFromString(out iterToggled, args.Path)) {
                    Console.WriteLine("Toggled GetIter Error " + args.Path);
                    return;
                }

                Node node = cmisStore.GetValue(iterToggled, (int)CmisTreeStore.Column.ColumnNode) as Node;
                if (node == null) {
                    Console.WriteLine("Toggled GetValue Error " + args.Path);
                    return;
                }

                RootFolder selectedRoot = repositories.Find(x => (x.Selected != false));
                Node parent = node;
                while (parent.Parent != null) {
                    parent = parent.Parent;
                }

                RootFolder root = parent as RootFolder;
                if (root != selectedRoot) {
                    selectedRoot.Selected = false;
                    cmisStore.UpdateCmisTree(selectedRoot);
                }

                if (node.Parent == null) {
                    node.Selected = true;
                } else {
                    node.Selected = !node.Selected;
                }

                cmisStore.UpdateCmisTree(root);
            };
            CellRendererText renderText = new CellRendererText();
            column.PackStart(renderText, false);
            column.SetAttributes(renderText, "text", (int)CmisTreeStore.Column.ColumnName);
            column.Expand = true;
            treeView.AppendColumn(column);

            treeView.RowExpanded += delegate(object o, RowExpandedArgs args) {
                Node node = cmisStore.GetValue(args.Iter, (int)CmisTreeStore.Column.ColumnNode) as Node;
                Node parent = node;
                while (parent.Parent != null) {
                    parent = parent.Parent;
                }

                RootFolder root = parent as RootFolder;
                loader[root.Id].Load(node);
            };

            ScrolledWindow sw = new ScrolledWindow() {
                ShadowType = Gtk.ShadowType.In
            };
            sw.Add(treeView);

            layout_vertical.PackStart(new Label(string.Empty), false, false, 0);
            layout_vertical.PackStart(sw, true, true, 0);
            this.Add(layout_vertical);
            this.AddButton(back_button);
            this.AddButton(cancel_button);
            this.AddButton(continue_button);

            if (repositories.Count > 0) {
                continue_button.GrabDefault();
                continue_button.GrabFocus();
            } else {
                back_button.GrabDefault();
                back_button.GrabFocus();
            }
        }
示例#13
0
        private void EditRepository(string reponame, Edit.EditType type) {
            RepoInfo folder;

            lock (this.repoLock) {
                folder = ConfigManager.CurrentConfig.GetRepoInfo(reponame);
                if (folder == null) {
                    Logger.Warn("Reponame \"" + reponame + "\" could not be found: Editing Repository failed");
                    return;
                }

                Edit edit = null;
                if (this.edits.TryGetValue(reponame, out edit)) {
                    edit.Controller.OpenWindow();
                    return;
                }

                CmisRepoCredentials credentials = new CmisRepoCredentials() {
                    Address = folder.Address,
                    Binding = folder.Binding,
                    UserName = folder.User,
                    Password = new Password() {
                        ObfuscatedPassword = folder.ObfuscatedPassword
                    },
                    RepoId = folder.RepositoryId
                };
                List<string> oldIgnores = new List<string>();
                foreach (var ignore in folder.IgnoredFolders) {
                    if (!string.IsNullOrEmpty(ignore.Path)) {
                        oldIgnores.Add(ignore.Path);
                    }
                }

                edit = new Edit(type, credentials, folder.DisplayName, folder.RemotePath, oldIgnores, folder.LocalPath);
                this.edits.Add(reponame, edit);

                edit.Controller.SaveFolderEvent += delegate {
                    lock (this.repoLock) {
                        folder.IgnoredFolders.Clear();
                        foreach (string ignore in edit.Ignores) {
                            folder.AddIgnorePath(ignore);
                        }

                        folder.SetPassword(edit.Credentials.Password);
                        ConfigManager.CurrentConfig.Save();
                        foreach (Repository repo in this.repositories) {
                            if (repo.Name == reponame) {
                                repo.Queue.AddEvent(new RepoConfigChangedEvent(folder));
                            }
                        }
                    }
                };

                edit.Controller.CleanWindowEvent += delegate {
                    lock (this.repoLock) {
                        this.edits.Remove(reponame);
                    }
                };
                edit.Controller.OpenWindow();
            }
        }
示例#14
0
        private void LoadAddSelectRepoWPF() {
            // UI elements.
            Header = Properties_Resources.Which;

            // A tree allowing the user to browse CMIS repositories/folders.
            System.Uri resourceTreeLocater = new System.Uri("/DataSpaceSync;component/FolderTreeMVC/TreeView.xaml", System.UriKind.Relative);
            System.Windows.Controls.TreeView treeView = System.Windows.Application.LoadComponent(resourceTreeLocater) as TreeView;

            ObservableCollection<RootFolder> repos = new ObservableCollection<RootFolder>();
            loader = new Dictionary<string, AsyncNodeLoader>();
            // Some CMIS servers hold several repositories (ex:Nuxeo). Show one root per repository.
            bool firstRepo = true;
            foreach (var repository in Controller.repositories) {
                RootFolder repo = new RootFolder() {
                    Name = repository.Name,
                    Id = repository.Id,
                    Address = Controller.saved_address.ToString()
                };
                repos.Add(repo);
                if (firstRepo) {
                    repo.Selected = true;
                    firstRepo = false;
                } else {
                    repo.Selected = false;
                }

                CmisRepoCredentials cred = new CmisRepoCredentials() {
                    UserName = Controller.saved_user,
                    Password = Controller.saved_password,
                    Address = Controller.saved_address,
                    Binding = Controller.saved_binding,
                    RepoId = repository.Id
                };
                AsyncNodeLoader asyncLoader = new AsyncNodeLoader(repo, cred, PredefinedNodeLoader.LoadSubFolderDelegate, PredefinedNodeLoader.CheckSubFolderDelegate);
                //  GUI workaround to remove ignore folder {{
                //asyncLoader.Load(repo);
                //loader.Add(repo.Id, asyncLoader);
                repo.Status = LoadingStatus.DONE;
                //  GUI workaround to remove ignore folder }}
            }

            treeView.DataContext = repos;
            treeView.AddHandler(TreeViewItem.ExpandedEvent, new RoutedEventHandler(delegate(object sender, RoutedEventArgs e) {
                TreeViewItem expandedItem = e.OriginalSource as TreeViewItem;
                Node expandedNode = expandedItem.Header as Folder;
                if (expandedNode != null) {
                    Node parent = expandedNode.Parent;
                    while (parent is Folder) {
                        parent = parent.Parent;
                    }

                    if (parent is RootFolder) {
                        AsyncNodeLoader l;
                        RootFolder r = parent as RootFolder;
                        if (loader.TryGetValue(r.Id, out l)) {
                            l.Load(expandedNode);
                        }
                    }
                }
            }));

            ContentCanvas.Children.Add(treeView);
            Canvas.SetTop(treeView, 70);
            Canvas.SetLeft(treeView, 185);

            System.Uri resourceLocater = new System.Uri("/DataSpaceSync;component/SetupAddSelectRepoWPF.xaml", System.UriKind.Relative);
            UserControl LoadXAML = Application.LoadComponent(resourceLocater) as UserControl;

            back_button = LoadXAML.FindName("back_button") as Button;
            continue_button = LoadXAML.FindName("continue_button") as Button;
            cancel_button = LoadXAML.FindName("cancel_button") as Button;

            continue_button.IsEnabled = !firstRepo;

            ContentCanvas.Children.Add(LoadXAML);

            // Actions
            cancel_button.Click += delegate {
                SelectRepoCancelAction();
                Controller.PageCancelled();
            };

            continue_button.Click += delegate {
                List<string> ignored = new List<string>();
                List<string> selectedFolder = new List<string>();
                ItemCollection items = treeView.Items;
                RootFolder selectedRepo = null;
                foreach (var item in items) {
                    RootFolder repo = item as RootFolder;
                    if (repo != null) {
                        if (repo.Selected != false) {
                            selectedRepo = repo;
                            break;
                        }
                    }
                }

                if (selectedRepo != null) {
                    ignored.AddRange(NodeModelUtils.GetIgnoredFolder(selectedRepo));
                    selectedFolder.AddRange(NodeModelUtils.GetSelectedFolder(selectedRepo));
                    Controller.saved_repository = selectedRepo.Id;
                    Controller.saved_remote_path = selectedRepo.Path;
                    SelectRepoCancelAction();
                    Controller.Add2PageCompleted(
                        Controller.saved_repository, Controller.saved_remote_path, ignored.ToArray(), selectedFolder.ToArray());
                } else {
                    return;
                }
            };

            back_button.Click += delegate {
                SelectRepoCancelAction();
                Controller.BackToPage1();
            };
        }