[581293] Tell protocols when they are fully connected

https://bugs.eclipse.org/bugs/show_bug.cgi?id=581293
diff --git a/features/org.eclipse.emf.cdo.all-feature/feature.xml b/features/org.eclipse.emf.cdo.all-feature/feature.xml
index 2b2e055..2b831e4 100644
--- a/features/org.eclipse.emf.cdo.all-feature/feature.xml
+++ b/features/org.eclipse.emf.cdo.all-feature/feature.xml
@@ -13,7 +13,7 @@
 <feature
       id="org.eclipse.emf.cdo.all"
       label="%featureName"
-      version="4.21.0.qualifier"
+      version="4.22.0.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.emf.cdo.license"
       license-feature-version="0.0.0">
diff --git a/features/org.eclipse.emf.cdo.all-feature/pom.xml b/features/org.eclipse.emf.cdo.all-feature/pom.xml
index b1c3ee6..e55604a 100644
--- a/features/org.eclipse.emf.cdo.all-feature/pom.xml
+++ b/features/org.eclipse.emf.cdo.all-feature/pom.xml
@@ -25,7 +25,7 @@
 
   <groupId>org.eclipse.emf.cdo.features</groupId>
   <artifactId>org.eclipse.emf.cdo.all</artifactId>
-  <version>4.21.0-SNAPSHOT</version>
+  <version>4.22.0-SNAPSHOT</version>
   <packaging>eclipse-feature</packaging>
 
 </project>
diff --git a/features/org.eclipse.emf.cdo.server-feature/feature.xml b/features/org.eclipse.emf.cdo.server-feature/feature.xml
index 93352d5..4cc4522 100644
--- a/features/org.eclipse.emf.cdo.server-feature/feature.xml
+++ b/features/org.eclipse.emf.cdo.server-feature/feature.xml
@@ -12,7 +12,7 @@
 <feature
       id="org.eclipse.emf.cdo.server"
       label="%featureName"
-      version="4.21.0.qualifier"
+      version="4.22.0.qualifier"
       provider-name="%providerName"
       image="eclipse_update_120.jpg"
       license-feature="org.eclipse.emf.cdo.license"
diff --git a/features/org.eclipse.emf.cdo.server-feature/pom.xml b/features/org.eclipse.emf.cdo.server-feature/pom.xml
index d9c1cde..a38cc84 100644
--- a/features/org.eclipse.emf.cdo.server-feature/pom.xml
+++ b/features/org.eclipse.emf.cdo.server-feature/pom.xml
@@ -25,7 +25,7 @@
 
   <groupId>org.eclipse.emf.cdo.features</groupId>
   <artifactId>org.eclipse.emf.cdo.server</artifactId>
-  <version>4.21.0-SNAPSHOT</version>
+  <version>4.22.0-SNAPSHOT</version>
   <packaging>eclipse-feature</packaging>
 
 </project>
diff --git a/features/org.eclipse.emf.cdo.server.embedded-feature/feature.xml b/features/org.eclipse.emf.cdo.server.embedded-feature/feature.xml
index 88485fe..67f7865 100644
--- a/features/org.eclipse.emf.cdo.server.embedded-feature/feature.xml
+++ b/features/org.eclipse.emf.cdo.server.embedded-feature/feature.xml
@@ -12,7 +12,7 @@
 <feature
       id="org.eclipse.emf.cdo.server.embedded"
       label="%featureName"
-      version="4.21.0.qualifier"
+      version="4.22.0.qualifier"
       provider-name="%providerName"
       image="eclipse_update_120.jpg"
       license-feature="org.eclipse.emf.cdo.license"
diff --git a/features/org.eclipse.emf.cdo.server.embedded-feature/pom.xml b/features/org.eclipse.emf.cdo.server.embedded-feature/pom.xml
index da1a5a3..1037b54 100644
--- a/features/org.eclipse.emf.cdo.server.embedded-feature/pom.xml
+++ b/features/org.eclipse.emf.cdo.server.embedded-feature/pom.xml
@@ -25,7 +25,7 @@
 
   <groupId>org.eclipse.emf.cdo.features</groupId>
   <artifactId>org.eclipse.emf.cdo.server.embedded</artifactId>
-  <version>4.21.0-SNAPSHOT</version>
+  <version>4.22.0-SNAPSHOT</version>
   <packaging>eclipse-feature</packaging>
 
 </project>
diff --git a/features/org.eclipse.net4j-feature/feature.xml b/features/org.eclipse.net4j-feature/feature.xml
index be28790..1ce8435 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.21.0.qualifier"
+      version="4.22.0.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 ecb6930..eb37309 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.21.0-SNAPSHOT</version>
+  <version>4.22.0-SNAPSHOT</version>
   <packaging>eclipse-feature</packaging>
 
 </project>
diff --git a/features/org.eclipse.net4j.sdk-feature/feature.xml b/features/org.eclipse.net4j.sdk-feature/feature.xml
index 5f981b0..4939a58 100644
--- a/features/org.eclipse.net4j.sdk-feature/feature.xml
+++ b/features/org.eclipse.net4j.sdk-feature/feature.xml
@@ -12,7 +12,7 @@
 <feature
       id="org.eclipse.net4j.sdk"
       label="%featureName"
-      version="4.21.0.qualifier"
+      version="4.22.0.qualifier"
       provider-name="%providerName"
       image="eclipse_update_120.jpg"
       license-feature="org.eclipse.emf.cdo.license"
diff --git a/features/org.eclipse.net4j.sdk-feature/pom.xml b/features/org.eclipse.net4j.sdk-feature/pom.xml
index 2664dbe..c59368b 100644
--- a/features/org.eclipse.net4j.sdk-feature/pom.xml
+++ b/features/org.eclipse.net4j.sdk-feature/pom.xml
@@ -25,7 +25,7 @@
 
   <groupId>org.eclipse.emf.cdo.features</groupId>
   <artifactId>org.eclipse.net4j.sdk</artifactId>
-  <version>4.21.0-SNAPSHOT</version>
+  <version>4.22.0-SNAPSHOT</version>
   <packaging>eclipse-feature</packaging>
 
 </project>
diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.server.net4j/META-INF/MANIFEST.MF
index e1e0108..8b53713 100644
--- a/plugins/org.eclipse.emf.cdo.server.net4j/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.emf.cdo.server.net4j/META-INF/MANIFEST.MF
@@ -1,7 +1,7 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-SymbolicName: org.eclipse.emf.cdo.server.net4j;singleton:=true
-Bundle-Version: 4.5.4.qualifier
+Bundle-Version: 4.6.0.qualifier
 Bundle-Name: %pluginName
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
@@ -12,7 +12,7 @@
 Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)";resolution:=optional,
  org.eclipse.emf.cdo.server;bundle-version="[4.0.0,5.0.0)";visibility:=reexport,
  org.eclipse.net4j;bundle-version="[4.0.0,5.0.0)";visibility:=reexport
-Export-Package: org.eclipse.emf.cdo.server.internal.net4j.bundle;version="4.5.4";x-internal:=true,
- org.eclipse.emf.cdo.server.internal.net4j.protocol;version="4.5.4";x-friends:="org.eclipse.emf.cdo.tests",
- org.eclipse.emf.cdo.server.net4j;version="4.5.4"
+Export-Package: org.eclipse.emf.cdo.server.internal.net4j.bundle;version="4.6.0";x-internal:=true,
+ org.eclipse.emf.cdo.server.internal.net4j.protocol;version="4.6.0";x-friends:="org.eclipse.emf.cdo.tests",
+ org.eclipse.emf.cdo.server.net4j;version="4.6.0"
 Automatic-Module-Name: org.eclipse.emf.cdo.server.net4j
diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/pom.xml b/plugins/org.eclipse.emf.cdo.server.net4j/pom.xml
index f7628b7..ba5d1b1 100644
--- a/plugins/org.eclipse.emf.cdo.server.net4j/pom.xml
+++ b/plugins/org.eclipse.emf.cdo.server.net4j/pom.xml
@@ -25,7 +25,7 @@
 
   <groupId>org.eclipse.emf.cdo</groupId>
   <artifactId>org.eclipse.emf.cdo.server.net4j</artifactId>
-  <version>4.5.4-SNAPSHOT</version>
+  <version>4.6.0-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 
 </project>
diff --git a/plugins/org.eclipse.net4j/META-INF/MANIFEST.MF b/plugins/org.eclipse.net4j/META-INF/MANIFEST.MF
index 241682c..ddcd84e 100644
--- a/plugins/org.eclipse.net4j/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.net4j/META-INF/MANIFEST.MF
@@ -1,7 +1,7 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-SymbolicName: org.eclipse.net4j;singleton:=true
-Bundle-Version: 4.16.0.qualifier
+Bundle-Version: 4.17.0.qualifier
 Bundle-Name: %pluginName
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
@@ -11,7 +11,7 @@
 Bundle-ClassPath: .
 Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)";resolution:=optional,
  org.eclipse.net4j.util;bundle-version="[3.0.0,4.0.0)";visibility:=reexport
-Export-Package: org.eclipse.internal.net4j;version="4.16.0";
+Export-Package: org.eclipse.internal.net4j;version="4.17.0";
   x-friends:="org.eclipse.net4j.http.server,
    org.eclipse.net4j.jvm,
    org.eclipse.net4j.tcp,
@@ -21,7 +21,7 @@
    org.eclipse.net4j.http.tests,
    org.eclipse.net4j.tests,
    org.eclipse.net4j.trace",
- org.eclipse.internal.net4j.buffer;version="4.16.0";
+ org.eclipse.internal.net4j.buffer;version="4.17.0";
   x-friends:="org.eclipse.net4j.http.server,
    org.eclipse.net4j.jvm,
    org.eclipse.net4j.tcp,
@@ -31,18 +31,18 @@
    org.eclipse.net4j.http.tests,
    org.eclipse.net4j.tests,
    org.eclipse.net4j.trace",
- org.eclipse.internal.net4j.bundle;version="4.16.0";x-internal:=true,
- org.eclipse.net4j;version="4.16.0",
- org.eclipse.net4j.acceptor;version="4.16.0",
- org.eclipse.net4j.buffer;version="4.16.0",
- org.eclipse.net4j.channel;version="4.16.0",
- org.eclipse.net4j.connector;version="4.16.0",
- org.eclipse.net4j.protocol;version="4.16.0",
- org.eclipse.net4j.signal;version="4.16.0",
- org.eclipse.net4j.signal.confirmation;version="4.16.0",
- org.eclipse.net4j.signal.heartbeat;version="4.16.0",
- org.eclipse.net4j.signal.security;version="4.16.0",
- org.eclipse.net4j.signal.wrapping;version="4.16.0",
- org.eclipse.spi.net4j;version="4.16.0"
+ org.eclipse.internal.net4j.bundle;version="4.17.0";x-internal:=true,
+ org.eclipse.net4j;version="4.17.0",
+ org.eclipse.net4j.acceptor;version="4.17.0",
+ org.eclipse.net4j.buffer;version="4.17.0",
+ org.eclipse.net4j.channel;version="4.17.0",
+ org.eclipse.net4j.connector;version="4.17.0",
+ org.eclipse.net4j.protocol;version="4.17.0",
+ org.eclipse.net4j.signal;version="4.17.0",
+ org.eclipse.net4j.signal.confirmation;version="4.17.0",
+ org.eclipse.net4j.signal.heartbeat;version="4.17.0",
+ org.eclipse.net4j.signal.security;version="4.17.0",
+ org.eclipse.net4j.signal.wrapping;version="4.17.0",
+ org.eclipse.spi.net4j;version="4.17.0"
 Eclipse-BuddyPolicy: registered
 Automatic-Module-Name: org.eclipse.net4j
diff --git a/plugins/org.eclipse.net4j/pom.xml b/plugins/org.eclipse.net4j/pom.xml
index c140105..40fb482 100644
--- a/plugins/org.eclipse.net4j/pom.xml
+++ b/plugins/org.eclipse.net4j/pom.xml
@@ -25,7 +25,7 @@
 
   <groupId>org.eclipse.emf.cdo</groupId>
   <artifactId>org.eclipse.net4j</artifactId>
-  <version>4.16.0-SNAPSHOT</version>
+  <version>4.17.0-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 
 </project>
diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/protocol/IProtocol3.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/protocol/IProtocol3.java
new file mode 100644
index 0000000..4c1db60
--- /dev/null
+++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/protocol/IProtocol3.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2023 Eike Stepper (Loehne, Germany) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Eike Stepper - initial API and implementation
+ */
+package org.eclipse.net4j.protocol;
+
+/**
+ * A {@link IProtocol protocol} that is told when it is {@link #doWhenFullyConnected() fully connected}.
+ *
+ * @author Eike Stepper
+ * @since 4.17
+ */
+public interface IProtocol3<INFRA_STRUCTURE> extends IProtocol2<INFRA_STRUCTURE>
+{
+  public default void doWhenFullyConnected()
+  {
+  }
+}
diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/spi/net4j/Channel.java b/plugins/org.eclipse.net4j/src/org/eclipse/spi/net4j/Channel.java
index 1af8838..97e0b2e 100644
--- a/plugins/org.eclipse.net4j/src/org/eclipse/spi/net4j/Channel.java
+++ b/plugins/org.eclipse.net4j/src/org/eclipse/spi/net4j/Channel.java
@@ -233,6 +233,8 @@
   @Override
   public void handleBuffer(IBuffer buffer)
   {
+    checkID();
+
     BufferState state = buffer.getState();
     if (state != BufferState.PUTTING)
     {
@@ -382,7 +384,7 @@
   protected void doBeforeActivate() throws Exception
   {
     super.doBeforeActivate();
-    checkState(id != IBuffer.NO_CHANNEL, "channelID == NO_CHANNEL"); //$NON-NLS-1$
+    checkID();
     checkState(channelMultiplexer, "channelMultiplexer"); //$NON-NLS-1$
   }
 
@@ -428,6 +430,11 @@
     return !isActive();
   }
 
+  private void checkID()
+  {
+    checkState(id != IBuffer.NO_CHANNEL, "channelID == NO_CHANNEL"); //$NON-NLS-1$
+  }
+
   private void fireCountersChangedEvent()
   {
     IListener[] listeners = getListeners();
diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/spi/net4j/ChannelMultiplexer.java b/plugins/org.eclipse.net4j/src/org/eclipse/spi/net4j/ChannelMultiplexer.java
index 12652d0..b51c00a 100644
--- a/plugins/org.eclipse.net4j/src/org/eclipse/spi/net4j/ChannelMultiplexer.java
+++ b/plugins/org.eclipse.net4j/src/org/eclipse/spi/net4j/ChannelMultiplexer.java
@@ -18,6 +18,7 @@
 import org.eclipse.net4j.channel.IChannelMultiplexer;
 import org.eclipse.net4j.protocol.IProtocol;
 import org.eclipse.net4j.protocol.IProtocol2;
+import org.eclipse.net4j.protocol.IProtocol3;
 import org.eclipse.net4j.protocol.IProtocolProvider;
 import org.eclipse.net4j.protocol.ProtocolVersionException;
 import org.eclipse.net4j.util.ReflectUtil.ExcludeFromDump;
@@ -205,6 +206,8 @@
         String message = "Channel registration timeout after " + getOpenChannelTimeout() + " milliseconds";
         throw new TimeoutRuntimeException(message, ex);
       }
+
+      protocolConnected(protocol);
     }
     catch (ChannelException ex)
     {
@@ -246,6 +249,7 @@
       channel.setID(channelID);
 
       addChannel(channel);
+      protocolConnected(protocol);
       return channel;
     }
     finally
@@ -467,4 +471,12 @@
       throw ex;
     }
   }
+
+  private void protocolConnected(IProtocol<?> protocol)
+  {
+    if (protocol instanceof IProtocol3)
+    {
+      ((IProtocol3<?>)protocol).doWhenFullyConnected();
+    }
+  }
 }
diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/spi/net4j/Protocol.java b/plugins/org.eclipse.net4j/src/org/eclipse/spi/net4j/Protocol.java
index 6f759dc..4a7ec3e 100644
--- a/plugins/org.eclipse.net4j/src/org/eclipse/spi/net4j/Protocol.java
+++ b/plugins/org.eclipse.net4j/src/org/eclipse/spi/net4j/Protocol.java
@@ -12,7 +12,7 @@
 
 import org.eclipse.net4j.buffer.IBufferProvider;
 import org.eclipse.net4j.channel.IChannel;
-import org.eclipse.net4j.protocol.IProtocol2;
+import org.eclipse.net4j.protocol.IProtocol3;
 import org.eclipse.net4j.util.ReflectUtil.ExcludeFromDump;
 import org.eclipse.net4j.util.concurrent.ConcurrencyUtil;
 import org.eclipse.net4j.util.concurrent.IExecutorServiceProvider;
@@ -32,7 +32,7 @@
  * @author Eike Stepper
  * @since 2.0
  */
-public abstract class Protocol<INFRA_STRUCTURE> extends Lifecycle implements IProtocol2<INFRA_STRUCTURE>, IExecutorServiceProvider
+public abstract class Protocol<INFRA_STRUCTURE> extends Lifecycle implements IProtocol3<INFRA_STRUCTURE>, IExecutorServiceProvider
 {
   private String type;
 
diff --git a/releng/org.eclipse.emf.cdo.releng.parent/tp/org.eclipse.emf.cdo.releng.tp.target b/releng/org.eclipse.emf.cdo.releng.parent/tp/org.eclipse.emf.cdo.releng.tp.target
index 054a3ac..b09bb71 100644
--- a/releng/org.eclipse.emf.cdo.releng.parent/tp/org.eclipse.emf.cdo.releng.tp.target
+++ b/releng/org.eclipse.emf.cdo.releng.parent/tp/org.eclipse.emf.cdo.releng.tp.target
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <?pde version="3.8"?>
-<target name="Generated from CDO" sequenceNumber="84">
+<target name="Generated from CDO" sequenceNumber="85">
   <locations>
     <location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit">
       <unit id="com.google.guava" version="0.0.0"/>
@@ -60,6 +60,7 @@
       <repository location="https://download.oracle.com/otn_software/oepe/12.2.1.3/mars/repository/tools"/>
       <repository location="https://www.springsite.com/eclipse/2.1.0/update"/>
       <repository location="https://download.eclipse.org/tools/ajdt/48/dev/update"/>
+      <repository location="https://download.eclipse.org/eclipse/updates/4.27-I-builds"/>
     </location>
   </locations>
 </target>