public void SetRepoId() { string repoId = "RepoId"; var cred = new CmisRepoCredentials() { RepoId = repoId }; Assert.AreEqual(repoId, cred.RepoId); }
/// <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); }
/// <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 (); }); }; }
/// <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 }} }
/// <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; }
static public Dictionary<string, string> GetCmisParameters(CmisRepoCredentials credentials) { Dictionary<string, string> cmisParameters = GetCmisParameters((ServerCredentials)credentials); cmisParameters[SessionParameter.RepositoryId] = credentials.RepoId; return cmisParameters; }
/// <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; } }
/// <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(); }; }
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(); } }
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(); } }
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(); }; }