Added LinqBridge and did some code cleanup.

This commit is contained in:
Robin 2016-09-05 23:37:40 +02:00
commit 7c7fd67b2a
20 changed files with 327 additions and 343 deletions

View file

@ -94,8 +94,8 @@ namespace Confluence {
public class ConfluenceConnector : IDisposable {
private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(ConfluenceConnector));
private const string AuthFailedExceptionName = "com.atlassian.confluence.rpc.AuthenticationFailedException";
private const string V2Failed = "AXIS";
private static readonly ConfluenceConfiguration Config = IniConfig.GetIniSection<ConfluenceConfiguration>();
private const string V2Failed = "AXIS";
private static readonly ConfluenceConfiguration Config = IniConfig.GetIniSection<ConfluenceConfiguration>();
private string _credentials;
private DateTime _loggedInTime = DateTime.Now;
private bool _loggedIn;
@ -123,17 +123,17 @@ namespace Confluence {
public ConfluenceConnector(string url, int timeout) {
_timeout = timeout;
Init(url);
Init(url);
}
private void Init(string url) {
_url = url;
_confluence = new ConfluenceSoapServiceService
{
Url = url,
Proxy = NetworkHelper.CreateProxy(new Uri(url))
};
}
private void Init(string url) {
_url = url;
_confluence = new ConfluenceSoapServiceService
{
Url = url,
Proxy = NetworkHelper.CreateProxy(new Uri(url))
};
}
~ConfluenceConnector() {
Dispose(false);
@ -149,11 +149,11 @@ namespace Confluence {
_loggedInTime = DateTime.Now;
_loggedIn = true;
} catch (Exception e) {
// Check if confluence-v2 caused an error, use v1 instead
if (e.Message.Contains(V2Failed) && _url.Contains("v2")) {
Init(_url.Replace("v2", "v1"));
return DoLogin(user, password);
}
// Check if confluence-v2 caused an error, use v1 instead
if (e.Message.Contains(V2Failed) && _url.Contains("v2")) {
Init(_url.Replace("v2", "v1"));
return DoLogin(user, password);
}
// check if auth failed
if (e.Message.Contains(AuthFailedExceptionName)) {
return false;
@ -173,7 +173,7 @@ namespace Confluence {
try {
// Get the system name, so the user knows where to login to
string systemName = _url.Replace(ConfluenceConfiguration.DEFAULT_POSTFIX1,"");
systemName = systemName.Replace(ConfluenceConfiguration.DEFAULT_POSTFIX2, "");
systemName = systemName.Replace(ConfluenceConfiguration.DEFAULT_POSTFIX2, "");
CredentialsDialog dialog = new CredentialsDialog(systemName)
{
Name = null
@ -274,49 +274,40 @@ namespace Confluence {
return new Page(page);
}
public List<Space> GetSpaceSummaries() {
public IEnumerable<Space> GetSpaceSummaries() {
CheckCredentials();
RemoteSpaceSummary [] spaces = _confluence.getSpaces(_credentials);
List<Space> returnSpaces = new List<Space>();
foreach(RemoteSpaceSummary space in spaces) {
returnSpaces.Add(new Space(space));
yield return new Space(space);
}
returnSpaces.Sort((x, y) => string.CompareOrdinal(x.Name, y.Name));
return returnSpaces;
}
public List<Page> GetPageChildren(Page parentPage) {
public IEnumerable<Page> GetPageChildren(Page parentPage) {
CheckCredentials();
List<Page> returnPages = new List<Page>();
RemotePageSummary[] pages = _confluence.getChildren(_credentials, parentPage.Id);
foreach(RemotePageSummary page in pages) {
returnPages.Add(new Page(page));
yield return new Page(page);
}
returnPages.Sort((x, y) => string.CompareOrdinal(x.Title, y.Title));
return returnPages;
}
public List<Page> GetPageSummaries(Space space) {
public IEnumerable<Page> GetPageSummaries(Space space) {
CheckCredentials();
List<Page> returnPages = new List<Page>();
RemotePageSummary[] pages = _confluence.getPages(_credentials, space.Key);
foreach(RemotePageSummary page in pages) {
returnPages.Add(new Page(page));
yield return new Page(page);
}
returnPages.Sort((x, y) => string.CompareOrdinal(x.Title, y.Title));
return returnPages;
}
public List<Page> SearchPages(string query, string space) {
public IEnumerable<Page> SearchPages(string query, string space) {
CheckCredentials();
List<Page> results = new List<Page>();
foreach(RemoteSearchResult searchResult in _confluence.search(_credentials, query, 20)) {
foreach(var searchResult in _confluence.search(_credentials, query, 20)) {
Log.DebugFormat("Got result of type {0}", searchResult.type);
if ("page".Equals(searchResult.type)) {
results.Add(new Page(searchResult, space));
if ("page".Equals(searchResult.type))
{
yield return new Page(searchResult, space);
}
}
return results;
}
}
}

View file

@ -20,6 +20,7 @@
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Windows.Automation;
@ -140,7 +141,7 @@ namespace GreenshotConfluencePlugin {
}
}
foreach(string url in IEHelper.GetIEUrls()) {
foreach(string url in IEHelper.GetIEUrls().Distinct()) {
urls.Add(url);
}

View file

@ -21,77 +21,68 @@
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;
using Greenshot.IniFile;
namespace GreenshotConfluencePlugin {
public partial class ConfluenceSearch : System.Windows.Controls.Page {
private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(ConfluenceSearch));
private static readonly ConfluenceConfiguration config = IniConfig.GetIniSection<ConfluenceConfiguration>();
private readonly ConfluenceUpload confluenceUpload;
public partial class ConfluenceSearch
{
private static readonly ConfluenceConfiguration ConfluenceConfig = IniConfig.GetIniSection<ConfluenceConfiguration>();
private readonly ConfluenceUpload _confluenceUpload;
public List<Confluence.Space> Spaces {
get {
return confluenceUpload.Spaces;
}
}
public IEnumerable<Confluence.Space> Spaces => _confluenceUpload.Spaces;
private readonly ObservableCollection<Confluence.Page> pages = new ObservableCollection<Confluence.Page>();
public ObservableCollection<Confluence.Page> Pages {
get {
return pages;
}
}
public ObservableCollection<Confluence.Page> Pages { get; } = new ObservableCollection<Confluence.Page>();
public ConfluenceSearch(ConfluenceUpload confluenceUpload) {
this.confluenceUpload = confluenceUpload;
_confluenceUpload = confluenceUpload;
DataContext = this;
InitializeComponent();
if (config.SearchSpaceKey == null) {
SpaceComboBox.SelectedItem = Spaces[0];
if (ConfluenceConfig.SearchSpaceKey == null) {
SpaceComboBox.SelectedItem = Spaces.FirstOrDefault();
} else {
foreach(Confluence.Space space in Spaces) {
if (space.Key.Equals(config.SearchSpaceKey)) {
foreach(var space in Spaces) {
if (space.Key.Equals(ConfluenceConfig.SearchSpaceKey)) {
SpaceComboBox.SelectedItem = space;
}
}
}
}
void PageListView_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) {
private void PageListView_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) {
SelectionChanged();
}
void SelectionChanged() {
private void SelectionChanged() {
if (PageListView.HasItems && PageListView.SelectedItems.Count > 0) {
confluenceUpload.SelectedPage = (Confluence.Page)PageListView.SelectedItem;
_confluenceUpload.SelectedPage = (Confluence.Page)PageListView.SelectedItem;
} else {
confluenceUpload.SelectedPage = null;
_confluenceUpload.SelectedPage = null;
}
}
void Search_Click(object sender, RoutedEventArgs e) {
doSearch();
private void Search_Click(object sender, RoutedEventArgs e) {
DoSearch();
}
void doSearch() {
private void DoSearch() {
string spaceKey = (string)SpaceComboBox.SelectedValue;
config.SearchSpaceKey = spaceKey;
List<Confluence.Page> searchResult = ConfluencePlugin.ConfluenceConnector.SearchPages(searchText.Text, spaceKey);
pages.Clear();
foreach(Confluence.Page page in searchResult) {
pages.Add(page);
ConfluenceConfig.SearchSpaceKey = spaceKey;
Pages.Clear();
foreach(var page in ConfluencePlugin.ConfluenceConnector.SearchPages(searchText.Text, spaceKey).OrderBy(p => p.Title)) {
Pages.Add(page);
}
}
void SearchText_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) {
private void SearchText_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) {
if (e.Key == System.Windows.Input.Key.Return && Search.IsEnabled) {
doSearch();
e.Handled = true;
DoSearch();
e.Handled = true;
}
}
void Page_Loaded(object sender, RoutedEventArgs e) {
private void Page_Loaded(object sender, RoutedEventArgs e) {
SelectionChanged();
}

View file

@ -18,8 +18,9 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
@ -32,96 +33,99 @@ namespace GreenshotConfluencePlugin {
/// <summary>
/// Interaction logic for ConfluenceTreePicker.xaml
/// </summary>
public partial class ConfluenceTreePicker : System.Windows.Controls.Page {
private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(ConfluenceTreePicker));
private readonly ConfluenceConnector confluenceConnector;
private readonly ConfluenceUpload confluenceUpload;
private bool isInitDone = false;
public partial class ConfluenceTreePicker
{
private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(ConfluenceTreePicker));
private readonly ConfluenceConnector _confluenceConnector;
private readonly ConfluenceUpload _confluenceUpload;
private bool _isInitDone;
public ConfluenceTreePicker(ConfluenceUpload confluenceUpload) {
confluenceConnector = ConfluencePlugin.ConfluenceConnector;
this.confluenceUpload = confluenceUpload;
_confluenceConnector = ConfluencePlugin.ConfluenceConnector;
_confluenceUpload = confluenceUpload;
InitializeComponent();
}
void pageTreeViewItem_DoubleClick(object sender, MouseButtonEventArgs eventArgs) {
LOG.Debug("spaceTreeViewItem_MouseLeftButtonDown is called!");
private void pageTreeViewItem_DoubleClick(object sender, MouseButtonEventArgs eventArgs) {
Log.Debug("spaceTreeViewItem_MouseLeftButtonDown is called!");
TreeViewItem clickedItem = eventArgs.Source as TreeViewItem;
if (clickedItem ==null) {
return;
}
Confluence.Page page = clickedItem.Tag as Confluence.Page;
Confluence.Page page = clickedItem?.Tag as Confluence.Page;
if (page == null) {
return;
}
if (!clickedItem.HasItems) {
LOG.Debug("Loading pages for page: " + page.Title);
(new Thread(() => {
Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)(() => {ShowBusy.Visibility = Visibility.Visible;}));
List<Confluence.Page> pages = confluenceConnector.GetPageChildren(page);
Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)(() => {
foreach(Confluence.Page childPage in pages) {
LOG.Debug("Adding page: " + childPage.Title);
TreeViewItem pageTreeViewItem = new TreeViewItem();
pageTreeViewItem.Header = childPage.Title;
pageTreeViewItem.Tag = childPage;
clickedItem.Items.Add(pageTreeViewItem);
pageTreeViewItem.PreviewMouseDoubleClick += new MouseButtonEventHandler(pageTreeViewItem_DoubleClick);
pageTreeViewItem.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(pageTreeViewItem_Click);
}
ShowBusy.Visibility = Visibility.Collapsed;
}));
}
) { Name = "Loading childpages for confluence page " + page.Title }).Start();
if (clickedItem.HasItems)
{
return;
}
Log.Debug("Loading pages for page: " + page.Title);
new Thread(() => {
Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)(() => {ShowBusy.Visibility = Visibility.Visible;}));
var pages = _confluenceConnector.GetPageChildren(page).OrderBy(p => p.Title);
Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)(() => {
foreach(var childPage in pages) {
Log.Debug("Adding page: " + childPage.Title);
var pageTreeViewItem = new TreeViewItem
{
Header = childPage.Title,
Tag = childPage
};
clickedItem.Items.Add(pageTreeViewItem);
pageTreeViewItem.PreviewMouseDoubleClick += pageTreeViewItem_DoubleClick;
pageTreeViewItem.PreviewMouseLeftButtonDown += pageTreeViewItem_Click;
}
ShowBusy.Visibility = Visibility.Collapsed;
}));
}) { Name = "Loading childpages for confluence page " + page.Title }.Start();
}
void pageTreeViewItem_Click(object sender, MouseButtonEventArgs eventArgs) {
LOG.Debug("pageTreeViewItem_PreviewMouseDoubleClick is called!");
private void pageTreeViewItem_Click(object sender, MouseButtonEventArgs eventArgs) {
Log.Debug("pageTreeViewItem_PreviewMouseDoubleClick is called!");
TreeViewItem clickedItem = eventArgs.Source as TreeViewItem;
if (clickedItem ==null) {
return;
}
Confluence.Page page = clickedItem.Tag as Confluence.Page;
confluenceUpload.SelectedPage = page;
_confluenceUpload.SelectedPage = page;
if (page != null) {
LOG.Debug("Page selected: " + page.Title);
Log.Debug("Page selected: " + page.Title);
}
}
void Page_Loaded(object sender, RoutedEventArgs e) {
confluenceUpload.SelectedPage = null;
if (isInitDone) {
private void Page_Loaded(object sender, RoutedEventArgs e) {
_confluenceUpload.SelectedPage = null;
if (_isInitDone) {
return;
}
ShowBusy.Visibility = Visibility.Visible;
(new Thread(() => {
new Thread(() => {
Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)(() => {
List<Space> spaces = confluenceUpload.Spaces;
foreach (Space space in spaces) {
TreeViewItem spaceTreeViewItem = new TreeViewItem();
spaceTreeViewItem.Header = space.Name;
spaceTreeViewItem.Tag = space;
foreach (Space space in _confluenceUpload.Spaces) {
TreeViewItem spaceTreeViewItem = new TreeViewItem
{
Header = space.Name,
Tag = space
};
// Get homepage
try {
Confluence.Page page = confluenceConnector.GetSpaceHomepage(space);
TreeViewItem pageTreeViewItem = new TreeViewItem();
pageTreeViewItem.Header = page.Title;
pageTreeViewItem.Tag = page;
pageTreeViewItem.PreviewMouseDoubleClick += new MouseButtonEventHandler(pageTreeViewItem_DoubleClick);
pageTreeViewItem.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(pageTreeViewItem_Click);
Confluence.Page page = _confluenceConnector.GetSpaceHomepage(space);
TreeViewItem pageTreeViewItem = new TreeViewItem
{
Header = page.Title,
Tag = page
};
pageTreeViewItem.PreviewMouseDoubleClick += pageTreeViewItem_DoubleClick;
pageTreeViewItem.PreviewMouseLeftButtonDown += pageTreeViewItem_Click;
spaceTreeViewItem.Items.Add(pageTreeViewItem);
ConfluenceTreeView.Items.Add(spaceTreeViewItem);
} catch (Exception ex) {
LOG.Error("Can't get homepage for space : " + space.Name + " (" + ex.Message + ")");
Log.Error("Can't get homepage for space : " + space.Name + " (" + ex.Message + ")");
}
}
ShowBusy.Visibility = Visibility.Collapsed;
isInitDone = true;
_isInitDone = true;
}));
}
) { Name = "Loading spaces for confluence"}).Start();
}) { Name = "Loading spaces for confluence"}.Start();
}
}
}

View file

@ -20,6 +20,7 @@
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
@ -88,8 +89,8 @@ namespace GreenshotConfluencePlugin {
}
private static DateTime _lastLoad = DateTime.Now;
private static List<Confluence.Space> _spaces;
public List<Confluence.Space> Spaces {
private static IList<Confluence.Space> _spaces;
public IList<Confluence.Space> Spaces {
get {
UpdateSpaces();
while (_spaces == null) {
@ -118,7 +119,7 @@ namespace GreenshotConfluencePlugin {
// Check if load is needed
if (_spaces == null) {
(new Thread(() => {
_spaces = ConfluencePlugin.ConfluenceConnector.GetSpaceSummaries();
_spaces = ConfluencePlugin.ConfluenceConnector.GetSpaceSummaries().OrderBy(s => s.Name).ToList();
_lastLoad = DateTime.Now;
}) { Name = "Loading spaces for confluence"}).Start();
}