Author: philharveyonline Date: Fri Jan 25 12:27:13 2013 New Revision: 1438470
URL: http://svn.apache.org/viewvc?rev=1438470&view=rev Log: PROTON-192: finished reducing visibility of proton-j Engine constructors and replacing calls with factories. Also introduced ProtonJXXX interfaces so contrib is referring to these rather than concrete classes Added: qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ProtonJConnection.java - copied, changed from r1438469, qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslPeerDetailsImpl.java qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ProtonJSender.java - copied, changed from r1438469, qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslPeerDetailsImpl.java qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ProtonJSession.java - copied, changed from r1438469, qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslPeerDetailsImpl.java qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ProtonJTransport.java - copied, changed from r1438469, qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslPeerDetailsImpl.java qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/ProtonJSslDomain.java - copied, changed from r1438469, qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslPeerDetailsImpl.java qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/ProtonJSslPeerDetails.java - copied, changed from r1438469, qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslPeerDetailsImpl.java Modified: qpid/proton/branches/jni-binding/proton-j/contrib/proton-hawtdispatch/src/main/java/org/apache/qpid/proton/hawtdispatch/api/AmqpConnection.java qpid/proton/branches/jni-binding/proton-j/contrib/proton-hawtdispatch/src/main/java/org/apache/qpid/proton/hawtdispatch/api/AmqpReceiver.java qpid/proton/branches/jni-binding/proton-j/contrib/proton-hawtdispatch/src/main/java/org/apache/qpid/proton/hawtdispatch/api/AmqpSender.java qpid/proton/branches/jni-binding/proton-j/contrib/proton-hawtdispatch/src/main/java/org/apache/qpid/proton/hawtdispatch/api/AmqpSession.java qpid/proton/branches/jni-binding/proton-j/contrib/proton-hawtdispatch/src/main/java/org/apache/qpid/proton/hawtdispatch/api/MessageDelivery.java qpid/proton/branches/jni-binding/proton-j/contrib/proton-hawtdispatch/src/main/java/org/apache/qpid/proton/hawtdispatch/impl/AmqpListener.java qpid/proton/branches/jni-binding/proton-j/contrib/proton-hawtdispatch/src/main/java/org/apache/qpid/proton/hawtdispatch/impl/AmqpTransport.java qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ConnectionImpl.java qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/EngineFactoryImpl.java qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/PlainTransportWrapper.java qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/SenderImpl.java qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/SessionImpl.java qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslDomainImpl.java qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslImpl.java qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslPeerDetailsImpl.java Modified: qpid/proton/branches/jni-binding/proton-j/contrib/proton-hawtdispatch/src/main/java/org/apache/qpid/proton/hawtdispatch/api/AmqpConnection.java URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/proton-j/contrib/proton-hawtdispatch/src/main/java/org/apache/qpid/proton/hawtdispatch/api/AmqpConnection.java?rev=1438470&r1=1438469&r2=1438470&view=diff ============================================================================== --- qpid/proton/branches/jni-binding/proton-j/contrib/proton-hawtdispatch/src/main/java/org/apache/qpid/proton/hawtdispatch/api/AmqpConnection.java (original) +++ qpid/proton/branches/jni-binding/proton-j/contrib/proton-hawtdispatch/src/main/java/org/apache/qpid/proton/hawtdispatch/api/AmqpConnection.java Fri Jan 25 12:27:13 2013 @@ -24,6 +24,8 @@ import org.apache.qpid.proton.engine.End import org.apache.qpid.proton.engine.EndpointError; import org.apache.qpid.proton.engine.impl.ConnectionImpl; import org.apache.qpid.proton.engine.impl.ProtocolTracer; +import org.apache.qpid.proton.engine.impl.ProtonJConnection; +import org.apache.qpid.proton.engine.impl.ProtonJSession; import org.apache.qpid.proton.engine.impl.SessionImpl; import org.fusesource.hawtdispatch.DispatchQueue; import org.fusesource.hawtdispatch.Task; @@ -37,7 +39,7 @@ import java.util.HashSet; public class AmqpConnection extends AmqpEndpointBase { AmqpTransport transport; - ConnectionImpl connection; + ProtonJConnection connection; HashSet<AmqpSender> senders = new HashSet<AmqpSender>(); boolean closing = false; @@ -106,7 +108,7 @@ public class AmqpConnection extends Amqp public AmqpSession createSession() { assertExecuting(); - SessionImpl session = connection.session(); + ProtonJSession session = connection.session(); session.open(); pumpOut(); return new AmqpSession(this, session); Modified: qpid/proton/branches/jni-binding/proton-j/contrib/proton-hawtdispatch/src/main/java/org/apache/qpid/proton/hawtdispatch/api/AmqpReceiver.java URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/proton-j/contrib/proton-hawtdispatch/src/main/java/org/apache/qpid/proton/hawtdispatch/api/AmqpReceiver.java?rev=1438470&r1=1438469&r2=1438470&view=diff ============================================================================== --- qpid/proton/branches/jni-binding/proton-j/contrib/proton-hawtdispatch/src/main/java/org/apache/qpid/proton/hawtdispatch/api/AmqpReceiver.java (original) +++ qpid/proton/branches/jni-binding/proton-j/contrib/proton-hawtdispatch/src/main/java/org/apache/qpid/proton/hawtdispatch/api/AmqpReceiver.java Fri Jan 25 12:27:13 2013 @@ -17,32 +17,32 @@ package org.apache.qpid.proton.hawtdispatch.api; -import org.apache.qpid.proton.hawtdispatch.impl.Defer; +import java.util.LinkedList; + +import org.apache.qpid.proton.amqp.messaging.Accepted; import org.apache.qpid.proton.engine.Delivery; +import org.apache.qpid.proton.engine.Receiver; import org.apache.qpid.proton.engine.impl.DeliveryImpl; -import org.apache.qpid.proton.engine.impl.ReceiverImpl; -import org.apache.qpid.proton.amqp.messaging.Accepted; +import org.apache.qpid.proton.hawtdispatch.impl.Defer; import org.fusesource.hawtbuf.Buffer; import org.fusesource.hawtbuf.ByteArrayOutputStream; -import java.util.LinkedList; - /** * @author <a href="http://hiramchirino.com">Hiram Chirino</a> */ public class AmqpReceiver extends AmqpLink { final AmqpSession parent; - final ReceiverImpl receiver; + final Receiver receiver; - public AmqpReceiver(AmqpSession parent, ReceiverImpl receiver, QoS qos) { + public AmqpReceiver(AmqpSession parent, Receiver receiver2, QoS qos) { this.parent = parent; - this.receiver = receiver; + this.receiver = receiver2; attach(); } @Override - protected ReceiverImpl getEndpoint() { + protected Receiver getEndpoint() { return receiver; } @Override Modified: qpid/proton/branches/jni-binding/proton-j/contrib/proton-hawtdispatch/src/main/java/org/apache/qpid/proton/hawtdispatch/api/AmqpSender.java URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/proton-j/contrib/proton-hawtdispatch/src/main/java/org/apache/qpid/proton/hawtdispatch/api/AmqpSender.java?rev=1438470&r1=1438469&r2=1438470&view=diff ============================================================================== --- qpid/proton/branches/jni-binding/proton-j/contrib/proton-hawtdispatch/src/main/java/org/apache/qpid/proton/hawtdispatch/api/AmqpSender.java (original) +++ qpid/proton/branches/jni-binding/proton-j/contrib/proton-hawtdispatch/src/main/java/org/apache/qpid/proton/hawtdispatch/api/AmqpSender.java Fri Jan 25 12:27:13 2013 @@ -21,6 +21,7 @@ import org.apache.qpid.proton.hawtdispat import org.apache.qpid.proton.hawtdispatch.impl.Watch; import org.apache.qpid.proton.engine.Delivery; import org.apache.qpid.proton.engine.impl.DeliveryImpl; +import org.apache.qpid.proton.engine.impl.ProtonJSender; import org.apache.qpid.proton.engine.impl.SenderImpl; import org.apache.qpid.proton.message.Message; import org.apache.qpid.proton.amqp.messaging.Accepted; @@ -47,11 +48,11 @@ public class AmqpSender extends AmqpLink final AmqpSession parent; private final QoS qos; - final SenderImpl sender; + final ProtonJSender sender; - public AmqpSender(AmqpSession parent, SenderImpl sender, QoS qos) { + public AmqpSender(AmqpSession parent, ProtonJSender sender2, QoS qos) { this.parent = parent; - this.sender = sender; + this.sender = sender2; this.qos = qos; attach(); getConnection().senders.add(this); @@ -64,7 +65,7 @@ public class AmqpSender extends AmqpLink } @Override - protected SenderImpl getEndpoint() { + protected ProtonJSender getEndpoint() { return sender; } @@ -100,7 +101,7 @@ public class AmqpSender extends AmqpLink } Buffer currentBuffer; - DeliveryImpl currentDelivery; + Delivery currentDelivery; Defer deferedPumpDeliveries = new Defer() { public void run() { @@ -121,7 +122,7 @@ public class AmqpSender extends AmqpLink int sent = sender.send(currentBuffer.data, currentBuffer.offset, currentBuffer.length); currentBuffer.moveHead(sent); if( currentBuffer.length == 0 ) { - DeliveryImpl current = currentDelivery; + Delivery current = currentDelivery; MessageDelivery md = (MessageDelivery) current.getContext(); currentBuffer = null; currentDelivery = null; Modified: qpid/proton/branches/jni-binding/proton-j/contrib/proton-hawtdispatch/src/main/java/org/apache/qpid/proton/hawtdispatch/api/AmqpSession.java URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/proton-j/contrib/proton-hawtdispatch/src/main/java/org/apache/qpid/proton/hawtdispatch/api/AmqpSession.java?rev=1438470&r1=1438469&r2=1438470&view=diff ============================================================================== --- qpid/proton/branches/jni-binding/proton-j/contrib/proton-hawtdispatch/src/main/java/org/apache/qpid/proton/hawtdispatch/api/AmqpSession.java (original) +++ qpid/proton/branches/jni-binding/proton-j/contrib/proton-hawtdispatch/src/main/java/org/apache/qpid/proton/hawtdispatch/api/AmqpSession.java Fri Jan 25 12:27:13 2013 @@ -17,19 +17,22 @@ package org.apache.qpid.proton.hawtdispatch.api; +import java.util.UUID; + +import org.apache.qpid.proton.amqp.Binary; +import org.apache.qpid.proton.amqp.messaging.AmqpValue; +import org.apache.qpid.proton.amqp.messaging.Data; import org.apache.qpid.proton.amqp.messaging.Section; +import org.apache.qpid.proton.amqp.messaging.Source; +import org.apache.qpid.proton.amqp.messaging.Target; import org.apache.qpid.proton.amqp.transport.ReceiverSettleMode; +import org.apache.qpid.proton.amqp.transport.SenderSettleMode; import org.apache.qpid.proton.engine.Endpoint; import org.apache.qpid.proton.engine.Link; -import org.apache.qpid.proton.engine.impl.ReceiverImpl; -import org.apache.qpid.proton.engine.impl.SenderImpl; -import org.apache.qpid.proton.engine.impl.SessionImpl; +import org.apache.qpid.proton.engine.Receiver; +import org.apache.qpid.proton.engine.impl.ProtonJSender; +import org.apache.qpid.proton.engine.impl.ProtonJSession; import org.apache.qpid.proton.message.Message; -import org.apache.qpid.proton.amqp.Binary; -import org.apache.qpid.proton.amqp.messaging.*; -import org.apache.qpid.proton.amqp.transport.SenderSettleMode; - -import java.util.UUID; import org.apache.qpid.proton.message.impl.MessageImpl; /** @@ -38,10 +41,10 @@ import org.apache.qpid.proton.message.im public class AmqpSession extends AmqpEndpointBase { final AmqpConnection parent; - final SessionImpl session; + final ProtonJSession session; - public AmqpSession(AmqpConnection parent, SessionImpl session) { + public AmqpSession(AmqpConnection parent, ProtonJSession session) { this.parent = parent; this.session = session; attach(); @@ -67,7 +70,7 @@ public class AmqpSession extends AmqpEnd public AmqpSender createSender(Target target, QoS qos, String name) { assertExecuting(); - SenderImpl sender = session.sender(name); + ProtonJSender sender = session.sender(name); attach(); // Source source = new Source(); // source.setAddress(UUID.randomUUID().toString()); @@ -93,7 +96,7 @@ public class AmqpSession extends AmqpEnd public AmqpReceiver createReceiver(Source source, QoS qos, int prefetch, String name) { assertExecuting(); - ReceiverImpl receiver = session.receiver(name); + Receiver receiver = session.receiver(name); receiver.setSource(source); // Target target = new Target(); // target.setAddress(UUID.randomUUID().toString()); Modified: qpid/proton/branches/jni-binding/proton-j/contrib/proton-hawtdispatch/src/main/java/org/apache/qpid/proton/hawtdispatch/api/MessageDelivery.java URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/proton-j/contrib/proton-hawtdispatch/src/main/java/org/apache/qpid/proton/hawtdispatch/api/MessageDelivery.java?rev=1438470&r1=1438469&r2=1438470&view=diff ============================================================================== --- qpid/proton/branches/jni-binding/proton-j/contrib/proton-hawtdispatch/src/main/java/org/apache/qpid/proton/hawtdispatch/api/MessageDelivery.java (original) +++ qpid/proton/branches/jni-binding/proton-j/contrib/proton-hawtdispatch/src/main/java/org/apache/qpid/proton/hawtdispatch/api/MessageDelivery.java Fri Jan 25 12:27:13 2013 @@ -18,7 +18,7 @@ package org.apache.qpid.proton.hawtdispatch.api; import org.apache.qpid.proton.amqp.transport.DeliveryState; -import org.apache.qpid.proton.engine.impl.DeliveryImpl; +import org.apache.qpid.proton.engine.Delivery; import org.apache.qpid.proton.hawtdispatch.impl.Watch; import org.apache.qpid.proton.hawtdispatch.impl.WatchBase; import org.apache.qpid.proton.message.Message; @@ -34,7 +34,7 @@ public abstract class MessageDelivery ex final int initialSize; private Message message; private Buffer encoded; - public DeliveryImpl delivery; + public Delivery delivery; private int sizeHint = 1024*4; static Buffer encode(Message message, int sizeHint) { Modified: qpid/proton/branches/jni-binding/proton-j/contrib/proton-hawtdispatch/src/main/java/org/apache/qpid/proton/hawtdispatch/impl/AmqpListener.java URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/proton-j/contrib/proton-hawtdispatch/src/main/java/org/apache/qpid/proton/hawtdispatch/impl/AmqpListener.java?rev=1438470&r1=1438469&r2=1438470&view=diff ============================================================================== --- qpid/proton/branches/jni-binding/proton-j/contrib/proton-hawtdispatch/src/main/java/org/apache/qpid/proton/hawtdispatch/impl/AmqpListener.java (original) +++ qpid/proton/branches/jni-binding/proton-j/contrib/proton-hawtdispatch/src/main/java/org/apache/qpid/proton/hawtdispatch/impl/AmqpListener.java Fri Jan 25 12:27:13 2013 @@ -17,19 +17,22 @@ package org.apache.qpid.proton.hawtdispatch.impl; -import org.apache.qpid.proton.engine.*; +import java.io.IOException; + +import org.apache.qpid.proton.engine.Delivery; +import org.apache.qpid.proton.engine.Endpoint; +import org.apache.qpid.proton.engine.EndpointError; +import org.apache.qpid.proton.engine.Sasl; import org.apache.qpid.proton.engine.impl.EndpointImpl; -import org.apache.qpid.proton.engine.impl.TransportImpl; +import org.apache.qpid.proton.engine.impl.ProtonJTransport; import org.fusesource.hawtdispatch.Task; -import java.io.IOException; - /** * @author <a href="http://hiramchirino.com">Hiram Chirino</a> */ public class AmqpListener { - public Sasl processSaslConnect(TransportImpl transport) { + public Sasl processSaslConnect(ProtonJTransport protonTransport) { return null; } Modified: qpid/proton/branches/jni-binding/proton-j/contrib/proton-hawtdispatch/src/main/java/org/apache/qpid/proton/hawtdispatch/impl/AmqpTransport.java URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/proton-j/contrib/proton-hawtdispatch/src/main/java/org/apache/qpid/proton/hawtdispatch/impl/AmqpTransport.java?rev=1438470&r1=1438469&r2=1438470&view=diff ============================================================================== --- qpid/proton/branches/jni-binding/proton-j/contrib/proton-hawtdispatch/src/main/java/org/apache/qpid/proton/hawtdispatch/impl/AmqpTransport.java (original) +++ qpid/proton/branches/jni-binding/proton-j/contrib/proton-hawtdispatch/src/main/java/org/apache/qpid/proton/hawtdispatch/impl/AmqpTransport.java Fri Jan 25 12:27:13 2013 @@ -16,13 +16,17 @@ */ package org.apache.qpid.proton.hawtdispatch.impl; +import org.apache.qpid.proton.ProtonFactoryLoader; import org.apache.qpid.proton.hawtdispatch.api.AmqpConnectOptions; import org.apache.qpid.proton.hawtdispatch.api.Callback; import org.apache.qpid.proton.hawtdispatch.api.ChainedCallback; import org.apache.qpid.proton.hawtdispatch.api.TransportState; import org.apache.qpid.proton.engine.*; import org.apache.qpid.proton.engine.impl.ConnectionImpl; +import org.apache.qpid.proton.engine.impl.EngineFactoryImpl; import org.apache.qpid.proton.engine.impl.ProtocolTracer; +import org.apache.qpid.proton.engine.impl.ProtonJConnection; +import org.apache.qpid.proton.engine.impl.ProtonJTransport; import org.apache.qpid.proton.engine.impl.TransportImpl; import org.fusesource.hawtbuf.Buffer; import org.fusesource.hawtbuf.DataByteArrayOutputStream; @@ -51,9 +55,10 @@ public class AmqpTransport extends Watch private TransportState state = CREATED; final DispatchQueue queue; - final ConnectionImpl connection = new ConnectionImpl(); + final ProtonJConnection connection; + private final EngineFactoryImpl engineFactory = new EngineFactoryImpl(); Transport hawtdispatchTransport; - Transport protonTransport; + ProtonJTransport protonTransport; Throwable failure; CustomDispatchSource<Defer,LinkedList<Defer>> defers; @@ -61,6 +66,8 @@ public class AmqpTransport extends Watch private AmqpTransport(DispatchQueue queue) { this.queue = queue; + this.connection = engineFactory.createConnection(); + defers = Dispatch.createSource(EventAggregators.<Defer>linkedList(), this.queue); defers.setEventHandler(new Task(){ public void run() { @@ -315,7 +322,7 @@ public class AmqpTransport extends Watch private void bind(final Transport transport) { this.hawtdispatchTransport = transport; - this.protonTransport = new TransportImpl(); + this.protonTransport = engineFactory.createTransport(); this.protonTransport.bind(connection); if( transport.getProtocolCodec()==null ) { try { @@ -411,7 +418,7 @@ public class AmqpTransport extends Watch } - public ConnectionImpl connection() { + public ProtonJConnection connection() { return connection; } Modified: qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ConnectionImpl.java URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ConnectionImpl.java?rev=1438470&r1=1438469&r2=1438470&view=diff ============================================================================== --- qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ConnectionImpl.java (original) +++ qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ConnectionImpl.java Fri Jan 25 12:27:13 2013 @@ -27,7 +27,7 @@ import java.util.List; import org.apache.qpid.proton.engine.*; import org.apache.qpid.proton.amqp.transport.Open; -public class ConnectionImpl extends EndpointImpl implements Connection +public class ConnectionImpl extends EndpointImpl implements ProtonJConnection { public static final int MAX_CHANNELS = 255; @@ -242,6 +242,7 @@ public class ConnectionImpl extends Endp return _localContainerId; } + @Override public void setLocalContainerId(String localContainerId) { _localContainerId = localContainerId; Modified: qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/EngineFactoryImpl.java URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/EngineFactoryImpl.java?rev=1438470&r1=1438469&r2=1438470&view=diff ============================================================================== --- qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/EngineFactoryImpl.java (original) +++ qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/EngineFactoryImpl.java Fri Jan 25 12:27:13 2013 @@ -18,37 +18,34 @@ */ package org.apache.qpid.proton.engine.impl; -import org.apache.qpid.proton.engine.Connection; import org.apache.qpid.proton.engine.EngineFactory; -import org.apache.qpid.proton.engine.SslDomain; -import org.apache.qpid.proton.engine.SslPeerDetails; -import org.apache.qpid.proton.engine.Transport; +import org.apache.qpid.proton.engine.impl.ssl.ProtonJSslDomain; +import org.apache.qpid.proton.engine.impl.ssl.ProtonJSslPeerDetails; import org.apache.qpid.proton.engine.impl.ssl.SslDomainImpl; import org.apache.qpid.proton.engine.impl.ssl.SslPeerDetailsImpl; public class EngineFactoryImpl implements EngineFactory { - @Override - public Connection createConnection() + public ProtonJConnection createConnection() { return new ConnectionImpl(); } @Override - public Transport createTransport() + public ProtonJTransport createTransport() { return new TransportImpl(); } @Override - public SslDomain createSslDomain() + public ProtonJSslDomain createSslDomain() { return new SslDomainImpl(); } @Override - public SslPeerDetails createSslPeerDetails(String hostname, int port) + public ProtonJSslPeerDetails createSslPeerDetails(String hostname, int port) { return new SslPeerDetailsImpl(hostname, port); } Modified: qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/PlainTransportWrapper.java URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/PlainTransportWrapper.java?rev=1438470&r1=1438469&r2=1438470&view=diff ============================================================================== --- qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/PlainTransportWrapper.java (original) +++ qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/PlainTransportWrapper.java Fri Jan 25 12:27:13 2013 @@ -25,7 +25,7 @@ public class PlainTransportWrapper imple private final TransportOutput _outputProcessor; private final TransportInput _inputProcessor; - PlainTransportWrapper(TransportOutput outputProcessor, + public PlainTransportWrapper(TransportOutput outputProcessor, TransportInput inputProcessor) { _outputProcessor = outputProcessor; Copied: qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ProtonJConnection.java (from r1438469, qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslPeerDetailsImpl.java) URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ProtonJConnection.java?p2=qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ProtonJConnection.java&p1=qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslPeerDetailsImpl.java&r1=1438469&r2=1438470&rev=1438470&view=diff ============================================================================== --- qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslPeerDetailsImpl.java (original) +++ qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ProtonJConnection.java Fri Jan 25 12:27:13 2013 @@ -16,30 +16,19 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.qpid.proton.engine.impl.ssl; +package org.apache.qpid.proton.engine.impl; -import org.apache.qpid.proton.engine.SslPeerDetails; +import org.apache.qpid.proton.engine.Connection; -public class SslPeerDetailsImpl implements SslPeerDetails +/** + * Extends {@link Connection} with functionality that is specific to proton-j + */ +public interface ProtonJConnection extends Connection { - private final String _hostname; - private final int _port; - - SslPeerDetailsImpl(String hostname, int port) - { - _hostname = hostname; - _port = port; - } + void setLocalContainerId(String localContainerId); @Override - public String getHostname() - { - return _hostname; - } + ProtonJSession session(); - @Override - public int getPort() - { - return _port; - } + int getMaxChannels(); } Copied: qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ProtonJSender.java (from r1438469, qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslPeerDetailsImpl.java) URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ProtonJSender.java?p2=qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ProtonJSender.java&p1=qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslPeerDetailsImpl.java&r1=1438469&r2=1438470&rev=1438470&view=diff ============================================================================== --- qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslPeerDetailsImpl.java (original) +++ qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ProtonJSender.java Fri Jan 25 12:27:13 2013 @@ -16,30 +16,11 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.qpid.proton.engine.impl.ssl; +package org.apache.qpid.proton.engine.impl; -import org.apache.qpid.proton.engine.SslPeerDetails; +import org.apache.qpid.proton.engine.Sender; -public class SslPeerDetailsImpl implements SslPeerDetails +public interface ProtonJSender extends Sender { - private final String _hostname; - private final int _port; - SslPeerDetailsImpl(String hostname, int port) - { - _hostname = hostname; - _port = port; - } - - @Override - public String getHostname() - { - return _hostname; - } - - @Override - public int getPort() - { - return _port; - } } Copied: qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ProtonJSession.java (from r1438469, qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslPeerDetailsImpl.java) URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ProtonJSession.java?p2=qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ProtonJSession.java&p1=qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslPeerDetailsImpl.java&r1=1438469&r2=1438470&rev=1438470&view=diff ============================================================================== --- qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslPeerDetailsImpl.java (original) +++ qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ProtonJSession.java Fri Jan 25 12:27:13 2013 @@ -16,30 +16,14 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.qpid.proton.engine.impl.ssl; +package org.apache.qpid.proton.engine.impl; -import org.apache.qpid.proton.engine.SslPeerDetails; +import org.apache.qpid.proton.engine.Session; -public class SslPeerDetailsImpl implements SslPeerDetails +/** + * Extends {@link Session} with functionality that is specific to proton-j + */ +public interface ProtonJSession extends Session { - private final String _hostname; - private final int _port; - - SslPeerDetailsImpl(String hostname, int port) - { - _hostname = hostname; - _port = port; - } - - @Override - public String getHostname() - { - return _hostname; - } - - @Override - public int getPort() - { - return _port; - } + ProtonJSender sender(String name); } Copied: qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ProtonJTransport.java (from r1438469, qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslPeerDetailsImpl.java) URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ProtonJTransport.java?p2=qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ProtonJTransport.java&p1=qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslPeerDetailsImpl.java&r1=1438469&r2=1438470&rev=1438470&view=diff ============================================================================== --- qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslPeerDetailsImpl.java (original) +++ qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ProtonJTransport.java Fri Jan 25 12:27:13 2013 @@ -16,30 +16,16 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.qpid.proton.engine.impl.ssl; +package org.apache.qpid.proton.engine.impl; -import org.apache.qpid.proton.engine.SslPeerDetails; +import org.apache.qpid.proton.engine.Transport; -public class SslPeerDetailsImpl implements SslPeerDetails +/** + * Extends {@link Transport} with functionality that is specific to proton-j + */ +public interface ProtonJTransport extends Transport { - private final String _hostname; - private final int _port; - - SslPeerDetailsImpl(String hostname, int port) - { - _hostname = hostname; - _port = port; - } - - @Override - public String getHostname() - { - return _hostname; - } + void setProtocolTracer(ProtocolTracer protocolTracer); - @Override - public int getPort() - { - return _port; - } + ProtocolTracer getProtocolTracer(); } Modified: qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/SenderImpl.java URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/SenderImpl.java?rev=1438470&r1=1438469&r2=1438470&view=diff ============================================================================== --- qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/SenderImpl.java (original) +++ qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/SenderImpl.java Fri Jan 25 12:27:13 2013 @@ -23,9 +23,8 @@ package org.apache.qpid.proton.engine.im import java.util.Iterator; import org.apache.qpid.proton.engine.Delivery; import org.apache.qpid.proton.engine.EndpointState; -import org.apache.qpid.proton.engine.Sender; -public class SenderImpl extends LinkImpl implements Sender +public class SenderImpl extends LinkImpl implements ProtonJSender { private int _offered; private TransportSender _transportLink; Modified: qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/SessionImpl.java URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/SessionImpl.java?rev=1438470&r1=1438469&r2=1438470&view=diff ============================================================================== --- qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/SessionImpl.java (original) +++ qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/SessionImpl.java Fri Jan 25 12:27:13 2013 @@ -24,7 +24,7 @@ import java.util.*; import org.apache.qpid.proton.engine.EndpointState; import org.apache.qpid.proton.engine.Session; -public class SessionImpl extends EndpointImpl implements Session +public class SessionImpl extends EndpointImpl implements ProtonJSession { private final ConnectionImpl _connection; Modified: qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java?rev=1438470&r1=1438469&r2=1438470&view=diff ============================================================================== --- qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java (original) +++ qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java Fri Jan 25 12:27:13 2013 @@ -36,7 +36,6 @@ import org.apache.qpid.proton.engine.Sas import org.apache.qpid.proton.engine.Ssl; import org.apache.qpid.proton.engine.SslDomain; import org.apache.qpid.proton.engine.SslPeerDetails; -import org.apache.qpid.proton.engine.Transport; import org.apache.qpid.proton.engine.TransportException; import org.apache.qpid.proton.engine.impl.ssl.ProtonSslEngineProvider; import org.apache.qpid.proton.engine.impl.ssl.SslImpl; @@ -54,7 +53,7 @@ import org.apache.qpid.proton.amqp.trans import org.apache.qpid.proton.amqp.transport.Role; import org.apache.qpid.proton.amqp.transport.Transfer; -public class TransportImpl extends EndpointImpl implements Transport, FrameBody.FrameBodyHandler<Integer>,FrameTransport +public class TransportImpl extends EndpointImpl implements ProtonJTransport, FrameBody.FrameBodyHandler<Integer>,FrameTransport { public static final byte[] HEADER = new byte[8]; public static final org.apache.qpid.proton.amqp.messaging.Accepted ACCEPTED = @@ -123,6 +122,7 @@ public class TransportImpl extends Endpo }; } + @Override public void bind(Connection conn) { // TODO - check if already bound @@ -145,6 +145,7 @@ public class TransportImpl extends Endpo } } + @Override public int input(byte[] bytes, int offset, int length) { if(_inputException != null) @@ -172,7 +173,7 @@ public class TransportImpl extends Endpo //================================================================================================================== // Process model state to generate output - + @Override public int output(byte[] bytes, final int offset, final int size) { try @@ -958,6 +959,7 @@ public class TransportImpl extends Endpo return _connectionEndpoint; } + @Override public void free() { super.free(); @@ -967,6 +969,7 @@ public class TransportImpl extends Endpo // handle incoming amqp data + @Override public void handleOpen(Open open, Binary payload, Integer channel) { setRemoteState(EndpointState.ACTIVE); @@ -985,6 +988,7 @@ public class TransportImpl extends Endpo } } + @Override public void handleBegin(Begin begin, Binary payload, Integer channel) { // TODO - check channel < max_channel @@ -1018,6 +1022,7 @@ public class TransportImpl extends Endpo } + @Override public void handleAttach(Attach attach, Binary payload, Integer channel) { TransportSession transportSession = _remoteSessions[channel]; @@ -1070,6 +1075,7 @@ public class TransportImpl extends Endpo } } + @Override public void handleFlow(Flow flow, Binary payload, Integer channel) { TransportSession transportSession = _remoteSessions[channel]; @@ -1084,6 +1090,7 @@ public class TransportImpl extends Endpo } + @Override public void handleTransfer(Transfer transfer, Binary payload, Integer channel) { // TODO - check channel < max_channel @@ -1098,6 +1105,7 @@ public class TransportImpl extends Endpo } } + @Override public void handleDisposition(Disposition disposition, Binary payload, Integer channel) { TransportSession transportSession = _remoteSessions[channel]; @@ -1111,6 +1119,7 @@ public class TransportImpl extends Endpo } } + @Override public void handleDetach(Detach detach, Binary payload, Integer channel) { TransportSession transportSession = _remoteSessions[channel]; @@ -1137,6 +1146,7 @@ public class TransportImpl extends Endpo } } + @Override public void handleEnd(End end, Binary payload, Integer channel) { TransportSession transportSession = _remoteSessions[channel]; @@ -1153,6 +1163,7 @@ public class TransportImpl extends Endpo } } + @Override public void handleClose(Close close, Binary payload, Integer channel) { _closeReceived = true; @@ -1164,6 +1175,7 @@ public class TransportImpl extends Endpo } + @Override public boolean input(TransportFrame frame) { if( _protocolTracer!=null ) @@ -1196,11 +1208,13 @@ public class TransportImpl extends Endpo } } + @Override public ProtocolTracer getProtocolTracer() { return _protocolTracer; } + @Override public void setProtocolTracer(ProtocolTracer protocolTracer) { this._protocolTracer = protocolTracer; Copied: qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/ProtonJSslDomain.java (from r1438469, qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslPeerDetailsImpl.java) URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/ProtonJSslDomain.java?p2=qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/ProtonJSslDomain.java&p1=qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslPeerDetailsImpl.java&r1=1438469&r2=1438470&rev=1438470&view=diff ============================================================================== --- qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslPeerDetailsImpl.java (original) +++ qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/ProtonJSslDomain.java Fri Jan 25 12:27:13 2013 @@ -18,28 +18,12 @@ */ package org.apache.qpid.proton.engine.impl.ssl; -import org.apache.qpid.proton.engine.SslPeerDetails; +import org.apache.qpid.proton.engine.SslDomain; -public class SslPeerDetailsImpl implements SslPeerDetails +/** + * Extends {@link SslDomain} with functionality that is specific to proton-j + */ +public interface ProtonJSslDomain extends SslDomain { - private final String _hostname; - private final int _port; - - SslPeerDetailsImpl(String hostname, int port) - { - _hostname = hostname; - _port = port; - } - - @Override - public String getHostname() - { - return _hostname; - } - @Override - public int getPort() - { - return _port; - } } Copied: qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/ProtonJSslPeerDetails.java (from r1438469, qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslPeerDetailsImpl.java) URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/ProtonJSslPeerDetails.java?p2=qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/ProtonJSslPeerDetails.java&p1=qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslPeerDetailsImpl.java&r1=1438469&r2=1438470&rev=1438470&view=diff ============================================================================== --- qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslPeerDetailsImpl.java (original) +++ qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/ProtonJSslPeerDetails.java Fri Jan 25 12:27:13 2013 @@ -20,26 +20,10 @@ package org.apache.qpid.proton.engine.im import org.apache.qpid.proton.engine.SslPeerDetails; -public class SslPeerDetailsImpl implements SslPeerDetails +/** + * Extends {@link SslPeerDetails} with functionality specific to proton-j + */ +public interface ProtonJSslPeerDetails extends SslPeerDetails { - private final String _hostname; - private final int _port; - SslPeerDetailsImpl(String hostname, int port) - { - _hostname = hostname; - _port = port; - } - - @Override - public String getHostname() - { - return _hostname; - } - - @Override - public int getPort() - { - return _port; - } } Modified: qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslDomainImpl.java URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslDomainImpl.java?rev=1438470&r1=1438469&r2=1438470&view=diff ============================================================================== --- qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslDomainImpl.java (original) +++ qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslDomainImpl.java Fri Jan 25 12:27:13 2013 @@ -22,7 +22,7 @@ import org.apache.qpid.proton.ProtonUnsu import org.apache.qpid.proton.engine.SslDomain; import org.apache.qpid.proton.engine.SslPeerDetails; -public class SslDomainImpl implements SslDomain, ProtonSslEngineProvider +public class SslDomainImpl implements SslDomain, ProtonSslEngineProvider, ProtonJSslDomain { private Mode _mode; private VerifyMode _verifyMode = VerifyMode.ANONYMOUS_PEER; @@ -34,7 +34,7 @@ public class SslDomainImpl implements Ss private final SslEngineFacadeFactory _sslEngineFacadeFactory = new SslEngineFacadeFactory(); - SslDomainImpl() + public SslDomainImpl() { } Modified: qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslImpl.java URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslImpl.java?rev=1438470&r1=1438469&r2=1438470&view=diff ============================================================================== --- qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslImpl.java (original) +++ qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslImpl.java Fri Jan 25 12:27:13 2013 @@ -43,7 +43,7 @@ public class SslImpl implements Ssl * enforce at the API level because {@link ProtonSslEngineProvider} is not part of the * public Proton API.</p> */ - SslImpl(SslDomain domain, SslPeerDetails peerDetails) + public SslImpl(SslDomain domain, SslPeerDetails peerDetails) { _domain = domain; _protonSslEngineProvider = (ProtonSslEngineProvider)domain; Modified: qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslPeerDetailsImpl.java URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslPeerDetailsImpl.java?rev=1438470&r1=1438469&r2=1438470&view=diff ============================================================================== --- qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslPeerDetailsImpl.java (original) +++ qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslPeerDetailsImpl.java Fri Jan 25 12:27:13 2013 @@ -18,14 +18,13 @@ */ package org.apache.qpid.proton.engine.impl.ssl; -import org.apache.qpid.proton.engine.SslPeerDetails; -public class SslPeerDetailsImpl implements SslPeerDetails +public class SslPeerDetailsImpl implements ProtonJSslPeerDetails { private final String _hostname; private final int _port; - SslPeerDetailsImpl(String hostname, int port) + public SslPeerDetailsImpl(String hostname, int port) { _hostname = hostname; _port = port; --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
