diff options
author | Esteban Dugueperoux | 2016-02-05 12:18:49 +0000 |
---|---|---|
committer | Eike Stepper | 2016-02-05 12:49:26 +0000 |
commit | 3161838c989d7ebfc009eded4ac95698bb2a70a4 (patch) | |
tree | f5a8b11dcac8216a7f1e4f8a60f17cded0f5ab39 | |
parent | f11f14a3b2711978ad96d835dd69b2384721bb37 (diff) | |
download | cdo-3161838c989d7ebfc009eded4ac95698bb2a70a4.tar.gz cdo-3161838c989d7ebfc009eded4ac95698bb2a70a4.tar.xz cdo-3161838c989d7ebfc009eded4ac95698bb2a70a4.zip |
[482686] Have IStreamWrapper configurable through cdo-server.xml
For example:
<acceptor type="tcp" listenAddr="0.0.0.0" port="2036">
<streamWrapper type="gzip" protocol="cdo"
description="bufferSize=256,compressionLevel=3"/>
</acceptor>
<streamWrapper type="gzip"/>
Change-Id: I7e04ad92b081a454ab90b4ace5dc328f3fd12bfe
Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=482686
Signed-off-by: Esteban Dugueperoux <esteban.dugueperoux@obeo.fr>
Signed-off-by: Eike Stepper <stepper@esc-net.de>
19 files changed, 301 insertions, 72 deletions
diff --git a/plugins/org.eclipse.net4j.http.server/META-INF/MANIFEST.MF b/plugins/org.eclipse.net4j.http.server/META-INF/MANIFEST.MF index 32dcfe26ff..d31f7da64d 100644 --- a/plugins/org.eclipse.net4j.http.server/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.net4j.http.server/META-INF/MANIFEST.MF @@ -1,7 +1,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.eclipse.net4j.http.server;singleton:=true -Bundle-Version: 4.0.400.qualifier +Bundle-Version: 4.0.500.qualifier Bundle-Name: %pluginName Bundle-Vendor: %providerName Bundle-Localization: plugin @@ -14,7 +14,7 @@ Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)";resoluti org.eclipse.equinox.http.registry;bundle-version="[1.0.0,2.0.0)" Import-Package: javax.servlet;version="[2.3.0,4.0.0)", javax.servlet.http;version="[2.3.0,4.0.0)" -Export-Package: org.eclipse.net4j.http.internal.server;version="4.0.400";x-friends:="org.eclipse.net4j.http.tests,org.eclipse.net4j.defs", - org.eclipse.net4j.http.internal.server.bundle;version="4.0.400";x-internal:=true, - org.eclipse.net4j.http.internal.server.messages;version="4.0.400";x-internal:=true, - org.eclipse.net4j.http.server;version="4.0.400" +Export-Package: org.eclipse.net4j.http.internal.server;version="4.0.500";x-friends:="org.eclipse.net4j.http.tests,org.eclipse.net4j.defs", + org.eclipse.net4j.http.internal.server.bundle;version="4.0.500";x-internal:=true, + org.eclipse.net4j.http.internal.server.messages;version="4.0.500";x-internal:=true, + org.eclipse.net4j.http.server;version="4.0.500" diff --git a/plugins/org.eclipse.net4j.http.server/src/org/eclipse/net4j/http/internal/server/HTTPServerConnector.java b/plugins/org.eclipse.net4j.http.server/src/org/eclipse/net4j/http/internal/server/HTTPServerConnector.java index fcc32f7e26..0a98acdfd8 100644 --- a/plugins/org.eclipse.net4j.http.server/src/org/eclipse/net4j/http/internal/server/HTTPServerConnector.java +++ b/plugins/org.eclipse.net4j.http.server/src/org/eclipse/net4j/http/internal/server/HTTPServerConnector.java @@ -11,6 +11,7 @@ package org.eclipse.net4j.http.internal.server; import org.eclipse.net4j.channel.ChannelException; +import org.eclipse.net4j.connector.IServerConnector; import org.eclipse.net4j.http.internal.common.HTTPConnector; import org.eclipse.net4j.protocol.IProtocol; import org.eclipse.net4j.util.WrappedException; @@ -20,7 +21,7 @@ import java.text.MessageFormat; /** * @author Eike Stepper */ -public class HTTPServerConnector extends HTTPConnector +public class HTTPServerConnector extends HTTPConnector implements IServerConnector { private HTTPAcceptor acceptor; diff --git a/plugins/org.eclipse.net4j.jvm/META-INF/MANIFEST.MF b/plugins/org.eclipse.net4j.jvm/META-INF/MANIFEST.MF index 320b6f9ae8..7a38afe8ef 100644 --- a/plugins/org.eclipse.net4j.jvm/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.net4j.jvm/META-INF/MANIFEST.MF @@ -1,7 +1,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.eclipse.net4j.jvm;singleton:=true -Bundle-Version: 4.1.300.qualifier +Bundle-Version: 4.1.400.qualifier Bundle-Name: %pluginName Bundle-Vendor: %providerName Bundle-Localization: plugin @@ -12,7 +12,7 @@ Bundle-ClassPath: . Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)";resolution:=optional, org.eclipse.net4j;bundle-version="[4.0.0,5.0.0)";visibility:=reexport Import-Package: org.osgi.framework;version="[1.3.0,2.0.0)";resolution:=optional -Export-Package: org.eclipse.net4j.internal.jvm;version="4.1.300";x-friends:="org.eclipse.net4j.defs,org.eclipse.net4j.tests,org.eclipse.net4j.ui", - org.eclipse.net4j.internal.jvm.bundle;version="4.1.300";x-internal:=true, - org.eclipse.net4j.internal.jvm.messages;version="4.1.300";x-internal:=true, - org.eclipse.net4j.jvm;version="4.1.300" +Export-Package: org.eclipse.net4j.internal.jvm;version="4.1.400";x-friends:="org.eclipse.net4j.defs,org.eclipse.net4j.tests,org.eclipse.net4j.ui", + org.eclipse.net4j.internal.jvm.bundle;version="4.1.400";x-internal:=true, + org.eclipse.net4j.internal.jvm.messages;version="4.1.400";x-internal:=true, + org.eclipse.net4j.jvm;version="4.1.400" diff --git a/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/JVMAcceptor.java b/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/JVMAcceptor.java index b5b2b20de9..2c08814ddb 100644 --- a/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/JVMAcceptor.java +++ b/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/JVMAcceptor.java @@ -40,7 +40,7 @@ public class JVMAcceptor extends Acceptor implements IJVMAcceptor public JVMServerConnector handleAccept(JVMClientConnector client) { - JVMServerConnector connector = new JVMServerConnector(client); + JVMServerConnector connector = new JVMServerConnector(this, client); connector.setName(client.getName()); connector.setConfig(getConfig()); connector.activate(); diff --git a/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/JVMServerConnector.java b/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/JVMServerConnector.java index 54251a9f76..6115948ff5 100644 --- a/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/JVMServerConnector.java +++ b/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/JVMServerConnector.java @@ -10,18 +10,27 @@ */ package org.eclipse.net4j.internal.jvm; +import org.eclipse.net4j.connector.IServerConnector; import org.eclipse.net4j.util.lifecycle.LifecycleUtil; /** * @author Eike Stepper */ -public class JVMServerConnector extends JVMConnector +public class JVMServerConnector extends JVMConnector implements IServerConnector { - public JVMServerConnector(JVMClientConnector clientPeer) + private final JVMAcceptor acceptor; + + public JVMServerConnector(JVMAcceptor acceptor, JVMClientConnector clientPeer) { + this.acceptor = acceptor; setPeer(clientPeer); } + public JVMAcceptor getAcceptor() + { + return acceptor; + } + @Override public Location getLocation() { diff --git a/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPServerConnector.java b/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPServerConnector.java index 862549d09f..ca8312f57c 100644 --- a/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPServerConnector.java +++ b/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPServerConnector.java @@ -10,6 +10,7 @@ */ package org.eclipse.net4j.internal.tcp; +import org.eclipse.net4j.connector.IServerConnector; import org.eclipse.net4j.internal.tcp.bundle.OM; import org.eclipse.net4j.tcp.ITCPSelector; @@ -19,7 +20,7 @@ import java.text.MessageFormat; /** * @author Eike Stepper */ -public class TCPServerConnector extends TCPConnector +public class TCPServerConnector extends TCPConnector implements IServerConnector { private TCPAcceptor acceptor; diff --git a/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/bugzilla/Bugzilla_241463_Test.java b/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/bugzilla/Bugzilla_241463_Test.java index 5eebf60224..2e3a91090c 100644 --- a/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/bugzilla/Bugzilla_241463_Test.java +++ b/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/bugzilla/Bugzilla_241463_Test.java @@ -90,7 +90,7 @@ public class Bugzilla_241463_Test extends AbstractTransportTest @Override public JVMServerConnector handleAccept(JVMClientConnector client) { - JVMServerConnector connector = new JVMServerConnector(client) + JVMServerConnector connector = new JVMServerConnector(this, client) { @Override public InternalChannel inverseOpenChannel(short channelID, String protocolID, int protocolVersion) diff --git a/plugins/org.eclipse.net4j.util/.settings/.api_filters b/plugins/org.eclipse.net4j.util/.settings/.api_filters index 717e5483be..aff0f5752c 100644 --- a/plugins/org.eclipse.net4j.util/.settings/.api_filters +++ b/plugins/org.eclipse.net4j.util/.settings/.api_filters @@ -77,6 +77,14 @@ </message_arguments> </filter> </resource> + <resource path="src/org/eclipse/net4j/util/io/GZIPStreamWrapper.java" type="org.eclipse.net4j.util.io.GZIPStreamWrapper"> + <filter id="338792546"> + <message_arguments> + <message_argument value="org.eclipse.net4j.util.io.GZIPStreamWrapper"/> + <message_argument value="main(String[])"/> + </message_arguments> + </filter> + </resource> <resource path="src/org/eclipse/net4j/util/lifecycle/ILifecycle.java" type="org.eclipse.net4j.util.lifecycle.ILifecycle"> <filter id="403984517"> <message_arguments> diff --git a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/io/GZIPStreamWrapper.java b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/io/GZIPStreamWrapper.java index 65cc8b40c5..282a01573d 100644 --- a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/io/GZIPStreamWrapper.java +++ b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/io/GZIPStreamWrapper.java @@ -10,23 +10,47 @@ */ package org.eclipse.net4j.util.io; -import org.eclipse.net4j.util.concurrent.ConcurrencyUtil; +import org.eclipse.net4j.util.factory.ProductCreationException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.io.PipedInputStream; -import java.io.PipedOutputStream; +import java.util.zip.Deflater; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; /** * @author Eike Stepper + * @since 3.6 */ public class GZIPStreamWrapper implements IStreamWrapper { + /** + * @since 3.6 + */ + public static final int DEFAULT_BUFFER_SIZE = 512; + + /** + * @since 3.6 + */ + public static final int DEFAULT_COMPRESSION_LEVEL = Deflater.BEST_SPEED; + + private final int bufferSize; + + private final int compressionLevel; + public GZIPStreamWrapper() { + this(DEFAULT_BUFFER_SIZE, DEFAULT_COMPRESSION_LEVEL); + } + + /** + * @since 3.6 + */ + public GZIPStreamWrapper(int bufferSize, int compressionLevel) + { + this.bufferSize = bufferSize; + this.compressionLevel = compressionLevel; } public GZIPInputStream wrapInputStream(InputStream in) throws IOException @@ -36,7 +60,7 @@ public class GZIPStreamWrapper implements IStreamWrapper return (GZIPInputStream)in; } - return new GZIPInputStream(in); + return new GZIPInputStream(in, bufferSize); } public GZIPOutputStream wrapOutputStream(OutputStream out) throws IOException @@ -46,7 +70,12 @@ public class GZIPStreamWrapper implements IStreamWrapper return (GZIPOutputStream)out; } - return new GZIPOutputStream(out); + return new GZIPOutputStream(out, bufferSize) + { + { + def.setLevel(compressionLevel); + } + }; } public void finishInputStream(InputStream in) throws IOException @@ -59,43 +88,59 @@ public class GZIPStreamWrapper implements IStreamWrapper } /** - * TODO Move or remove me + * @author Esteban Dugueperoux + * @since 3.6 */ - public static void main(String[] args) throws Exception + public static class Factory extends IStreamWrapper.Factory { - final PipedOutputStream pos = new PipedOutputStream(); - @SuppressWarnings("resource") - final PipedInputStream pis = new PipedInputStream(pos); + public static final String TYPE = "gzip"; //$NON-NLS-1$ - final GZIPOutputStream gos = new GZIPOutputStream(pos); - final byte[] out = "eike".getBytes(); //$NON-NLS-1$ + public Factory() + { + super(TYPE); + } - Thread thread = new Thread() + @Override + public IStreamWrapper create(String description) throws ProductCreationException { - @Override - public void run() - { - try - { - GZIPInputStream gis = new GZIPInputStream(pis); + int bufferSize = GZIPStreamWrapper.DEFAULT_BUFFER_SIZE; + int compressionLevel = GZIPStreamWrapper.DEFAULT_COMPRESSION_LEVEL; - byte[] in = new byte[out.length]; - gis.read(in); - gis.close(); - } - catch (IOException ex) + String[] properties = description.split(","); + for (String property : properties) + { + String[] tokens = property.split("="); + if (tokens.length == 2) { - throw new IORuntimeException(ex); + String propertyName = tokens[0]; + String propertyValue = tokens[1]; + + if ("bufferSize".equals(propertyName)) + { + try + { + bufferSize = Integer.valueOf(propertyValue); + } + catch (NumberFormatException ex) + { + throw new ProductCreationException(ex); + } + } + else if ("compressionLevel".equals(propertyName)) + { + try + { + compressionLevel = Integer.valueOf(propertyValue); + } + catch (NumberFormatException ex) + { + throw new ProductCreationException(ex); + } + } } } - }; - thread.start(); - ConcurrencyUtil.sleep(1000); - - gos.write(out); - gos.close(); - - ConcurrencyUtil.sleep(2000); + return new GZIPStreamWrapper(bufferSize, compressionLevel); + } } } diff --git a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/io/IStreamWrapper.java b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/io/IStreamWrapper.java index a43985fc47..d92b4eca9d 100644 --- a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/io/IStreamWrapper.java +++ b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/io/IStreamWrapper.java @@ -10,6 +10,8 @@ */ package org.eclipse.net4j.util.io; +import org.eclipse.net4j.util.factory.ProductCreationException; + import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -26,4 +28,20 @@ public interface IStreamWrapper public void finishInputStream(InputStream in) throws IOException; public void finishOutputStream(OutputStream out) throws IOException; + + /** + * @author Esteban Dugueperoux + * @since 3.6 + */ + public static abstract class Factory extends org.eclipse.net4j.util.factory.Factory + { + public static final String PRODUCT_GROUP = "org.eclipse.net4j.streamWrappers"; //$NON-NLS-1$ + + public Factory(String type) + { + super(PRODUCT_GROUP, type); + } + + public abstract IStreamWrapper create(String description) throws ProductCreationException; + } } diff --git a/plugins/org.eclipse.net4j/.settings/.api_filters b/plugins/org.eclipse.net4j/.settings/.api_filters new file mode 100644 index 0000000000..fa64efe5e5 --- /dev/null +++ b/plugins/org.eclipse.net4j/.settings/.api_filters @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<component id="org.eclipse.net4j" version="2"> + <resource path="src/org/eclipse/spi/net4j/InternalChannelMultiplexer.java" type="org.eclipse.spi.net4j.InternalChannelMultiplexer"> + <filter id="403767336"> + <message_arguments> + <message_argument value="org.eclipse.spi.net4j.InternalChannelMultiplexer"/> + <message_argument value="CONTEXT_CHANNEL"/> + </message_arguments> + </filter> + <filter id="403767336"> + <message_arguments> + <message_argument value="org.eclipse.spi.net4j.InternalChannelMultiplexer"/> + <message_argument value="CONTEXT_MULTIPLEXER"/> + </message_arguments> + </filter> + </resource> +</component> diff --git a/plugins/org.eclipse.net4j/plugin.xml b/plugins/org.eclipse.net4j/plugin.xml index 61bb4391b4..0d30d94fd1 100644 --- a/plugins/org.eclipse.net4j/plugin.xml +++ b/plugins/org.eclipse.net4j/plugin.xml @@ -13,26 +13,24 @@ <plugin> - <extension - point="org.eclipse.net4j.util.factories"> + <extension point="org.eclipse.net4j.util.factories"> <factory class="org.eclipse.internal.net4j.buffer.BufferProviderFactory" productGroup="org.eclipse.net4j.bufferProviders" type="default"/> <factory + class="org.eclipse.net4j.util.io.GZIPStreamWrapper$Factory" + productGroup="org.eclipse.net4j.streamWrappers" + type="gzip"/> + <factory class="org.eclipse.net4j.signal.heartbeat.HeartBeatProtocol$Server$Factory" productGroup="org.eclipse.net4j.serverProtocols" type="heartbeat"/> </extension> - <extension - point="org.eclipse.net4j.util.elementProcessors"> - <elementProcessor - class="org.eclipse.net4j.TransportInjector"> - </elementProcessor> - <elementProcessor - class="org.eclipse.net4j.signal.heartbeat.HeartBeatProtocol$Server$TimerInjector"> - </elementProcessor> + <extension point="org.eclipse.net4j.util.elementProcessors"> + <elementProcessor class="org.eclipse.net4j.TransportInjector"/> + <elementProcessor class="org.eclipse.net4j.signal.heartbeat.HeartBeatProtocol$Server$TimerInjector"/> </extension> </plugin> diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/ContainerProtocolProvider.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/ContainerProtocolProvider.java index a46853a619..3728709bd2 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/ContainerProtocolProvider.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/ContainerProtocolProvider.java @@ -50,7 +50,8 @@ public abstract class ContainerProtocolProvider implements IProtocolProvider public IProtocol<?> getProtocol(String type) { - return (IProtocol<?>)container.getElement(productGroup, type, "protocol-" + counter.increment(), false); //$NON-NLS-1$ + String description = "protocol-" + counter.increment(); + return (IProtocol<?>)container.getElement(productGroup, type, description, false); } /** diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/Net4jUtil.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/Net4jUtil.java index 923c9b03d3..2523632b1c 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/Net4jUtil.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/Net4jUtil.java @@ -22,6 +22,7 @@ import org.eclipse.net4j.util.StringUtil; import org.eclipse.net4j.util.concurrent.ExecutorServiceFactory; import org.eclipse.net4j.util.container.ContainerUtil; import org.eclipse.net4j.util.container.IManagedContainer; +import org.eclipse.net4j.util.io.GZIPStreamWrapper; import org.eclipse.net4j.util.lifecycle.ILifecycle; import org.eclipse.internal.net4j.TransportConfig; @@ -53,8 +54,9 @@ public final class Net4jUtil { ContainerUtil.prepareContainer(container); container.registerFactory(new BufferProviderFactory()); - container.addPostProcessor(new TransportInjector()); + container.registerFactory(new GZIPStreamWrapper.Factory()); container.registerFactory(new HeartBeatProtocol.Server.Factory()); + container.addPostProcessor(new TransportInjector()); container.addPostProcessor(new HeartBeatProtocol.Server.TimerInjector()); } diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/TransportConfigurator.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/TransportConfigurator.java index c99a4adcf2..b52704c611 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/TransportConfigurator.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/TransportConfigurator.java @@ -11,7 +11,13 @@ package org.eclipse.net4j; import org.eclipse.net4j.acceptor.IAcceptor; +import org.eclipse.net4j.channel.IChannelMultiplexer; +import org.eclipse.net4j.connector.IServerConnector; +import org.eclipse.net4j.signal.SignalProtocol; +import org.eclipse.net4j.signal.wrapping.StreamWrapperInjector; +import org.eclipse.net4j.util.container.IElementProcessor; import org.eclipse.net4j.util.container.IManagedContainer; +import org.eclipse.net4j.util.io.IStreamWrapper; import org.eclipse.net4j.util.om.trace.ContextTracer; import org.eclipse.net4j.util.security.INegotiator; import org.eclipse.net4j.util.security.NegotiatorFactory; @@ -21,6 +27,7 @@ import org.eclipse.internal.net4j.bundle.OM; import org.eclipse.core.runtime.CoreException; import org.eclipse.spi.net4j.Acceptor; import org.eclipse.spi.net4j.AcceptorFactory; +import org.eclipse.spi.net4j.InternalChannelMultiplexer; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -71,6 +78,7 @@ public class TransportConfigurator List<IAcceptor> acceptors = new ArrayList<IAcceptor>(); Document document = getDocument(configFile); + NodeList acceptorConfigs = document.getElementsByTagName("acceptor"); //$NON-NLS-1$ for (int i = 0; i < acceptorConfigs.getLength(); i++) { @@ -79,6 +87,16 @@ public class TransportConfigurator acceptors.add(acceptor); } + NodeList streamWrapperConfigs = document.getElementsByTagName("streamWrapper"); //$NON-NLS-1$ + for (int i = 0; i < streamWrapperConfigs.getLength(); i++) + { + Element streamWrapperConfig = (Element)streamWrapperConfigs.item(i); + if (getLevel(streamWrapperConfig) == 2) + { + configureStreamWrapper(streamWrapperConfig, null); + } + } + return acceptors.toArray(new IAcceptor[acceptors.size()]); } @@ -104,6 +122,16 @@ public class TransportConfigurator acceptor.getConfig().setNegotiator(negotiator); } + NodeList streamWrapperConfigs = acceptorConfig.getElementsByTagName("streamWrapper"); //$NON-NLS-1$ + for (int i = 0; i < streamWrapperConfigs.getLength(); i++) + { + Element streamWrapperConfig = (Element)streamWrapperConfigs.item(i); + if (getLevel(streamWrapperConfig) == 3) + { + configureStreamWrapper(streamWrapperConfig, acceptor); + } + } + OM.LOG.info("Net4j acceptor starting: " + type + "://" + description); acceptor.activate(); return acceptor; @@ -116,6 +144,24 @@ public class TransportConfigurator return (INegotiator)container.getElement(NegotiatorFactory.PRODUCT_GROUP, type, description); } + /** + * @since 4.5 + */ + protected void configureStreamWrapper(Element streamWrapperConfig, Acceptor acceptor) + { + String type = streamWrapperConfig.getAttribute("type");//$NON-NLS-1$ + String description = streamWrapperConfig.getAttribute("description"); //$NON-NLS-1$ + String protocolName = streamWrapperConfig.getAttribute("protocol");//$NON-NLS-1$ + + IStreamWrapper streamWrapper = (IStreamWrapper)container.getElement(IStreamWrapper.Factory.PRODUCT_GROUP, type, + description); + if (streamWrapper != null) + { + IElementProcessor injector = new AcceptorStreamWrapperInjector(protocolName, acceptor, streamWrapper); + container.addPostProcessor(injector); + } + } + protected Document getDocument(File configFile) throws ParserConfigurationException, SAXException, IOException { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); @@ -165,4 +211,49 @@ public class TransportConfigurator } } } + + private static int getLevel(Node node) + { + Node parentNode = node.getParentNode(); + return parentNode != null ? getLevel(parentNode) + 1 : 0; + } + + /** + * @author Eike Stepper + */ + private static final class AcceptorStreamWrapperInjector extends StreamWrapperInjector + { + private final IAcceptor acceptor; + + public AcceptorStreamWrapperInjector(String protocolID, IAcceptor acceptor, IStreamWrapper streamWrapper) + { + super(protocolID, streamWrapper); + this.acceptor = acceptor; + } + + @Override + protected boolean shouldInject(IManagedContainer container, String productGroup, String factoryType, + String description, SignalProtocol<?> signalProtocol) + { + if (super.shouldInject(container, productGroup, factoryType, description, signalProtocol)) + { + if (acceptor == null) + { + return true; + } + + IChannelMultiplexer multiplexer = InternalChannelMultiplexer.CONTEXT_MULTIPLEXER.get(); + if (multiplexer instanceof IServerConnector) + { + IServerConnector serverConnector = (IServerConnector)multiplexer; + if (serverConnector.getAcceptor() == acceptor) + { + return true; + } + } + } + + return false; + } + } } diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/connector/IServerConnector.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/connector/IServerConnector.java new file mode 100644 index 0000000000..66792c8e8d --- /dev/null +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/connector/IServerConnector.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2016 Eike Stepper (Berlin, 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.connector; + +import org.eclipse.net4j.acceptor.IAcceptor; + +/** + * @author Eike Stepper + * @since 4.5 + */ +public interface IServerConnector extends IConnector +{ + public IAcceptor getAcceptor(); +} diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/wrapping/StreamWrapperInjector.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/wrapping/StreamWrapperInjector.java index 6cc23de30a..fe5a0b8d37 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/wrapping/StreamWrapperInjector.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/wrapping/StreamWrapperInjector.java @@ -12,6 +12,7 @@ package org.eclipse.net4j.signal.wrapping; import org.eclipse.net4j.signal.SignalProtocol; import org.eclipse.net4j.util.ObjectUtil; +import org.eclipse.net4j.util.StringUtil; import org.eclipse.net4j.util.container.IElementProcessor; import org.eclipse.net4j.util.container.IManagedContainer; import org.eclipse.net4j.util.io.IStreamWrapper; @@ -24,9 +25,9 @@ import org.eclipse.net4j.util.io.IStreamWrapper; */ public class StreamWrapperInjector implements IElementProcessor { - private String protocolID; + private final IStreamWrapper streamWrapper; - private IStreamWrapper streamWrapper; + private final String protocolID; public StreamWrapperInjector(String protocolID, IStreamWrapper streamWrapper) { @@ -67,7 +68,7 @@ public class StreamWrapperInjector implements IElementProcessor return false; } - return ObjectUtil.equals(signalProtocol.getType(), protocolID); + return StringUtil.isEmpty(protocolID) || ObjectUtil.equals(signalProtocol.getType(), protocolID); } protected Object inject(IManagedContainer container, String productGroup, String factoryType, String description, 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 0558cdbfd5..2e879a345a 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 @@ -47,7 +47,7 @@ import java.util.concurrent.ConcurrentMap; * @author Eike Stepper * @since 2.0 */ -public abstract class ChannelMultiplexer extends Container<IChannel>implements InternalChannelMultiplexer +public abstract class ChannelMultiplexer extends Container<IChannel> implements InternalChannelMultiplexer { private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG_CONNECTOR, ChannelMultiplexer.class); @@ -193,14 +193,24 @@ public abstract class ChannelMultiplexer extends Container<IChannel>implements I */ public InternalChannel inverseOpenChannel(short channelID, String protocolID, int protocolVersion) { - IProtocol<?> protocol = createProtocol(protocolID, null); - ProtocolVersionException.checkVersion(protocol, protocolVersion); + CONTEXT_MULTIPLEXER.set(this); - InternalChannel channel = createChannel(); - initChannel(channel, protocol); - channel.setID(channelID); - addChannel(channel); - return channel; + try + { + IProtocol<?> protocol = createProtocol(protocolID, null); + ProtocolVersionException.checkVersion(protocol, protocolVersion); + + InternalChannel channel = createChannel(); + initChannel(channel, protocol); + channel.setID(channelID); + + addChannel(channel); + return channel; + } + finally + { + CONTEXT_MULTIPLEXER.remove(); + } } public void closeChannel(InternalChannel channel) throws ChannelException diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/spi/net4j/InternalChannelMultiplexer.java b/plugins/org.eclipse.net4j/src/org/eclipse/spi/net4j/InternalChannelMultiplexer.java index d93fd2df5b..4cdc6b1aa1 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/spi/net4j/InternalChannelMultiplexer.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/spi/net4j/InternalChannelMultiplexer.java @@ -24,6 +24,11 @@ import org.eclipse.net4j.channel.IChannelMultiplexer; public interface InternalChannelMultiplexer extends IChannelMultiplexer, IBufferProvider, ITransportConfigAware { /** + * @since 4.5 + */ + public static final ThreadLocal<InternalChannelMultiplexer> CONTEXT_MULTIPLEXER = new ThreadLocal<InternalChannelMultiplexer>(); + + /** * @since 4.0 */ public static final short RESERVED_CHANNEL = 0; |