Author: philharveyonline Date: Mon Jan 21 17:15:09 2013 New Revision: 1436493
URL: http://svn.apache.org/viewvc?rev=1436493&view=rev Log: PROTON-192: Changes to the Java/Python thunking layer and JNI implementations to allow more system tests to pass (all passing except message tests). Modified: qpid/proton/branches/jni-binding/proton-c/bindings/java/jni/src/main/java/org/apache/qpid/proton/engine/jni/JNIEngineFactory.java qpid/proton/branches/jni-binding/proton-c/bindings/java/jni/src/main/java/org/apache/qpid/proton/engine/jni/JNISslDomain.java qpid/proton/branches/jni-binding/proton-c/bindings/java/jni/src/main/java/org/apache/qpid/proton/engine/jni/JNITransport.java qpid/proton/branches/jni-binding/proton-c/bindings/java/jni/src/main/java/org/apache/qpid/proton/jni/JNIFactory.java qpid/proton/branches/jni-binding/proton-j/proton-api/src/main/java/org/apache/qpid/proton/ProtonFactoryLoader.java qpid/proton/branches/jni-binding/proton-j/proton-api/src/main/java/org/apache/qpid/proton/engine/EngineFactory.java qpid/proton/branches/jni-binding/proton-j/proton-api/src/main/java/org/apache/qpid/proton/engine/SslDomain.java qpid/proton/branches/jni-binding/proton-j/proton-api/src/main/scripts/proton.py qpid/proton/branches/jni-binding/proton-j/proton/src/main/java/org/apache/qpid/proton/engine/impl/EngineFactoryImpl.java qpid/proton/branches/jni-binding/tests/src/test/java/org/apache/qpid/proton/JythonTest.java Modified: qpid/proton/branches/jni-binding/proton-c/bindings/java/jni/src/main/java/org/apache/qpid/proton/engine/jni/JNIEngineFactory.java URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/proton-c/bindings/java/jni/src/main/java/org/apache/qpid/proton/engine/jni/JNIEngineFactory.java?rev=1436493&r1=1436492&r2=1436493&view=diff ============================================================================== --- qpid/proton/branches/jni-binding/proton-c/bindings/java/jni/src/main/java/org/apache/qpid/proton/engine/jni/JNIEngineFactory.java (original) +++ qpid/proton/branches/jni-binding/proton-c/bindings/java/jni/src/main/java/org/apache/qpid/proton/engine/jni/JNIEngineFactory.java Mon Jan 21 17:15:09 2013 @@ -18,28 +18,21 @@ */ package org.apache.qpid.proton.engine.jni; -import java.util.logging.Logger; - import org.apache.qpid.proton.ProtonCEquivalent; 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.jni.JNIFactory; public class JNIEngineFactory extends JNIFactory implements EngineFactory { - private static final Logger LOGGER = Logger.getLogger(JNIEngineFactory.class.getName()); - @Override @ProtonCEquivalent("pn_connection") public Connection createConnection() { - LOGGER.info("PHDEBUG about to create JNIConnection"); - - JNIConnection jniConnection = new JNIConnection(); - LOGGER.info("PHDEBUG created JNIConnection"); - - return jniConnection; + return new JNIConnection(); } @Override @@ -48,4 +41,30 @@ public class JNIEngineFactory extends JN return new JNITransport(); } + @Override + public SslDomain createSslDomain() + { + return new JNISslDomain(); + } + + @Override + public SslPeerDetails createSslPeerDetails(final String hostname, final int port) + { + return new SslPeerDetails() + { + + @Override + public int getPort() + { + return port; + } + + @Override + public String getHostname() + { + return hostname; + } + }; + } + } Modified: qpid/proton/branches/jni-binding/proton-c/bindings/java/jni/src/main/java/org/apache/qpid/proton/engine/jni/JNISslDomain.java URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/proton-c/bindings/java/jni/src/main/java/org/apache/qpid/proton/engine/jni/JNISslDomain.java?rev=1436493&r1=1436492&r2=1436493&view=diff ============================================================================== --- qpid/proton/branches/jni-binding/proton-c/bindings/java/jni/src/main/java/org/apache/qpid/proton/engine/jni/JNISslDomain.java (original) +++ qpid/proton/branches/jni-binding/proton-c/bindings/java/jni/src/main/java/org/apache/qpid/proton/engine/jni/JNISslDomain.java Mon Jan 21 17:15:09 2013 @@ -19,8 +19,12 @@ */ package org.apache.qpid.proton.engine.jni; +import java.util.logging.Level; +import java.util.logging.Logger; + import org.apache.qpid.proton.ProtonCEquivalent; import org.apache.qpid.proton.engine.SslDomain; +import org.apache.qpid.proton.engine.TransportException; import org.apache.qpid.proton.jni.Proton; import org.apache.qpid.proton.jni.SWIGTYPE_p_pn_ssl_domain_t; import org.apache.qpid.proton.jni.pn_ssl_mode_t; @@ -28,11 +32,13 @@ import org.apache.qpid.proton.jni.pn_ssl public class JNISslDomain implements SslDomain { + private static final Logger LOGGER = Logger.getLogger(JNISslDomain.class.getName()); private SWIGTYPE_p_pn_ssl_domain_t _impl; private Mode _mode; private VerifyMode _verifyMode; private String _certificateFile; + private String _trustedCaDb; private String _privateKeyFile; private String _privateKeyPassword; private boolean _allowUnsecured; @@ -73,7 +79,20 @@ public class JNISslDomain implements Ssl _certificateFile = certificate_file; _privateKeyFile = private_key_file; _privateKeyPassword = password; - Proton.pn_ssl_domain_set_credentials(_impl,certificate_file,private_key_file,password); + int retVal = Proton.pn_ssl_domain_set_credentials(_impl,certificate_file,private_key_file,password); + checkProtonCReturnValue(retVal); + } + + private void checkProtonCReturnValue(int retVal) + { + if(retVal != 0) + { + if(LOGGER.isLoggable(Level.FINE)) + { + LOGGER.log(Level.FINE, "Non-zero return value: " + retVal, new Exception("<dummy exception to generate stack trace>")); + } + throw new TransportException("Unexpected return value: " + retVal); + } } @Override @@ -99,14 +118,15 @@ public class JNISslDomain implements Ssl @ProtonCEquivalent("pn_ssl_domain_set_trusted_ca_db") public void setTrustedCaDb(String certificate_db) { - Proton.pn_ssl_domain_set_trusted_ca_db(_impl, certificate_db); - + _trustedCaDb = certificate_db; + int retVal = Proton.pn_ssl_domain_set_trusted_ca_db(_impl, certificate_db); + checkProtonCReturnValue(retVal); } @Override public String getTrustedCaDb() { - return _certificateFile; + return _trustedCaDb; } @Override @@ -114,8 +134,8 @@ public class JNISslDomain implements Ssl public void allowUnsecuredClient(boolean unused) { _allowUnsecured = true; - Proton.pn_ssl_domain_allow_unsecured_client(_impl); - + int retVal = Proton.pn_ssl_domain_allow_unsecured_client(_impl); + checkProtonCReturnValue(retVal); } @Override @@ -129,8 +149,8 @@ public class JNISslDomain implements Ssl public void setPeerAuthentication(VerifyMode mode) { _verifyMode = mode; - Proton.pn_ssl_domain_set_peer_authentication(_impl,convertVerifyMode(mode),_certificateFile); - + int retVal = Proton.pn_ssl_domain_set_peer_authentication(_impl,convertVerifyMode(mode),_trustedCaDb); + checkProtonCReturnValue(retVal); } private pn_ssl_verify_mode_t convertVerifyMode(VerifyMode mode) @@ -144,6 +164,11 @@ public class JNISslDomain implements Ssl case VERIFY_PEER: cMode = pn_ssl_verify_mode_t.PN_SSL_VERIFY_PEER; break; + case VERIFY_PEER_NAME: + cMode = pn_ssl_verify_mode_t.PN_SSL_VERIFY_PEER_NAME; + break; + default: + throw new IllegalArgumentException("Unsupported verify mode " + mode); } return cMode; Modified: qpid/proton/branches/jni-binding/proton-c/bindings/java/jni/src/main/java/org/apache/qpid/proton/engine/jni/JNITransport.java URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/proton-c/bindings/java/jni/src/main/java/org/apache/qpid/proton/engine/jni/JNITransport.java?rev=1436493&r1=1436492&r2=1436493&view=diff ============================================================================== --- qpid/proton/branches/jni-binding/proton-c/bindings/java/jni/src/main/java/org/apache/qpid/proton/engine/jni/JNITransport.java (original) +++ qpid/proton/branches/jni-binding/proton-c/bindings/java/jni/src/main/java/org/apache/qpid/proton/engine/jni/JNITransport.java Mon Jan 21 17:15:09 2013 @@ -180,6 +180,7 @@ public class JNITransport implements Tra super.finalize(); } + // PHTODO delete main/pump public static void main(String args[]) { System.loadLibrary("protonjni"); @@ -189,7 +190,6 @@ public class JNITransport implements Tra JNIConnection conn2 = new JNIConnection(); t1.bind(conn1); t2.bind(conn2); - conn1.open(); conn2.open(); Modified: qpid/proton/branches/jni-binding/proton-c/bindings/java/jni/src/main/java/org/apache/qpid/proton/jni/JNIFactory.java URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/proton-c/bindings/java/jni/src/main/java/org/apache/qpid/proton/jni/JNIFactory.java?rev=1436493&r1=1436492&r2=1436493&view=diff ============================================================================== --- qpid/proton/branches/jni-binding/proton-c/bindings/java/jni/src/main/java/org/apache/qpid/proton/jni/JNIFactory.java (original) +++ qpid/proton/branches/jni-binding/proton-c/bindings/java/jni/src/main/java/org/apache/qpid/proton/jni/JNIFactory.java Mon Jan 21 17:15:09 2013 @@ -18,6 +18,7 @@ */ package org.apache.qpid.proton.jni; +import java.util.logging.Level; import java.util.logging.Logger; public abstract class JNIFactory @@ -28,11 +29,17 @@ public abstract class JNIFactory { String libname = "proton-swig"; - LOGGER.info("About to load library " + libname); + if(LOGGER.isLoggable(Level.FINE)) + { + LOGGER.fine("About to load library " + libname); + } System.loadLibrary(libname); - LOGGER.info("Successfully loaded library " + libname); + if(LOGGER.isLoggable(Level.FINE)) + { + LOGGER.fine("Successfully loaded library " + libname); + } } } Modified: qpid/proton/branches/jni-binding/proton-j/proton-api/src/main/java/org/apache/qpid/proton/ProtonFactoryLoader.java URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/proton-j/proton-api/src/main/java/org/apache/qpid/proton/ProtonFactoryLoader.java?rev=1436493&r1=1436492&r2=1436493&view=diff ============================================================================== --- qpid/proton/branches/jni-binding/proton-j/proton-api/src/main/java/org/apache/qpid/proton/ProtonFactoryLoader.java (original) +++ qpid/proton/branches/jni-binding/proton-j/proton-api/src/main/java/org/apache/qpid/proton/ProtonFactoryLoader.java Mon Jan 21 17:15:09 2013 @@ -20,6 +20,7 @@ package org.apache.qpid.proton; import java.util.Iterator; import java.util.ServiceLoader; +import java.util.logging.Level; import java.util.logging.Logger; public class ProtonFactoryLoader<C> @@ -35,7 +36,10 @@ public class ProtonFactoryLoader<C> throw new IllegalStateException("Can't find service loader for " + factoryInterface.getName()); } C factory = serviceLoaderIterator.next(); - LOGGER.info("loadFactory returning " + factory); + if(LOGGER.isLoggable(Level.FINE)) + { + LOGGER.fine("loadFactory returning " + factory); + } return factory; } Modified: qpid/proton/branches/jni-binding/proton-j/proton-api/src/main/java/org/apache/qpid/proton/engine/EngineFactory.java URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/proton-j/proton-api/src/main/java/org/apache/qpid/proton/engine/EngineFactory.java?rev=1436493&r1=1436492&r2=1436493&view=diff ============================================================================== --- qpid/proton/branches/jni-binding/proton-j/proton-api/src/main/java/org/apache/qpid/proton/engine/EngineFactory.java (original) +++ qpid/proton/branches/jni-binding/proton-j/proton-api/src/main/java/org/apache/qpid/proton/engine/EngineFactory.java Mon Jan 21 17:15:09 2013 @@ -22,4 +22,10 @@ public interface EngineFactory { Connection createConnection(); Transport createTransport(); + SslDomain createSslDomain(); + /** + * PHTODO consider overloading createSslPeerDetails(sessionId) + * for better fit with the C world + */ + SslPeerDetails createSslPeerDetails(String hostname, int port); } Modified: qpid/proton/branches/jni-binding/proton-j/proton-api/src/main/java/org/apache/qpid/proton/engine/SslDomain.java URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/proton-j/proton-api/src/main/java/org/apache/qpid/proton/engine/SslDomain.java?rev=1436493&r1=1436492&r2=1436493&view=diff ============================================================================== --- qpid/proton/branches/jni-binding/proton-j/proton-api/src/main/java/org/apache/qpid/proton/engine/SslDomain.java (original) +++ qpid/proton/branches/jni-binding/proton-j/proton-api/src/main/java/org/apache/qpid/proton/engine/SslDomain.java Mon Jan 21 17:15:09 2013 @@ -47,7 +47,7 @@ public interface SslDomain * by a trusted CA and are using an authenticated cipher */ VERIFY_PEER, - + VERIFY_PEER_NAME, /** * does not require a valid certificate, and permits use of ciphers that * do not provide authentication Modified: qpid/proton/branches/jni-binding/proton-j/proton-api/src/main/scripts/proton.py URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/proton-j/proton-api/src/main/scripts/proton.py?rev=1436493&r1=1436492&r2=1436493&view=diff ============================================================================== --- qpid/proton/branches/jni-binding/proton-j/proton-api/src/main/scripts/proton.py (original) +++ qpid/proton/branches/jni-binding/proton-j/proton-api/src/main/scripts/proton.py Mon Jan 21 17:15:09 2013 @@ -19,12 +19,12 @@ from uuid import UUID from org.apache.qpid.proton import ProtonFactoryLoader -from org.apache.qpid.proton.engine import EndpointState, TransportException, Sasl, SslDomain, EngineFactory -#from org.apache.qpid.proton.engine.impl.ssl import SslDomainImpl, SslPeerDetailsImpl +from org.apache.qpid.proton.engine import \ + EngineFactory, Transport as JTransport, Sender as JSender, Receiver as JReceiver, \ + Sasl, SslDomain as JSslDomain, \ + EndpointState, TransportException from org.apache.qpid.proton.message import MessageFormat, MessageFactory -#from org.apache.qpid.proton.message.impl import MessageImpl from org.apache.qpid.proton.messenger import MessengerException, Status -#from org.apache.qpid.proton.messenger.impl import MessengerImpl from org.apache.qpid.proton.amqp.messaging import Source, Target, Accepted, AmqpValue from org.apache.qpid.proton.amqp import UnsignedInteger from jarray import zeros @@ -53,11 +53,10 @@ STATUSES = { MANUAL = "MANUAL" AUTOMATIC = "AUTOMATIC" -print "PHDEBUG about to load factories" protonFactoryLoader = ProtonFactoryLoader() engineFactory = protonFactoryLoader.loadFactory(EngineFactory) messageFactory = protonFactoryLoader.loadFactory(MessageFactory) -print "PHDEBUG engineFactory = %s " % engineFactory + class Endpoint(object): @@ -219,9 +218,9 @@ class Session(Endpoint): def wrap_link(impl): if impl is None: return None - elif isinstance(impl, SenderImpl): + elif isinstance(impl, JSender): return Sender(impl) - elif isinstance(impl, ReceiverImpl): + elif isinstance(impl, JReceiver): return Receiver(impl) else: raise Exception("unknown type") @@ -348,7 +347,7 @@ class Receiver(Link): n = self.impl.recv(output, 0, size) if n >= 0: return output.tostring()[:n] - elif n == TransportImpl.END_OF_STREAM: + elif n == JTransport.END_OF_STREAM: return None else: raise Exception(n) @@ -440,13 +439,19 @@ class Transport(object): n = self.impl.output(output, 0, size) if n >= 0: return output.tostring()[:n] - elif n == Transport.END_OF_STREAM: + elif n == JTransport.END_OF_STREAM: return None else: - raise Exception("XXX: %s" % n) + raise Exception("Unexpected return value from output: %s" % n) def input(self, bytes): - return self.impl.input(bytes, 0, len(bytes)) + n = self.impl.input(bytes, 0, len(bytes)) + if n >= 0: + return n + elif n == JTransport.END_OF_STREAM: + return None + else: + raise Exception("Unexpected return value from input: %s" % n) def _get_max_frame_size(self): #return pn_transport_get_max_frame(self._trans) @@ -802,7 +807,7 @@ class SASL(object): n = self._sasl.recv(output, 0, size) if n >= 0: return output.tostring()[:n] - elif n == Transport.END_OF_STREAM: + elif n == JTransport.END_OF_STREAM: return None else: raise Exception(n) @@ -832,14 +837,14 @@ class SSLUnavailable(SSLException): class SSLDomain(object): - MODE_SERVER = SslDomain.Mode.SERVER - MODE_CLIENT = SslDomain.Mode.CLIENT - VERIFY_PEER = SslDomain.VerifyMode.VERIFY_PEER - ANONYMOUS_PEER = SslDomain.VerifyMode.ANONYMOUS_PEER - VERIFY_PEER_NAME = None # TBD + MODE_SERVER = JSslDomain.Mode.SERVER + MODE_CLIENT = JSslDomain.Mode.CLIENT + VERIFY_PEER = JSslDomain.VerifyMode.VERIFY_PEER + VERIFY_PEER_NAME = JSslDomain.VerifyMode.VERIFY_PEER_NAME + ANONYMOUS_PEER = JSslDomain.VerifyMode.ANONYMOUS_PEER def __init__(self, mode): - self._domain = SslDomainImpl() + self._domain = engineFactory.createSslDomain() self._domain.init(mode) def set_credentials(self, cert_file, key_file, password): @@ -849,9 +854,11 @@ class SSLDomain(object): self._domain.setTrustedCaDb(certificate_db) def set_peer_authentication(self, verify_mode, trusted_CAs=None): - self._domain.setPeerAuthentication(verify_mode) + # PHTODO the following two method calls have to occur in the following order + # otherwise tests fail with proton-jni. It is not clear yet why. if trusted_CAs is not None: self._domain.setTrustedCaDb(trusted_CAs) + self._domain.setPeerAuthentication(verify_mode) def allow_unsecured_client(self, allow_unsecured = True): self._domain.allowUnsecuredClient(allow_unsecured) @@ -859,7 +866,7 @@ class SSLDomain(object): class SSLSessionDetails(object): def __init__(self, session_id): - self._session_details = SslPeerDetailsImpl(session_id, 1) + self._session_details = engineFactory.createSslPeerDetails(session_id, 1) class SSL(object): 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=1436493&r1=1436492&r2=1436493&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 Mon Jan 21 17:15:09 2013 @@ -20,7 +20,11 @@ package org.apache.qpid.proton.engine.im 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.SslDomainImpl; +import org.apache.qpid.proton.engine.impl.ssl.SslPeerDetailsImpl; public class EngineFactoryImpl implements EngineFactory { @@ -37,4 +41,16 @@ public class EngineFactoryImpl implement return new TransportImpl(); } + @Override + public SslDomain createSslDomain() + { + return new SslDomainImpl(); + } + + @Override + public SslPeerDetails createSslPeerDetails(String hostname, int port) + { + return new SslPeerDetailsImpl(hostname, port); + } + } Modified: qpid/proton/branches/jni-binding/tests/src/test/java/org/apache/qpid/proton/JythonTest.java URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/tests/src/test/java/org/apache/qpid/proton/JythonTest.java?rev=1436493&r1=1436492&r2=1436493&view=diff ============================================================================== --- qpid/proton/branches/jni-binding/tests/src/test/java/org/apache/qpid/proton/JythonTest.java (original) +++ qpid/proton/branches/jni-binding/tests/src/test/java/org/apache/qpid/proton/JythonTest.java Mon Jan 21 17:15:09 2013 @@ -20,9 +20,12 @@ */ package org.apache.qpid.proton; +import static org.junit.Assert.fail; + import java.io.File; import java.net.URISyntaxException; import java.net.URL; +import java.util.logging.Level; import java.util.logging.Logger; import org.junit.Test; @@ -73,7 +76,11 @@ public class JythonTest } else { - throw e; + if (LOGGER.isLoggable(Level.FINE)) + { + LOGGER.log(Level.FINE, "Jython interpreter failed. Test failures?", e); + } + fail(e.getMessage()); } } } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org