[572117] Enable configurable debug trace at a global level in CDO client standalone mode

https://bugs.eclipse.org/bugs/show_bug.cgi?id=572117
diff --git a/features/org.eclipse.net4j-feature/feature.xml b/features/org.eclipse.net4j-feature/feature.xml
index 598ec2c..f6bb608 100644
--- a/features/org.eclipse.net4j-feature/feature.xml
+++ b/features/org.eclipse.net4j-feature/feature.xml
@@ -12,7 +12,7 @@
 <feature
       id="org.eclipse.net4j"
       label="%featureName"
-      version="4.13.0.qualifier"
+      version="4.13.1.qualifier"
       provider-name="%providerName"
       image="eclipse_update_120.jpg"
       license-feature="org.eclipse.emf.cdo.license"
diff --git a/features/org.eclipse.net4j-feature/pom.xml b/features/org.eclipse.net4j-feature/pom.xml
index 7ccf378..007a407 100644
--- a/features/org.eclipse.net4j-feature/pom.xml
+++ b/features/org.eclipse.net4j-feature/pom.xml
@@ -25,7 +25,7 @@
 
   <groupId>org.eclipse.emf.cdo.features</groupId>
   <artifactId>org.eclipse.net4j</artifactId>
-  <version>4.13.0-SNAPSHOT</version>
+  <version>4.13.1-SNAPSHOT</version>
   <packaging>eclipse-feature</packaging>
 
 </project>
diff --git a/features/org.eclipse.net4j.db-feature/feature.xml b/features/org.eclipse.net4j.db-feature/feature.xml
index 250239b..81db26a 100644
--- a/features/org.eclipse.net4j.db-feature/feature.xml
+++ b/features/org.eclipse.net4j.db-feature/feature.xml
@@ -12,7 +12,7 @@
 <feature
       id="org.eclipse.net4j.db"
       label="%featureName"
-      version="4.13.0.qualifier"
+      version="4.13.1.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.emf.cdo.license"
       license-feature-version="0.0.0">
diff --git a/features/org.eclipse.net4j.db-feature/pom.xml b/features/org.eclipse.net4j.db-feature/pom.xml
index 3f7284c..e9aae6c 100644
--- a/features/org.eclipse.net4j.db-feature/pom.xml
+++ b/features/org.eclipse.net4j.db-feature/pom.xml
@@ -25,7 +25,7 @@
 
   <groupId>org.eclipse.emf.cdo.features</groupId>
   <artifactId>org.eclipse.net4j.db</artifactId>
-  <version>4.13.0-SNAPSHOT</version>
+  <version>4.13.1-SNAPSHOT</version>
   <packaging>eclipse-feature</packaging>
 
 </project>
diff --git a/features/org.eclipse.net4j.util-feature/feature.xml b/features/org.eclipse.net4j.util-feature/feature.xml
index 7a49641..8c3c178 100644
--- a/features/org.eclipse.net4j.util-feature/feature.xml
+++ b/features/org.eclipse.net4j.util-feature/feature.xml
@@ -12,7 +12,7 @@
 <feature
       id="org.eclipse.net4j.util"
       label="%featureName"
-      version="4.13.0.qualifier"
+      version="4.13.1.qualifier"
       provider-name="%providerName"
       image="eclipse_update_120.jpg"
       license-feature="org.eclipse.emf.cdo.license"
diff --git a/features/org.eclipse.net4j.util-feature/pom.xml b/features/org.eclipse.net4j.util-feature/pom.xml
index a89c0cc..31368f3 100644
--- a/features/org.eclipse.net4j.util-feature/pom.xml
+++ b/features/org.eclipse.net4j.util-feature/pom.xml
@@ -25,7 +25,7 @@
 
   <groupId>org.eclipse.emf.cdo.features</groupId>
   <artifactId>org.eclipse.net4j.util</artifactId>
-  <version>4.13.0-SNAPSHOT</version>
+  <version>4.13.1-SNAPSHOT</version>
   <packaging>eclipse-feature</packaging>
 
 </project>
diff --git a/features/org.eclipse.net4j.util.ui-feature/feature.xml b/features/org.eclipse.net4j.util.ui-feature/feature.xml
index cdcb3ad..7949c7a 100644
--- a/features/org.eclipse.net4j.util.ui-feature/feature.xml
+++ b/features/org.eclipse.net4j.util.ui-feature/feature.xml
@@ -12,7 +12,7 @@
 <feature
       id="org.eclipse.net4j.util.ui"
       label="%featureName"
-      version="4.13.0.qualifier"
+      version="4.13.1.qualifier"
       provider-name="%providerName"
       image="eclipse_update_120.jpg"
       license-feature="org.eclipse.emf.cdo.license"
diff --git a/features/org.eclipse.net4j.util.ui-feature/pom.xml b/features/org.eclipse.net4j.util.ui-feature/pom.xml
index ba275e0..7a1b006 100644
--- a/features/org.eclipse.net4j.util.ui-feature/pom.xml
+++ b/features/org.eclipse.net4j.util.ui-feature/pom.xml
@@ -25,7 +25,7 @@
 
   <groupId>org.eclipse.emf.cdo.features</groupId>
   <artifactId>org.eclipse.net4j.util.ui</artifactId>
-  <version>4.13.0-SNAPSHOT</version>
+  <version>4.13.1-SNAPSHOT</version>
   <packaging>eclipse-feature</packaging>
 
 </project>
diff --git a/plugins/org.eclipse.net4j.util/META-INF/MANIFEST.MF b/plugins/org.eclipse.net4j.util/META-INF/MANIFEST.MF
index bb409a4..f91d66d 100644
--- a/plugins/org.eclipse.net4j.util/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.net4j.util/META-INF/MANIFEST.MF
@@ -1,7 +1,7 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-SymbolicName: org.eclipse.net4j.util;singleton:=true
-Bundle-Version: 3.14.0.qualifier
+Bundle-Version: 3.14.1.qualifier
 Bundle-Name: %pluginName
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
@@ -15,36 +15,36 @@
  org.osgi.framework;version="[1.3.0,2.0.0)";resolution:=optional,
  org.osgi.service.log;version="[1.3.0,2.0.0)";resolution:=optional,
  org.osgi.util.tracker;version="[1.3.0,2.0.0)";resolution:=optional
-Export-Package: org.eclipse.net4j.internal.util.bundle;version="3.14.0";x-friends:="org.eclipse.net4j.util.ui,org.eclipse.net4j.tests",
- org.eclipse.net4j.internal.util.container;version="3.14.0";x-internal:=true,
- org.eclipse.net4j.internal.util.factory;version="3.14.0";x-internal:=true,
- org.eclipse.net4j.internal.util.om;version="3.14.0";x-internal:=true,
- org.eclipse.net4j.internal.util.om.pref;version="3.14.0";x-internal:=true,
- org.eclipse.net4j.internal.util.table;version="3.14.0";x-internal:=true,
- org.eclipse.net4j.internal.util.test;version="3.14.0";x-friends:="org.eclipse.net4j.tests",
- org.eclipse.net4j.util;version="3.14.0",
- org.eclipse.net4j.util.cache;version="3.14.0",
- org.eclipse.net4j.util.collection;version="3.14.0",
- org.eclipse.net4j.util.concurrent;version="3.14.0",
- org.eclipse.net4j.util.confirmation;version="3.14.0",
- org.eclipse.net4j.util.container;version="3.14.0",
- org.eclipse.net4j.util.container.delegate;version="3.14.0",
- org.eclipse.net4j.util.event;version="3.14.0",
- org.eclipse.net4j.util.factory;version="3.14.0",
- org.eclipse.net4j.util.fsm;version="3.14.0",
- org.eclipse.net4j.util.io;version="3.14.0",
- org.eclipse.net4j.util.lifecycle;version="3.14.0",
- org.eclipse.net4j.util.om;version="3.14.0",
- org.eclipse.net4j.util.om.job;version="3.14.0",
- org.eclipse.net4j.util.om.log;version="3.14.0",
- org.eclipse.net4j.util.om.monitor;version="3.14.0",
- org.eclipse.net4j.util.om.pref;version="3.14.0",
- org.eclipse.net4j.util.om.trace;version="3.14.0",
- org.eclipse.net4j.util.options;version="3.14.0",
- org.eclipse.net4j.util.properties;version="3.14.0",
- org.eclipse.net4j.util.ref;version="3.14.0",
- org.eclipse.net4j.util.registry;version="3.14.0",
- org.eclipse.net4j.util.security;version="3.14.0",
- org.eclipse.net4j.util.transaction;version="3.14.0"
+Export-Package: org.eclipse.net4j.internal.util.bundle;version="3.14.1";x-friends:="org.eclipse.net4j.util.ui,org.eclipse.net4j.tests",
+ org.eclipse.net4j.internal.util.container;version="3.14.1";x-internal:=true,
+ org.eclipse.net4j.internal.util.factory;version="3.14.1";x-internal:=true,
+ org.eclipse.net4j.internal.util.om;version="3.14.1";x-internal:=true,
+ org.eclipse.net4j.internal.util.om.pref;version="3.14.1";x-internal:=true,
+ org.eclipse.net4j.internal.util.table;version="3.14.1";x-internal:=true,
+ org.eclipse.net4j.internal.util.test;version="3.14.1";x-friends:="org.eclipse.net4j.tests",
+ org.eclipse.net4j.util;version="3.14.1",
+ org.eclipse.net4j.util.cache;version="3.14.1",
+ org.eclipse.net4j.util.collection;version="3.14.1",
+ org.eclipse.net4j.util.concurrent;version="3.14.1",
+ org.eclipse.net4j.util.confirmation;version="3.14.1",
+ org.eclipse.net4j.util.container;version="3.14.1",
+ org.eclipse.net4j.util.container.delegate;version="3.14.1",
+ org.eclipse.net4j.util.event;version="3.14.1",
+ org.eclipse.net4j.util.factory;version="3.14.1",
+ org.eclipse.net4j.util.fsm;version="3.14.1",
+ org.eclipse.net4j.util.io;version="3.14.1",
+ org.eclipse.net4j.util.lifecycle;version="3.14.1",
+ org.eclipse.net4j.util.om;version="3.14.1",
+ org.eclipse.net4j.util.om.job;version="3.14.1",
+ org.eclipse.net4j.util.om.log;version="3.14.1",
+ org.eclipse.net4j.util.om.monitor;version="3.14.1",
+ org.eclipse.net4j.util.om.pref;version="3.14.1",
+ org.eclipse.net4j.util.om.trace;version="3.14.1",
+ org.eclipse.net4j.util.options;version="3.14.1",
+ org.eclipse.net4j.util.properties;version="3.14.1",
+ org.eclipse.net4j.util.ref;version="3.14.1",
+ org.eclipse.net4j.util.registry;version="3.14.1",
+ org.eclipse.net4j.util.security;version="3.14.1",
+ org.eclipse.net4j.util.transaction;version="3.14.1"
 Eclipse-BuddyPolicy: registered
 Automatic-Module-Name: org.eclipse.net4j.util
diff --git a/plugins/org.eclipse.net4j.util/pom.xml b/plugins/org.eclipse.net4j.util/pom.xml
index 8381d92..9e99e68 100644
--- a/plugins/org.eclipse.net4j.util/pom.xml
+++ b/plugins/org.eclipse.net4j.util/pom.xml
@@ -25,7 +25,7 @@
 
   <groupId>org.eclipse.emf.cdo</groupId>
   <artifactId>org.eclipse.net4j.util</artifactId>
-  <version>3.14.0-SNAPSHOT</version>
+  <version>3.14.1-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 
 </project>
diff --git a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/bundle/AbstractBundle.java b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/bundle/AbstractBundle.java
index 635e25d..f547164 100644
--- a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/bundle/AbstractBundle.java
+++ b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/bundle/AbstractBundle.java
@@ -198,6 +198,11 @@
     platform.setDebugOption(bundleID, option, value);
   }
 
+  public void setDebugOptionIfAbsent(String option, String value)
+  {
+    platform.setDebugOption(bundleID, option, value, true);
+  }
+
   @Override
   public synchronized OMTracer tracer(String name)
   {
diff --git a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/bundle/AbstractPlatform.java b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/bundle/AbstractPlatform.java
index 6857c02..3af737c 100644
--- a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/bundle/AbstractPlatform.java
+++ b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/bundle/AbstractPlatform.java
@@ -433,7 +433,12 @@
 
   protected abstract String getDebugOption(String bundleID, String option);
 
-  protected abstract void setDebugOption(String bundleID, String option, String value);
+  protected abstract void setDebugOption(String bundleID, String option, String value, boolean ifAbsent);
+
+  protected void setDebugOption(String bundleID, String option, String value)
+  {
+    setDebugOption(bundleID, option, value, false);
+  }
 
   public abstract void scheduleJob(InternalOMJob job);
 
diff --git a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/om/LegacyBundle.java b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/om/LegacyBundle.java
index afb96c3..f1fc5a3 100644
--- a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/om/LegacyBundle.java
+++ b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/om/LegacyBundle.java
@@ -19,6 +19,7 @@
 import org.eclipse.net4j.util.om.OMPlatform;
 import org.eclipse.net4j.util.om.trace.Tracer;
 
+import java.io.BufferedInputStream;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
@@ -180,7 +181,7 @@
       final String prefix = getBundleID() + "/"; //$NON-NLS-1$
       final int length = prefix.length();
 
-      inputStream = getInputStream(".options"); //$NON-NLS-1$
+      inputStream = new BufferedInputStream(getInputStream(LegacyPlatform.OPTIONS));
       properties.load(inputStream);
 
       for (Entry<Object, Object> entry : properties.entrySet())
@@ -191,7 +192,7 @@
           if (key.startsWith(prefix))
           {
             String value = (String)entry.getValue();
-            setDebugOption(key.substring(length), value);
+            setDebugOptionIfAbsent(key.substring(length), value.trim());
           }
         }
         catch (RuntimeException ignore)
diff --git a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/om/LegacyPlatform.java b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/om/LegacyPlatform.java
index a382d1d..426427a 100644
--- a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/om/LegacyPlatform.java
+++ b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/om/LegacyPlatform.java
@@ -13,15 +13,23 @@
 import org.eclipse.net4j.internal.util.bundle.AbstractPlatform;
 import org.eclipse.net4j.util.concurrent.ConcurrencyUtil;
 import org.eclipse.net4j.util.container.IPluginContainer;
+import org.eclipse.net4j.util.io.IOUtil;
 import org.eclipse.net4j.util.om.LegacyUtil;
 import org.eclipse.net4j.util.om.OMBundle;
 
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.NullProgressMonitor;
 
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Properties;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ExecutorService;
 
@@ -30,12 +38,61 @@
  */
 public class LegacyPlatform extends AbstractPlatform
 {
+  public static final String OPTIONS = ".options";
+
   private final Map<String, String> debugOptions = new ConcurrentHashMap<>(0);
 
   private final Map<InternalOMJob, IProgressMonitor> jobMonitors = Collections.synchronizedMap(new HashMap<>());
 
   public LegacyPlatform()
   {
+    String debugOptionsPath = System.getProperty("debug.options");
+    if (debugOptionsPath == null)
+    {
+      debugOptionsPath = System.getProperty("osgi.debug");
+    }
+
+    if (debugOptionsPath != null)
+    {
+      loadDebugOptions(debugOptionsPath);
+    }
+  }
+
+  private void loadDebugOptions(String debugOptionsPath)
+  {
+    if (debugOptionsPath.length() == 0)
+    {
+      debugOptionsPath = new File(System.getProperty("user.dir"), OPTIONS).toString();
+    }
+  
+    InputStream inputStream = null;
+    Properties properties = new Properties();
+  
+    try
+    {
+      inputStream = new BufferedInputStream(new FileInputStream(debugOptionsPath));
+      properties.load(inputStream);
+  
+      for (Entry<Object, Object> entry : properties.entrySet())
+      {
+        try
+        {
+          String key = (String)entry.getKey();
+          String value = (String)entry.getValue();
+          debugOptions.put(key, value.trim());
+        }
+        catch (RuntimeException ignore)
+        {
+        }
+      }
+    }
+    catch (IOException ignore)
+    {
+    }
+    finally
+    {
+      IOUtil.closeSilent(inputStream);
+    }
   }
 
   @Override
@@ -57,9 +114,18 @@
   }
 
   @Override
-  protected void setDebugOption(String bundleID, String option, String value)
+  protected void setDebugOption(String bundleID, String option, String value, boolean ifAbsent)
   {
-    debugOptions.put(bundleID + "/" + option, value); //$NON-NLS-1$
+    option = bundleID + "/" + option; //$NON-NLS-1$
+
+    if (ifAbsent)
+    {
+      debugOptions.putIfAbsent(option, value);
+    }
+    else
+    {
+      debugOptions.put(option, value);
+    }
   }
 
   @Override
diff --git a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/om/OSGiPlatform.java b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/om/OSGiPlatform.java
index 35e5478..7f18bfe 100644
--- a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/om/OSGiPlatform.java
+++ b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/om/OSGiPlatform.java
@@ -144,12 +144,19 @@
   }
 
   @Override
-  protected void setDebugOption(String bundleID, String option, String value)
+  protected void setDebugOption(String bundleID, String option, String value, boolean ifAbsent)
   {
     try
     {
       DebugOptions debugOptions = getDebugOptions();
-      debugOptions.setOption(bundleID + "/" + option, value); //$NON-NLS-1$
+      option = bundleID + "/" + option; //$NON-NLS-1$
+
+      if (ifAbsent && debugOptions.getOption(option) != null)
+      {
+        return;
+      }
+
+      debugOptions.setOption(option, value);
     }
     catch (RuntimeException ex)
     {