diff options
93 files changed, 1731 insertions, 936 deletions
diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/bundle/CDOUI.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/bundle/CDOUI.java index 776bcf6317..b3769a441c 100644 --- a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/bundle/CDOUI.java +++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/bundle/CDOUI.java @@ -10,13 +10,6 @@ **************************************************************************/ package org.eclipse.emf.cdo.internal.ui.bundle; -import org.eclipse.net4j.util.om.OMBundle; -import org.eclipse.net4j.util.om.OMLogger; -import org.eclipse.net4j.util.om.OMPlatform; -import org.eclipse.net4j.util.om.OMTracer; - -import org.eclipse.internal.net4j.util.om.OSGiActivator; - /** * @author Eike Stepper */ diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOEditor.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOEditor.java index 8f514aac3f..0fb088e6f2 100644 --- a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOEditor.java +++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOEditor.java @@ -6,10 +6,6 @@ */ package org.eclipse.emf.cdo.internal.ui.editor; -import org.eclipse.emf.cdo.CDOAdapter; -import org.eclipse.emf.cdo.CDOSession; -import org.eclipse.emf.cdo.util.CDOUtil; - import org.eclipse.emf.common.command.BasicCommandStack; import org.eclipse.emf.common.notify.AdapterFactory; import org.eclipse.emf.common.notify.Notification; diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOEditorInput.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOEditorInput.java index 607d0fc562..796ca29c29 100644 --- a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOEditorInput.java +++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOEditorInput.java @@ -10,7 +10,6 @@ **************************************************************************/ package org.eclipse.emf.cdo.internal.ui.editor; -import org.eclipse.emf.cdo.CDOSession; import org.eclipse.emf.cdo.internal.ui.bundle.SharedIcons; import org.eclipse.jface.resource.ImageDescriptor; diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/views/CDOSessionsItemProvider.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/views/CDOSessionsItemProvider.java index 02f015af01..1123ef664f 100644 --- a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/views/CDOSessionsItemProvider.java +++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/views/CDOSessionsItemProvider.java @@ -10,17 +10,8 @@ **************************************************************************/ package org.eclipse.emf.cdo.internal.ui.views; -import org.eclipse.emf.cdo.CDOAdapter; -import org.eclipse.emf.cdo.CDOSession; -import org.eclipse.emf.cdo.container.CDOContainerAdapter; -import org.eclipse.emf.cdo.internal.container.CDOContainerAdapterImpl; import org.eclipse.emf.cdo.internal.ui.bundle.SharedIcons; -import org.eclipse.net4j.util.event.IEvent; -import org.eclipse.net4j.util.event.IListener; -import org.eclipse.net4j.util.registry.IRegistry; -import org.eclipse.net4j.util.registry.IRegistryEvent; - import org.eclipse.swt.graphics.Image; import java.text.MessageFormat; diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/views/CDOSessionsView.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/views/CDOSessionsView.java index fa7baf789a..e8fce8f49b 100644 --- a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/views/CDOSessionsView.java +++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/views/CDOSessionsView.java @@ -1,17 +1,11 @@ package org.eclipse.emf.cdo.internal.ui.views; -import org.eclipse.emf.cdo.CDOConstants; -import org.eclipse.emf.cdo.CDOSession; -import org.eclipse.emf.cdo.container.CDOContainerAdapter; import org.eclipse.emf.cdo.internal.ui.bundle.CDOUI; import org.eclipse.emf.cdo.internal.ui.bundle.SharedIcons; -import org.eclipse.net4j.container.Container; -import org.eclipse.net4j.container.ContainerManager; -import org.eclipse.net4j.transport.ConnectorException; - import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; +import org.eclipse.core.internal.resources.Container; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IToolBarManager; diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/wizards/NewEditorWizard.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/wizards/NewEditorWizard.java index fd7a94d96e..cfe767c243 100644 --- a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/wizards/NewEditorWizard.java +++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/wizards/NewEditorWizard.java @@ -1,12 +1,6 @@ package org.eclipse.emf.cdo.internal.ui.wizards; -import org.eclipse.emf.cdo.CDOSession; -import org.eclipse.emf.cdo.container.CDOContainerAdapter; - -import org.eclipse.net4j.container.Container; -import org.eclipse.net4j.container.ContainerManager; -import org.eclipse.net4j.transport.ConnectorException; - +import org.eclipse.core.internal.resources.Container; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.operation.IRunnableWithProgress; diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/wizards/NewEditorWizardPage.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/wizards/NewEditorWizardPage.java index 66a05a5f8d..ebf3ef7f93 100644 --- a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/wizards/NewEditorWizardPage.java +++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/wizards/NewEditorWizardPage.java @@ -1,7 +1,5 @@ package org.eclipse.emf.cdo.internal.ui.wizards; -import org.eclipse.emf.cdo.CDOObject; -import org.eclipse.emf.cdo.CDOSession; import org.eclipse.emf.cdo.internal.ui.bundle.SharedIcons; import org.eclipse.emf.common.util.EList; diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/wizards/NewSessionWizard.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/wizards/NewSessionWizard.java index 4dad73c93f..08886b0ef7 100644 --- a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/wizards/NewSessionWizard.java +++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/wizards/NewSessionWizard.java @@ -1,11 +1,6 @@ package org.eclipse.emf.cdo.internal.ui.wizards; -import org.eclipse.emf.cdo.container.CDOContainerAdapter; - -import org.eclipse.net4j.container.Container; -import org.eclipse.net4j.container.ContainerManager; -import org.eclipse.net4j.transport.ConnectorException; - +import org.eclipse.core.internal.resources.Container; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.operation.IRunnableWithProgress; diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/wizards/NewSessionWizardPage.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/wizards/NewSessionWizardPage.java index 44818648f1..918f3ef4b7 100644 --- a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/wizards/NewSessionWizardPage.java +++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/wizards/NewSessionWizardPage.java @@ -1,8 +1,6 @@ package org.eclipse.emf.cdo.internal.ui.wizards; -import org.eclipse.net4j.container.Container; -import org.eclipse.net4j.container.ContainerManager; - +import org.eclipse.core.internal.resources.Container; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; diff --git a/plugins/org.eclipse.net4j.jvm/META-INF/MANIFEST.MF b/plugins/org.eclipse.net4j.jvm/META-INF/MANIFEST.MF index e668dad351..47b0bb1087 100644 --- a/plugins/org.eclipse.net4j.jvm/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.net4j.jvm/META-INF/MANIFEST.MF @@ -1,14 +1,15 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName -Bundle-SymbolicName: org.eclipse.net4j.jvm +Bundle-SymbolicName: org.eclipse.net4j.jvm;singleton:=true Bundle-Version: 0.8.0.qualifier Bundle-Activator: org.eclipse.net4j.internal.jvm.bundle.JVM$Activator Bundle-Vendor: %providerName -Require-Bundle: org.eclipse.net4j;visibility:=reexport -Eclipse-LazyStart: true Bundle-RequiredExecutionEnvironment: J2SE-1.5 +Require-Bundle: org.eclipse.core.runtime;resolution:=optional, + org.eclipse.net4j;visibility:=reexport Import-Package: org.osgi.framework;version="1.3.0";resolution:=optional Export-Package: org.eclipse.net4j.internal.jvm;version="0.8.0", org.eclipse.net4j.internal.jvm.bundle;version="0.8.0", org.eclipse.net4j.jvm;version="0.8.0" +Eclipse-LazyStart: true diff --git a/plugins/org.eclipse.net4j.jvm/plugin.xml b/plugins/org.eclipse.net4j.jvm/plugin.xml new file mode 100644 index 0000000000..5aa799c777 --- /dev/null +++ b/plugins/org.eclipse.net4j.jvm/plugin.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<?eclipse version="3.2"?> + +<plugin> + + <extension + point="org.eclipse.net4j.factories"> + <factory + class="org.eclipse.net4j.internal.jvm.JVMAcceptorFactory" + productGroup="org.eclipse.net4j.acceptors" + type="jvm"/> + <factory + class="org.eclipse.net4j.internal.jvm.JVMConnectorFactory" + productGroup="org.eclipse.net4j.connectors" + type="jvm"/> + </extension> + +</plugin> 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 new file mode 100644 index 0000000000..0eb804a014 --- /dev/null +++ b/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/JVMAcceptor.java @@ -0,0 +1,77 @@ +/*************************************************************************** + * Copyright (c) 2004-2007 Eike Stepper, Germany. + * 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.internal.jvm; + +import org.eclipse.net4j.jvm.IJVMAcceptor; +import org.eclipse.net4j.util.StringUtil; + +import org.eclipse.internal.net4j.transport.Acceptor; + +import java.text.MessageFormat; + +/** + * @author Eike Stepper + */ +public class JVMAcceptor extends Acceptor implements IJVMAcceptor +{ + private String name; + + public JVMAcceptor() + { + } + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + public JVMServerConnector handleAccept(JVMClientConnector client) + { + JVMServerConnector connector = new JVMServerConnector(client); + addConnector(connector); + return connector; + } + + @Override + public String toString() + { + return MessageFormat.format("JVMAcceptor[{0}]", name); //$NON-NLS-1$ + } + + @Override + protected void doBeforeActivate() throws Exception + { + super.doBeforeActivate(); + if (StringUtil.isEmpty(name)) + { + throw new IllegalStateException("No name"); //$NON-NLS-1$ + } + } + + @Override + protected void doActivate() throws Exception + { + super.doActivate(); + JVMAcceptorManager.INSTANCE.registerAcceptor(this); + } + + @Override + protected void doDeactivate() throws Exception + { + JVMAcceptorManager.INSTANCE.deregisterAcceptor(this); + super.doDeactivate(); + } +} diff --git a/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/JVMAcceptorFactory.java b/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/JVMAcceptorFactory.java new file mode 100644 index 0000000000..0a0310f9c3 --- /dev/null +++ b/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/JVMAcceptorFactory.java @@ -0,0 +1,40 @@ +/*************************************************************************** + * Copyright (c) 2004-2007 Eike Stepper, Germany. + * 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.internal.jvm; + +import org.eclipse.net4j.jvm.IJVMConstants; +import org.eclipse.net4j.util.factory.ProductCreationException; + +import org.eclipse.internal.net4j.transport.AcceptorFactory; + +/** + * @author Eike Stepper + */ +public class JVMAcceptorFactory extends AcceptorFactory<JVMAcceptor> +{ + public JVMAcceptorFactory() + { + super(IJVMConstants.TYPE); + } + + public JVMAcceptor create(String description) throws ProductCreationException + { + JVMAcceptor acceptor = new JVMAcceptor(); + acceptor.setName(description); + return acceptor; + } + + @Override + public String getDescriptionFor(JVMAcceptor acceptor) + { + return acceptor.getName(); + } +} diff --git a/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/JVMAcceptorImpl.java b/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/JVMAcceptorImpl.java deleted file mode 100644 index 4b4dbb95cc..0000000000 --- a/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/JVMAcceptorImpl.java +++ /dev/null @@ -1,83 +0,0 @@ -/*************************************************************************** - * Copyright (c) 2004-2007 Eike Stepper, Germany. - * 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.internal.jvm; - -import org.eclipse.net4j.jvm.JVMAcceptor; -import org.eclipse.net4j.util.om.trace.ContextTracer; - -import org.eclipse.internal.net4j.bundle.Net4j; -import org.eclipse.internal.net4j.transport.Acceptor; -import org.eclipse.internal.net4j.transport.DescriptionUtil; - -import java.text.MessageFormat; - -/** - * @author Eike Stepper - */ -public class JVMAcceptorImpl extends Acceptor implements JVMAcceptor -{ - @SuppressWarnings("unused") - private static final ContextTracer TRACER = new ContextTracer(Net4j.DEBUG_ACCEPTOR, JVMAcceptorImpl.class); - - private String name; - - public JVMAcceptorImpl() - { - } - - public String getName() - { - return name; - } - - public ServerJVMConnectorImpl handleAccept(ClientJVMConnectorImpl client) - { - ServerJVMConnectorImpl connector = new ServerJVMConnectorImpl(client); - connector.setReceiveExecutor(getReceiveExecutor()); - connector.setProtocolFactoryRegistry(getProtocolFactoryRegistry()); - connector.setBufferProvider(getBufferProvider()); - return connector; - } - - @Override - public String toString() - { - return MessageFormat.format("JVMAcceptor[{0}]", getDescription()); //$NON-NLS-1$ - } - - @Override - protected void doBeforeActivate() throws Exception - { - super.doBeforeActivate(); - if (getDescription() == null) - { - throw new IllegalStateException("getDescription() == null"); //$NON-NLS-1$ - } - else - { - name = DescriptionUtil.getElement(getDescription(), 1); - } - } - - @Override - protected void doActivate() throws Exception - { - super.doActivate(); - JVMAcceptorManagerImpl.INSTANCE.registerAcceptor(this); - } - - @Override - protected void doDeactivate() throws Exception - { - JVMAcceptorManagerImpl.INSTANCE.deregisterAcceptor(this); - super.doDeactivate(); - } -} diff --git a/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/JVMAcceptorManagerImpl.java b/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/JVMAcceptorManager.java index fcc6e8c619..c092d12975 100644 --- a/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/JVMAcceptorManagerImpl.java +++ b/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/JVMAcceptorManager.java @@ -10,8 +10,8 @@ **************************************************************************/ package org.eclipse.net4j.internal.jvm; -import org.eclipse.net4j.jvm.JVMAcceptor; -import org.eclipse.net4j.jvm.JVMAcceptorManager; +import org.eclipse.net4j.jvm.IJVMAcceptor; +import org.eclipse.net4j.jvm.IJVMAcceptorManager; import org.eclipse.net4j.util.registry.IRegistry; import org.eclipse.internal.net4j.util.registry.HashMapRegistry; @@ -19,25 +19,25 @@ import org.eclipse.internal.net4j.util.registry.HashMapRegistry; /** * @author Eike Stepper */ -public class JVMAcceptorManagerImpl implements JVMAcceptorManager +public class JVMAcceptorManager implements IJVMAcceptorManager { // @Singleton - public static final JVMAcceptorManagerImpl INSTANCE = new JVMAcceptorManagerImpl(); + public static final JVMAcceptorManager INSTANCE = new JVMAcceptorManager(); - private IRegistry<String, JVMAcceptor> acceptorRegistry = new HashMapRegistry(); + private IRegistry<String, IJVMAcceptor> acceptorRegistry = new HashMapRegistry(); - public IRegistry<String, JVMAcceptor> getAcceptorRegistry() + public IRegistry<String, IJVMAcceptor> getAcceptorRegistry() { // TODO Introduce UnmodifiableRegistry return acceptorRegistry; } - public JVMAcceptorImpl getAcceptor(String name) + public JVMAcceptor getAcceptor(String name) { - return (JVMAcceptorImpl)acceptorRegistry.get(name); + return (JVMAcceptor)acceptorRegistry.get(name); } - public boolean registerAcceptor(JVMAcceptorImpl acceptor) + public boolean registerAcceptor(JVMAcceptor acceptor) { String name = acceptor.getName(); if (!acceptorRegistry.containsKey(name)) @@ -49,7 +49,7 @@ public class JVMAcceptorManagerImpl implements JVMAcceptorManager return false; } - public boolean deregisterAcceptor(JVMAcceptorImpl acceptor) + public boolean deregisterAcceptor(JVMAcceptor acceptor) { return acceptorRegistry.remove(acceptor.getName()) != null; } diff --git a/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/ClientJVMConnectorImpl.java b/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/JVMClientConnector.java index 330ba59fb6..4799e9c419 100644 --- a/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/ClientJVMConnectorImpl.java +++ b/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/JVMClientConnector.java @@ -20,9 +20,9 @@ import org.eclipse.internal.net4j.util.lifecycle.LifecycleEventAdapter; /** * @author Eike Stepper */ -public class ClientJVMConnectorImpl extends AbstractJVMConnector +public class JVMClientConnector extends JVMConnector { - private JVMAcceptorImpl acceptor; + private JVMAcceptor acceptor; private IListener peerLifecycleListener = new LifecycleEventAdapter() { @@ -34,7 +34,7 @@ public class ClientJVMConnectorImpl extends AbstractJVMConnector } }; - public ClientJVMConnectorImpl() + public JVMClientConnector() { } @@ -43,7 +43,7 @@ public class ClientJVMConnectorImpl extends AbstractJVMConnector return ConnectorLocation.CLIENT; } - public JVMAcceptorImpl getAcceptor() + public JVMAcceptor getAcceptor() { return acceptor; } @@ -52,7 +52,7 @@ public class ClientJVMConnectorImpl extends AbstractJVMConnector protected void doBeforeActivate() throws Exception { super.doBeforeActivate(); - acceptor = JVMAcceptorManagerImpl.INSTANCE.getAcceptor(getName()); + acceptor = JVMAcceptorManager.INSTANCE.getAcceptor(getName()); if (acceptor == null) { throw new IllegalStateException("acceptor == null"); @@ -63,7 +63,7 @@ public class ClientJVMConnectorImpl extends AbstractJVMConnector protected void doActivate() throws Exception { super.doActivate(); - AbstractJVMConnector peer = acceptor.handleAccept(this); + JVMConnector peer = acceptor.handleAccept(this); setPeer(peer); } @@ -74,9 +74,9 @@ public class ClientJVMConnectorImpl extends AbstractJVMConnector super.doDeactivate(); } - protected AbstractJVMConnector createServerPeer() throws Exception + protected JVMConnector createServerPeer() throws Exception { - ServerJVMConnectorImpl server = new ServerJVMConnectorImpl(this); + JVMServerConnector server = new JVMServerConnector(this); server.setBufferProvider(getBufferProvider()); server.setReceiveExecutor(getReceiveExecutor()); server.addListener(peerLifecycleListener); diff --git a/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/AbstractJVMConnector.java b/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/JVMConnector.java index 4704d077c7..2a703824ec 100644 --- a/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/AbstractJVMConnector.java +++ b/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/JVMConnector.java @@ -24,13 +24,13 @@ import java.util.Queue; * * @author Eike Stepper */ -public abstract class AbstractJVMConnector extends Connector +public abstract class JVMConnector extends Connector { - private AbstractJVMConnector peer; + private JVMConnector peer; private String name; - public AbstractJVMConnector() + public JVMConnector() { } @@ -39,12 +39,17 @@ public abstract class AbstractJVMConnector extends Connector return name; } - public AbstractJVMConnector getPeer() + public void setName(String name) + { + this.name = name; + } + + public JVMConnector getPeer() { return peer; } - public void setPeer(AbstractJVMConnector peer) + public void setPeer(JVMConnector peer) { this.peer = peer; } @@ -54,7 +59,7 @@ public abstract class AbstractJVMConnector extends Connector { try { - Channel channel = getPeer().createChannel(channelIndex, protocolID, null); + Channel channel = getPeer().createChannel(channelIndex, protocolID); if (channel == null) { throw new ConnectorException("Failed to register channel with peer"); //$NON-NLS-1$ diff --git a/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/JVMConnectorFactory.java b/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/JVMConnectorFactory.java new file mode 100644 index 0000000000..f7b99a331c --- /dev/null +++ b/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/JVMConnectorFactory.java @@ -0,0 +1,40 @@ +/*************************************************************************** + * Copyright (c) 2004-2007 Eike Stepper, Germany. + * 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.internal.jvm; + +import org.eclipse.net4j.jvm.IJVMConstants; +import org.eclipse.net4j.util.factory.ProductCreationException; + +import org.eclipse.internal.net4j.transport.ConnectorFactory; + +/** + * @author Eike Stepper + */ +public class JVMConnectorFactory extends ConnectorFactory<JVMClientConnector> +{ + public JVMConnectorFactory(String type) + { + super(IJVMConstants.TYPE); + } + + public JVMClientConnector create(String description) throws ProductCreationException + { + JVMClientConnector connector = new JVMClientConnector(); + connector.setName(description); + return connector; + } + + @Override + public String getDescriptionFor(JVMClientConnector connector) + { + return connector.getName(); + } +} diff --git a/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/ServerJVMConnectorImpl.java b/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/JVMServerConnector.java index 1fddd23e20..2340767ef2 100644 --- a/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/ServerJVMConnectorImpl.java +++ b/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/JVMServerConnector.java @@ -16,9 +16,9 @@ import org.eclipse.net4j.util.lifecycle.LifecycleUtil; /** * @author Eike Stepper */ -public class ServerJVMConnectorImpl extends AbstractJVMConnector +public class JVMServerConnector extends JVMConnector { - public ServerJVMConnectorImpl(ClientJVMConnectorImpl clientPeer) + public JVMServerConnector(JVMClientConnector clientPeer) { setPeer(clientPeer); } diff --git a/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/jvm/JVMAcceptor.java b/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/jvm/IJVMAcceptor.java index ff0d4c1e19..cbecd6ba89 100644 --- a/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/jvm/JVMAcceptor.java +++ b/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/jvm/IJVMAcceptor.java @@ -15,7 +15,7 @@ import org.eclipse.net4j.transport.IAcceptor; /** * @author Eike Stepper */ -public interface JVMAcceptor extends IAcceptor +public interface IJVMAcceptor extends IAcceptor { public String getName(); } diff --git a/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/jvm/JVMAcceptorManager.java b/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/jvm/IJVMAcceptorManager.java index 5709133ce2..1362db36b6 100644 --- a/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/jvm/JVMAcceptorManager.java +++ b/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/jvm/IJVMAcceptorManager.java @@ -10,17 +10,17 @@ **************************************************************************/ package org.eclipse.net4j.jvm; -import org.eclipse.net4j.internal.jvm.JVMAcceptorManagerImpl; +import org.eclipse.net4j.internal.jvm.JVMAcceptorManager; import org.eclipse.net4j.util.registry.IRegistry; /** * @author Eike Stepper */ -public interface JVMAcceptorManager +public interface IJVMAcceptorManager { - public static final JVMAcceptorManager INSTANCE = JVMAcceptorManagerImpl.INSTANCE; + public static final IJVMAcceptorManager INSTANCE = JVMAcceptorManager.INSTANCE; - public IRegistry<String, JVMAcceptor> getAcceptorRegistry(); + public IRegistry<String, IJVMAcceptor> getAcceptorRegistry(); - public JVMAcceptor getAcceptor(String name); + public IJVMAcceptor getAcceptor(String name); } diff --git a/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/jvm/JVMConnector.java b/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/jvm/IJVMConnector.java index 3a27e3a6ab..cfa2cbc40d 100644 --- a/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/jvm/JVMConnector.java +++ b/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/jvm/IJVMConnector.java @@ -15,7 +15,7 @@ import org.eclipse.net4j.transport.IConnector; /** * @author Eike Stepper */ -public interface JVMConnector extends IConnector +public interface IJVMConnector extends IConnector { public String getName(); } diff --git a/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/jvm/JVMConstants.java b/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/jvm/IJVMConstants.java index 7c61a92f56..647aea20cf 100644 --- a/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/jvm/JVMConstants.java +++ b/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/jvm/IJVMConstants.java @@ -13,7 +13,7 @@ package org.eclipse.net4j.jvm; /** * @author Eike Stepper */ -public interface JVMConstants +public interface IJVMConstants { public static final String TYPE = "jvm"; diff --git a/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/jvm/JVMUtil.java b/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/jvm/JVMUtil.java deleted file mode 100644 index 0a3aa8151f..0000000000 --- a/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/jvm/JVMUtil.java +++ /dev/null @@ -1,50 +0,0 @@ -/*************************************************************************** - * Copyright (c) 2004-2007 Eike Stepper, Germany. - * 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.jvm; - -import org.eclipse.internal.net4j.transport.DescriptionUtil; - -/** - * @author Eike Stepper - */ -public final class JVMUtil -{ - private JVMUtil() - { - } - - public static String createAcceptorDescription() - { - return createAcceptorDescription(JVMConstants.DEFAULT_NAME); - } - - public static String createAcceptorDescription(String name) - { - Object[] elements = { name }; - return DescriptionUtil.getDescription(JVMConstants.TYPE, elements); - } - - public static String createConnectorDescription() - { - return createConnectorDescription(JVMConstants.DEFAULT_NAME); - } - - public static String createConnectorDescription(String name) - { - return createConnectorDescription(null, name); - } - - public static String createConnectorDescription(String userName, String name) - { - Object[] elements = { userName, name }; - return DescriptionUtil.getDescription(JVMConstants.TYPE, elements); - } -} diff --git a/plugins/org.eclipse.net4j.tcp/META-INF/MANIFEST.MF b/plugins/org.eclipse.net4j.tcp/META-INF/MANIFEST.MF index c304620bed..cbe248a970 100644 --- a/plugins/org.eclipse.net4j.tcp/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.net4j.tcp/META-INF/MANIFEST.MF @@ -1,14 +1,15 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName -Bundle-SymbolicName: org.eclipse.net4j.tcp +Bundle-SymbolicName: org.eclipse.net4j.tcp;singleton:=true Bundle-Version: 0.8.0.qualifier Bundle-Activator: org.eclipse.net4j.internal.tcp.bundle.TCP$Activator Bundle-Vendor: %providerName -Require-Bundle: org.eclipse.net4j;visibility:=reexport -Eclipse-LazyStart: true Bundle-RequiredExecutionEnvironment: J2SE-1.5 +Require-Bundle: org.eclipse.core.runtime;resolution:=optional, + org.eclipse.net4j;visibility:=reexport Import-Package: org.osgi.framework;version="1.3.0";resolution:=optional Export-Package: org.eclipse.net4j.internal.tcp;version="0.8.0", org.eclipse.net4j.internal.tcp.bundle;version="0.8.0", org.eclipse.net4j.tcp;version="0.8.0" +Eclipse-LazyStart: true diff --git a/plugins/org.eclipse.net4j.tcp/build.properties b/plugins/org.eclipse.net4j.tcp/build.properties index d801b47a47..5e316ac59f 100644 --- a/plugins/org.eclipse.net4j.tcp/build.properties +++ b/plugins/org.eclipse.net4j.tcp/build.properties @@ -3,4 +3,5 @@ output.. = bin/ bin.includes = META-INF/,\ .,\ .options,\ - plugin.properties + plugin.properties,\ + plugin.xml diff --git a/plugins/org.eclipse.net4j.tcp/plugin.xml b/plugins/org.eclipse.net4j.tcp/plugin.xml new file mode 100644 index 0000000000..c57536b58b --- /dev/null +++ b/plugins/org.eclipse.net4j.tcp/plugin.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<?eclipse version="3.2"?> + +<plugin> + + <extension + point="org.eclipse.net4j.factories"> + <factory + class="org.eclipse.net4j.internal.tcp.TCPAcceptorFactory" + productGroup="org.eclipse.net4j.acceptors" + type="tcp"/> + <factory + class="org.eclipse.net4j.internal.tcp.TCPConnectorFactory" + productGroup="org.eclipse.net4j.connectors" + type="tcp"/> + </extension> + +</plugin> diff --git a/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/ControlChannelImpl.java b/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/ControlChannel.java index 5b22de29d8..f6ebc3600a 100644 --- a/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/ControlChannelImpl.java +++ b/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/ControlChannel.java @@ -24,7 +24,7 @@ import java.nio.ByteBuffer; /** * @author Eike Stepper */ -public final class ControlChannelImpl extends Channel +public final class ControlChannel extends Channel { public static final short CONTROL_CHANNEL_ID = -1; @@ -40,11 +40,11 @@ public final class ControlChannelImpl extends Channel public static final byte FAILURE = 0; - private static final ContextTracer TRACER = new ContextTracer(Net4j.DEBUG_CHANNEL, ControlChannelImpl.class); + private static final ContextTracer TRACER = new ContextTracer(Net4j.DEBUG_CHANNEL, ControlChannel.class); private SynchronizingCorrelator<Short, Boolean> registrations = new SynchronizingCorrelator(); - public ControlChannelImpl(AbstractTCPConnector connector) + public ControlChannel(TCPConnector connector) { super(connector.getReceiveExecutor()); setChannelIndex(CONTROL_CHANNEL_ID); @@ -101,7 +101,7 @@ public final class ControlChannelImpl extends Channel { byte[] handlerFactoryUTF8 = BufferUtil.getByteArray(byteBuffer); String protocolID = BufferUtil.fromUTF8(handlerFactoryUTF8); - Channel channel = ((AbstractTCPConnector)getConnector()).createChannel(channelIndex, protocolID, null); + Channel channel = ((TCPConnector)getConnector()).createChannel(channelIndex, protocolID); if (channel != null) { channel.activate(); @@ -136,7 +136,7 @@ public final class ControlChannelImpl extends Channel try { - Channel channel = ((AbstractTCPConnector)getConnector()).getChannel(channelIndex); + Channel channel = ((TCPConnector)getConnector()).getChannel(channelIndex); if (channel != null) { channel.deactivate(); @@ -159,7 +159,7 @@ public final class ControlChannelImpl extends Channel default: Net4j.LOG.error("Invalid opcode: " + opcode); //$NON-NLS-1$ - ((AbstractTCPConnector)getConnector()).deactivate(); + ((TCPConnector)getConnector()).deactivate(); } } finally diff --git a/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPAcceptorImpl.java b/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPAcceptor.java index a0c5d1735d..bf34cfcda3 100644 --- a/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPAcceptorImpl.java +++ b/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPAcceptor.java @@ -10,20 +10,18 @@ **************************************************************************/ package org.eclipse.net4j.internal.tcp; -import org.eclipse.net4j.tcp.TCPAcceptor; -import org.eclipse.net4j.tcp.TCPSelector; -import org.eclipse.net4j.tcp.TCPSelectorListener; -import org.eclipse.net4j.tcp.TCPUtil; +import org.eclipse.net4j.tcp.ITCPAcceptor; +import org.eclipse.net4j.tcp.ITCPSelector; +import org.eclipse.net4j.tcp.ITCPSelectorListener; +import org.eclipse.net4j.util.StringUtil; import org.eclipse.net4j.util.om.trace.ContextTracer; import org.eclipse.internal.net4j.bundle.Net4j; import org.eclipse.internal.net4j.transport.Acceptor; -import org.eclipse.internal.net4j.transport.DescriptionUtil; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.ServerSocket; -import java.net.SocketAddress; import java.nio.channels.ClosedChannelException; import java.nio.channels.SelectionKey; import java.nio.channels.ServerSocketChannel; @@ -34,13 +32,11 @@ import java.util.concurrent.CountDownLatch; /** * @author Eike Stepper */ -public class TCPAcceptorImpl extends Acceptor implements TCPAcceptor, TCPSelectorListener.Passive +public class TCPAcceptor extends Acceptor implements ITCPAcceptor, ITCPSelectorListener.Passive { - private static final ContextTracer TRACER = new ContextTracer(Net4j.DEBUG_ACCEPTOR, TCPAcceptorImpl.class); + private static final ContextTracer TRACER = new ContextTracer(Net4j.DEBUG_ACCEPTOR, TCPAcceptor.class); - private static final String DEFAULT_ADDRESS = "0.0.0.0"; - - private TCPSelectorImpl selector; + private TCPSelector selector; private SelectionKey selectionKey; @@ -54,7 +50,7 @@ public class TCPAcceptorImpl extends Acceptor implements TCPAcceptor, TCPSelecto private int port; - public TCPAcceptorImpl() + public TCPAcceptor() { } @@ -63,17 +59,27 @@ public class TCPAcceptorImpl extends Acceptor implements TCPAcceptor, TCPSelecto return address; } + public void setAddress(String address) + { + this.address = address; + } + public int getPort() { return port; } - public TCPSelectorImpl getSelector() + public void setPort(int port) + { + this.port = port; + } + + public TCPSelector getSelector() { return selector; } - public void setSelector(TCPSelectorImpl selector) + public void setSelector(TCPSelector selector) { this.selector = selector; } @@ -102,7 +108,7 @@ public class TCPAcceptorImpl extends Acceptor implements TCPAcceptor, TCPSelecto } } - public void handleAccept(TCPSelector selector, ServerSocketChannel serverSocketChannel) + public void handleAccept(ITCPSelector selector, ServerSocketChannel serverSocketChannel) { try { @@ -115,7 +121,7 @@ public class TCPAcceptorImpl extends Acceptor implements TCPAcceptor, TCPSelecto } socketChannel.configureBlocking(false); - ServerTCPConnectorImpl connector = createConnector(socketChannel); + TCPServerConnector connector = createConnector(socketChannel); addConnector(connector); } } @@ -137,19 +143,13 @@ public class TCPAcceptorImpl extends Acceptor implements TCPAcceptor, TCPSelecto @Override public String toString() { - return MessageFormat.format("TCPAcceptor[{0}]", getDescription()); //$NON-NLS-1$ + return MessageFormat.format("TCPAcceptor[{0}:{1}]", address, port); //$NON-NLS-1$ } - protected ServerTCPConnectorImpl createConnector(SocketChannel socketChannel) + protected TCPServerConnector createConnector(SocketChannel socketChannel) { - String description = createConnectorDescription(socketChannel); - - ServerTCPConnectorImpl connector = new ServerTCPConnectorImpl(); - connector.setDescription(description); + TCPServerConnector connector = new TCPServerConnector(); connector.setSocketChannel(socketChannel); - connector.setReceiveExecutor(getReceiveExecutor()); - connector.setProtocolFactoryRegistry(getProtocolFactoryRegistry()); - connector.setBufferProvider(getBufferProvider()); connector.setSelector(selector); return connector; } @@ -158,20 +158,9 @@ public class TCPAcceptorImpl extends Acceptor implements TCPAcceptor, TCPSelecto protected void doBeforeActivate() throws Exception { super.doBeforeActivate(); - if (getDescription() == null) + if (StringUtil.isEmpty(address)) { - throw new IllegalStateException("description == null"); //$NON-NLS-1$ - } - else - { - String[] elements = DescriptionUtil.getElements(getDescription()); - address = elements[1]; - if (address.length() == 0) - { - address = DEFAULT_ADDRESS; - } - - port = Integer.parseInt(elements[2]); + throw new IllegalStateException("No address"); //$NON-NLS-1$ } if (selector == null) @@ -230,24 +219,4 @@ public class TCPAcceptorImpl extends Acceptor implements TCPAcceptor, TCPSelecto serverSocketChannel.close(); super.doDeactivate(); } - - private String createConnectorDescription(SocketChannel socketChannel) - { - SocketAddress addr = socketChannel.socket().getRemoteSocketAddress(); - String host = addr.toString(); - if (host.startsWith("/")) - { - host = host.substring(1); - } - - int port = 0; - int colon = host.indexOf(':'); - if (colon != -1) - { - port = Integer.parseInt(host.substring(colon + 1)); - host = host.substring(0, colon); - } - - return TCPUtil.createConnectorDescription(host, port); - } } diff --git a/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPAcceptorFactory.java b/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPAcceptorFactory.java new file mode 100644 index 0000000000..e7ae40ed11 --- /dev/null +++ b/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPAcceptorFactory.java @@ -0,0 +1,60 @@ +/*************************************************************************** + * Copyright (c) 2004-2007 Eike Stepper, Germany. + * 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.internal.tcp; + +import org.eclipse.net4j.tcp.ITCPConstants; +import org.eclipse.net4j.util.StringUtil; + +import org.eclipse.internal.net4j.transport.AcceptorFactory; + +/** + * @author Eike Stepper + */ +public class TCPAcceptorFactory extends AcceptorFactory<TCPAcceptor> +{ + public static final String SEPARATOR = ":"; //$NON-NLS-1$ + + public TCPAcceptorFactory() + { + super(ITCPConstants.TYPE); + } + + public TCPAcceptor create(String description) + { + String address = ITCPConstants.DEFAULT_ADDRESS; + int port = ITCPConstants.DEFAULT_PORT; + + if (!StringUtil.isEmpty(description)) + { + String[] tokens = description.split(SEPARATOR); + if (!StringUtil.isEmpty(tokens[0])) + { + address = tokens[0]; + } + + if (tokens.length > 1 && !StringUtil.isEmpty(tokens[1])) + { + port = Integer.parseInt(tokens[1]); + } + } + + TCPAcceptor acceptor = new TCPAcceptor(); + acceptor.setAddress(address); + acceptor.setPort(port); + return acceptor; + } + + @Override + public String getDescriptionFor(TCPAcceptor acceptor) + { + return acceptor.getAddress() + SEPARATOR + acceptor.getPort(); + } +} diff --git a/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/ClientTCPConnectorImpl.java b/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPClientConnector.java index f126cc3a7d..6efdfbcfc2 100644 --- a/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/ClientTCPConnectorImpl.java +++ b/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPClientConnector.java @@ -23,9 +23,9 @@ import java.text.MessageFormat; /** * @author Eike Stepper */ -public class ClientTCPConnectorImpl extends AbstractTCPConnector +public class TCPClientConnector extends TCPConnector { - public ClientTCPConnectorImpl() + public TCPClientConnector() { try { @@ -58,6 +58,21 @@ public class ClientTCPConnectorImpl extends AbstractTCPConnector } @Override + protected void doBeforeActivate() throws Exception + { + super.doBeforeActivate(); + if (getHost() == null) + { + throw new IllegalStateException("host == null"); + } + + if (getPort() == 0) + { + throw new IllegalStateException("port == 0"); + } + } + + @Override protected void doActivate() throws Exception { super.doActivate(); diff --git a/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/AbstractTCPConnector.java b/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPConnector.java index 70871ecf86..fb3cd2d243 100644 --- a/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/AbstractTCPConnector.java +++ b/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPConnector.java @@ -10,9 +10,9 @@ **************************************************************************/ package org.eclipse.net4j.internal.tcp; -import org.eclipse.net4j.tcp.TCPConnector; -import org.eclipse.net4j.tcp.TCPSelector; -import org.eclipse.net4j.tcp.TCPSelectorListener; +import org.eclipse.net4j.tcp.ITCPConnector; +import org.eclipse.net4j.tcp.ITCPSelector; +import org.eclipse.net4j.tcp.ITCPSelectorListener; import org.eclipse.net4j.transport.ConnectorException; import org.eclipse.net4j.transport.ConnectorState; import org.eclipse.net4j.transport.IBuffer; @@ -33,25 +33,25 @@ import java.util.Queue; /** * @author Eike Stepper */ -public abstract class AbstractTCPConnector extends Connector implements TCPConnector, TCPSelectorListener.Active +public abstract class TCPConnector extends Connector implements ITCPConnector, ITCPSelectorListener.Active { - private static final ContextTracer TRACER = new ContextTracer(Net4j.DEBUG_CONNECTOR, AbstractTCPConnector.class); + private static final ContextTracer TRACER = new ContextTracer(Net4j.DEBUG_CONNECTOR, TCPConnector.class); private SocketChannel socketChannel; - private TCPSelector selector; + private ITCPSelector selector; private SelectionKey selectionKey; private IBuffer inputBuffer; - private ControlChannelImpl controlChannel; + private ControlChannel controlChannel; private String host; private int port; - public AbstractTCPConnector() + public TCPConnector() { } @@ -60,17 +60,27 @@ public abstract class AbstractTCPConnector extends Connector implements TCPConne return host; } + void setHost(String host) + { + this.host = host; + } + public int getPort() { return port; } - public TCPSelector getSelector() + void setPort(int port) + { + this.port = port; + } + + public ITCPSelector getSelector() { return selector; } - public void setSelector(TCPSelector selector) + public void setSelector(ITCPSelector selector) { this.selector = selector; } @@ -108,7 +118,7 @@ public abstract class AbstractTCPConnector extends Connector implements TCPConne } } - public void handleConnect(TCPSelector selector, SocketChannel channel) + public void handleConnect(ITCPSelector selector, SocketChannel channel) { try { @@ -135,7 +145,7 @@ public abstract class AbstractTCPConnector extends Connector implements TCPConne } } - public void handleRead(TCPSelector selector, SocketChannel socketChannel) + public void handleRead(ITCPSelector selector, SocketChannel socketChannel) { try { @@ -148,8 +158,7 @@ public abstract class AbstractTCPConnector extends Connector implements TCPConne if (byteBuffer != null) { short channelIndex = inputBuffer.getChannelIndex(); - Channel channel = channelIndex == ControlChannelImpl.CONTROL_CHANNEL_ID ? controlChannel - : getChannel(channelIndex); + Channel channel = channelIndex == ControlChannel.CONTROL_CHANNEL_ID ? controlChannel : getChannel(channelIndex); if (channel != null) { channel.handleBufferFromMultiplexer(inputBuffer); @@ -178,7 +187,7 @@ public abstract class AbstractTCPConnector extends Connector implements TCPConne } } - public void handleWrite(TCPSelector selector, SocketChannel socketChannel) + public void handleWrite(ITCPSelector selector, SocketChannel socketChannel) { try { @@ -284,23 +293,13 @@ public abstract class AbstractTCPConnector extends Connector implements TCPConne { throw new IllegalStateException("selector == null"); } - - if (host == null) - { - throw new IllegalStateException("host == null"); - } - - if (port == 0) - { - throw new IllegalStateException("port == 0"); - } } @Override protected void doActivate() throws Exception { super.doActivate(); - controlChannel = new ControlChannelImpl(this); + controlChannel = new ControlChannel(this); controlChannel.activate(); selector.registerAsync(socketChannel, this); } diff --git a/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPConnectorFactory.java b/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPConnectorFactory.java new file mode 100644 index 0000000000..1b93924a23 --- /dev/null +++ b/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPConnectorFactory.java @@ -0,0 +1,78 @@ +/*************************************************************************** + * Copyright (c) 2004-2007 Eike Stepper, Germany. + * 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.internal.tcp; + +import org.eclipse.net4j.tcp.ITCPConstants; +import org.eclipse.net4j.util.StringUtil; +import org.eclipse.net4j.util.factory.ProductCreationException; + +import org.eclipse.internal.net4j.transport.ConnectorFactory; + +import java.net.MalformedURLException; +import java.net.URL; + +/** + * @author Eike Stepper + */ +public class TCPConnectorFactory extends ConnectorFactory<TCPClientConnector> +{ + private static final String URL_SCHEME = "http://"; + + public TCPConnectorFactory() + { + super(ITCPConstants.TYPE); + } + + public TCPClientConnector create(String description) + { + try + { + // TODO Don't use URL + URL url = new URL(URL_SCHEME + description); + String userID = url.getUserInfo(); + String host = url.getHost(); + int port = url.getPort(); + if (port == -1) + { + port = ITCPConstants.DEFAULT_PORT; + } + + TCPClientConnector connector = new TCPClientConnector(); + connector.setUserID(userID); + connector.setHost(host); + connector.setPort(port); + return connector; + } + catch (MalformedURLException ex) + { + throw new ProductCreationException(ex); + } + } + + @Override + public String getDescriptionFor(TCPClientConnector connector) + { + String description = connector.getHost(); + String userID = connector.getUserID(); + if (!StringUtil.isEmpty(userID)) + { + description = userID + "@" + description; + } + + int port = connector.getPort(); + if (port != ITCPConstants.DEFAULT_PORT) + { + description = description + ":" + port; + } + + return description; + } +} diff --git a/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPSelectorImpl.java b/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPSelector.java index aeaa54c1a5..75c47ccf24 100644 --- a/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPSelectorImpl.java +++ b/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPSelector.java @@ -10,10 +10,10 @@ **************************************************************************/ package org.eclipse.net4j.internal.tcp; -import org.eclipse.net4j.tcp.TCPSelector; -import org.eclipse.net4j.tcp.TCPSelectorListener; -import org.eclipse.net4j.tcp.TCPSelectorListener.Active; -import org.eclipse.net4j.tcp.TCPSelectorListener.Passive; +import org.eclipse.net4j.tcp.ITCPSelector; +import org.eclipse.net4j.tcp.ITCPSelectorListener; +import org.eclipse.net4j.tcp.ITCPSelectorListener.Active; +import org.eclipse.net4j.tcp.ITCPSelectorListener.Passive; import org.eclipse.net4j.util.om.trace.ContextTracer; import org.eclipse.internal.net4j.bundle.Net4j; @@ -35,9 +35,9 @@ import java.util.concurrent.ConcurrentLinkedQueue; /** * @author Eike Stepper */ -public class TCPSelectorImpl extends Lifecycle implements TCPSelector, Runnable +public class TCPSelector extends Lifecycle implements ITCPSelector, Runnable { - private static final ContextTracer TRACER = new ContextTracer(Net4j.DEBUG_SELECTOR, TCPSelectorImpl.class); + private static final ContextTracer TRACER = new ContextTracer(Net4j.DEBUG_SELECTOR, TCPSelector.class); private Selector selector; @@ -45,7 +45,7 @@ public class TCPSelectorImpl extends Lifecycle implements TCPSelector, Runnable private Thread thread; - public TCPSelectorImpl() + public TCPSelector() { } @@ -224,7 +224,7 @@ public class TCPSelectorImpl extends Lifecycle implements TCPSelector, Runnable if (channel instanceof ServerSocketChannel) { ServerSocketChannel ssChannel = (ServerSocketChannel)selKey.channel(); - TCPSelectorListener.Passive listener = (TCPSelectorListener.Passive)selKey.attachment(); + ITCPSelectorListener.Passive listener = (ITCPSelectorListener.Passive)selKey.attachment(); if (selKey.isAcceptable()) { @@ -239,7 +239,7 @@ public class TCPSelectorImpl extends Lifecycle implements TCPSelector, Runnable else if (channel instanceof SocketChannel) { SocketChannel sChannel = (SocketChannel)channel; - TCPSelectorListener.Active listener = (TCPSelectorListener.Active)selKey.attachment(); + ITCPSelectorListener.Active listener = (ITCPSelectorListener.Active)selKey.attachment(); if (selKey.isConnectable()) { @@ -334,7 +334,7 @@ public class TCPSelectorImpl extends Lifecycle implements TCPSelector, Runnable } } - private void doRegister(final ServerSocketChannel channel, final TCPSelectorListener.Passive listener) + private void doRegister(final ServerSocketChannel channel, final ITCPSelectorListener.Passive listener) { if (TRACER.isEnabled()) { @@ -353,7 +353,7 @@ public class TCPSelectorImpl extends Lifecycle implements TCPSelector, Runnable } } - private void doRegister(final SocketChannel channel, final TCPSelectorListener.Active listener) + private void doRegister(final SocketChannel channel, final ITCPSelectorListener.Active listener) { if (TRACER.isEnabled()) { diff --git a/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPAcceptorFactoryImpl.java b/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPSelectorFactory.java index 1330087dc8..8ba166f9dc 100644 --- a/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPAcceptorFactoryImpl.java +++ b/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPSelectorFactory.java @@ -10,21 +10,25 @@ **************************************************************************/ package org.eclipse.net4j.internal.tcp; -import org.eclipse.net4j.tcp.TCPConstants; -import org.eclipse.net4j.transport.IAcceptor; +import org.eclipse.net4j.tcp.ITCPConstants; + +import org.eclipse.internal.net4j.bundle.Net4j; +import org.eclipse.internal.net4j.util.factory.Factory; /** * @author Eike Stepper */ -public class TCPAcceptorFactoryImpl implements IAcceptorFactory +public class TCPSelectorFactory extends Factory<TCPSelector> { - public String getType() + public static final String SELECTOR_GROUP = Net4j.BUNDLE_ID + ".selectors"; + + public TCPSelectorFactory() { - return TCPConstants.TYPE; + super(SELECTOR_GROUP, ITCPConstants.TYPE); } - public IAcceptor createAcceptor() + public TCPSelector create(String description) { - return new TCPAcceptorImpl(); + return new TCPSelector(); } } diff --git a/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPSelectorInjector.java b/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPSelectorInjector.java new file mode 100644 index 0000000000..aaf25e1f69 --- /dev/null +++ b/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPSelectorInjector.java @@ -0,0 +1,47 @@ +/*************************************************************************** + * Copyright (c) 2004, 2005, 2006 Eike Stepper, Germany. + * 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.internal.tcp; + +import org.eclipse.net4j.tcp.ITCPConstants; +import org.eclipse.net4j.util.container.IElementProcessor; +import org.eclipse.net4j.util.container.IManagedContainer; + +/** + * @author Eike Stepper + */ +public class TCPSelectorInjector implements IElementProcessor +{ + public TCPSelectorInjector() + { + } + + public Object process(IManagedContainer container, String productGroup, String factoryType, String description, + Object element) + { + if (element instanceof TCPAcceptor) + { + TCPAcceptor acceptor = (TCPAcceptor)element; + acceptor.setSelector(getSelector(container)); + } + else if (element instanceof TCPConnector) + { + TCPConnector connector = (TCPConnector)element; + connector.setSelector(getSelector(container)); + } + + return element; + } + + protected TCPSelector getSelector(IManagedContainer container) + { + return (TCPSelector)container.getElement(TCPSelectorFactory.SELECTOR_GROUP, ITCPConstants.TYPE, null); + } +} diff --git a/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/ServerTCPConnectorImpl.java b/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPServerConnector.java index 217276ad09..2ba8f66cfa 100644 --- a/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/ServerTCPConnectorImpl.java +++ b/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPServerConnector.java @@ -17,9 +17,9 @@ import java.text.MessageFormat; /** * @author Eike Stepper */ -public class ServerTCPConnectorImpl extends AbstractTCPConnector +public class TCPServerConnector extends TCPConnector { - public ServerTCPConnectorImpl() + public TCPServerConnector() { } diff --git a/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/tcp/TCPAcceptor.java b/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/tcp/ITCPAcceptor.java index b3a65f445c..019a88f163 100644 --- a/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/tcp/TCPAcceptor.java +++ b/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/tcp/ITCPAcceptor.java @@ -15,7 +15,7 @@ import org.eclipse.net4j.transport.IAcceptor; /** * @author Eike Stepper */ -public interface TCPAcceptor extends IAcceptor +public interface ITCPAcceptor extends IAcceptor { public String getAddress(); diff --git a/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/tcp/TCPConnector.java b/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/tcp/ITCPConnector.java index 0ee76dc6c2..70291684ff 100644 --- a/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/tcp/TCPConnector.java +++ b/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/tcp/ITCPConnector.java @@ -15,7 +15,7 @@ import org.eclipse.net4j.transport.IConnector; /** * @author Eike Stepper */ -public interface TCPConnector extends IConnector +public interface ITCPConnector extends IConnector { public String getHost(); diff --git a/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/tcp/TCPConstants.java b/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/tcp/ITCPConstants.java index 5637c77a51..1677120712 100644 --- a/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/tcp/TCPConstants.java +++ b/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/tcp/ITCPConstants.java @@ -13,7 +13,7 @@ package org.eclipse.net4j.tcp; /** * @author Eike Stepper */ -public interface TCPConstants +public interface ITCPConstants { public static final String TYPE = "tcp"; diff --git a/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/tcp/TCPSelector.java b/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/tcp/ITCPSelector.java index 493eead36f..a776e66576 100644 --- a/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/tcp/TCPSelector.java +++ b/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/tcp/ITCPSelector.java @@ -10,8 +10,8 @@ **************************************************************************/ package org.eclipse.net4j.tcp; -import org.eclipse.net4j.tcp.TCPSelectorListener.Active; -import org.eclipse.net4j.tcp.TCPSelectorListener.Passive; +import org.eclipse.net4j.tcp.ITCPSelectorListener.Active; +import org.eclipse.net4j.tcp.ITCPSelectorListener.Passive; import java.nio.channels.SelectionKey; import java.nio.channels.ServerSocketChannel; @@ -20,7 +20,7 @@ import java.nio.channels.SocketChannel; /** * @author Eike Stepper */ -public interface TCPSelector +public interface ITCPSelector { public void invokeAsync(Runnable operation); diff --git a/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/tcp/TCPSelectorListener.java b/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/tcp/ITCPSelectorListener.java index 7bf72904a7..6eeec066ff 100644 --- a/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/tcp/TCPSelectorListener.java +++ b/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/tcp/ITCPSelectorListener.java @@ -17,27 +17,27 @@ import java.nio.channels.SocketChannel; /** * @author Eike Stepper */ -public interface TCPSelectorListener +public interface ITCPSelectorListener { public void registered(SelectionKey selectionKey); /** * @author Eike Stepper */ - public interface Passive extends TCPSelectorListener + public interface Passive extends ITCPSelectorListener { - public void handleAccept(TCPSelector selector, ServerSocketChannel serverSocketChannel); + public void handleAccept(ITCPSelector selector, ServerSocketChannel serverSocketChannel); } /** * @author Eike Stepper */ - public interface Active extends TCPSelectorListener + public interface Active extends ITCPSelectorListener { - public void handleConnect(TCPSelector selector, SocketChannel channel); + public void handleConnect(ITCPSelector selector, SocketChannel channel); - public void handleRead(TCPSelector selector, SocketChannel socketChannel); + public void handleRead(ITCPSelector selector, SocketChannel socketChannel); - public void handleWrite(TCPSelector selector, SocketChannel socketChannel); + public void handleWrite(ITCPSelector selector, SocketChannel socketChannel); } }
\ No newline at end of file diff --git a/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/tcp/TCPUtil.java b/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/tcp/TCPUtil.java deleted file mode 100644 index ceb545631c..0000000000 --- a/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/tcp/TCPUtil.java +++ /dev/null @@ -1,60 +0,0 @@ -/*************************************************************************** - * Copyright (c) 2004-2007 Eike Stepper, Germany. - * 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.tcp; - -import org.eclipse.internal.net4j.transport.DescriptionUtil; - -/** - * @author Eike Stepper - */ -public final class TCPUtil -{ - private TCPUtil() - { - } - - public static String createAcceptorDescription() - { - return createAcceptorDescription(TCPConstants.DEFAULT_ADDRESS); - } - - public static String createAcceptorDescription(String address) - { - return createAcceptorDescription(address, TCPConstants.DEFAULT_PORT); - } - - public static String createAcceptorDescription(String address, int port) - { - Object[] elements = { address, port }; - return DescriptionUtil.getDescription(TCPConstants.TYPE, elements); - } - - public static String createConnectorDescription(String host) - { - return createConnectorDescription(null, host); - } - - public static String createConnectorDescription(String host, int port) - { - return createConnectorDescription(null, host, port); - } - - public static String createConnectorDescription(String userName, String host) - { - return createConnectorDescription(userName, host, TCPConstants.DEFAULT_PORT); - } - - public static String createConnectorDescription(String userName, String host, int port) - { - Object[] elements = { userName, host, port }; - return DescriptionUtil.getDescription(TCPConstants.TYPE, elements); - } -} diff --git a/plugins/org.eclipse.net4j.tests/META-INF/MANIFEST.MF b/plugins/org.eclipse.net4j.tests/META-INF/MANIFEST.MF index a6c9bc6946..ce95c3b7f1 100644 --- a/plugins/org.eclipse.net4j.tests/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.net4j.tests/META-INF/MANIFEST.MF @@ -8,5 +8,8 @@ Bundle-Activator: org.eclipse.net4j.tests.bundle.Activator Bundle-Localization: plugin Bundle-RequiredExecutionEnvironment: J2SE-1.5 Require-Bundle: org.eclipse.core.runtime, - org.junit, - org.eclipse.net4j.tcp.container;visibility:=reexport + org.junit;visibility:=reexport, + org.eclipse.net4j.tcp;visibility:=reexport +Export-Package: org.eclipse.net4j.tests, + org.eclipse.net4j.tests.bundle, + org.eclipse.net4j.tests.signal diff --git a/plugins/org.eclipse.net4j.tests/Net4j SignalTest.launch b/plugins/org.eclipse.net4j.tests/Net4j SignalTest.launch index 28f2362420..666182b471 100644 --- a/plugins/org.eclipse.net4j.tests/Net4j SignalTest.launch +++ b/plugins/org.eclipse.net4j.tests/Net4j SignalTest.launch @@ -5,10 +5,10 @@ <stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/> <stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.net4j.tests"/> <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"> -<listEntry value="4"/> +<listEntry value="1"/> </listAttribute> <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS"> -<listEntry value="/org.eclipse.net4j.tests"/> +<listEntry value="/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/SignalTest.java"/> </listAttribute> <stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/> <booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/> diff --git a/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/AbstractTCPTest.java b/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/AbstractTransportTest.java index 47f58ab14d..4f24c486ae 100644 --- a/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/AbstractTCPTest.java +++ b/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/AbstractTransportTest.java @@ -10,27 +10,26 @@ **************************************************************************/ package org.eclipse.net4j.tests; -import org.eclipse.net4j.container.Container; -import org.eclipse.net4j.container.ContainerUtil; -import org.eclipse.net4j.tcp.TCPUtil; -import org.eclipse.net4j.tcp.internal.container.TCPContainerAdapterFactoryImpl; +import org.eclipse.net4j.internal.tcp.TCPAcceptorFactory; +import org.eclipse.net4j.internal.tcp.TCPConnectorFactory; +import org.eclipse.net4j.internal.tcp.TCPSelectorFactory; +import org.eclipse.net4j.internal.tcp.TCPSelectorInjector; +import org.eclipse.net4j.tcp.ITCPConstants; import org.eclipse.net4j.util.lifecycle.LifecycleUtil; import org.eclipse.internal.net4j.transport.Acceptor; import org.eclipse.internal.net4j.transport.Connector; +import org.eclipse.internal.net4j.transport.TransportContainer; /** * @author Eike Stepper */ -public abstract class AbstractTCPTest extends AbstractOMTest +public abstract class AbstractTransportTest extends AbstractOMTest { - protected static final String ACCEPTOR_DESCRIPTION = TCPUtil.createAcceptorDescription(); + protected static final String HOST = "localhost"; - protected static final String CONNECTOR_DESCRIPTION = TCPUtil.createConnectorDescription("localhost"); + protected TransportContainer container; - protected Container container; - - @SuppressWarnings("unused") private Acceptor acceptor; private Connector connector; @@ -70,14 +69,13 @@ public abstract class AbstractTCPTest extends AbstractOMTest } } - protected Container createContainer() + protected TransportContainer createContainer() { - Container container = ContainerUtil.createContainer(); - if (container != null) - { - container.register(new TCPContainerAdapterFactoryImpl()); - } - + TransportContainer container = new TransportContainer(); + container.registerFactory(new TCPSelectorFactory()); + container.registerFactory(new TCPAcceptorFactory()); + container.registerFactory(new TCPConnectorFactory()); + container.addPostProcessor(new TCPSelectorInjector()); return container; } @@ -85,7 +83,7 @@ public abstract class AbstractTCPTest extends AbstractOMTest { if (acceptor == null) { - acceptor = (Acceptor)container.getAcceptor(ACCEPTOR_DESCRIPTION); + acceptor = container.getAcceptor(ITCPConstants.TYPE, null); } return acceptor; @@ -95,18 +93,21 @@ public abstract class AbstractTCPTest extends AbstractOMTest { if (connector == null) { - connector = (Connector)container.getConnector(CONNECTOR_DESCRIPTION); + connector = container.getConnector(ITCPConstants.TYPE, HOST); } return connector; } - protected void startTransport() + protected void startTransport() throws Exception { if (container != null) { - assertTrue(getAcceptor().isActive()); - assertTrue(getConnector().isActive()); + Acceptor acceptor = getAcceptor(); + acceptor.activate(); + + Connector connector = getConnector(); + connector.activate(); } } } diff --git a/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/SignalTest.java b/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/SignalTest.java index b123ca4a5a..94b685ab9c 100644 --- a/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/SignalTest.java +++ b/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/SignalTest.java @@ -10,31 +10,33 @@ **************************************************************************/ package org.eclipse.net4j.tests; -import org.eclipse.net4j.container.Container; import org.eclipse.net4j.tests.signal.Request1; import org.eclipse.net4j.tests.signal.Request2; import org.eclipse.net4j.tests.signal.TestSignalProtocol; +import org.eclipse.net4j.tests.signal.TestSignalServerProtocolFactory; import org.eclipse.net4j.transport.IChannel; +import org.eclipse.internal.net4j.transport.TransportContainer; + import java.util.Arrays; /** * @author Eike Stepper */ -public class SignalTest extends AbstractTCPTest +public class SignalTest extends AbstractTransportTest { @Override - protected Container createContainer() + protected TransportContainer createContainer() { - Container container = super.createContainer(); - container.register(new TestSignalProtocol.Factory()); + TransportContainer container = super.createContainer(); + container.registerFactory(new TestSignalServerProtocolFactory()); return container; } public void testInteger() throws Exception { startTransport(); - IChannel channel = getConnector().openChannel(TestSignalProtocol.PROTOCOL_ID); + IChannel channel = getConnector().openChannel(TestSignalProtocol.TYPE); int data = 0x0a; int result = new Request1(channel, data).send(); assertEquals(data, result); @@ -43,7 +45,7 @@ public class SignalTest extends AbstractTCPTest public void testArray() throws Exception { startTransport(); - IChannel channel = getConnector().openChannel(TestSignalProtocol.PROTOCOL_ID); + IChannel channel = getConnector().openChannel(TestSignalProtocol.TYPE); byte[] data = TinyData.getBytes(); byte[] result = new Request2(channel, data).send(); assertTrue(Arrays.equals(data, result)); diff --git a/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/TCPTransportTest.java b/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/TCPTransportTest.java index 4f3841f966..1fc924e369 100644 --- a/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/TCPTransportTest.java +++ b/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/TCPTransportTest.java @@ -10,11 +10,10 @@ **************************************************************************/ package org.eclipse.net4j.tests; -import org.eclipse.net4j.container.Container; import org.eclipse.net4j.stream.ChannelInputStream; import org.eclipse.net4j.stream.ChannelOutputStream; -import org.eclipse.net4j.tests.signal.TestSignalProtocol; -import org.eclipse.net4j.transport.IAcceptorAcceptedEvent; +import org.eclipse.net4j.tests.signal.TestSignalServerProtocolFactory; +import org.eclipse.net4j.transport.IAcceptorEvent; import org.eclipse.net4j.transport.IBuffer; import org.eclipse.net4j.transport.IChannel; import org.eclipse.net4j.transport.IConnectorChannelsEvent; @@ -22,6 +21,8 @@ import org.eclipse.net4j.util.container.IContainerDelta; import org.eclipse.net4j.util.event.IEvent; import org.eclipse.net4j.util.event.IListener; +import org.eclipse.internal.net4j.transport.TransportContainer; + import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; @@ -36,13 +37,13 @@ import java.util.concurrent.TimeUnit; /** * @author Eike Stepper */ -public class TCPTransportTest extends AbstractTCPTest +public class TCPTransportTest extends AbstractTransportTest { @Override - protected Container createContainer() + protected TransportContainer createContainer() { - Container container = super.createContainer(); - container.register(new TestSignalProtocol.Factory()); + TransportContainer container = super.createContainer(); + container.registerFactory(new TestSignalServerProtocolFactory()); return container; } @@ -73,10 +74,10 @@ public class TCPTransportTest extends AbstractTCPTest { final int COUNT = 3; final CountDownLatch counter = new CountDownLatch(COUNT); - container.register(new TestProtocolFactory(counter)); + container.registerFactory(new TestProtocolFactory(counter)); startTransport(); - IChannel channel = getConnector().openChannel(TestProtocolFactory.PROTOCOL_ID); + IChannel channel = getConnector().openChannel(TestProtocolFactory.TYPE); for (int i = 0; i < COUNT; i++) { IBuffer buffer = provideBuffer(); @@ -154,9 +155,9 @@ public class TCPTransportTest extends AbstractTCPTest { public void notifyEvent(IEvent event) { - if (event instanceof IAcceptorAcceptedEvent) + if (event instanceof IAcceptorEvent) { - IAcceptorAcceptedEvent e = (IAcceptorAcceptedEvent)event; + IAcceptorEvent e = (IAcceptorEvent)event; e.getConnector().addListener(new IListener() { public void notifyEvent(IEvent event) @@ -217,9 +218,9 @@ public class TCPTransportTest extends AbstractTCPTest { public void notifyEvent(IEvent event) { - if (event instanceof IAcceptorAcceptedEvent) + if (event instanceof IAcceptorEvent) { - IAcceptorAcceptedEvent e = (IAcceptorAcceptedEvent)event; + IAcceptorEvent e = (IAcceptorEvent)event; e.getConnector().addListener(new IListener() { public void notifyEvent(IEvent event) @@ -283,9 +284,9 @@ public class TCPTransportTest extends AbstractTCPTest { public void notifyEvent(IEvent event) { - if (event instanceof IAcceptorAcceptedEvent) + if (event instanceof IAcceptorEvent) { - IAcceptorAcceptedEvent e = (IAcceptorAcceptedEvent)event; + IAcceptorEvent e = (IAcceptorEvent)event; e.getConnector().addListener(new IListener() { public void notifyEvent(IEvent event) @@ -311,6 +312,7 @@ public class TCPTransportTest extends AbstractTCPTest new Thread() { + @Override public void run() { try @@ -363,9 +365,9 @@ public class TCPTransportTest extends AbstractTCPTest { public void notifyEvent(IEvent event) { - if (event instanceof IAcceptorAcceptedEvent) + if (event instanceof IAcceptorEvent) { - IAcceptorAcceptedEvent e = (IAcceptorAcceptedEvent)event; + IAcceptorEvent e = (IAcceptorEvent)event; e.getConnector().addListener(new IListener() { public void notifyEvent(IEvent event) diff --git a/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/TestProtocol.java b/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/TestProtocol.java new file mode 100644 index 0000000000..ae1e62443d --- /dev/null +++ b/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/TestProtocol.java @@ -0,0 +1,32 @@ +package org.eclipse.net4j.tests; + +import org.eclipse.net4j.transport.IBuffer; + +import org.eclipse.internal.net4j.transport.Protocol; + +import java.util.concurrent.CountDownLatch; + +/** + * @author Eike Stepper + */ +public final class TestProtocol extends Protocol +{ + private CountDownLatch counter; + + public TestProtocol(CountDownLatch counter) + { + this.counter = counter; + } + + public String getType() + { + return TestProtocolFactory.TYPE; + } + + public void handleBuffer(IBuffer buffer) + { + System.out.println("BUFFER ARRIVED"); + buffer.release(); + counter.countDown(); + } +}
\ No newline at end of file diff --git a/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/TestProtocolFactory.java b/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/TestProtocolFactory.java index 042ebd93a2..06376463cd 100644 --- a/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/TestProtocolFactory.java +++ b/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/TestProtocolFactory.java @@ -10,67 +10,29 @@ **************************************************************************/ package org.eclipse.net4j.tests; -import org.eclipse.net4j.transport.ConnectorLocation; -import org.eclipse.net4j.transport.IBuffer; -import org.eclipse.net4j.transport.IChannel; -import org.eclipse.net4j.transport.IProtocol; -import org.eclipse.net4j.transport.IProtocolFactory; +import org.eclipse.net4j.util.factory.ProductCreationException; -import org.eclipse.internal.net4j.transport.Protocol; -import org.eclipse.internal.net4j.transport.ProtocolFactory; +import org.eclipse.internal.net4j.transport.ServerProtocolFactory; -import java.util.Set; import java.util.concurrent.CountDownLatch; /** * @author Eike Stepper */ -public class TestProtocolFactory extends ProtocolFactory implements IProtocolFactory +public class TestProtocolFactory extends ServerProtocolFactory<TestProtocol> { - public static final String PROTOCOL_ID = "test.protocol"; + public static final String TYPE = "test.protocol"; private CountDownLatch counter; public TestProtocolFactory(CountDownLatch counter) { + super(TYPE); this.counter = counter; } - public String getProtocolID() + public TestProtocol create(String description) throws ProductCreationException { - return PROTOCOL_ID; - } - - public Set<ConnectorLocation> getLocations() - { - return IProtocolFactory.SYMMETRIC; - } - - public IProtocol createProtocol(IChannel channel, Object protocolData) - { - return new TestProtocol(channel); - } - - /** - * @author Eike Stepper - */ - private final class TestProtocol extends Protocol - { - public TestProtocol(IChannel channel) - { - super(channel); - } - - public String getProtocolID() - { - return PROTOCOL_ID; - } - - public void handleBuffer(IBuffer buffer) - { - System.out.println("BUFFER ARRIVED"); - buffer.release(); - counter.countDown(); - } + return new TestProtocol(counter); } }
\ No newline at end of file diff --git a/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/signal/TestSignalProtocol.java b/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/signal/TestSignalProtocol.java index 4b4d72b56a..8749840e0f 100644 --- a/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/signal/TestSignalProtocol.java +++ b/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/signal/TestSignalProtocol.java @@ -12,38 +12,25 @@ package org.eclipse.net4j.tests.signal; import org.eclipse.net4j.signal.SignalProtocol; import org.eclipse.net4j.signal.SignalReactor; -import org.eclipse.net4j.transport.ConnectorLocation; -import org.eclipse.net4j.transport.IChannel; -import org.eclipse.net4j.transport.IProtocol; -import org.eclipse.net4j.transport.IProtocolFactory; - -import org.eclipse.internal.net4j.transport.ProtocolFactory; - -import java.util.Set; /** * @author Eike Stepper */ public class TestSignalProtocol extends SignalProtocol { - public static final String PROTOCOL_ID = "signal.protocol"; + public static final String TYPE = "signal.protocol"; public static final short SIGNAL1 = 1; public static final short SIGNAL2 = 2; - public static final short SIGNAL3 = 3; - - public static final short SIGNAL4 = 4; - - public TestSignalProtocol(IChannel channel) + public TestSignalProtocol() { - super(channel); } - public String getProtocolID() + public String getType() { - return PROTOCOL_ID; + return TYPE; } @Override @@ -59,25 +46,4 @@ public class TestSignalProtocol extends SignalProtocol throw new IllegalArgumentException("Invalid signalID " + signalID); } - - /** - * @author Eike Stepper - */ - public static class Factory extends ProtocolFactory - { - public String getProtocolID() - { - return PROTOCOL_ID; - } - - public Set<ConnectorLocation> getLocations() - { - return IProtocolFactory.SYMMETRIC; - } - - public IProtocol createProtocol(IChannel channel, Object protocolData) - { - return new TestSignalProtocol(channel); - } - } } diff --git a/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/signal/TestSignalServerProtocolFactory.java b/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/signal/TestSignalServerProtocolFactory.java new file mode 100644 index 0000000000..c4cc1596db --- /dev/null +++ b/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/signal/TestSignalServerProtocolFactory.java @@ -0,0 +1,21 @@ +package org.eclipse.net4j.tests.signal; + +import org.eclipse.net4j.util.factory.ProductCreationException; + +import org.eclipse.internal.net4j.transport.ServerProtocolFactory; + +/** + * @author Eike Stepper + */ +public class TestSignalServerProtocolFactory extends ServerProtocolFactory<TestSignalProtocol> +{ + public TestSignalServerProtocolFactory() + { + super(TestSignalProtocol.TYPE); + } + + public TestSignalProtocol create(String description) throws ProductCreationException + { + return new TestSignalProtocol(); + } +}
\ No newline at end of file diff --git a/plugins/org.eclipse.net4j/META-INF/MANIFEST.MF b/plugins/org.eclipse.net4j/META-INF/MANIFEST.MF index 3edb1de42c..b82768c0d9 100644 --- a/plugins/org.eclipse.net4j/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.net4j/META-INF/MANIFEST.MF @@ -1,12 +1,13 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 -Bundle-SymbolicName: org.eclipse.net4j +Bundle-SymbolicName: org.eclipse.net4j;singleton:=true Bundle-Version: 0.8.0.qualifier Bundle-Name: %pluginName Bundle-Vendor: %providerName Bundle-Localization: plugin Bundle-Activator: org.eclipse.internal.net4j.bundle.Net4j$Activator Bundle-RequiredExecutionEnvironment: J2SE-1.5 +Require-Bundle: org.eclipse.core.runtime;resolution:=optional Import-Package: org.eclipse.osgi.service.debug;version="1.0.0";resolution:=optional, org.osgi.framework;version="1.3.0";resolution:=optional, org.osgi.service.log;version="1.3.0";resolution:=optional, @@ -40,4 +41,3 @@ Export-Package: org.eclipse.internal.net4j.bundle;version="0.8.0", org.eclipse.net4j.util.registry;version="0.8.0", org.eclipse.net4j.util.stream;version="0.8.0" Eclipse-LazyStart: true -Require-Bundle: org.eclipse.core.runtime;resolution:=optional diff --git a/plugins/org.eclipse.net4j/TODOS.txt b/plugins/org.eclipse.net4j/TODOS.txt deleted file mode 100644 index fe0d4a26e0..0000000000 --- a/plugins/org.eclipse.net4j/TODOS.txt +++ /dev/null @@ -1 +0,0 @@ -SSL diff --git a/plugins/org.eclipse.net4j/build.properties b/plugins/org.eclipse.net4j/build.properties index 666d03a9c6..72ff0827bf 100644 --- a/plugins/org.eclipse.net4j/build.properties +++ b/plugins/org.eclipse.net4j/build.properties @@ -7,4 +7,6 @@ bin.includes = META-INF/,\ about.html,\ copyright.txt,\ epl-v10.html,\ - license.html + license.html,\ + plugin.xml,\ + schema/ diff --git a/plugins/org.eclipse.net4j/javadoc.xml b/plugins/org.eclipse.net4j/javadoc.xml deleted file mode 100644 index f439bd5eac..0000000000 --- a/plugins/org.eclipse.net4j/javadoc.xml +++ /dev/null @@ -1,46 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - - Copyright (c) 2004, 2005, 2006 Eike Stepper, Germany. - 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 - ---> -<project default="javadoc"> - <target name="javadoc"> - <javadoc - access="protected" - author="true" - destdir="doc" - nodeprecated="false" - nodeprecatedlist="false" - noindex="false" - nonavbar="false" - notree="false" - source="1.5" - sourcepath="src" - splitindex="true" - use="true" - version="true"> - <package name="org.eclipse.net4j"/> - <package name="org.eclipse.net4j.message"/> - <package name="org.eclipse.net4j.remote"/> - <package name="org.eclipse.net4j.signal"/> - <package name="org.eclipse.net4j.transport"/> - <package name="org.eclipse.net4j.transport.tcp"/> - <package name="org.eclipse.net4j.transport.util"/> - <package name="org.eclipse.net4j.util"/> - <package name="org.eclipse.net4j.util.concurrent"/> - <package name="org.eclipse.net4j.util.lifecycle"/> - <package name="org.eclipse.net4j.util.om"/> - <package name="org.eclipse.net4j.util.registry"/> - <package name="org.eclipse.net4j.util.stream"/> - <link href="http://java.sun.com/j2se/1.5.0/docs/api/" /> - </javadoc> - </target> -</project> diff --git a/plugins/org.eclipse.net4j/plugin.xml b/plugins/org.eclipse.net4j/plugin.xml new file mode 100644 index 0000000000..c22e936321 --- /dev/null +++ b/plugins/org.eclipse.net4j/plugin.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<?eclipse version="3.2"?> + +<plugin> + + <extension-point id="factories" name="Factories" schema="schema/factories.exsd"/> + +</plugin> diff --git a/plugins/org.eclipse.net4j/schema/factories.exsd b/plugins/org.eclipse.net4j/schema/factories.exsd new file mode 100644 index 0000000000..b755309df1 --- /dev/null +++ b/plugins/org.eclipse.net4j/schema/factories.exsd @@ -0,0 +1,124 @@ +<?xml version='1.0' encoding='UTF-8'?> +<!-- Schema file written by PDE --> +<schema targetNamespace="org.eclipse.net4j"> +<annotation> + <appInfo> + <meta.schema plugin="org.eclipse.net4j" id="factories" name="Factories"/> + </appInfo> + <documentation> + [Enter description of this extension point.] + </documentation> + </annotation> + + <element name="extension"> + <complexType> + <sequence> + <element ref="factory" minOccurs="1" maxOccurs="unbounded"/> + </sequence> + <attribute name="point" type="string" use="required"> + <annotation> + <documentation> + + </documentation> + </annotation> + </attribute> + <attribute name="id" type="string"> + <annotation> + <documentation> + + </documentation> + </annotation> + </attribute> + <attribute name="name" type="string"> + <annotation> + <documentation> + + </documentation> + <appInfo> + <meta.attribute translatable="true"/> + </appInfo> + </annotation> + </attribute> + </complexType> + </element> + + <element name="factory"> + <annotation> + <appInfo> + <meta.element labelAttribute="class"/> + </appInfo> + </annotation> + <complexType> + <attribute name="productGroup" type="string" use="required"> + <annotation> + <documentation> + + </documentation> + </annotation> + </attribute> + <attribute name="type" type="string" use="required"> + <annotation> + <documentation> + + </documentation> + </annotation> + </attribute> + <attribute name="class" type="string" use="required"> + <annotation> + <documentation> + + </documentation> + <appInfo> + <meta.attribute kind="java" basedOn="org.eclipse.net4j.util.factory.IFactory"/> + </appInfo> + </annotation> + </attribute> + </complexType> + </element> + + <annotation> + <appInfo> + <meta.section type="since"/> + </appInfo> + <documentation> + [Enter the first release in which this extension point appears.] + </documentation> + </annotation> + + <annotation> + <appInfo> + <meta.section type="examples"/> + </appInfo> + <documentation> + [Enter extension point usage example here.] + </documentation> + </annotation> + + <annotation> + <appInfo> + <meta.section type="apiInfo"/> + </appInfo> + <documentation> + [Enter API information here.] + </documentation> + </annotation> + + <annotation> + <appInfo> + <meta.section type="implementation"/> + </appInfo> + <documentation> + [Enter information about supplied implementation of this extension point.] + </documentation> + </annotation> + + <annotation> + <appInfo> + <meta.section type="copyright"/> + </appInfo> + <documentation> + + </documentation> + </annotation> + +</schema> diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/Acceptor.java b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/Acceptor.java index b58c6ae64e..0427749861 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/Acceptor.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/Acceptor.java @@ -11,14 +11,14 @@ package org.eclipse.internal.net4j.transport; import org.eclipse.net4j.transport.IAcceptor; -import org.eclipse.net4j.transport.IAcceptorAcceptedEvent; +import org.eclipse.net4j.transport.IAcceptorEvent; import org.eclipse.net4j.transport.IBufferProvider; import org.eclipse.net4j.transport.IConnector; -import org.eclipse.net4j.transport.IProtocolFactory; -import org.eclipse.net4j.transport.IProtocolFactoryID; -import org.eclipse.net4j.util.container.IContainer; +import org.eclipse.net4j.util.container.IContainerDelta; +import org.eclipse.net4j.util.container.IContainerDelta.Kind; import org.eclipse.net4j.util.event.IListener; -import org.eclipse.net4j.util.event.INotifier; +import org.eclipse.net4j.util.factory.IFactory; +import org.eclipse.net4j.util.factory.IFactoryKey; import org.eclipse.net4j.util.lifecycle.ILifecycleEvent; import org.eclipse.net4j.util.lifecycle.LifecycleUtil; import org.eclipse.net4j.util.om.trace.ContextTracer; @@ -26,7 +26,7 @@ import org.eclipse.net4j.util.registry.IRegistry; import org.eclipse.internal.net4j.bundle.Net4j; import org.eclipse.internal.net4j.util.container.LifecycleEventConverter; -import org.eclipse.internal.net4j.util.event.Event; +import org.eclipse.internal.net4j.util.container.SingleDeltaContainerEvent; import org.eclipse.internal.net4j.util.lifecycle.Lifecycle; import java.util.HashSet; @@ -36,13 +36,13 @@ import java.util.concurrent.ExecutorService; /** * @author Eike Stepper */ -public abstract class Acceptor extends Lifecycle implements IAcceptor, IContainer<IConnector> +public abstract class Acceptor extends Lifecycle implements IAcceptor { private static final ContextTracer TRACER = new ContextTracer(Net4j.DEBUG_ACCEPTOR, Acceptor.class); private IBufferProvider bufferProvider; - private IRegistry<IProtocolFactoryID, IProtocolFactory> protocolFactoryRegistry; + private IRegistry<IFactoryKey, IFactory> factoryRegistry; private ExecutorService receiveExecutor; @@ -82,14 +82,14 @@ public abstract class Acceptor extends Lifecycle implements IAcceptor, IContaine this.receiveExecutor = receiveExecutor; } - public IRegistry<IProtocolFactoryID, IProtocolFactory> getProtocolFactoryRegistry() + public IRegistry<IFactoryKey, IFactory> getFactoryRegistry() { - return protocolFactoryRegistry; + return factoryRegistry; } - public void setProtocolFactoryRegistry(IRegistry<IProtocolFactoryID, IProtocolFactory> protocolFactoryRegistry) + public void setFactoryRegistry(IRegistry<IFactoryKey, IFactory> factoryRegistry) { - this.protocolFactoryRegistry = protocolFactoryRegistry; + this.factoryRegistry = factoryRegistry; } public IConnector[] getAcceptedConnectors() @@ -100,6 +100,11 @@ public abstract class Acceptor extends Lifecycle implements IAcceptor, IContaine } } + public boolean isEmpty() + { + return acceptedConnectors.isEmpty(); + } + public IConnector[] getElements() { return getAcceptedConnectors(); @@ -109,6 +114,9 @@ public abstract class Acceptor extends Lifecycle implements IAcceptor, IContaine { try { + connector.setBufferProvider(bufferProvider); + connector.setReceiveExecutor(receiveExecutor); + connector.setFactoryRegistry(factoryRegistry); connector.activate(); connector.addListener(lifecycleEventConverter); @@ -122,7 +130,7 @@ public abstract class Acceptor extends Lifecycle implements IAcceptor, IContaine TRACER.trace("Added connector " + connector); //$NON-NLS-1$ } - fireEvent(new AcceptorAcceptedEventImpl(this, connector)); + fireEvent(new AcceptorEvent(this, connector, IContainerDelta.Kind.ADDED)); } catch (Exception ex) { @@ -142,6 +150,8 @@ public abstract class Acceptor extends Lifecycle implements IAcceptor, IContaine { TRACER.trace("Removed connector " + connector); //$NON-NLS-1$ } + + fireEvent(new AcceptorEvent(this, connector, IContainerDelta.Kind.REMOVED)); } @Override @@ -153,13 +163,15 @@ public abstract class Acceptor extends Lifecycle implements IAcceptor, IContaine throw new IllegalStateException("bufferProvider == null"); //$NON-NLS-1$ } - if (protocolFactoryRegistry == null && TRACER.isEnabled()) + if (factoryRegistry == null && TRACER.isEnabled()) { - TRACER.trace("protocolFactoryRegistry == null"); //$NON-NLS-1$ + // Just a reminder during development + TRACER.trace("factoryRegistry == null"); //$NON-NLS-1$ } if (receiveExecutor == null && TRACER.isEnabled()) { + // Just a reminder during development TRACER.trace("receiveExecutor == null"); //$NON-NLS-1$ } } @@ -178,21 +190,23 @@ public abstract class Acceptor extends Lifecycle implements IAcceptor, IContaine /** * @author Eike Stepper */ - private static class AcceptorAcceptedEventImpl extends Event implements IAcceptorAcceptedEvent + private static class AcceptorEvent extends SingleDeltaContainerEvent<IConnector> implements IAcceptorEvent { private static final long serialVersionUID = 1L; - private IConnector acceptedConnector; + public AcceptorEvent(IAcceptor acceptor, IConnector connector, Kind kind) + { + super(acceptor, connector, kind); + } - public AcceptorAcceptedEventImpl(INotifier notifier, IConnector acceptedConnector) + public IAcceptor getAcceptor() { - super(notifier); - this.acceptedConnector = acceptedConnector; + return (IAcceptor)getContainer(); } public IConnector getConnector() { - return acceptedConnector; + return getDeltaElement(); } } } diff --git a/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/JVMAcceptorFactoryImpl.java b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/AcceptorFactory.java index f92ec8aa24..3336e8d828 100644 --- a/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/JVMAcceptorFactoryImpl.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/AcceptorFactory.java @@ -8,23 +8,22 @@ * Contributors: * Eike Stepper - initial API and implementation **************************************************************************/ -package org.eclipse.net4j.internal.jvm; +package org.eclipse.internal.net4j.transport; -import org.eclipse.net4j.jvm.JVMConstants; import org.eclipse.net4j.transport.IAcceptor; +import org.eclipse.internal.net4j.bundle.Net4j; +import org.eclipse.internal.net4j.util.factory.Factory; + /** * @author Eike Stepper */ -public class JVMAcceptorFactoryImpl implements IAcceptorFactory +public abstract class AcceptorFactory<PRODUCT extends IAcceptor> extends Factory<PRODUCT> { - public String getType() - { - return JVMConstants.TYPE; - } + public static final String ACCEPTOR_GROUP = Net4j.BUNDLE_ID + ".acceptors"; - public IAcceptor createAcceptor() + public AcceptorFactory(String type) { - return new JVMAcceptorImpl(); + super(ACCEPTOR_GROUP, type); } } diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/Channel.java b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/Channel.java index cd96202de8..085a1d10b3 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/Channel.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/Channel.java @@ -82,7 +82,7 @@ public class Channel extends Lifecycle implements IChannel, IBufferProvider this.channelIndex = channelIndex; } - public IConnector getConnector() + public Connector getConnector() { return connector; } diff --git a/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPConnectorFactoryImpl.java b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/ClientProtocolFactory.java index ea4255902c..5b4daf2ac2 100644 --- a/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPConnectorFactoryImpl.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/ClientProtocolFactory.java @@ -8,23 +8,22 @@ * Contributors: * Eike Stepper - initial API and implementation **************************************************************************/ -package org.eclipse.net4j.internal.tcp; +package org.eclipse.internal.net4j.transport; -import org.eclipse.net4j.tcp.TCPConstants; -import org.eclipse.net4j.transport.IConnector; +import org.eclipse.net4j.transport.IProtocol; + +import org.eclipse.internal.net4j.bundle.Net4j; +import org.eclipse.internal.net4j.util.factory.Factory; /** * @author Eike Stepper */ -public class TCPConnectorFactoryImpl implements IConnectorFactory +public abstract class ClientProtocolFactory<PRODUCT extends IProtocol> extends Factory<PRODUCT> { - public String getType() - { - return TCPConstants.TYPE; - } + public static final String CLIENT_PROTOCOL_GROUP = Net4j.BUNDLE_ID + ".clientProtocols"; - public IConnector createConnector() + public ClientProtocolFactory(String type) { - return new ClientTCPConnectorImpl(); + super(CLIENT_PROTOCOL_GROUP, type); } } diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/Connector.java b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/Connector.java index 1a9e31fd5a..5294f8ce36 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/Connector.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/Connector.java @@ -17,21 +17,27 @@ import org.eclipse.net4j.transport.IBuffer; import org.eclipse.net4j.transport.IBufferProvider; import org.eclipse.net4j.transport.IChannel; import org.eclipse.net4j.transport.IConnector; +import org.eclipse.net4j.transport.IConnectorChannelsEvent; import org.eclipse.net4j.transport.IConnectorCredentials; import org.eclipse.net4j.transport.IConnectorStateEvent; import org.eclipse.net4j.transport.IProtocol; -import org.eclipse.net4j.transport.IProtocolFactory; -import org.eclipse.net4j.transport.IProtocolFactoryID; -import org.eclipse.net4j.util.container.IContainer; +import org.eclipse.net4j.util.StringUtil; +import org.eclipse.net4j.util.container.IContainerDelta; +import org.eclipse.net4j.util.container.IContainerDelta.Kind; import org.eclipse.net4j.util.event.IListener; import org.eclipse.net4j.util.event.INotifier; +import org.eclipse.net4j.util.factory.IFactory; +import org.eclipse.net4j.util.factory.IFactoryKey; +import org.eclipse.net4j.util.lifecycle.ILifecycleEvent; import org.eclipse.net4j.util.lifecycle.LifecycleUtil; import org.eclipse.net4j.util.om.trace.ContextTracer; import org.eclipse.net4j.util.registry.IRegistry; import org.eclipse.internal.net4j.bundle.Net4j; import org.eclipse.internal.net4j.util.container.LifecycleEventConverter; +import org.eclipse.internal.net4j.util.container.SingleDeltaContainerEvent; import org.eclipse.internal.net4j.util.event.Event; +import org.eclipse.internal.net4j.util.factory.FactoryKey; import org.eclipse.internal.net4j.util.lifecycle.Lifecycle; import java.util.ArrayList; @@ -44,7 +50,7 @@ import java.util.concurrent.TimeUnit; /** * @author Eike Stepper */ -public abstract class Connector extends Lifecycle implements IConnector, IContainer<IChannel> +public abstract class Connector extends Lifecycle implements IConnector { private static final ContextTracer TRACER = new ContextTracer(Net4j.DEBUG_CONNECTOR, Connector.class); @@ -54,7 +60,7 @@ public abstract class Connector extends Lifecycle implements IConnector, IContai private IConnectorCredentials credentials; - private IRegistry<IProtocolFactoryID, IProtocolFactory> protocolFactoryRegistry; + private IRegistry<IFactoryKey, IFactory> factoryRegistry; private IBufferProvider bufferProvider; @@ -77,7 +83,22 @@ public abstract class Connector extends Lifecycle implements IConnector, IContai * Is registered with each {@link IChannel} of this {@link IConnector}. * <p> */ - private transient IListener lifecycleEventConverter = new LifecycleEventConverter(this); + private transient IListener lifecycleEventConverter = new LifecycleEventConverter(this) + { + @Override + protected void added(ILifecycleEvent e) + { + super.added(e); + fireEvent(new ConnectorChannelsEvent(Connector.this, (IChannel)e.getLifecycle(), IContainerDelta.Kind.ADDED)); + } + + @Override + protected void removed(ILifecycleEvent e) + { + fireEvent(new ConnectorChannelsEvent(Connector.this, (IChannel)e.getLifecycle(), IContainerDelta.Kind.REMOVED)); + super.removed(e); + } + }; private transient CountDownLatch finishedConnecting; @@ -99,14 +120,14 @@ public abstract class Connector extends Lifecycle implements IConnector, IContai this.receiveExecutor = receiveExecutor; } - public IRegistry<IProtocolFactoryID, IProtocolFactory> getProtocolFactoryRegistry() + public IRegistry<IFactoryKey, IFactory> getFactoryRegistry() { - return protocolFactoryRegistry; + return factoryRegistry; } - public void setProtocolFactoryRegistry(IRegistry<IProtocolFactoryID, IProtocolFactory> protocolFactoryRegistry) + public void setFactoryRegistry(IRegistry<IFactoryKey, IFactory> factoryRegistry) { - this.protocolFactoryRegistry = protocolFactoryRegistry; + this.factoryRegistry = factoryRegistry; } public IBufferProvider getBufferProvider() @@ -166,7 +187,7 @@ public abstract class Connector extends Lifecycle implements IConnector, IContai } connectorState = newState; - fireEvent(new ConnectorStateEventImpl(this, oldState, newState)); + fireEvent(new ConnectorStateEvent(this, oldState, newState)); switch (newState) { case DISCONNECTED: @@ -289,6 +310,11 @@ public abstract class Connector extends Lifecycle implements IConnector, IContai return result.toArray(new IChannel[result.size()]); } + public boolean isEmpty() + { + return getElements().length == 0; + } + public IChannel[] getElements() { return getChannels(); @@ -301,14 +327,9 @@ public abstract class Connector extends Lifecycle implements IConnector, IContai public IChannel openChannel(String protocolID) throws ConnectorException { - return openChannel(protocolID, null); - } - - public IChannel openChannel(String protocolID, Object protocolData) throws ConnectorException - { waitForConnection(Long.MAX_VALUE); short channelIndex = findFreeChannelIndex(); - Channel channel = createChannel(channelIndex, protocolID, protocolData); + Channel channel = createChannel(channelIndex, protocolID); registerChannelWithPeer(channelIndex, protocolID); try @@ -327,14 +348,24 @@ public abstract class Connector extends Lifecycle implements IConnector, IContai return channel; } - public Channel createChannel(short channelIndex, String protocolID, Object protocolData) + public Channel createChannel(short channelIndex, String protocolID) { Channel channel = new Channel(receiveExecutor); - IProtocol protocol = createProtocol(protocolID, channel, protocolData); - if (TRACER.isEnabled()) + IProtocol protocol = createProtocol(protocolID); + if (protocol != null) { - TRACER.trace("Opening channel " + channelIndex //$NON-NLS-1$ - + (protocol == null ? " without protocol" : " with protocol " + protocolID)); //$NON-NLS-1$ //$NON-NLS-2$ + protocol.setChannel(channel); + if (TRACER.isEnabled()) + { + TRACER.format("Opening channel {0} with protocol {1}", channelIndex, protocolID); //$NON-NLS-1$ + } + } + else + { + if (TRACER.isEnabled()) + { + TRACER.format("Opening channel {0} without protocol", channelIndex); //$NON-NLS-1$ + } } channel.setChannelIndex(channelIndex); @@ -426,27 +457,39 @@ public abstract class Connector extends Lifecycle implements IConnector, IContai channels.set(channelIndex, NULL_CHANNEL); } - protected IProtocol createProtocol(String protocolID, IChannel channel, Object protocolData) + protected IProtocol createProtocol(String type) { - if (protocolID == null || protocolID.length() == 0 || protocolFactoryRegistry == null) + if (StringUtil.isEmpty(type) || factoryRegistry == null) { return null; } - IProtocolFactoryID protocolFactoryID = ProtocolFactoryID.create(getLocation(), protocolID); - IProtocolFactory factory = protocolFactoryRegistry.get(protocolFactoryID); - + IFactoryKey key = createProtocolFactoryKey(type); + IFactory<IProtocol> factory = factoryRegistry.get(key); if (factory == null) { if (TRACER.isEnabled()) { - TRACER.trace("Unknown protocol " + protocolID); //$NON-NLS-1$ + TRACER.trace("Unknown protocol " + type); //$NON-NLS-1$ } return null; } - return factory.createProtocol(channel, protocolData); + return factory.create(null); + } + + protected IFactoryKey createProtocolFactoryKey(String type) + { + switch (getLocation()) + { + case SERVER: + return new FactoryKey(ServerProtocolFactory.SERVER_PROTOCOL_GROUP, type); + case CLIENT: + return new FactoryKey(ClientProtocolFactory.CLIENT_PROTOCOL_GROUP, type); + default: + throw new IllegalStateException(); + } } @Override @@ -458,10 +501,10 @@ public abstract class Connector extends Lifecycle implements IConnector, IContai throw new IllegalStateException("bufferProvider == null"); //$NON-NLS-1$ } - if (protocolFactoryRegistry == null && TRACER.isEnabled()) + if (factoryRegistry == null && TRACER.isEnabled()) { // Just a reminder during development - TRACER.trace("No protocolFactoryRegistry!"); //$NON-NLS-1$ + TRACER.trace("No factoryRegistry!"); //$NON-NLS-1$ } if (receiveExecutor == null && TRACER.isEnabled()) @@ -523,7 +566,7 @@ public abstract class Connector extends Lifecycle implements IConnector, IContai /** * @author Eike Stepper */ - private static class ConnectorStateEventImpl extends Event implements IConnectorStateEvent + private static class ConnectorStateEvent extends Event implements IConnectorStateEvent { private static final long serialVersionUID = 1L; @@ -531,7 +574,7 @@ public abstract class Connector extends Lifecycle implements IConnector, IContai private ConnectorState newState; - public ConnectorStateEventImpl(INotifier notifier, ConnectorState oldState, ConnectorState newState) + public ConnectorStateEvent(INotifier notifier, ConnectorState oldState, ConnectorState newState) { super(notifier); this.oldState = oldState; @@ -548,4 +591,28 @@ public abstract class Connector extends Lifecycle implements IConnector, IContai return newState; } } + + /** + * @author Eike Stepper + */ + private static class ConnectorChannelsEvent extends SingleDeltaContainerEvent<IChannel> implements + IConnectorChannelsEvent + { + private static final long serialVersionUID = 1L; + + public ConnectorChannelsEvent(IConnector connector, IChannel channel, Kind kind) + { + super(connector, channel, kind); + } + + public IConnector getConnector() + { + return (IConnector)getContainer(); + } + + public IChannel getChannel() + { + return getDeltaElement(); + } + } } diff --git a/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/JVMConnectorFactoryImpl.java b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/ConnectorFactory.java index b724717634..538d22ace2 100644 --- a/plugins/org.eclipse.net4j.jvm/src/org/eclipse/net4j/internal/jvm/JVMConnectorFactoryImpl.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/ConnectorFactory.java @@ -8,23 +8,22 @@ * Contributors: * Eike Stepper - initial API and implementation **************************************************************************/ -package org.eclipse.net4j.internal.jvm; +package org.eclipse.internal.net4j.transport; -import org.eclipse.net4j.jvm.JVMConstants; import org.eclipse.net4j.transport.IConnector; +import org.eclipse.internal.net4j.bundle.Net4j; +import org.eclipse.internal.net4j.util.factory.Factory; + /** * @author Eike Stepper */ -public class JVMConnectorFactoryImpl implements IConnectorFactory +public abstract class ConnectorFactory<PRODUCT extends IConnector> extends Factory<PRODUCT> { - public String getType() - { - return JVMConstants.TYPE; - } + public static final String CONNECTOR_GROUP = Net4j.BUNDLE_ID + ".connectors"; - public IConnector createConnector() + public ConnectorFactory(String type) { - return new ClientJVMConnectorImpl(); + super(CONNECTOR_GROUP, type); } } diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/DescriptionUtil.java b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/DescriptionUtil.java index da94c5f49d..022451e8ff 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/DescriptionUtil.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/DescriptionUtil.java @@ -13,6 +13,7 @@ package org.eclipse.internal.net4j.transport; /** * @author Eike Stepper */ +@Deprecated public final class DescriptionUtil { public static final String SEPARATOR = ":"; //$NON-NLS-1$ diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/Protocol.java b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/Protocol.java index 7fd4fa39e6..724476a837 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/Protocol.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/Protocol.java @@ -22,18 +22,22 @@ import org.eclipse.internal.net4j.util.lifecycle.Lifecycle; */ public abstract class Protocol extends Lifecycle implements IProtocol, IBufferProvider { - private IChannel channel; + private Channel channel; - public Protocol(IChannel channel) + public Protocol() { - this.channel = channel; } - public IChannel getChannel() + public Channel getChannel() { return channel; } + public void setChannel(IChannel channel) + { + this.channel = (Channel)channel; + } + public short getBufferCapacity() { return BufferUtil.getBufferProvider(channel).getBufferCapacity(); @@ -50,6 +54,16 @@ public abstract class Protocol extends Lifecycle implements IProtocol, IBufferPr } @Override + protected void doBeforeActivate() throws Exception + { + super.doBeforeActivate(); + if (channel == null) + { + throw new IllegalStateException("channel == null"); + } + } + + @Override protected void doDeactivate() throws Exception { channel = null; diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/ProtocolFactory.java b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/ProtocolFactory.java deleted file mode 100644 index 25ae987ecb..0000000000 --- a/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/ProtocolFactory.java +++ /dev/null @@ -1,53 +0,0 @@ -/*************************************************************************** - * Copyright (c) 2004-2007 Eike Stepper, Germany. - * 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.internal.net4j.transport; - -import org.eclipse.net4j.transport.ConnectorLocation; -import org.eclipse.net4j.transport.IProtocolFactory; -import org.eclipse.net4j.transport.IProtocolFactoryID; - -import java.text.MessageFormat; - -/** - * @author Eike Stepper - */ -public abstract class ProtocolFactory implements IProtocolFactory -{ - public ProtocolFactory() - { - } - - public final boolean isForClients() - { - return getLocations().contains(ConnectorLocation.CLIENT); - } - - public final boolean isForServers() - { - return getLocations().contains(ConnectorLocation.SERVER); - } - - public final boolean isSymmetric() - { - return isForClients() && isForServers(); - } - - public IProtocolFactoryID getID(ConnectorLocation location) - { - return ProtocolFactoryID.create(location, getProtocolID()); - } - - @Override - public String toString() - { - return MessageFormat.format("Protocol.Factory({0}, {1})", getProtocolID(), getLocations()); - } -} diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/ProtocolFactoryID.java b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/ProtocolFactoryID.java deleted file mode 100644 index 7eedfacfb3..0000000000 --- a/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/ProtocolFactoryID.java +++ /dev/null @@ -1,82 +0,0 @@ -/*************************************************************************** - * Copyright (c) 2004-2007 Eike Stepper, Germany. - * 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.internal.net4j.transport; - -import org.eclipse.net4j.transport.ConnectorLocation; -import org.eclipse.net4j.transport.IProtocolFactoryID; -import org.eclipse.net4j.util.ObjectUtil; - -import org.eclipse.internal.net4j.util.Value; - -import java.text.MessageFormat; - -/** - * @author Eike Stepper - */ -public class ProtocolFactoryID extends Value implements IProtocolFactoryID -{ - private static final long serialVersionUID = 1L; - - private ConnectorLocation location; - - private String protocolID; - - public ProtocolFactoryID(ConnectorLocation location, String protocolID) - { - this.location = location; - this.protocolID = protocolID; - } - - public ConnectorLocation getLocation() - { - return location; - } - - public String getProtocolID() - { - return protocolID; - } - - @Override - protected Object clone() throws CloneNotSupportedException - { - return this; - } - - @Override - public boolean equals(Object obj) - { - if (obj instanceof IProtocolFactoryID) - { - IProtocolFactoryID that = (IProtocolFactoryID)obj; - return this.location == that.getLocation() && ObjectUtil.equals(this.protocolID, that.getProtocolID()); - } - - return false; - } - - @Override - public int hashCode() - { - return location.hashCode() ^ protocolID.hashCode(); - } - - @Override - public String toString() - { - return MessageFormat.format("{0}[{1}]", location, protocolID); - } - - public static IProtocolFactoryID create(ConnectorLocation location, String protocolID) - { - return new ProtocolFactoryID(location, protocolID); - } -} diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/ServerProtocolFactory.java b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/ServerProtocolFactory.java new file mode 100644 index 0000000000..a359d4caeb --- /dev/null +++ b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/ServerProtocolFactory.java @@ -0,0 +1,29 @@ +/*************************************************************************** + * Copyright (c) 2004-2007 Eike Stepper, Germany. + * 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.internal.net4j.transport; + +import org.eclipse.net4j.transport.IProtocol; + +import org.eclipse.internal.net4j.bundle.Net4j; +import org.eclipse.internal.net4j.util.factory.Factory; + +/** + * @author Eike Stepper + */ +public abstract class ServerProtocolFactory<PRODUCT extends IProtocol> extends Factory<PRODUCT> +{ + public static final String SERVER_PROTOCOL_GROUP = Net4j.BUNDLE_ID + ".serverProtocols"; + + public ServerProtocolFactory(String type) + { + super(SERVER_PROTOCOL_GROUP, type); + } +} diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/TransportContainer.java b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/TransportContainer.java new file mode 100644 index 0000000000..f75c6c6d07 --- /dev/null +++ b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/transport/TransportContainer.java @@ -0,0 +1,130 @@ +/*************************************************************************** + * Copyright (c) 2004, 2005, 2006 Eike Stepper, Germany. + * 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.internal.net4j.transport; + +import org.eclipse.net4j.transport.IBufferProvider; +import org.eclipse.net4j.transport.ITransportContainer; +import org.eclipse.net4j.transport.TransportUtil; +import org.eclipse.net4j.util.container.IElementProcessor; +import org.eclipse.net4j.util.container.IManagedContainer; + +import org.eclipse.internal.net4j.bundle.Net4j; +import org.eclipse.internal.net4j.util.container.ManagedContainer; + +import java.text.MessageFormat; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadFactory; + +/** + * @author Eike Stepper + */ +public class TransportContainer extends ManagedContainer implements ITransportContainer +{ + public static final String EXECUTOR_SERVICE_GROUP = Net4j.BUNDLE_ID + ".executorServices"; + + public static final String BUFFER_PROVIDER_GROUP = Net4j.BUNDLE_ID + ".bufferProviders"; + + public static final short DEFAULT_BUFFER_CAPACITY = 4096; + + public static final ThreadFactory THREAD_FACTORY = new ThreadFactory() + { + public Thread newThread(Runnable r) + { + Thread thread = new Thread(r); + thread.setDaemon(true); + return thread; + } + }; + + private short bufferCapacity; + + public TransportContainer(short bufferCapacity) + { + this.bufferCapacity = bufferCapacity; + putElement(BUFFER_PROVIDER_GROUP, null, null, createBufferProvider()); + putElement(EXECUTOR_SERVICE_GROUP, null, null, createExecutorService()); + addPostProcessor(new PostProcessor()); + } + + public TransportContainer() + { + this(DEFAULT_BUFFER_CAPACITY); + } + + public short getBufferCapacity() + { + return bufferCapacity; + } + + public BufferProvider getBufferProvider() + { + return (BufferProvider)getElement(BUFFER_PROVIDER_GROUP, null, null); + } + + public ExecutorService getExecutorService() + { + return (ExecutorService)getElement(EXECUTOR_SERVICE_GROUP, null, null); + } + + public Acceptor getAcceptor(String type, String description) + { + return (Acceptor)getElement(AcceptorFactory.ACCEPTOR_GROUP, type, description); + } + + public Connector getConnector(String type, String description) + { + return (Connector)getElement(ConnectorFactory.CONNECTOR_GROUP, type, description); + } + + @Override + public String toString() + { + return MessageFormat.format("TransportContainer[{0}]", bufferCapacity); + } + + protected IBufferProvider createBufferProvider() + { + return TransportUtil.createBufferPool(getBufferCapacity()); + } + + protected ExecutorService createExecutorService() + { + return Executors.newCachedThreadPool(THREAD_FACTORY); + } + + /** + * @author Eike Stepper + */ + private final class PostProcessor implements IElementProcessor + { + public Object process(final IManagedContainer container, final String productGroup, final String factoryType, + final String description, final Object element) + { + if (element instanceof Acceptor) + { + Acceptor acceptor = (Acceptor)element; + acceptor.setBufferProvider(getBufferProvider()); + acceptor.setReceiveExecutor(getExecutorService()); + acceptor.setFactoryRegistry(getFactoryRegistry()); + } + else if (element instanceof Connector) + { + Connector connector = (Connector)element; + connector.setBufferProvider(getBufferProvider()); + connector.setReceiveExecutor(getExecutorService()); + connector.setFactoryRegistry(getFactoryRegistry()); + } + + return element; + } + } +} diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/util/container/ManagedContainer.java b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/util/container/ManagedContainer.java index 667eb1914a..0c3da3d082 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/util/container/ManagedContainer.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/util/container/ManagedContainer.java @@ -12,13 +12,16 @@ package org.eclipse.internal.net4j.util.container; import org.eclipse.net4j.util.ObjectUtil; import org.eclipse.net4j.util.container.IContainerDelta; +import org.eclipse.net4j.util.container.IElementProcessor; import org.eclipse.net4j.util.container.IManagedContainer; import org.eclipse.net4j.util.factory.IFactory; +import org.eclipse.net4j.util.factory.IFactoryKey; import org.eclipse.net4j.util.lifecycle.LifecycleUtil; import org.eclipse.net4j.util.registry.IRegistry; -import org.eclipse.internal.net4j.util.event.Notifier; +import org.eclipse.internal.net4j.bundle.Net4j; import org.eclipse.internal.net4j.util.factory.FactoryKey; +import org.eclipse.internal.net4j.util.lifecycle.Lifecycle; import org.eclipse.internal.net4j.util.registry.HashMapRegistry; import java.io.IOException; @@ -27,6 +30,7 @@ import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.io.Serializable; +import java.text.MessageFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -36,49 +40,54 @@ import java.util.Map.Entry; /** * @author Eike Stepper */ -public class ManagedContainer extends Notifier implements IManagedContainer +public class ManagedContainer extends Lifecycle implements IManagedContainer { - private IRegistry<FactoryKey, IFactory> factoryRegistry = new HashMapRegistry(); + private IRegistry<IFactoryKey, IFactory> factoryRegistry; + + private List<IElementProcessor> postProcessors; private IRegistry<ElementKey, Object> elementRegistry = new HashMapRegistry(); private long maxElementID; - public IFactory[] getFactories() + public ManagedContainer() { - return factoryRegistry.values().toArray(new IFactory[factoryRegistry.size()]); } - public IFactory[] getFactories(String productGroup) + public synchronized IRegistry<IFactoryKey, IFactory> getFactoryRegistry() { - List<IFactory> result = new ArrayList(); - for (IFactory factory : factoryRegistry.values()) + if (factoryRegistry == null) { - if (ObjectUtil.equals(factory.getProductGroup(), productGroup)) - { - result.add(factory); - } + factoryRegistry = createFactoryRegistry(); } - return result.toArray(new IFactory[result.size()]); + return factoryRegistry; } - public IFactory getFactory(String productGroup, String factoryType) + public ManagedContainer registerFactory(IFactory factory) { - FactoryKey key = new FactoryKey(productGroup, factoryType); - return factoryRegistry.get(key); + getFactoryRegistry().put(factory.getKey(), factory); + return this; } - public void registerFactory(IFactory factory) + public synchronized List<IElementProcessor> getPostProcessors() { - FactoryKey key = new FactoryKey(factory.getProductGroup(), factory.getType()); - factoryRegistry.put(key, factory); + if (postProcessors == null) + { + postProcessors = createPostProcessors(); + } + + return postProcessors; } - public void deregisterFactory(IFactory factory) + public void addPostProcessor(IElementProcessor postProcessor) { - FactoryKey key = new FactoryKey(factory.getProductGroup(), factory.getType()); - factoryRegistry.remove(key); + getPostProcessors().add(postProcessor); + } + + public void removePostProcessor(IElementProcessor postProcessor) + { + getPostProcessors().remove(postProcessor); } public boolean isEmpty() @@ -133,6 +142,8 @@ public class ManagedContainer extends Notifier implements IManagedContainer element = createElement(productGroup, factoryType, description); if (element != null) { + element = postProcessElement(productGroup, factoryType, description, element); + LifecycleUtil.activate(element); key.setID(++maxElementID); elementRegistry.put(key, element); fireEvent(new SingleDeltaContainerEvent(this, element, IContainerDelta.Kind.ADDED)); @@ -143,6 +154,29 @@ public class ManagedContainer extends Notifier implements IManagedContainer } } + /** + * TODO Replace usages by factories (BufferProvider, ExecutorService, + * ProtocolFactoryRegistry) + */ + public Object putElement(String productGroup, String factoryType, String description, Object element) + { + synchronized (elementRegistry) + { + ContainerEvent event = new ContainerEvent(this); + ElementKey key = new ElementKey(productGroup, factoryType, description); + key.setID(++maxElementID); + Object oldElement = elementRegistry.put(key, element); + if (oldElement != null) + { + event.addDelta(oldElement, IContainerDelta.Kind.REMOVED); + } + + event.addDelta(element, IContainerDelta.Kind.ADDED); + fireEvent(event); + return oldElement; + } + } + public Object removeElement(String productGroup, String factoryType, String description) { ElementKey key = new ElementKey(productGroup, factoryType, description); @@ -219,9 +253,26 @@ public class ManagedContainer extends Notifier implements IManagedContainer } } + @Override + public String toString() + { + return "ManagedContainer"; + } + + protected HashMapRegistry createFactoryRegistry() + { + return new HashMapRegistry(); + } + + protected ArrayList createPostProcessors() + { + return new ArrayList(); + } + protected Object createElement(String productGroup, String factoryType, String description) { - IFactory factory = getFactory(productGroup, factoryType); + FactoryKey key = new FactoryKey(productGroup, factoryType); + IFactory factory = getFactoryRegistry().get(key); if (factory != null) { return factory.create(description); @@ -230,6 +281,16 @@ public class ManagedContainer extends Notifier implements IManagedContainer return null; } + protected Object postProcessElement(String productGroup, String factoryType, String description, Object element) + { + for (IElementProcessor processor : getPostProcessors()) + { + element = processor.process(this, productGroup, factoryType, description, element); + } + + return element; + } + protected void initMaxElementID() { synchronized (elementRegistry) @@ -246,6 +307,23 @@ public class ManagedContainer extends Notifier implements IManagedContainer } } + @Override + protected void doDeactivate() throws Exception + { + for (Object element : elementRegistry.values()) + { + try + { + LifecycleUtil.deactivateNoisy(element); + } + catch (RuntimeException ex) + { + Net4j.LOG.error(ex); + } + } + super.doDeactivate(); + } + /** * @author Eike Stepper */ @@ -312,6 +390,12 @@ public class ManagedContainer extends Notifier implements IManagedContainer return ObjectUtil.hashCode(productGroup) ^ ObjectUtil.hashCode(factoryType) ^ ObjectUtil.hashCode(description); } + @Override + public String toString() + { + return MessageFormat.format("{0}[{1}, {2}]", productGroup, factoryType, description); + } + public int compareTo(Object o) { if (o instanceof ElementKey) diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/util/container/PluginElementProcessorList.java b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/util/container/PluginElementProcessorList.java new file mode 100644 index 0000000000..4feabbbf97 --- /dev/null +++ b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/util/container/PluginElementProcessorList.java @@ -0,0 +1,80 @@ +/*************************************************************************** + * Copyright (c) 2004, 2005, 2006 Eike Stepper, Germany. + * 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.internal.net4j.util.container; + +import org.eclipse.net4j.util.container.IElementProcessor; + +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.IExtensionDelta; +import org.eclipse.core.runtime.IExtensionRegistry; +import org.eclipse.core.runtime.IRegistryChangeEvent; +import org.eclipse.core.runtime.IRegistryChangeListener; +import org.eclipse.core.runtime.Platform; +import org.eclipse.internal.net4j.bundle.Net4j; +import org.eclipse.internal.net4j.util.lifecycle.Lifecycle; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Eike Stepper + */ +public class PluginElementProcessorList extends Lifecycle +{ + private static final String ATTR_CLASS = "class"; + + public static final String NAMESPACE = Net4j.BUNDLE_ID; + + public static final String EXT_POINT = "postProcessors"; + + private List<IElementProcessor> processors = new ArrayList(); + + private IRegistryChangeListener extensionRegistryListener = new IRegistryChangeListener() + { + public void registryChanged(IRegistryChangeEvent event) + { + IExtensionDelta[] deltas = event.getExtensionDeltas(NAMESPACE, EXT_POINT); + for (IExtensionDelta delta : deltas) + { + // TODO Handle ExtensionDelta + Net4j.LOG.warn("ExtensionDelta not handled: " + delta); + } + } + }; + + public PluginElementProcessorList() + { + } + + @Override + protected void doActivate() throws Exception + { + super.doActivate(); + IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry(); + IConfigurationElement[] elements = extensionRegistry.getConfigurationElementsFor(NAMESPACE, EXT_POINT); + for (IConfigurationElement element : elements) + { + IElementProcessor processor = (IElementProcessor)element.createExecutableExtension(ATTR_CLASS); + processors.add(processor); + } + + extensionRegistry.addRegistryChangeListener(extensionRegistryListener, NAMESPACE); + } + + @Override + protected void doDeactivate() throws Exception + { + IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry(); + extensionRegistry.removeRegistryChangeListener(extensionRegistryListener); + processors.clear(); + super.doDeactivate(); + } +} diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/util/factory/Factory.java b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/util/factory/Factory.java index 61bcf1f186..9ba58f29cb 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/util/factory/Factory.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/util/factory/Factory.java @@ -12,6 +12,8 @@ package org.eclipse.internal.net4j.util.factory; import org.eclipse.net4j.util.factory.IFactory; +import java.text.MessageFormat; + /** * @author Eike Stepper */ @@ -19,9 +21,14 @@ public abstract class Factory<PRODUCT> implements IFactory<PRODUCT> { private FactoryKey key; + public Factory(FactoryKey key) + { + this.key = key; + } + public Factory(String productGroup, String type) { - key = new FactoryKey(productGroup, type); + this(new FactoryKey(productGroup, type)); } public FactoryKey getKey() @@ -29,18 +36,24 @@ public abstract class Factory<PRODUCT> implements IFactory<PRODUCT> return key; } - public String getFactoryType() + public String getProductGroup() { - return key.getFactoryType(); + return key.getProductGroup(); } - public String getProductGroup() + public String getType() { - return key.getProductGroup(); + return key.getType(); + } + + public String getDescriptionFor(PRODUCT product) + { + return null; } + @Override public String toString() { - return key.toString(); + return MessageFormat.format("Factory[{0}, {1}]", getProductGroup(), getType()); } } diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/util/factory/FactoryCreationException.java b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/util/factory/FactoryCreationException.java new file mode 100644 index 0000000000..135f80892a --- /dev/null +++ b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/util/factory/FactoryCreationException.java @@ -0,0 +1,38 @@ +/*************************************************************************** + * Copyright (c) 2004, 2005, 2006 Eike Stepper, Germany. + * 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.internal.net4j.util.factory; + +/** + * @author Eike Stepper + */ +public class FactoryCreationException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + public FactoryCreationException() + { + } + + public FactoryCreationException(String message) + { + super(message); + } + + public FactoryCreationException(Throwable cause) + { + super(cause); + } + + public FactoryCreationException(String message, Throwable cause) + { + super(message, cause); + } +} diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/util/factory/FactoryDescriptor.java b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/util/factory/FactoryDescriptor.java new file mode 100644 index 0000000000..71e988a54d --- /dev/null +++ b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/util/factory/FactoryDescriptor.java @@ -0,0 +1,71 @@ +/*************************************************************************** + * Copyright (c) 2004, 2005, 2006 Eike Stepper, Germany. + * 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.internal.net4j.util.factory; + +import org.eclipse.net4j.util.factory.IFactory; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IConfigurationElement; + +/** + * @author Eike Stepper + */ +public class FactoryDescriptor extends Factory +{ + private static final String ATTR_PRODUCT_GROUP = "productGroup"; + + private static final String ATTR_TYPE = "type"; + + private static final String ATTR_CLASS = "class"; + + private IConfigurationElement configurationElement; + + public FactoryDescriptor(IConfigurationElement configurationElement) + { + super(createFactoryKey(configurationElement)); + this.configurationElement = configurationElement; + } + + public IConfigurationElement getConfigurationElement() + { + return configurationElement; + } + + public IFactory createFactory() + { + try + { + return (IFactory)configurationElement.createExecutableExtension(ATTR_CLASS); + } + catch (CoreException ex) + { + throw new FactoryCreationException(ex); + } + } + + public Object create(String description) + { + throw new UnsupportedOperationException(); + } + + @Override + public String getDescriptionFor(Object product) + { + throw new UnsupportedOperationException(); + } + + private static FactoryKey createFactoryKey(IConfigurationElement element) + { + String productGroup = element.getAttribute(ATTR_PRODUCT_GROUP); + String type = element.getAttribute(ATTR_TYPE); + return new FactoryKey(productGroup, type); + } +} diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/util/factory/FactoryKey.java b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/util/factory/FactoryKey.java index abdb7bedad..a305494362 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/util/factory/FactoryKey.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/util/factory/FactoryKey.java @@ -1,6 +1,8 @@ package org.eclipse.internal.net4j.util.factory; import org.eclipse.net4j.util.ObjectUtil; +import org.eclipse.net4j.util.StringUtil; +import org.eclipse.net4j.util.factory.IFactoryKey; import java.io.Serializable; import java.text.MessageFormat; @@ -8,18 +10,18 @@ import java.text.MessageFormat; /** * @author Eike Stepper */ -public final class FactoryKey implements Serializable +public final class FactoryKey implements IFactoryKey, Serializable, Comparable { private static final long serialVersionUID = 1L; private String productGroup; - private String factoryType; + private String type; - public FactoryKey(String productGroup, String factoryType) + public FactoryKey(String productGroup, String type) { this.productGroup = productGroup; - this.factoryType = factoryType; + this.type = type; } public String getProductGroup() @@ -27,9 +29,9 @@ public final class FactoryKey implements Serializable return productGroup; } - public String getFactoryType() + public String getType() { - return factoryType; + return type; } @Override @@ -38,7 +40,7 @@ public final class FactoryKey implements Serializable if (obj instanceof FactoryKey) { FactoryKey key = (FactoryKey)obj; - return ObjectUtil.equals(productGroup, key.productGroup) && ObjectUtil.equals(factoryType, key.factoryType); + return ObjectUtil.equals(productGroup, key.productGroup) && ObjectUtil.equals(type, key.type); } return false; @@ -47,12 +49,29 @@ public final class FactoryKey implements Serializable @Override public int hashCode() { - return ObjectUtil.hashCode(productGroup) ^ ObjectUtil.hashCode(factoryType); + return ObjectUtil.hashCode(productGroup) ^ ObjectUtil.hashCode(type); } @Override public String toString() { - return MessageFormat.format("{0}[{1}]", productGroup, factoryType); + return MessageFormat.format("{0}[{1}]", productGroup, type); + } + + public int compareTo(Object o) + { + if (o instanceof FactoryKey) + { + FactoryKey key = (FactoryKey)o; + int result = StringUtil.compare(productGroup, key.productGroup); + if (result == 0) + { + result = StringUtil.compare(type, key.type); + } + + return result; + } + + return 0; } }
\ No newline at end of file diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/util/factory/PluginFactoryRegistry.java b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/util/factory/PluginFactoryRegistry.java new file mode 100644 index 0000000000..6910337236 --- /dev/null +++ b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/util/factory/PluginFactoryRegistry.java @@ -0,0 +1,91 @@ +/*************************************************************************** + * Copyright (c) 2004, 2005, 2006 Eike Stepper, Germany. + * 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.internal.net4j.util.factory; + +import org.eclipse.net4j.util.factory.IFactory; +import org.eclipse.net4j.util.factory.IFactoryKey; + +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.IExtensionDelta; +import org.eclipse.core.runtime.IExtensionRegistry; +import org.eclipse.core.runtime.IRegistryChangeEvent; +import org.eclipse.core.runtime.IRegistryChangeListener; +import org.eclipse.core.runtime.Platform; +import org.eclipse.internal.net4j.bundle.Net4j; +import org.eclipse.internal.net4j.util.registry.HashMapRegistry; + +/** + * @author Eike Stepper + */ +public class PluginFactoryRegistry extends HashMapRegistry<IFactoryKey, IFactory> +{ + public static final String NAMESPACE = Net4j.BUNDLE_ID; + + public static final String EXT_POINT = "factories"; + + private IRegistryChangeListener extensionRegistryListener = new IRegistryChangeListener() + { + public void registryChanged(IRegistryChangeEvent event) + { + IExtensionDelta[] deltas = event.getExtensionDeltas(NAMESPACE, EXT_POINT); + for (IExtensionDelta delta : deltas) + { + // TODO Handle ExtensionDelta + Net4j.LOG.warn("ExtensionDelta not handled: " + delta); + } + } + }; + + public PluginFactoryRegistry() + { + } + + @Override + public IFactory get(Object key) + { + IFactory factory = super.get(key); + if (factory instanceof FactoryDescriptor) + { + FactoryDescriptor descriptor = (FactoryDescriptor)factory; + factory = descriptor.createFactory(); + } + + return factory; + } + + public void registerFactory(FactoryDescriptor factory) + { + put(factory.getKey(), factory); + } + + @Override + protected void doActivate() throws Exception + { + super.doActivate(); + IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry(); + IConfigurationElement[] elements = extensionRegistry.getConfigurationElementsFor(NAMESPACE, EXT_POINT); + for (IConfigurationElement element : elements) + { + registerFactory(new FactoryDescriptor(element)); + } + + extensionRegistry.addRegistryChangeListener(extensionRegistryListener, NAMESPACE); + } + + @Override + protected void doDeactivate() throws Exception + { + IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry(); + extensionRegistry.removeRegistryChangeListener(extensionRegistryListener); + clear(); + super.doDeactivate(); + } +} diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/util/registry/Registry.java b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/util/registry/Registry.java index adb1f581cf..3417deb9e9 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/util/registry/Registry.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/util/registry/Registry.java @@ -14,7 +14,7 @@ import org.eclipse.net4j.util.container.IContainerDelta; import org.eclipse.net4j.util.registry.IRegistry; import org.eclipse.internal.net4j.bundle.Net4j; -import org.eclipse.internal.net4j.util.event.Notifier; +import org.eclipse.internal.net4j.util.lifecycle.Lifecycle; import java.util.Collection; import java.util.Iterator; @@ -24,7 +24,7 @@ import java.util.Set; /** * @author Eike Stepper */ -public abstract class Registry<K, V> extends Notifier implements IRegistry<K, V> +public abstract class Registry<K, V> extends Lifecycle implements IRegistry<K, V> { private boolean autoCommit; diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/SignalProtocol.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/SignalProtocol.java index 53e68427b1..0bb9f3a5bd 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/SignalProtocol.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/SignalProtocol.java @@ -14,12 +14,10 @@ import org.eclipse.net4j.stream.BufferInputStream; import org.eclipse.net4j.stream.ChannelOutputStream; import org.eclipse.net4j.transport.IBuffer; import org.eclipse.net4j.transport.IBufferProvider; -import org.eclipse.net4j.transport.IChannel; import org.eclipse.net4j.util.om.trace.ContextTracer; import org.eclipse.internal.net4j.bundle.Net4j; import org.eclipse.internal.net4j.transport.BufferUtil; -import org.eclipse.internal.net4j.transport.Channel; import org.eclipse.internal.net4j.transport.Protocol; import java.nio.ByteBuffer; @@ -43,27 +41,17 @@ public abstract class SignalProtocol extends Protocol private static final ContextTracer STREAM_TRACER = new ContextTracer(Net4j.DEBUG_BUFFER_STREAM, SignalOutputStream.class); - private ExecutorService executorService; - private Map<Integer, Signal> signals = new ConcurrentHashMap(0); private int nextCorrelationID = MIN_CORRELATION_ID; - protected SignalProtocol(IChannel channel, ExecutorService executorService) + protected SignalProtocol() { - super(channel); - - if (executorService == null) - { - throw new IllegalArgumentException("executorService == null"); //$NON-NLS-1$ - } - - this.executorService = executorService; } - protected SignalProtocol(IChannel channel) + public ExecutorService getExecutorService() { - this(channel, ((Channel)channel).getReceiveExecutor()); + return getChannel().getConnector().getReceiveExecutor(); } public boolean waitForSignals(long timeout) @@ -114,7 +102,7 @@ public abstract class SignalProtocol extends Protocol signal.setInputStream(new SignalInputStream(getInputStreamTimeout())); signal.setOutputStream(new SignalOutputStream(-correlationID, signalID, false)); signals.put(-correlationID, signal); - executorService.execute(signal); + getExecutorService().execute(signal); } } else @@ -143,7 +131,7 @@ public abstract class SignalProtocol extends Protocol @Override public String toString() { - return "SignalProtocol[" + getProtocolID() + ", " + getChannel() + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + return "SignalProtocol[" + getType() + ", " + getChannel() + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } protected abstract SignalReactor createSignalReactor(short signalID); diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/transport/IAcceptor.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/transport/IAcceptor.java index 7aa19b37c4..df3688d649 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/transport/IAcceptor.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/transport/IAcceptor.java @@ -10,12 +10,12 @@ **************************************************************************/ package org.eclipse.net4j.transport; -import org.eclipse.net4j.util.event.INotifier; +import org.eclipse.net4j.util.container.IContainer; /** * @author Eike Stepper */ -public interface IAcceptor extends INotifier +public interface IAcceptor extends IContainer<IConnector> { public IConnector[] getAcceptedConnectors(); } diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/transport/IAcceptorAcceptedEvent.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/transport/IAcceptorEvent.java index 5022b3dbd6..578565e298 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/transport/IAcceptorAcceptedEvent.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/transport/IAcceptorEvent.java @@ -10,12 +10,14 @@ **************************************************************************/ package org.eclipse.net4j.transport; -import org.eclipse.net4j.util.event.IEvent; +import org.eclipse.net4j.util.container.IContainerEvent; /** * @author Eike Stepper */ -public interface IAcceptorAcceptedEvent extends IEvent +public interface IAcceptorEvent extends IContainerEvent<IConnector> { + public IAcceptor getAcceptor(); + public IConnector getConnector(); } diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/transport/IConnector.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/transport/IConnector.java index 88b4722857..bc9049d800 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/transport/IConnector.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/transport/IConnector.java @@ -10,7 +10,7 @@ **************************************************************************/ package org.eclipse.net4j.transport; -import org.eclipse.net4j.util.event.INotifier; +import org.eclipse.net4j.util.container.IContainer; import org.eclipse.internal.net4j.transport.Channel; import org.eclipse.internal.net4j.transport.Connector; @@ -31,7 +31,7 @@ import org.eclipse.internal.net4j.transport.Connector; * * @author Eike Stepper */ -public interface IConnector extends INotifier +public interface IConnector extends IContainer<IChannel> { public ConnectorLocation getLocation(); @@ -102,6 +102,4 @@ public interface IConnector extends INotifier * @see #openChannel() */ public IChannel openChannel(String protocolID) throws ConnectorException; - - public IChannel openChannel(String protocolID, Object protocolData) throws ConnectorException; } diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/transport/IConnectorChannelsEvent.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/transport/IConnectorChannelsEvent.java index fcff07fea7..e2a674dd96 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/transport/IConnectorChannelsEvent.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/transport/IConnectorChannelsEvent.java @@ -17,5 +17,7 @@ import org.eclipse.net4j.util.container.IContainerEvent; */ public interface IConnectorChannelsEvent extends IContainerEvent<IChannel> { + public IConnector getConnector(); + public IChannel getChannel(); } diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/transport/IProtocol.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/transport/IProtocol.java index a1eebd7d39..60a5cd5eb5 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/transport/IProtocol.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/transport/IProtocol.java @@ -15,7 +15,9 @@ package org.eclipse.net4j.transport; */ public interface IProtocol extends IBufferHandler { - public String getProtocolID(); + public String getType(); public IChannel getChannel(); + + public void setChannel(IChannel channel); } diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/transport/IProtocolFactory.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/transport/IProtocolFactory.java deleted file mode 100644 index 047d471a81..0000000000 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/transport/IProtocolFactory.java +++ /dev/null @@ -1,43 +0,0 @@ -/*************************************************************************** - * Copyright (c) 2004-2007 Eike Stepper, Germany. - * 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.transport; - -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; - -/** - * @author Eike Stepper - */ -public interface IProtocolFactory -{ - public static final Set<ConnectorLocation> FOR_CLIENTS = Collections.singleton(ConnectorLocation.CLIENT); - - public static final Set<ConnectorLocation> FOR_SERVERS = Collections.singleton(ConnectorLocation.SERVER); - - public static final Set<ConnectorLocation> SYMMETRIC = Collections.unmodifiableSet(new HashSet(Arrays - .asList(new ConnectorLocation[] { ConnectorLocation.CLIENT, ConnectorLocation.SERVER }))); - - public String getProtocolID(); - - public Set<ConnectorLocation> getLocations(); - - public boolean isForClients(); - - public boolean isForServers(); - - public boolean isSymmetric(); - - public IProtocolFactoryID getID(ConnectorLocation location); - - public IProtocol createProtocol(IChannel channel, Object protocolData); -}
\ No newline at end of file diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/transport/ITransportContainer.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/transport/ITransportContainer.java new file mode 100644 index 0000000000..0dba548671 --- /dev/null +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/transport/ITransportContainer.java @@ -0,0 +1,21 @@ +package org.eclipse.net4j.transport; + +import org.eclipse.net4j.util.container.IManagedContainer; + +import java.util.concurrent.ExecutorService; + +/** + * @author Eike Stepper + */ +public interface ITransportContainer extends IManagedContainer +{ + public short getBufferCapacity(); + + public IBufferProvider getBufferProvider(); + + public ExecutorService getExecutorService(); + + public IAcceptor getAcceptor(String type, String description); + + public IConnector getConnector(String type, String description); +} diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/ReflectUtil.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/ReflectUtil.java index 8488783487..c986a07af5 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/ReflectUtil.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/ReflectUtil.java @@ -20,6 +20,7 @@ import java.lang.annotation.Target; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.util.Collection; import java.util.Map; import java.util.WeakHashMap; @@ -209,8 +210,28 @@ public final class ReflectUtil builder.append(segmentPrefix); builder.append(field.getName()); builder.append(" = "); //$NON-NLS-1$ - builder.append(getValue(object, field)); - builder.append(NL); + + Object value = getValue(object, field); + if (value instanceof Map) + { + value = ((Map)value).entrySet(); + } + + if (value instanceof Collection) + { + builder.append(NL); + for (Object element : (Collection)value) + { + builder.append(" "); + builder.append(element); + builder.append(NL); + } + } + else + { + builder.append(value); + builder.append(NL); + } } } diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/StringUtil.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/StringUtil.java index cc0ac52744..864ab279cb 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/StringUtil.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/StringUtil.java @@ -31,6 +31,21 @@ public final class StringUtil return str; } + public static int compare(String s1, String s2) + { + if (s1 == null) + { + return s2 == null ? 0 : -1; + } + + if (s2 == null) + { + return 1; + } + + return s1.compareTo(s2); + } + public static int occurrences(String str, char c) { int count = 0; @@ -41,4 +56,9 @@ public final class StringUtil return count; } + + public static boolean isEmpty(String str) + { + return str == null || str.length() == 0; + } } diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/container/IElementProcessor.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/container/IElementProcessor.java new file mode 100644 index 0000000000..ae70097406 --- /dev/null +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/container/IElementProcessor.java @@ -0,0 +1,20 @@ +/*************************************************************************** + * Copyright (c) 2004, 2005, 2006 Eike Stepper, Germany. + * 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.util.container; + +/** + * @author Eike Stepper + */ +public interface IElementProcessor +{ + public Object process(IManagedContainer container, String productGroup, String factoryType, String description, + Object element); +} diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/container/IManagedContainer.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/container/IManagedContainer.java index 90ccb5527e..68f9ab6966 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/container/IManagedContainer.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/container/IManagedContainer.java @@ -11,25 +11,26 @@ package org.eclipse.net4j.util.container; import org.eclipse.net4j.util.factory.IFactory; +import org.eclipse.net4j.util.factory.IFactoryKey; +import org.eclipse.net4j.util.registry.IRegistry; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.List; /** * @author Eike Stepper */ public interface IManagedContainer extends IContainer { - public IFactory[] getFactories(); + public IRegistry<IFactoryKey, IFactory> getFactoryRegistry(); - public IFactory[] getFactories(String productGroup); + public List<IElementProcessor> getPostProcessors(); - public IFactory getFactory(String productGroup, String factoryType); + public void addPostProcessor(IElementProcessor postProcessor); - public void registerFactory(IFactory factory); - - public void deregisterFactory(IFactory factory); + public void removePostProcessor(IElementProcessor postProcessor); public Object[] getElements(String productGroup); diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/factory/IFactory.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/factory/IFactory.java index 92b752d4c2..add5be74c4 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/factory/IFactory.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/factory/IFactory.java @@ -15,11 +15,9 @@ package org.eclipse.net4j.util.factory; */ public interface IFactory<PRODUCT> { - public String getProductGroup(); + public IFactoryKey getKey(); - public String getType(); - - public PRODUCT create(String description); + public PRODUCT create(String description) throws ProductCreationException; public String getDescriptionFor(PRODUCT product); } diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/transport/IProtocolFactoryID.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/factory/IFactoryKey.java index e5e1256fc0..4862e8f586 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/transport/IProtocolFactoryID.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/factory/IFactoryKey.java @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (c) 2004-2007 Eike Stepper, Germany. + * Copyright (c) 2004, 2005, 2006 Eike Stepper, Germany. * 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 @@ -8,14 +8,14 @@ * Contributors: * Eike Stepper - initial API and implementation **************************************************************************/ -package org.eclipse.net4j.transport; +package org.eclipse.net4j.util.factory; /** * @author Eike Stepper */ -public interface IProtocolFactoryID +public interface IFactoryKey { - public ConnectorLocation getLocation(); + public String getProductGroup(); - public String getProtocolID(); + public String getType(); } diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/factory/ProductCreationException.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/factory/ProductCreationException.java new file mode 100644 index 0000000000..c2bba42c07 --- /dev/null +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/factory/ProductCreationException.java @@ -0,0 +1,38 @@ +/*************************************************************************** + * Copyright (c) 2004, 2005, 2006 Eike Stepper, Germany. + * 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.util.factory; + +/** + * @author Eike Stepper + */ +public class ProductCreationException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + public ProductCreationException() + { + } + + public ProductCreationException(String message) + { + super(message); + } + + public ProductCreationException(Throwable cause) + { + super(cause); + } + + public ProductCreationException(String message, Throwable cause) + { + super(message, cause); + } +} |