Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse code

update to 2.1.6 and additional changes

  • Loading branch information...
commit 90d38e1143af6d09e64873619bbaad629c82f018 1 parent e2ca9c7
authored March 15, 2013

Showing 94 changed files with 1,331 additions and 427 deletions. Show diff stats Hide diff stats

  1. 20  org.rssowl.build/build-files/fetchSvnAll.xml
  2. 4  org.rssowl.build/pluginbuilder.config
  3. 4  org.rssowl.build/releases/HEAD.properties
  4. 18  org.rssowl.build/rssowl.product
  5. 5  org.rssowl.core.tests/Launch RSSOwl 2.0 Tests.launch
  6. 2  org.rssowl.core.tests/META-INF/MANIFEST.MF
  7. 2  org.rssowl.core.tests/src/org/rssowl/core/tests/connection/ConnectionTests.java
  8. 37  org.rssowl.core.tests/src/org/rssowl/core/tests/model/ApplicationLayerTest.java
  9. 40  org.rssowl.core.tests/src/org/rssowl/core/tests/model/NewsFilterTest.java
  10. 10  org.rssowl.core.tests/src/org/rssowl/core/tests/ui/FolderNewsMarkTest.java
  11. 2  org.rssowl.core/META-INF/MANIFEST.MF
  12. 4  org.rssowl.core/src/org/rssowl/core/IApplicationService.java
  13. 57  org.rssowl.core/src/org/rssowl/core/connection/PlatformCredentialsProvider.java
  14. 6  org.rssowl.core/src/org/rssowl/core/internal/ApplicationServiceImpl.java
  15. 114  org.rssowl.core/src/org/rssowl/core/internal/LogBridge.java
  16. 10  org.rssowl.core/src/org/rssowl/core/internal/connection/DefaultProtocolHandler.java
  17. 2  org.rssowl.core/src/org/rssowl/core/internal/connection/EasySSLProtocolSocketFactory.java
  18. 9  org.rssowl.core/src/org/rssowl/core/internal/interpreter/RDFInterpreter.java
  19. 9  org.rssowl.core/src/org/rssowl/core/internal/interpreter/RSSInterpreter.java
  20. 9  org.rssowl.core/src/org/rssowl/core/internal/interpreter/json/JSONInterpreter.java
  21. 2  org.rssowl.core/src/org/rssowl/core/internal/interpreter/json/JSONObject.java
  22. 6  org.rssowl.core/src/org/rssowl/core/internal/persist/Feed.java
  23. 20  org.rssowl.core/src/org/rssowl/core/internal/persist/News.java
  24. 3  org.rssowl.core/src/org/rssowl/core/internal/persist/Preference.java
  25. 3  org.rssowl.core/src/org/rssowl/core/internal/persist/pref/DefaultPreferences.java
  26. 3  org.rssowl.core/src/org/rssowl/core/internal/persist/service/DBManager.java
  27. 3  org.rssowl.core/src/org/rssowl/core/persist/pref/Preference.java
  28. 16  org.rssowl.core/src/org/rssowl/core/util/CoreUtils.java
  29. 9  org.rssowl.core/src/org/rssowl/core/util/DateUtils.java
  30. 2  org.rssowl.core/src/org/rssowl/core/util/HTMLFilterReader.java
  31. 1  org.rssowl.core/src/org/rssowl/core/util/Messages.java
  32. 1  org.rssowl.core/src/org/rssowl/core/util/messages.properties
  33. 2  org.rssowl.feature.eclipse/feature.xml
  34. 2  org.rssowl.feature.tests/feature.xml
  35. 2  org.rssowl.feature/feature.xml
  36. 2  org.rssowl.lib.db4o/META-INF/MANIFEST.MF
  37. 2  org.rssowl.lib.httpclient/META-INF/MANIFEST.MF
  38. 2  org.rssowl.lib.jdom/META-INF/MANIFEST.MF
  39. 2  org.rssowl.lib.lucene/META-INF/MANIFEST.MF
  40. 2  org.rssowl.ui/META-INF/MANIFEST.MF
  41. 4  org.rssowl.ui/about.ini
  42. 4  org.rssowl.ui/config.ini
  43. BIN  org.rssowl.ui/icons/elcl16/languages.gif
  44. BIN  org.rssowl.ui/icons/obj16/classic_layout.gif
  45. BIN  org.rssowl.ui/icons/obj16/headlines_layout.gif
  46. BIN  org.rssowl.ui/icons/obj16/list_layout.gif
  47. BIN  org.rssowl.ui/icons/obj16/newspaper_layout.gif
  48. BIN  org.rssowl.ui/icons/obj16/share_pocket.gif
  49. BIN  org.rssowl.ui/icons/obj16/vertical_layout.gif
  50. 122  org.rssowl.ui/pack200jars.bat
  51. 5  org.rssowl.ui/plugin.eclipse.properties
  52. 8  org.rssowl.ui/plugin.eclipse.xml
  53. 8  org.rssowl.ui/plugin.properties
  54. 53  org.rssowl.ui/plugin.xml
  55. 11  org.rssowl.ui/rssowl.product
  56. 28  org.rssowl.ui/rssowl_installer.nsi
  57. 15  org.rssowl.ui/src/org/rssowl/ui/internal/ApplicationActionBarAdvisor.java
  58. 5  org.rssowl.ui/src/org/rssowl/ui/internal/ApplicationWorkbenchWindowAdvisor.java
  59. 44  org.rssowl.ui/src/org/rssowl/ui/internal/Controller.java
  60. 22  org.rssowl.ui/src/org/rssowl/ui/internal/FolderNewsMark.java
  61. 18  org.rssowl.ui/src/org/rssowl/ui/internal/OwlUI.java
  62. 2  org.rssowl.ui/src/org/rssowl/ui/internal/PreferencesInitializer.java
  63. 2  org.rssowl.ui/src/org/rssowl/ui/internal/SplashHandler.java
  64. 33  org.rssowl.ui/src/org/rssowl/ui/internal/actions/CopyLinkAction.java
  65. 66  org.rssowl.ui/src/org/rssowl/ui/internal/actions/DownloadLanguagesAction.java
  66. 14  org.rssowl.ui/src/org/rssowl/ui/internal/actions/FindExtensionsAction.java
  67. 2  org.rssowl.ui/src/org/rssowl/ui/internal/actions/MakeNewsStickyAction.java
  68. 9  org.rssowl.ui/src/org/rssowl/ui/internal/actions/MarkTypesReadAction.java
  69. 7  org.rssowl.ui/src/org/rssowl/ui/internal/actions/ToggleReadStateAction.java
  70. 61  org.rssowl.ui/src/org/rssowl/ui/internal/actions/TranslateRSSOwlAction.java
  71. 4  org.rssowl.ui/src/org/rssowl/ui/internal/dialogs/Messages.java
  72. 4  org.rssowl.ui/src/org/rssowl/ui/internal/dialogs/messages.properties
  73. 77  org.rssowl.ui/src/org/rssowl/ui/internal/dialogs/preferences/BrowserPreferencePage.java
  74. 14  org.rssowl.ui/src/org/rssowl/ui/internal/dialogs/preferences/FeedsPreferencePage.java
  75. 1  org.rssowl.ui/src/org/rssowl/ui/internal/dialogs/preferences/Messages.java
  76. 13  org.rssowl.ui/src/org/rssowl/ui/internal/dialogs/preferences/MiscPreferencePage.java
  77. 3  org.rssowl.ui/src/org/rssowl/ui/internal/dialogs/preferences/messages.properties
  78. 11  org.rssowl.ui/src/org/rssowl/ui/internal/dialogs/properties/RetentionPropertyPage.java
  79. 4  org.rssowl.ui/src/org/rssowl/ui/internal/editors/browser/WebBrowserView.java
  80. 120  org.rssowl.ui/src/org/rssowl/ui/internal/editors/feed/FeedView.java
  81. 118  org.rssowl.ui/src/org/rssowl/ui/internal/editors/feed/FilterBar.java
  82. 1  org.rssowl.ui/src/org/rssowl/ui/internal/editors/feed/Messages.java
  83. 12  org.rssowl.ui/src/org/rssowl/ui/internal/editors/feed/NewsBrowserLabelProvider.java
  84. 1  org.rssowl.ui/src/org/rssowl/ui/internal/editors/feed/NewsBrowserViewer.java
  85. 7  org.rssowl.ui/src/org/rssowl/ui/internal/editors/feed/NewsTableViewer.java
  86. 1  org.rssowl.ui/src/org/rssowl/ui/internal/editors/feed/messages.properties
  87. 6  org.rssowl.ui/src/org/rssowl/ui/internal/services/DownloadService.java
  88. 184  org.rssowl.ui/src/org/rssowl/ui/internal/services/SyncService.java
  89. 140  org.rssowl.ui/src/org/rssowl/ui/internal/util/CBrowser.java
  90. 3  org.rssowl.update.sites/addons/site.xml
  91. 2  org.rssowl.update.sites/eclipse/site.xml
  92. 2  org.rssowl.update.sites/nightly/site.xml
  93. 34  org.rssowl.update.sites/nls/site.xml
  94. 4  org.rssowl.update.sites/program/site.xml
20  org.rssowl.build/build-files/fetchSvnAll.xml
@@ -3,43 +3,43 @@
3 3
     <antcall target="svn.co">
4 4
       <param name="target" value="features"/>
5 5
       <param name="element.id" value="org.rssowl"/>
6  
-      <param name="project.name" value="/trunk/org.rssowl.feature"/>
  6
+      <param name="project.name" value="/branches/2.1.x/org.rssowl.feature"/>
7 7
       <param name="url" value="https://rssowl.svn.sourceforge.net/svnroot/rssowl"/>
8 8
     </antcall>
9 9
     <antcall target="svn.co">
10 10
       <param name="target" value="plugins"/>
11 11
       <param name="element.id" value="org.rssowl.lib.jdom"/>
12  
-      <param name="project.name" value="/trunk/org.rssowl.lib.jdom"/>
  12
+      <param name="project.name" value="/branches/2.1.x/org.rssowl.lib.jdom"/>
13 13
       <param name="url" value="https://rssowl.svn.sourceforge.net/svnroot/rssowl"/>
14 14
     </antcall>
15 15
     <antcall target="svn.co">
16 16
       <param name="target" value="plugins"/>
17 17
       <param name="element.id" value="org.rssowl.ui"/>
18  
-      <param name="project.name" value="/trunk/org.rssowl.ui"/>
  18
+      <param name="project.name" value="/branches/2.1.x/org.rssowl.ui"/>
19 19
       <param name="url" value="https://rssowl.svn.sourceforge.net/svnroot/rssowl"/>
20 20
     </antcall>
21 21
     <antcall target="svn.co">
22 22
       <param name="target" value="plugins"/>
23 23
       <param name="element.id" value="org.rssowl.lib.db4o"/>
24  
-      <param name="project.name" value="/trunk/org.rssowl.lib.db4o"/>
  24
+      <param name="project.name" value="/branches/2.1.x/org.rssowl.lib.db4o"/>
25 25
       <param name="url" value="https://rssowl.svn.sourceforge.net/svnroot/rssowl"/>
26 26
     </antcall>
27 27
     <antcall target="svn.co">
28 28
       <param name="target" value="plugins"/>
29 29
       <param name="element.id" value="org.rssowl.core"/>
30  
-      <param name="project.name" value="/trunk/org.rssowl.core"/>
  30
+      <param name="project.name" value="/branches/2.1.x/org.rssowl.core"/>
31 31
       <param name="url" value="https://rssowl.svn.sourceforge.net/svnroot/rssowl"/>
32 32
     </antcall>
33 33
     <antcall target="svn.co">
34 34
       <param name="target" value="plugins"/>
35 35
       <param name="element.id" value="org.rssowl.lib.httpclient"/>
36  
-      <param name="project.name" value="/trunk/org.rssowl.lib.httpclient"/>
  36
+      <param name="project.name" value="/branches/2.1.x/org.rssowl.lib.httpclient"/>
37 37
       <param name="url" value="https://rssowl.svn.sourceforge.net/svnroot/rssowl"/>
38 38
     </antcall>
39 39
     <antcall target="svn.co">
40 40
       <param name="target" value="plugins"/>
41 41
       <param name="element.id" value="org.rssowl.lib.lucene"/>
42  
-      <param name="project.name" value="/trunk/org.rssowl.lib.lucene"/>
  42
+      <param name="project.name" value="/branches/2.1.x/org.rssowl.lib.lucene"/>
43 43
       <param name="url" value="https://rssowl.svn.sourceforge.net/svnroot/rssowl"/>
44 44
     </antcall>
45 45
     <antcall target="svn.co">
@@ -57,19 +57,19 @@
57 57
     <antcall target="svn.co">
58 58
       <param name="target" value="features"/>
59 59
       <param name="element.id" value="org.rssowl.tests"/>
60  
-      <param name="project.name" value="/trunk/org.rssowl.feature.tests"/>
  60
+      <param name="project.name" value="/branches/2.1.x/org.rssowl.feature.tests"/>
61 61
       <param name="url" value="https://rssowl.svn.sourceforge.net/svnroot/rssowl"/>
62 62
     </antcall>
63 63
     <antcall target="svn.co">
64 64
       <param name="target" value="plugins"/>
65 65
       <param name="element.id" value="org.rssowl.core.tests"/>
66  
-      <param name="project.name" value="/trunk/org.rssowl.core.tests"/>
  66
+      <param name="project.name" value="/branches/2.1.x/org.rssowl.core.tests"/>
67 67
       <param name="url" value="https://rssowl.svn.sourceforge.net/svnroot/rssowl"/>
68 68
     </antcall>
69 69
     <antcall target="svn.co">
70 70
       <param name="target" value="features"/>
71 71
       <param name="element.id" value="org.rssowl.dependencies"/>
72  
-      <param name="project.name" value="/trunk/org.rssowl.feature.dependencies"/>
  72
+      <param name="project.name" value="/branches/2.1.x/org.rssowl.feature.dependencies"/>
73 73
       <param name="url" value="https://rssowl.svn.sourceforge.net/svnroot/rssowl"/>
74 74
     </antcall>
75 75
     <antcall target="svn.co">
4  org.rssowl.build/pluginbuilder.config
... ...
@@ -1,4 +1,4 @@
1  
-#Tue May 17 11:01:29 CEST 2011
  1
+#Fri Aug 19 10:02:04 CEST 2011
2 2
 autotestsuite.class.exclusions=.*All(Tests|PDE_Tests|_Tests|PDETests).*;.*PerformanceTest.*
3 3
 pluginbuilder.eclipse.url=http\://www.rssowl.org/dl/target/eclipse-SDK-3.4.2_3.5.2-linux-gtk-x86_64_3.zip
4 4
 pluginbuilder.feature.urls=http\://www.rssowl.org/dl/target/eclipse-3.4.2_3.5.2-delta-pack_2.zip
@@ -7,7 +7,7 @@ pluginbuilder.server.user=rssowl
7 7
 pluginbuilder.is.svn=true
8 8
 autotestsuite.class.inclusions=.*
9 9
 pluginbuilder.is.runtests=true
10  
-pluginbuilder.svn.url=https\://rssowl.svn.sourceforge.net/svnroot/rssowl/trunk
  10
+pluginbuilder.svn.url=https\://rssowl.svn.sourceforge.net/svnroot/rssowl/branches/2.1.x
11 11
 autotestsuite.plugin.inclusions=.*(test|tests)$
12 12
 pluginbuilder.is.cvs=false
13 13
 pluginbuilder.is.copy=false
4  org.rssowl.build/releases/HEAD.properties
... ...
@@ -1,6 +1,6 @@
1 1
 #Written from Plug-in Builder Editor
2  
-#Sun Apr 17 18:43:12 CEST 2011
  2
+#Fri Aug 19 10:02:01 CEST 2011
3 3
 buildType=N
4  
-version=2.1.0
  4
+version=2.1.2
5 5
 fetchTag=HEAD
6 6
 buildTypePresentation=
18  org.rssowl.build/rssowl.product
@@ -6,14 +6,14 @@
6 6
    <aboutInfo>
7 7
       <image path="/org.rssowl.ui/icons/product/about.gif"/>
8 8
       <text>
9  
-         RSSOwl
10  
-
11  
-Version: 2.1
12  
-Build Id: 2011-07-15
13  
-
14  
-RSSOwl is licensed under the terms of the Eclipse Public License version 1.0.
15  
-http://www.rssowl.org/legal/epl-v10.html
16  
-
  9
+         RSSOwl
  10
+
  11
+Version: 2.1
  12
+Build Id: 2011-07-15
  13
+
  14
+RSSOwl is licensed under the terms of the Eclipse Public License version 1.0.
  15
+http://www.rssowl.org/legal/epl-v10.html
  16
+
17 17
 (c) Copyright RSSOwl contributors and others 2005, 2011.  All rights reserved.
18 18
       </text>
19 19
    </aboutInfo>
@@ -73,7 +73,7 @@ RSSOwl Development Team - initial API and implementation
73 73
    <features>
74 74
       <feature id="org.eclipse.rcp" version="3.4.200.R342_v20090122-989JESTEbig-SVaL8UJHcYBr4A63"/>
75 75
       <feature id="org.rssowl.dependencies" version="2.0.0"/>
76  
-      <feature id="org.rssowl" version="2.1.0.qualifier"/>
  76
+      <feature id="org.rssowl" version="2.1.2.qualifier"/>
77 77
    </features>
78 78
 
79 79
 
5  org.rssowl.core.tests/Launch RSSOwl 2.0 Tests.launch
@@ -33,11 +33,12 @@
33 33
 <stringAttribute key="pde.version" value="3.3"/>
34 34
 <stringAttribute key="product" value="org.rssowl.ui.product"/>
35 35
 <booleanAttribute key="run_in_ui_thread" value="true"/>
36  
-<stringAttribute key="selected_target_plugins" value="org.eclipse.text@default:default,org.eclipse.ui.workbench@default:default,org.eclipse.core.resources.compatibility@default:false,org.eclipse.ecf.identity@default:default,org.eclipse.equinox.p2.artifact.repository@default:default,org.eclipse.osgi.services@default:default,org.eclipse.core.resources.win32.x86@default:false,org.eclipse.jface@default:default,org.eclipse.core.expressions@default:default,org.eclipse.core.net@default:default,org.eclipse.ecf.ssl@default:false,org.eclipse.core.runtime.compatibility.registry@default:false,org.eclipse.ecf@default:default,org.eclipse.core.filesystem@default:default,com.ibm.icu@default:default,org.hamcrest.core@default:default,org.eclipse.core.contenttype@default:default,org.eclipse.osgi,org.eclipse.core.databinding.property@default:default,org.eclipse.ecf.provider.filetransfer.ssl@default:false,org.eclipse.equinox.security@default:default,org.eclipse.equinox.p2.jarprocessor@default:default,org.eclipse.equinox.p2.metadata@default:default,org.eclipse.help@default:default,org.eclipse.ecf.filetransfer@default:default,org.eclipse.ecf.provider.filetransfer@default:default,org.eclipse.ui.views@default:default,javax.servlet@default:default,org.eclipse.core.resources@default:default,org.eclipse.update.core.win32@default:false,org.eclipse.core.filesystem.win32.x86@default:false,org.eclipse.equinox.common@default:default,org.eclipse.core.commands@default:default,org.eclipse.equinox.security.win32.x86@default:false,org.eclipse.core.net.win32.x86@default:false,org.eclipse.equinox.preferences@default:default,org.eclipse.core.jobs@default:default,org.eclipse.swt.win32.win32.x86@default:false,org.eclipse.ui.win32@default:false,org.eclipse.swt@default:default,org.eclipse.ui.forms@default:default,org.eclipse.core.runtime@default:true,org.eclipse.equinox.p2.engine@default:default,org.eclipse.update.ui@default:default,org.eclipse.core.databinding@default:default,org.eclipse.core.databinding.observable@default:default,org.eclipse.equinox.p2.repository@default:default,org.eclipse.ui@default:default,org.eclipse.equinox.p2.metadata.repository@default:default,org.eclipse.update.configurator@default:default,org.eclipse.jface.text@default:default,org.eclipse.equinox.concurrent@default:default,org.junit4@default:default,org.eclipse.ant.core@default:default,org.eclipse.equinox.registry@default:default,org.eclipse.equinox.app@default:default,org.eclipse.jface.databinding@default:default,org.eclipse.core.runtime.compatibility.auth@default:default,org.eclipse.core.variables@default:default,org.eclipse.equinox.p2.core@default:default,org.eclipse.update.core@default:default,org.eclipse.ui.ide@default:default"/>
37  
-<stringAttribute key="selected_workspace_plugins" value="org.rssowl.lib.httpclient@default:default,org.rssowl.ui@default:default,org.rssowl.core@default:default,org.rssowl.core.tests@default:default,org.rssowl.lib.db4o@default:default,org.rssowl.lib.lucene@default:default,org.rssowl.lib.jdom@default:default"/>
  36
+<stringAttribute key="selected_target_plugins" value="com.ibm.icu.base@default:default,org.eclipse.core.commands@default:default,org.eclipse.core.contenttype@default:default,org.eclipse.core.databinding@default:default,org.eclipse.core.expressions@default:default,org.eclipse.core.jobs@default:default,org.eclipse.core.net.win32.x86@default:false,org.eclipse.core.net@default:default,org.eclipse.core.runtime.compatibility.auth@default:default,org.eclipse.core.runtime@default:true,org.eclipse.equinox.app@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.preferences@default:default,org.eclipse.equinox.registry@default:default,org.eclipse.equinox.security.win32.x86@default:false,org.eclipse.equinox.security@default:default,org.eclipse.help@default:default,org.eclipse.jface.databinding@default:default,org.eclipse.jface@default:default,org.eclipse.osgi@-1:true,org.eclipse.swt.win32.win32.x86@default:false,org.eclipse.swt@default:default,org.eclipse.ui.forms@default:default,org.eclipse.ui.workbench@default:default,org.eclipse.ui@default:default,org.eclipse.update.configurator@3:true,org.eclipse.update.core.win32@default:false,org.eclipse.update.core@default:default,org.eclipse.update.ui@default:default,org.junit4@default:default"/>
  37
+<stringAttribute key="selected_workspace_plugins" value="org.rssowl.core.tests@default:default,org.rssowl.core@default:default,org.rssowl.lib.db4o@default:default,org.rssowl.lib.httpclient@default:default,org.rssowl.lib.jdom@default:default,org.rssowl.lib.lucene@default:default,org.rssowl.ui@default:default"/>
38 38
 <booleanAttribute key="show_selected_only" value="false"/>
39 39
 <stringAttribute key="templateConfig" value="${target_home}\configuration\config.ini"/>
40 40
 <booleanAttribute key="tracing" value="false"/>
  41
+<booleanAttribute key="useCustomFeatures" value="false"/>
41 42
 <booleanAttribute key="useDefaultConfig" value="true"/>
42 43
 <booleanAttribute key="useDefaultConfigArea" value="false"/>
43 44
 <booleanAttribute key="useProduct" value="false"/>
2  org.rssowl.core.tests/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
2 2
 Bundle-ManifestVersion: 2
3 3
 Bundle-Name: Tests Plug-in
4 4
 Bundle-SymbolicName: org.rssowl.core.tests;singleton:=true
5  
-Bundle-Version: 2.1.0.qualifier
  5
+Bundle-Version: 2.1.6.qualifier
6 6
 Bundle-Vendor: RSSOwl.org
7 7
 Require-Bundle: org.eclipse.core.runtime,
8 8
  org.rssowl.lib.jdom,
2  org.rssowl.core.tests/src/org/rssowl/core/tests/connection/ConnectionTests.java
@@ -727,7 +727,7 @@ public void testNewsTransformer() throws Exception {
727 727
    */
728 728
   @Test
729 729
   public void testNewsTransformerEmbedded() throws Exception {
730  
-    String link = "http://www.rssowl.org/node/258";
  730
+    String link = "http://www.rssowl.org/help";
731 731
     String transformedUrl = Controller.getDefault().getEmbeddedTransformedUrl(link);
732 732
 
733 733
     InputStream inS = Owl.getConnectionService().getHandler(new URI(transformedUrl)).openStream(new URI(transformedUrl), null, new HashMap<Object, Object>());
37  org.rssowl.core.tests/src/org/rssowl/core/tests/model/ApplicationLayerTest.java
@@ -129,7 +129,7 @@ public void testHandleReloadedWithAsyncLoadingOfEquivalentNews() throws Exceptio
129 129
     feed1 = fFactory.createFeed(null, new URI("http://www.feed1.com"));
130 130
     INews news1 = fFactory.createNews(null, feed1, new Date());
131 131
     news1.setLink(newsLink);
132  
-    fAppService.handleFeedReload(mark1, feed1, null, false, new NullProgressMonitor());
  132
+    fAppService.handleFeedReload(mark1, feed1, null, false, true, new NullProgressMonitor());
133 133
 
134 134
     assertEquals(INews.State.READ, DynamicDAO.load(INews.class, news1.getId()).getState());
135 135
   }
@@ -152,13 +152,13 @@ public void testBookMarkLastNewNewsDateIsSetDuringReload() throws Exception {
152 152
     long time = System.currentTimeMillis();
153 153
     feed1 = fFactory.createFeed(null, new URI("http://www.feed1.com"));
154 154
     fFactory.createNews(null, feed1, new Date());
155  
-    fAppService.handleFeedReload(mark1, feed1, null, false, new NullProgressMonitor());
  155
+    fAppService.handleFeedReload(mark1, feed1, null, false, true, new NullProgressMonitor());
156 156
     assertNotNull(mark1.getMostRecentNewsDate());
157 157
     long lastUpdatedDate = mark1.getMostRecentNewsDate().getTime();
158 158
     assertTrue(time <= lastUpdatedDate);
159 159
 
160 160
     feed1 = fFactory.createFeed(null, new URI("http://www.feed1.com"));
161  
-    fAppService.handleFeedReload(mark1, feed1, null, false, new NullProgressMonitor());
  161
+    fAppService.handleFeedReload(mark1, feed1, null, false, true, new NullProgressMonitor());
162 162
     assertEquals(lastUpdatedDate, mark1.getMostRecentNewsDate().getTime());
163 163
   }
164 164
 
@@ -182,7 +182,7 @@ public void testHandleFeedReloadWithRetentionStrategy() throws Exception {
182 182
     news.setState(INews.State.READ);
183 183
 
184 184
     Owl.getPreferenceService().getEntityScope(mark).putBoolean(DefaultPreferences.DEL_READ_NEWS_STATE, true);
185  
-    fAppService.handleFeedReload(mark, emptyFeed, null, false, new NullProgressMonitor());
  185
+    fAppService.handleFeedReload(mark, emptyFeed, null, false, true, new NullProgressMonitor());
186 186
 
187 187
     feed = null;
188 188
     System.gc();
@@ -193,6 +193,31 @@ public void testHandleFeedReloadWithRetentionStrategy() throws Exception {
193 193
     assertEquals(INews.State.DELETED, DynamicDAO.load(INews.class, news.getId()).getState());
194 194
   }
195 195
 
  196
+  @Test
  197
+  public void testHandleFeedReloadWithoutRetentionStrategy() throws Exception {
  198
+    IFeed feed = fFactory.createFeed(null, new URI("http://www.rssowl.org"));
  199
+    IFolder folder = fFactory.createFolder(null, null, "Folder");
  200
+    IBookMark mark = fFactory.createBookMark(null, folder, new FeedLinkReference(feed.getLink()), "Mark");
  201
+    DynamicDAO.save(feed);
  202
+    FeedReference feedRef = new FeedReference(feed.getId());
  203
+    DynamicDAO.save(folder);
  204
+
  205
+    IFeed emptyFeed = fFactory.createFeed(null, feed.getLink());
  206
+    INews news = fFactory.createNews(null, emptyFeed, new Date());
  207
+    news.setState(INews.State.READ);
  208
+
  209
+    Owl.getPreferenceService().getEntityScope(mark).putBoolean(DefaultPreferences.DEL_READ_NEWS_STATE, true);
  210
+    fAppService.handleFeedReload(mark, emptyFeed, null, false, false, new NullProgressMonitor());
  211
+
  212
+    feed = null;
  213
+    System.gc();
  214
+
  215
+    feed = feedRef.resolve();
  216
+    assertEquals(1, feed.getNews().size());
  217
+    assertEquals(1, feed.getVisibleNews().size());
  218
+    assertEquals(INews.State.READ, DynamicDAO.load(INews.class, news.getId()).getState());
  219
+  }
  220
+
196 221
   /**
197 222
    * Tests that Feed#mergeNews(List, boolean) works properly during
198 223
    * handleFeedReload in the fast path when there are many news to be removed.
@@ -225,7 +250,7 @@ public void testHandleFeedReloadWithNewsToCleanUpBiggerThanTwenty() throws Excep
225 250
 
226 251
     IFeed emptyFeed = fFactory.createFeed(null, feed.getLink());
227 252
 
228  
-    fAppService.handleFeedReload(mark, emptyFeed, null, false, new NullProgressMonitor());
  253
+    fAppService.handleFeedReload(mark, emptyFeed, null, false, true, new NullProgressMonitor());
229 254
 
230 255
     feed = null;
231 256
     System.gc();
@@ -267,7 +292,7 @@ public void entitiesUpdated(Set<NewsEvent> events) {
267 292
         }
268 293
       };
269 294
       DynamicDAO.addEntityListener(INews.class, newsListener);
270  
-      fAppService.handleFeedReload(mark, emptyFeed, null, false, new NullProgressMonitor());
  295
+      fAppService.handleFeedReload(mark, emptyFeed, null, false, true, new NullProgressMonitor());
271 296
     } finally {
272 297
       if (newsListener != null)
273 298
         DynamicDAO.removeEntityListener(INews.class, newsListener);
40  org.rssowl.core.tests/src/org/rssowl/core/tests/model/NewsFilterTest.java
@@ -133,7 +133,7 @@ public void filterApplied(ISearchFilter f, Collection<INews> news) {
133 133
     DynamicDAO.addEntityListener(ISearchFilter.class, listener);
134 134
 
135 135
     try {
136  
-      fAppService.handleFeedReload(bm, feed, null, false, new NullProgressMonitor());
  136
+      fAppService.handleFeedReload(bm, feed, null, false, true, new NullProgressMonitor());
137 137
 
138 138
       assertTrue(listenerCalled.get());
139 139
 
@@ -174,7 +174,7 @@ public void test_MarkUnread_MatchAll() throws Exception {
174 174
 
175 175
     DynamicDAO.save(filter);
176 176
 
177  
-    fAppService.handleFeedReload(bm, feed, null, false, new NullProgressMonitor());
  177
+    fAppService.handleFeedReload(bm, feed, null, false, true, new NullProgressMonitor());
178 178
 
179 179
     List<INews> news = bm.getFeedLinkReference().resolve().getNews();
180 180
     assertEquals(3, bm.getNewsCount(EnumSet.of(INews.State.UNREAD)));
@@ -210,7 +210,7 @@ public void test_MarkSticky_MatchAll() throws Exception {
210 210
 
211 211
     DynamicDAO.save(filter);
212 212
 
213  
-    fAppService.handleFeedReload(bm, feed, null, false, new NullProgressMonitor());
  213
+    fAppService.handleFeedReload(bm, feed, null, false, true, new NullProgressMonitor());
214 214
 
215 215
     List<INews> news = bm.getFeedLinkReference().resolve().getNews();
216 216
     assertEquals(3, bm.getNewsCount(EnumSet.of(INews.State.NEW)));
@@ -250,7 +250,7 @@ public void test_AddLabel_MatchAll() throws Exception {
250 250
 
251 251
     DynamicDAO.save(filter);
252 252
 
253  
-    fAppService.handleFeedReload(bm, feed, null, false, new NullProgressMonitor());
  253
+    fAppService.handleFeedReload(bm, feed, null, false, true, new NullProgressMonitor());
254 254
 
255 255
     List<INews> news = bm.getFeedLinkReference().resolve().getNews();
256 256
     assertEquals(3, news.size());
@@ -288,7 +288,7 @@ public void test_Delete_MatchAll() throws Exception {
288 288
 
289 289
     DynamicDAO.save(filter);
290 290
 
291  
-    fAppService.handleFeedReload(bm, feed, null, false, new NullProgressMonitor());
  291
+    fAppService.handleFeedReload(bm, feed, null, false, true, new NullProgressMonitor());
292 292
 
293 293
     List<INews> news = bm.getFeedLinkReference().resolve().getNews();
294 294
     assertEquals(3, news.size());
@@ -329,7 +329,7 @@ public void test_CopyNews_MatchAll() throws Exception {
329 329
 
330 330
     DynamicDAO.save(filter);
331 331
 
332  
-    fAppService.handleFeedReload(bm, feed, null, false, new NullProgressMonitor());
  332
+    fAppService.handleFeedReload(bm, feed, null, false, true, new NullProgressMonitor());
333 333
 
334 334
     List<INews> news = bm.getFeedLinkReference().resolve().getNews();
335 335
     assertEquals(3, news.size());
@@ -379,7 +379,7 @@ public void test_MoveNews_MatchAll() throws Exception {
379 379
 
380 380
     DynamicDAO.save(filter);
381 381
 
382  
-    fAppService.handleFeedReload(bm, feed, null, false, new NullProgressMonitor());
  382
+    fAppService.handleFeedReload(bm, feed, null, false, true, new NullProgressMonitor());
383 383
 
384 384
     List<INews> news = bm.getFeedLinkReference().resolve().getNews();
385 385
     assertEquals(3, news.size());
@@ -430,7 +430,7 @@ public void test_MoveNews_MatchAll_RunAllActions() throws Exception {
430 430
 
431 431
     DynamicDAO.save(filter);
432 432
 
433  
-    fAppService.handleFeedReload(bm, feed, null, false, new NullProgressMonitor());
  433
+    fAppService.handleFeedReload(bm, feed, null, false, true, new NullProgressMonitor());
434 434
 
435 435
     List<INews> news = bm.getFeedLinkReference().resolve().getNews();
436 436
     assertEquals(3, news.size());
@@ -495,7 +495,7 @@ public void testStopFilter() throws Exception {
495 495
       DynamicDAO.save(filter);
496 496
     }
497 497
 
498  
-    fAppService.handleFeedReload(bm, feed, null, false, new NullProgressMonitor());
  498
+    fAppService.handleFeedReload(bm, feed, null, false, true, new NullProgressMonitor());
499 499
 
500 500
     List<INews> news = bm.getFeedLinkReference().resolve().getNews();
501 501
     assertEquals(3, news.size());
@@ -558,7 +558,7 @@ public void testDisabledFilter() throws Exception {
558 558
       DynamicDAO.save(filter);
559 559
     }
560 560
 
561  
-    fAppService.handleFeedReload(bm, feed, null, false, new NullProgressMonitor());
  561
+    fAppService.handleFeedReload(bm, feed, null, false, true, new NullProgressMonitor());
562 562
 
563 563
     List<INews> news = bm.getFeedLinkReference().resolve().getNews();
564 564
     assertEquals(3, news.size());
@@ -619,7 +619,7 @@ public void testFilterOrder_AllNews() throws Exception {
619 619
       DynamicDAO.save(filter);
620 620
     }
621 621
 
622  
-    fAppService.handleFeedReload(bm, feed, null, false, new NullProgressMonitor());
  622
+    fAppService.handleFeedReload(bm, feed, null, false, true, new NullProgressMonitor());
623 623
 
624 624
     List<INews> news = bm.getFeedLinkReference().resolve().getNews();
625 625
     assertEquals(3, news.size());
@@ -726,7 +726,7 @@ public void filterApplied(ISearchFilter f, Collection<INews> news) {
726 726
     DynamicDAO.addEntityListener(ISearchFilter.class, listener);
727 727
 
728 728
     try {
729  
-      fAppService.handleFeedReload(bm, feed, null, false, new NullProgressMonitor());
  729
+      fAppService.handleFeedReload(bm, feed, null, false, true, new NullProgressMonitor());
730 730
     } finally {
731 731
       DynamicDAO.removeEntityListener(ISearchFilter.class, listener);
732 732
     }
@@ -836,7 +836,7 @@ public void testFilterAndRetention_Count() throws Exception {
836 836
 
837 837
     DynamicDAO.save(filter);
838 838
 
839  
-    fAppService.handleFeedReload(bm, feed, null, false, new NullProgressMonitor());
  839
+    fAppService.handleFeedReload(bm, feed, null, false, true, new NullProgressMonitor());
840 840
 
841 841
     List<INews> news = bm.getFeedLinkReference().resolve().getNews();
842 842
     assertEquals(3, news.size());
@@ -899,7 +899,7 @@ public void testFilterAndRetention_Age() throws Exception {
899 899
 
900 900
     DynamicDAO.save(filter);
901 901
 
902  
-    fAppService.handleFeedReload(bm, feed, null, false, new NullProgressMonitor());
  902
+    fAppService.handleFeedReload(bm, feed, null, false, true, new NullProgressMonitor());
903 903
 
904 904
     List<INews> news = bm.getFeedLinkReference().resolve().getNews();
905 905
     assertEquals(3, news.size());
@@ -943,7 +943,7 @@ public void testSimpleFilterOnNewsWithDescription() throws Exception {
943 943
 
944 944
     DynamicDAO.save(filter);
945 945
 
946  
-    fAppService.handleFeedReload(bm, feed, null, false, new NullProgressMonitor());
  946
+    fAppService.handleFeedReload(bm, feed, null, false, true, new NullProgressMonitor());
947 947
 
948 948
     List<INews> news = bm.getFeedLinkReference().resolve().getNews();
949 949
     assertEquals(3, news.size());
@@ -987,7 +987,7 @@ public void testComplexFilterOnNewsWithDescription() throws Exception {
987 987
 
988 988
     DynamicDAO.save(filter);
989 989
 
990  
-    fAppService.handleFeedReload(bm, feed, null, false, new NullProgressMonitor());
  990
+    fAppService.handleFeedReload(bm, feed, null, false, true, new NullProgressMonitor());
991 991
 
992 992
     List<INews> news = bm.getFeedLinkReference().resolve().getNews();
993 993
     assertEquals(3, news.size());
@@ -1037,7 +1037,7 @@ public void testFilterOnDuplicateNews() throws Exception {
1037 1037
 
1038 1038
     DynamicDAO.save(filter);
1039 1039
 
1040  
-    fAppService.handleFeedReload(bm2, feed2, null, false, new NullProgressMonitor());
  1040
+    fAppService.handleFeedReload(bm2, feed2, null, false, true, new NullProgressMonitor());
1041 1041
 
1042 1042
     List<INews> news = bm2.getFeedLinkReference().resolve().getNews();
1043 1043
     assertEquals(1, news.size());
@@ -1081,7 +1081,7 @@ public void testScopeFilter_Matching() throws Exception {
1081 1081
 
1082 1082
     DynamicDAO.save(filter);
1083 1083
 
1084  
-    fAppService.handleFeedReload(bm1, feed, null, false, new NullProgressMonitor());
  1084
+    fAppService.handleFeedReload(bm1, feed, null, false, true, new NullProgressMonitor());
1085 1085
 
1086 1086
     List<INews> news = bm1.getFeedLinkReference().resolve().getNews();
1087 1087
     assertEquals(3, bm1.getNewsCount(EnumSet.of(INews.State.READ)));
@@ -1122,7 +1122,7 @@ public void testScopeFilter_NotMatching() throws Exception {
1122 1122
 
1123 1123
     DynamicDAO.save(filter);
1124 1124
 
1125  
-    fAppService.handleFeedReload(bm1, feed, null, false, new NullProgressMonitor());
  1125
+    fAppService.handleFeedReload(bm1, feed, null, false, true, new NullProgressMonitor());
1126 1126
 
1127 1127
     List<INews> news = bm1.getFeedLinkReference().resolve().getNews();
1128 1128
     assertEquals(0, bm1.getNewsCount(EnumSet.of(INews.State.READ)));
@@ -1162,7 +1162,7 @@ public void test_MoveNewsToInvalidLocation_MatchAll() throws Exception {
1162 1162
 
1163 1163
     DynamicDAO.save(filter);
1164 1164
 
1165  
-    fAppService.handleFeedReload(bm, feed, null, false, new NullProgressMonitor());
  1165
+    fAppService.handleFeedReload(bm, feed, null, false, true, new NullProgressMonitor());
1166 1166
 
1167 1167
     List<INews> news = bm.getFeedLinkReference().resolve().getNews();
1168 1168
     assertEquals(3, news.size());
10  org.rssowl.core.tests/src/org/rssowl/core/tests/ui/FolderNewsMarkTest.java
@@ -33,6 +33,7 @@
33 33
 import org.rssowl.core.Owl;
34 34
 import org.rssowl.core.internal.persist.News;
35 35
 import org.rssowl.core.internal.persist.service.PersistenceServiceImpl;
  36
+import org.rssowl.core.persist.IBookMark;
36 37
 import org.rssowl.core.persist.IFeed;
37 38
 import org.rssowl.core.persist.IFolder;
38 39
 import org.rssowl.core.persist.ILabel;
@@ -91,7 +92,7 @@ public void testSimpleFolderNewsMark() throws Exception {
91 92
     news.setState(INews.State.READ);
92 93
     DynamicDAO.save(feed);
93 94
 
94  
-    fFactory.createBookMark(null, childFolder, new FeedLinkReference(feed.getLink()), "Mark");
  95
+    IBookMark bookMark = fFactory.createBookMark(null, childFolder, new FeedLinkReference(feed.getLink()), "Mark");
95 96
     folder = DynamicDAO.save(folder);
96 97
 
97 98
     FolderNewsMark mark = new FolderNewsMark(childFolder);
@@ -99,6 +100,7 @@ public void testSimpleFolderNewsMark() throws Exception {
99 100
     assertEquals(childFolder, mark.getFolder());
100 101
     assertEquals("bar", mark.getProperty("foo"));
101 102
     assertTrue(Long.valueOf(mark.toReference().getId()).equals(childFolder.getId()));
  103
+    assertTrue(mark.contains(bookMark));
102 104
 
103 105
     waitForIndexer();
104 106
     mark.resolve(NewsFilter.Type.SHOW_ALL, null);
@@ -123,7 +125,7 @@ public void testComplexFolderNewsMark() throws Exception {
123 125
     news3.setState(INews.State.READ);
124 126
     DynamicDAO.save(feed);
125 127
 
126  
-    fFactory.createBookMark(null, childFolder, new FeedLinkReference(feed.getLink()), "Mark");
  128
+    IBookMark bookMark1 = fFactory.createBookMark(null, childFolder, new FeedLinkReference(feed.getLink()), "Mark");
127 129
 
128 130
     IFeed otherFeed = fFactory.createFeed(null, new URI("otherfeed"));
129 131
     INews othernews1 = fFactory.createNews(null, otherFeed, new Date());
@@ -134,7 +136,7 @@ public void testComplexFolderNewsMark() throws Exception {
134 136
     othernews3.setState(INews.State.READ);
135 137
     DynamicDAO.save(otherFeed);
136 138
 
137  
-    fFactory.createBookMark(null, folder, new FeedLinkReference(otherFeed.getLink()), "Other Mark");
  139
+    IBookMark bookMark2 = fFactory.createBookMark(null, folder, new FeedLinkReference(otherFeed.getLink()), "Other Mark");
138 140
 
139 141
     INewsBin bin = fFactory.createNewsBin(null, childFolder, "bin");
140 142
     DynamicDAO.save(bin);
@@ -156,6 +158,8 @@ public void testComplexFolderNewsMark() throws Exception {
156 158
     Controller.getDefault().getSavedSearchService().updateSavedSearches(true);
157 159
 
158 160
     FolderNewsMark mark = new FolderNewsMark(childFolder);
  161
+    assertTrue(mark.contains(bookMark1));
  162
+    assertFalse(mark.contains(bookMark2));
159 163
     mark.resolve(NewsFilter.Type.SHOW_ALL, null);
160 164
 
161 165
     {
2  org.rssowl.core/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
2 2
 Bundle-ManifestVersion: 2
3 3
 Bundle-Name: %Bundle-Name
4 4
 Bundle-SymbolicName: org.rssowl.core;singleton:=true
5  
-Bundle-Version: 2.1.0.qualifier
  5
+Bundle-Version: 2.1.6.qualifier
6 6
 Bundle-Activator: org.rssowl.core.internal.Activator
7 7
 Eclipse-RegisterBuddy: org.rssowl.lib.db4o, org.rssowl.lib.httpclient
8 8
 Require-Bundle: org.eclipse.core.runtime,
4  org.rssowl.core/src/org/rssowl/core/IApplicationService.java
@@ -57,7 +57,9 @@
57 57
    * @param deleteConditionalGet if <code>true</code> an existing
58 58
    * IConditionalGet object associated with the IFeed will be deleted as part of
59 59
    * this operation.
  60
+   * @param runRetention if <code>true</code> causes the method to perform clean
  61
+   * up of the feed and false otherwise.
60 62
    * @param monitor a monitor to show progress and react on cancellation.
61 63
    */
62  
-  void handleFeedReload(IBookMark bookMark, IFeed interpretedFeed, IConditionalGet conditionalGet, boolean deleteConditionalGet, IProgressMonitor monitor);
  64
+  void handleFeedReload(IBookMark bookMark, IFeed interpretedFeed, IConditionalGet conditionalGet, boolean deleteConditionalGet, boolean runRetention, IProgressMonitor monitor);
63 65
 }
57  org.rssowl.core/src/org/rssowl/core/connection/PlatformCredentialsProvider.java
@@ -39,6 +39,8 @@
39 39
 import org.rssowl.core.internal.InternalOwl;
40 40
 import org.rssowl.core.internal.persist.pref.DefaultPreferences;
41 41
 import org.rssowl.core.persist.pref.IPreferenceScope;
  42
+import org.rssowl.core.util.Pair;
  43
+import org.rssowl.core.util.StringUtils;
42 44
 import org.rssowl.core.util.URIUtils;
43 45
 
44 46
 import java.io.IOException;
@@ -50,6 +52,7 @@
50 52
 import java.util.HashSet;
51 53
 import java.util.Map;
52 54
 import java.util.Set;
  55
+import java.util.StringTokenizer;
53 56
 
54 57
 /**
55 58
  * The default implementation of the ICredentialsProvider retrieves
@@ -84,6 +87,15 @@
84 87
   /* Unique Key to store Domains */
85 88
   private static final String DOMAIN = "org.rssowl.core.connection.auth.Domain"; //$NON-NLS-1$
86 89
 
  90
+  /* Separator between Domain and Username */
  91
+  private static final String DOMAIN_SEPARATOR = "\\"; //$NON-NLS-1$
  92
+
  93
+  /* System Property to enable NTLM Proxy support */
  94
+  private static final String ENABLE_NTLM_PROXY = "enableNtlmProxy"; //$NON-NLS-1$
  95
+
  96
+  /* Flag for NTLM Proxy Support controlled through System Property */
  97
+  private static final boolean NTLM_PROXY_ENABLED = (System.getProperty(ENABLE_NTLM_PROXY) != null);
  98
+
87 99
   /* Default Realm being used to store credentials */
88 100
   private static final String REALM = ""; //$NON-NLS-1$
89 101
 
@@ -273,25 +285,33 @@ public IProxyCredentials getProxyCredentials(URI link) {
273 285
     /* Retrieve Proxy Data */
274 286
     final IProxyData proxyData = proxyService.getProxyDataForHost(host, isSSL ? IProxyData.HTTPS_PROXY_TYPE : IProxyData.HTTP_PROXY_TYPE);
275 287
     if (proxyData != null) {
  288
+
  289
+      /* Look for Domain as part of Username to support NTLM Proxy */
  290
+      final String proxyHost = proxyData.getHost();
  291
+      final int proxyPort = proxyData.getPort();
  292
+      final Pair<String /* Username */, String /* Domain */> proxyUserAndDomain = splitUserAndDomain(proxyData.getUserId());
  293
+      final String proxyPassword = proxyData.getPassword();
  294
+
  295
+      /* Return as IProxyCredentials Object */
276 296
       return new IProxyCredentials() {
277 297
         public String getHost() {
278  
-          return proxyData.getHost();
  298
+          return proxyHost;
279 299
         }
280 300
 
281 301
         public int getPort() {
282  
-          return proxyData.getPort();
  302
+          return proxyPort;
283 303
         }
284 304
 
285  
-        public String getDomain() {
286  
-          return null;
  305
+        public String getUsername() {
  306
+          return proxyUserAndDomain.getFirst();
287 307
         }
288 308
 
289 309
         public String getPassword() {
290  
-          return proxyData.getPassword();
  310
+          return proxyPassword;
291 311
         }
292 312
 
293  
-        public String getUsername() {
294  
-          return proxyData.getUserId();
  313
+        public String getDomain() {
  314
+          return proxyUserAndDomain.getSecond();
295 315
         }
296 316
       };
297 317
     }
@@ -300,6 +320,29 @@ public String getUsername() {
300 320
     return null;
301 321
   }
302 322
 
  323
+  private Pair<String /* Username */, String /* Domain */> splitUserAndDomain(String username) {
  324
+    if (NTLM_PROXY_ENABLED && StringUtils.isSet(username) && username.contains(DOMAIN_SEPARATOR)) {
  325
+      String user = null;
  326
+      String domain = null;
  327
+
  328
+      StringTokenizer tokenizer = new StringTokenizer(username, DOMAIN_SEPARATOR);
  329
+      while (tokenizer.hasMoreTokens()) {
  330
+        String token = tokenizer.nextToken();
  331
+        if (StringUtils.isSet(token)) {
  332
+          if (domain == null)
  333
+            domain = token;
  334
+          else if (user == null)
  335
+            user = token;
  336
+        }
  337
+      }
  338
+
  339
+      if (StringUtils.isSet(user) && StringUtils.isSet(domain))
  340
+        return Pair.create(user, domain);
  341
+    }
  342
+
  343
+    return Pair.create(username, null);
  344
+  }
  345
+
303 346
   /*
304 347
    * @see
305 348
    * org.rssowl.core.connection.ICredentialsProvider#setAuthCredentials(org.
6  org.rssowl.core/src/org/rssowl/core/internal/ApplicationServiceImpl.java
@@ -160,10 +160,10 @@ private void loadNewsActions() {
160 160
    * @see
161 161
    * org.rssowl.core.IApplicationService#handleFeedReload(org.rssowl.core.persist
162 162
    * .IBookMark, org.rssowl.core.persist.IFeed,
163  
-   * org.rssowl.core.persist.IConditionalGet, boolean,
  163
+   * org.rssowl.core.persist.IConditionalGet, boolean, boolean,
164 164
    * org.eclipse.core.runtime.IProgressMonitor)
165 165
    */
166  
-  public final void handleFeedReload(final IBookMark bookMark, IFeed interpretedFeed, IConditionalGet conditionalGet, boolean deleteConditionalGet, final IProgressMonitor monitor) {
  166
+  public final void handleFeedReload(final IBookMark bookMark, IFeed interpretedFeed, IConditionalGet conditionalGet, boolean deleteConditionalGet, boolean runRetention, final IProgressMonitor monitor) {
167 167
     fWriteLock.lock();
168 168
     MergeResult mergeResult = null;
169 169
     try {
@@ -326,7 +326,7 @@ public void run() throws Exception { //See Bug 1216 (NPE in ModelSearchImpl.getC
326 326
         return;
327 327
 
328 328
       /* Retention Policy */
329  
-      final List<INews> deletedNews = RetentionStrategy.process(bookMark, feed);
  329
+      final List<INews> deletedNews = runRetention ? RetentionStrategy.process(bookMark, feed) : Collections.<INews>emptyList();
330 330
       for (INews news : deletedNews)
331 331
         mergeResult.addUpdatedObject(news);
332 332
 
114  org.rssowl.core/src/org/rssowl/core/internal/LogBridge.java
@@ -26,6 +26,8 @@
26 26
 
27 27
 import org.apache.commons.logging.Log;
28 28
 import org.eclipse.core.runtime.IStatus;
  29
+import org.rssowl.core.util.CoreUtils;
  30
+import org.rssowl.core.util.StringUtils;
29 31
 
30 32
 /**
31 33
  * Implementation of <code>Log</code> that writes error and fatal messages to
@@ -35,15 +37,44 @@
35 37
  */
36 38
 public class LogBridge implements Log {
37 39
 
  40
+  /* System Properties to Control Logging Levels */
  41
+  private static final String DEBUG_PROPERTY = "rssowl.http.debug"; //$NON-NLS-1$
  42
+  private static final String TRACE_PROPERTY = "rssowl.http.trace"; //$NON-NLS-1$
  43
+  private static final String INFO_PROPERTY = "rssowl.http.info"; //$NON-NLS-1$
  44
+  private static final String WARN_PROPERTY = "rssowl.http.warn"; //$NON-NLS-1$
  45
+
  46
+  private final boolean fDebug;
  47
+  private final boolean fTrace;
  48
+  private final boolean fInfo;
  49
+  private final boolean fWarn;
  50
+  private final String fNl;
  51
+
  52
+  private enum Level {
  53
+    INFO, WARNING, ERROR
  54
+  }
  55
+
38 56
   /** Keep for reflection */
39  
-  public LogBridge() {}
  57
+  public LogBridge() {
  58
+    this(null);
  59
+  }
40 60
 
41 61
   /**
42 62
    * Keep for reflection
43 63
    *
44 64
    * @param str the class using this log
45 65
    */
46  
-  public LogBridge(String str) {}
  66
+  public LogBridge(String str) {
  67
+    fDebug = System.getProperty(DEBUG_PROPERTY) != null;
  68
+    fTrace = System.getProperty(TRACE_PROPERTY) != null;
  69
+    fInfo = System.getProperty(INFO_PROPERTY) != null;
  70
+    fWarn = System.getProperty(WARN_PROPERTY) != null;
  71
+
  72
+    String nl = System.getProperty("line.separator"); //$NON-NLS-1$
  73
+    if (!StringUtils.isSet(nl))
  74
+      nl = "\n"; //$NON-NLS-1$
  75
+
  76
+    fNl = nl;
  77
+  }
47 78
 
48 79
   /*
49 80
    * @see org.apache.commons.logging.impl.NoOpLog#error(java.lang.Object,
@@ -75,7 +106,19 @@ public void fatal(Object message) {
75 106
     logError(message, null);
76 107
   }
77 108
 
  109
+  private void logInfo(Object message, Throwable t) {
  110
+    logStatus(message, t, Level.INFO);
  111
+  }
  112
+
  113
+  private void logWarning(Object message, Throwable t) {
  114
+    logStatus(message, t, Level.WARNING);
  115
+  }
  116
+
78 117
   private void logError(Object message, Throwable t) {
  118
+    logStatus(message, t, Level.ERROR);
  119
+  }
  120
+
  121
+  private void logStatus(Object message, Throwable t, Level level) {
79 122
     if (message instanceof String || t instanceof Exception) {
80 123
       String msg = null;
81 124
       if (message instanceof String)
@@ -88,10 +131,21 @@ private void logError(Object message, Throwable t) {
88 131
       if (msg == null && e != null && e.getMessage() != null)
89 132
         msg = e.getMessage();
90 133
 
91  
-      Activator activator = Activator.getDefault();
92  
-      if (activator != null) {
93  
-        IStatus status = activator.createErrorStatus(msg, e);
94  
-        activator.getLog().log(status);
  134
+      /* Write Info and Warning to Log Directly */
  135
+      if (level == Level.INFO || level == Level.WARNING) {
  136
+        if (StringUtils.isSet(msg)) {
  137
+          CoreUtils.appendLogMessage(msg);
  138
+          CoreUtils.appendLogMessage(fNl);
  139
+        }
  140
+      }
  141
+
  142
+      /* Log Error Status for Errors */
  143
+      else {
  144
+        Activator activator = Activator.getDefault();
  145
+        if (activator != null) {
  146
+          IStatus status = activator.createErrorStatus(msg, e);
  147
+          activator.getLog().log(status);
  148
+        }
95 149
       }
96 150
     }
97 151
   }
@@ -99,52 +153,76 @@ private void logError(Object message, Throwable t) {
99 153
   /*
100 154
    * @see org.apache.commons.logging.Log#debug(java.lang.Object)
101 155
    */
102  
-  public void debug(Object message) {}
  156
+  public void debug(Object message) {
  157
+    if (isDebugEnabled())
  158
+      logInfo(message, null);
  159
+  }
103 160
 
104 161
   /*
105 162
    * @see org.apache.commons.logging.Log#debug(java.lang.Object,
106 163
    * java.lang.Throwable)
107 164
    */
108  
-  public void debug(Object message, Throwable t) {}
  165
+  public void debug(Object message, Throwable t) {
  166
+    if (isDebugEnabled())
  167
+      logInfo(message, t);
  168
+  }
109 169
 
110 170
   /*
111 171
    * @see org.apache.commons.logging.Log#info(java.lang.Object)
112 172
    */
113  
-  public void info(Object message) {}
  173
+  public void info(Object message) {
  174
+    if (isInfoEnabled())
  175
+      logInfo(message, null);
  176
+  }
114 177
 
115 178
   /*
116 179
    * @see org.apache.commons.logging.Log#info(java.lang.Object,
117 180
    * java.lang.Throwable)
118 181
    */
119  
-  public void info(Object message, Throwable t) {}
  182
+  public void info(Object message, Throwable t) {
  183
+    if (isInfoEnabled())
  184
+      logInfo(message, t);
  185
+  }
120 186
 
121 187
   /*
122 188
    * @see org.apache.commons.logging.Log#warn(java.lang.Object)
123 189
    */
124  
-  public void warn(Object message) {}
  190
+  public void warn(Object message) {
  191
+    if (isWarnEnabled())
  192
+      logWarning(message, null);
  193
+  }
125 194
 
126 195
   /*
127 196
    * @see org.apache.commons.logging.Log#warn(java.lang.Object,
128 197
    * java.lang.Throwable)
129 198
    */
130  
-  public void warn(Object message, Throwable t) {}
  199
+  public void warn(Object message, Throwable t) {
  200
+    if (isWarnEnabled())
  201
+      logWarning(message, t);
  202
+  }
131 203
 
132 204
   /*
133 205
    * @see org.apache.commons.logging.Log#trace(java.lang.Object)
134 206
    */
135  
-  public void trace(Object message) {}
  207
+  public void trace(Object message) {
  208
+    if (isTraceEnabled())
  209
+      logInfo(message, null);
  210
+  }
136 211
 
137 212
   /*
138 213
    * @see org.apache.commons.logging.Log#trace(java.lang.Object,
139 214
    * java.lang.Throwable)
140 215
    */
141  
-  public void trace(Object message, Throwable t) {}
  216
+  public void trace(Object message, Throwable t) {
  217
+    if (isTraceEnabled())
  218
+      logInfo(message, t);
  219
+  }
142 220
 
143 221
   /*
144 222
    * @see org.apache.commons.logging.Log#isDebugEnabled()
145 223
    */
146 224
   public boolean isDebugEnabled() {
147  
-    return false;
  225
+    return fDebug;
148 226
   }
149 227
 
150 228
   /*
@@ -165,20 +243,20 @@ public boolean isFatalEnabled() {
165 243
    * @see org.apache.commons.logging.Log#isInfoEnabled()
166 244
    */
167 245
   public boolean isInfoEnabled() {
168  
-    return false;
  246
+    return fInfo;
169 247
   }
170 248
 
171 249
   /*
172 250
    * @see org.apache.commons.logging.Log#isTraceEnabled()
173 251
    */
174 252
   public boolean isTraceEnabled() {
175  
-    return false;
  253
+    return fTrace;
176 254
   }
177 255
 
178 256
   /*
179 257
    * @see org.apache.commons.logging.Log#isWarnEnabled()
180 258
    */
181 259
   public boolean isWarnEnabled() {
182  
-    return false;
  260
+    return fWarn;
183 261
   }
184 262
 }
10  org.rssowl.core/src/org/rssowl/core/internal/connection/DefaultProtocolHandler.java
@@ -145,6 +145,9 @@
145 145
   /* Timeout for loading a Favicon */
146 146
   private static final int FAVICON_CON_TIMEOUT = 5000;
147 147
 
  148
+  /* Set a limit for titles that are looked up from feeds */
  149
+  private static final int MAX_DETECTED_TITLE_LENGTH = 1024;
  150
+
148 151
   private static final String USER_AGENT = CoreUtils.getUserAgent();
149 152
   private static boolean fgSSLInitialized;
150 153
   private static boolean fgFeedProtocolInitialized;
@@ -899,7 +902,12 @@ public String getLabel(URI link, IProgressMonitor monitor) throws ConnectionExce
899 902
       closeStream(inS, true); //Abort the stream to avoid downloading the full content
900 903
     }
901 904
 
902  
-    return StringUtils.stripTags(title.trim(), true);
  905
+    // Have an upper maximum of title length to protect against issues
  906
+    String result = StringUtils.stripTags(title.trim(), true);
  907
+    if (result.length() > MAX_DETECTED_TITLE_LENGTH)
  908
+      result = result.substring(0, MAX_DETECTED_TITLE_LENGTH);
  909
+
  910
+    return result;
903 911
   }
904 912
 
905 913
   /* Tries to read the encoding information from the given InputReader */
2  org.rssowl.core/src/org/rssowl/core/internal/connection/EasySSLProtocolSocketFactory.java
@@ -124,7 +124,7 @@ public Socket createSocket(final String host, final int port, final InetAddress
124 124
    */
125 125
   @Override
126 126
   public boolean equals(Object obj) {
127  
-    return ((obj != null) && obj.getClass().equals(this.getClass()));
  127
+    return ((obj != null) && obj.getClass().equals(EasySSLProtocolSocketFactory.class));
128 128
   }
129 129
 
130 130
   /*
9  org.rssowl.core/src/org/rssowl/core/internal/interpreter/RDFInterpreter.java
@@ -258,9 +258,12 @@ else if ("title".equals(name)) { //$NON-NLS-1$
258 258
 
259 259
       /* Link */
260 260
       else if ("link".equals(name)) { //$NON-NLS-1$
261  
-        URI uri = URIUtils.createURI(child.getText());
262  
-        if (uri != null)
263  
-          news.setLink(uri);
  261
+        if (child.getText().length() > 0) {
  262
+          URI uri = URIUtils.createURI(child.getText());
  263
+          if (uri != null)
  264
+            news.setLink(uri);
  265
+        }
  266
+
264 267
         processNamespaceAttributes(child, news);
265 268
       }
266 269
 
9  org.rssowl.core/src/org/rssowl/core/internal/interpreter/RSSInterpreter.java
@@ -415,9 +415,12 @@ else if ("title".equals(name)) { //$NON-NLS-1$
415 415
 
416 416
       /* Link */
417 417
       else if ("link".equals(name)) { //$NON-NLS-1$
418  
-        URI uri = URIUtils.createURI(child.getText());
419  
-        if (uri != null)
420  
-          news.setLink(uri);
  418
+        if (child.getText().length() > 0) {
  419
+          URI uri = URIUtils.createURI(child.getText());
  420
+          if (uri != null)
  421
+            news.setLink(uri);
  422
+        }
  423
+
421 424
         processNamespaceAttributes(child, news);
422 425
       }
423 426
 
9  org.rssowl.core/src/org/rssowl/core/internal/interpreter/json/JSONInterpreter.java
@@ -167,8 +167,13 @@ private void processItem(JSONObject item, IFeed feed) throws JSONException, URIS
167 167
           IAttachment att = factory.createAttachment(null, news);
168 168
           att.setLink(new URI(attachment.getString(HREF)));
169 169
 
170  
-          if (attachment.has(LENGTH))
171  
-            att.setLength(attachment.getInt(LENGTH));
  170
+          if (attachment.has(LENGTH)) {
  171
+            try {
  172
+              att.setLength(attachment.getInt(LENGTH));
  173
+            } catch (JSONException e) {
  174
+              // Can happen if the length is larger than Integer.MAX_VALUE, in that case just ignore
  175
+            }
  176
+          }
172 177
 
173 178
           if (attachment.has(TYPE))
174 179
             att.setType(attachment.getString(TYPE));
2  org.rssowl.core/src/org/rssowl/core/internal/interpreter/json/JSONObject.java
@@ -1374,7 +1374,7 @@ String toString(int indentFactor, int indent) throws JSONException {
1374 1374
    * @throws JSONException If the value is or contains an invalid number.
1375 1375
    */
1376 1376
   public static String valueToString(Object value) throws JSONException {
1377  
-    if (value == null) {
  1377
+    if (value == null || value.equals(null)) {