You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by rg...@apache.org on 2013/07/18 22:19:04 UTC

svn commit: r1504633 - in /qpid/proton/trunk: proton-c/bindings/java/src/main/java/org/apache/qpid/proton/ proton-j/proton-api/src/main/java/org/apache/qpid/proton/ proton-j/proton-api/src/main/resources/ proton-j/proton/src/main/java/org/apache/qpid/p...

Author: rgodfrey
Date: Thu Jul 18 20:19:04 2013
New Revision: 1504633

URL: http://svn.apache.org/r1504633
Log:
PROTON-359 : [Proton-j] Create a simple entry point for creating all Proton entities

Added:
    qpid/proton/trunk/proton-j/proton-api/src/main/java/org/apache/qpid/proton/Proton.java
Modified:
    qpid/proton/trunk/proton-c/bindings/java/src/main/java/org/apache/qpid/proton/TestDecoder.java
    qpid/proton/trunk/proton-j/proton-api/src/main/java/org/apache/qpid/proton/ProtonFactoryLoader.java
    qpid/proton/trunk/proton-j/proton-api/src/main/resources/proton.py
    qpid/proton/trunk/proton-j/proton/src/main/java/org/apache/qpid/proton/messenger/impl/MessengerImpl.java

Modified: qpid/proton/trunk/proton-c/bindings/java/src/main/java/org/apache/qpid/proton/TestDecoder.java
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/bindings/java/src/main/java/org/apache/qpid/proton/TestDecoder.java?rev=1504633&r1=1504632&r2=1504633&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/bindings/java/src/main/java/org/apache/qpid/proton/TestDecoder.java (original)
+++ qpid/proton/trunk/proton-c/bindings/java/src/main/java/org/apache/qpid/proton/TestDecoder.java Thu Jul 18 20:19:04 2013
@@ -18,8 +18,6 @@
  */
 package org.apache.qpid.proton;
 
-import org.apache.qpid.proton.TestDecoder;
-import org.apache.qpid.proton.ProtonFactoryLoader;
 import org.apache.qpid.proton.amqp.Binary;
 import org.apache.qpid.proton.amqp.Decimal128;
 import org.apache.qpid.proton.amqp.Decimal32;
@@ -30,9 +28,7 @@ import org.apache.qpid.proton.amqp.Unsig
 import org.apache.qpid.proton.amqp.UnsignedLong;
 import org.apache.qpid.proton.amqp.UnsignedShort;
 import org.apache.qpid.proton.codec.Data;
-import org.apache.qpid.proton.codec.DataFactory;
 
-import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.Date;
 import java.util.List;
@@ -50,9 +46,7 @@ public class TestDecoder {
     private Data data;
 
     TestDecoder(byte[] encoded) {
-	DataFactory df =
-	    new ProtonFactoryLoader<DataFactory>(DataFactory.class).loadFactory();
-	data = df.createData(encoded.length);
+	data = Proton.data(encoded.length);
 	int offset = 0;
 	while (offset < encoded.length) {
 	    ByteBuffer buffer = ByteBuffer.wrap(encoded, offset, encoded.length-offset);

Added: qpid/proton/trunk/proton-j/proton-api/src/main/java/org/apache/qpid/proton/Proton.java
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-j/proton-api/src/main/java/org/apache/qpid/proton/Proton.java?rev=1504633&view=auto
==============================================================================
--- qpid/proton/trunk/proton-j/proton-api/src/main/java/org/apache/qpid/proton/Proton.java (added)
+++ qpid/proton/trunk/proton-j/proton-api/src/main/java/org/apache/qpid/proton/Proton.java Thu Jul 18 20:19:04 2013
@@ -0,0 +1,243 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.proton;
+
+import java.io.IOException;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import org.apache.qpid.proton.amqp.messaging.ApplicationProperties;
+import org.apache.qpid.proton.amqp.messaging.DeliveryAnnotations;
+import org.apache.qpid.proton.amqp.messaging.Footer;
+import org.apache.qpid.proton.amqp.messaging.Header;
+import org.apache.qpid.proton.amqp.messaging.MessageAnnotations;
+import org.apache.qpid.proton.amqp.messaging.Properties;
+import org.apache.qpid.proton.amqp.messaging.Section;
+import org.apache.qpid.proton.codec.Data;
+import org.apache.qpid.proton.codec.DataFactory;
+import org.apache.qpid.proton.driver.Driver;
+import org.apache.qpid.proton.driver.DriverFactory;
+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.message.Message;
+import org.apache.qpid.proton.message.MessageFactory;
+import org.apache.qpid.proton.messenger.Messenger;
+import org.apache.qpid.proton.messenger.MessengerFactory;
+
+public final class Proton
+{
+
+    public static ProtonFactory.ImplementationType ANY = ProtonFactory.ImplementationType.ANY;
+    public static ProtonFactory.ImplementationType PROTON_C = ProtonFactory.ImplementationType.PROTON_C;
+    public static ProtonFactory.ImplementationType PROTON_J = ProtonFactory.ImplementationType.PROTON_J;
+
+
+    private static final MessengerFactory MESSENGER_FACTORY =
+            (new ProtonFactoryLoader<MessengerFactory>(MessengerFactory.class)).loadFactory();
+    private static final DriverFactory DRIVER_FACTORY =
+            (new ProtonFactoryLoader<DriverFactory>(DriverFactory.class)).loadFactory();
+    private static final MessageFactory MESSAGE_FACTORY =
+            (new ProtonFactoryLoader<MessageFactory>(MessageFactory.class)).loadFactory();
+    private static final DataFactory DATA_FACTORY =
+            (new ProtonFactoryLoader<DataFactory>(DataFactory.class)).loadFactory();
+    private static final EngineFactory ENGINE_FACTORY =
+            (new ProtonFactoryLoader<EngineFactory>(EngineFactory.class)).loadFactory();
+
+    private static final ProtonFactory.ImplementationType DEFAULT_IMPLEMENTATION =
+            ProtonFactoryLoader.getImpliedImplementationType();
+
+    private Proton()
+    {
+    }
+
+    public static ProtonFactory.ImplementationType getDefaultImplementationType()
+    {
+        return DEFAULT_IMPLEMENTATION;
+    }
+
+    public static Connection connection()
+    {
+        return ENGINE_FACTORY.createConnection();
+    }
+
+    public static Transport transport()
+    {
+        return ENGINE_FACTORY.createTransport();
+    }
+
+    public static SslDomain sslDomain()
+    {
+        return ENGINE_FACTORY.createSslDomain();
+    }
+
+    public static SslPeerDetails sslPeerDetails(String hostname, int port)
+    {
+        return ENGINE_FACTORY.createSslPeerDetails(hostname, port);
+    }
+
+    public static Data data(long capacity)
+    {
+        return DATA_FACTORY.createData(capacity);
+    }
+
+    public static Message message()
+    {
+        return MESSAGE_FACTORY.createMessage();
+    }
+
+    public static Message message(Header header,
+                      DeliveryAnnotations deliveryAnnotations, MessageAnnotations messageAnnotations,
+                      Properties properties, ApplicationProperties applicationProperties,
+                      Section body, Footer footer)
+    {
+        return MESSAGE_FACTORY.createMessage(header, deliveryAnnotations,
+                                             messageAnnotations, properties,
+                                             applicationProperties, body, footer);
+    }
+
+
+    public static Messenger messenger()
+    {
+        return MESSENGER_FACTORY.createMessenger();
+    }
+
+    public static Messenger messenger(String name)
+    {
+        return MESSENGER_FACTORY.createMessenger(name);
+    }
+
+    public static Driver driver() throws IOException
+    {
+        return DRIVER_FACTORY.createDriver();
+    }
+
+
+
+    public static Connection connection(ProtonFactory.ImplementationType implementation)
+    {
+        return getEngineFactory(implementation).createConnection();
+    }
+
+    public static Transport transport(ProtonFactory.ImplementationType implementation)
+    {
+        return getEngineFactory(implementation).createTransport();
+    }
+
+    public static SslDomain sslDomain(ProtonFactory.ImplementationType implementation)
+    {
+        return getEngineFactory(implementation).createSslDomain();
+    }
+
+    public static SslPeerDetails sslPeerDetails(ProtonFactory.ImplementationType implementation, String hostname, int port)
+    {
+        return getEngineFactory(implementation).createSslPeerDetails(hostname, port);
+    }
+
+    public static Data data(ProtonFactory.ImplementationType implementation, long capacity)
+    {
+        return getDataFactory(implementation).createData(capacity);
+    }
+
+    public static Message message(ProtonFactory.ImplementationType implementation)
+    {
+        return getMessageFactory(implementation).createMessage();
+    }
+
+    public static Message message(ProtonFactory.ImplementationType implementation, Header header,
+                      DeliveryAnnotations deliveryAnnotations, MessageAnnotations messageAnnotations,
+                      Properties properties, ApplicationProperties applicationProperties,
+                      Section body, Footer footer)
+    {
+        return getMessageFactory(implementation).createMessage(header, deliveryAnnotations,
+                                                               messageAnnotations, properties,
+                                                               applicationProperties, body, footer);
+    }
+
+
+    public static Messenger messenger(ProtonFactory.ImplementationType implementation)
+    {
+        return getMessengerFactory(implementation).createMessenger();
+    }
+
+    public static Messenger messenger(ProtonFactory.ImplementationType implementation, String name)
+    {
+        return getMessengerFactory(implementation).createMessenger(name);
+    }
+
+    public static Driver driver(ProtonFactory.ImplementationType implementation) throws IOException
+    {
+        return getDriverFactory(implementation).createDriver();
+    }
+
+
+    private static final ConcurrentMap<ProtonFactory.ImplementationType, EngineFactory> _engineFactories =
+            new ConcurrentHashMap<ProtonFactory.ImplementationType, EngineFactory>();
+    private static final ConcurrentMap<ProtonFactory.ImplementationType, MessageFactory> _messageFactories =
+            new ConcurrentHashMap<ProtonFactory.ImplementationType, MessageFactory>();
+    private static final ConcurrentMap<ProtonFactory.ImplementationType, MessengerFactory> _messengerFactories =
+                new ConcurrentHashMap<ProtonFactory.ImplementationType, MessengerFactory>();
+    private static final ConcurrentMap<ProtonFactory.ImplementationType, DataFactory> _dataFactories =
+                new ConcurrentHashMap<ProtonFactory.ImplementationType, DataFactory>();
+    private static final ConcurrentMap<ProtonFactory.ImplementationType, DriverFactory> _driverFactories =
+                new ConcurrentHashMap<ProtonFactory.ImplementationType, DriverFactory>();
+
+    private static EngineFactory getEngineFactory(ProtonFactory.ImplementationType implementation)
+    {
+        return getFactory(EngineFactory.class, implementation, _engineFactories);
+    }
+
+    private static MessageFactory getMessageFactory(ProtonFactory.ImplementationType implementation)
+    {
+        return getFactory(MessageFactory.class, implementation, _messageFactories);
+    }
+
+    private static MessengerFactory getMessengerFactory(ProtonFactory.ImplementationType implementation)
+    {
+        return getFactory(MessengerFactory.class, implementation, _messengerFactories);
+    }
+
+    private static DriverFactory getDriverFactory(ProtonFactory.ImplementationType implementation)
+    {
+        return getFactory(DriverFactory.class, implementation, _driverFactories);
+    }
+
+    private static DataFactory getDataFactory(ProtonFactory.ImplementationType implementation)
+    {
+        return getFactory(DataFactory.class, implementation, _dataFactories);
+    }
+
+    private static <T extends ProtonFactory>  T getFactory(Class<T> factoryClass, ProtonFactory.ImplementationType implementation,
+                                                           ConcurrentMap<ProtonFactory.ImplementationType, T> factories)
+    {
+        T factory = factories.get(implementation);
+        if(factory == null)
+        {
+            factories.putIfAbsent(implementation, (new ProtonFactoryLoader<T>(factoryClass,implementation)).loadFactory());
+            factory = factories.get(implementation);
+
+        }
+        return factory;
+    }
+
+
+}

Modified: qpid/proton/trunk/proton-j/proton-api/src/main/java/org/apache/qpid/proton/ProtonFactoryLoader.java
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-j/proton-api/src/main/java/org/apache/qpid/proton/ProtonFactoryLoader.java?rev=1504633&r1=1504632&r2=1504633&view=diff
==============================================================================
--- qpid/proton/trunk/proton-j/proton-api/src/main/java/org/apache/qpid/proton/ProtonFactoryLoader.java (original)
+++ qpid/proton/trunk/proton-j/proton-api/src/main/java/org/apache/qpid/proton/ProtonFactoryLoader.java Thu Jul 18 20:19:04 2013
@@ -54,7 +54,7 @@ public class ProtonFactoryLoader<C exten
         this(factoryInterface, getImpliedImplementationType());
     }
 
-    private static ImplementationType getImpliedImplementationType()
+    static ImplementationType getImpliedImplementationType()
     {
         String implementationTypeFromSystemProperty = System.getProperty(IMPLEMENTATION_TYPE_PROPERTY);
         if(implementationTypeFromSystemProperty != null)

Modified: qpid/proton/trunk/proton-j/proton-api/src/main/resources/proton.py
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-j/proton-api/src/main/resources/proton.py?rev=1504633&r1=1504632&r2=1504633&view=diff
==============================================================================
--- qpid/proton/trunk/proton-j/proton-api/src/main/resources/proton.py (original)
+++ qpid/proton/trunk/proton-j/proton-api/src/main/resources/proton.py Thu Jul 18 20:19:04 2013
@@ -23,18 +23,18 @@ try:
 except NameError:
   bytes = str
 
-from org.apache.qpid.proton import ProtonFactoryLoader, ProtonUnsupportedOperationException
+from org.apache.qpid.proton import Proton, ProtonUnsupportedOperationException
 from org.apache.qpid.proton import InterruptException as Interrupt
 from org.apache.qpid.proton.engine import \
-    EngineFactory, Transport as JTransport, Sender as JSender, Receiver as JReceiver, \
+    Transport as JTransport, Sender as JSender, Receiver as JReceiver, \
     Sasl, SslDomain as JSslDomain, \
     EndpointState, TransportException
 
 from org.apache.qpid.proton.message import \
-    MessageFormat, MessageFactory, Message as JMessage
+    MessageFormat, Message as JMessage
 from org.apache.qpid.proton.codec import \
-    DataFactory, Data as JData
-from org.apache.qpid.proton.messenger import MessengerFactory, MessengerException, Status
+    Data as JData
+from org.apache.qpid.proton.messenger import MessengerException, Status
 from org.apache.qpid.proton.amqp.transport import ErrorCondition, SenderSettleMode, ReceiverSettleMode
 from org.apache.qpid.proton.amqp.messaging import Source, Target, Accepted, \
     Rejected, Received, Modified, Released, AmqpValue
@@ -74,15 +74,9 @@ STATUSES = {
 MANUAL = "MANUAL"
 AUTOMATIC = "AUTOMATIC"
 
-protonFactoryLoader = ProtonFactoryLoader()
-engineFactory = protonFactoryLoader.loadFactory(EngineFactory)
-messageFactory = protonFactoryLoader.loadFactory(MessageFactory)
-messengerFactory = protonFactoryLoader.loadFactory(MessengerFactory)
-dataFactory = protonFactoryLoader.loadFactory(DataFactory)
-
 API_LANGUAGE = "Java"
 IMPLEMENTATION_LANGUAGE = "C"
-if engineFactory.getImplementationType().name() == "PROTON_J":
+if Proton.getDefaultImplementationType().name() == "PROTON_J":
   IMPLEMENTATION_LANGUAGE = "Java"
 
 
@@ -202,7 +196,7 @@ class Connection(Endpoint):
 
   def __init__(self, _impl=None):
     Endpoint.__init__(self)
-    self.impl = _impl or engineFactory.createConnection()
+    self.impl = _impl or Proton.connection()
     self.desired_capabilities = None
     self.offered_capabilities = None
     self.properties = None
@@ -709,7 +703,7 @@ class Transport(object):
   TRACE_DRV = 4
 
   def __init__(self):
-    self.impl = engineFactory.createTransport()
+    self.impl = Proton.transport()
 
   def trace(self, mask):
     # XXX: self.impl.trace(mask)
@@ -889,7 +883,7 @@ class Data(object):
   MAP = JData.DataType.MAP;
 
   def __init__(self, capacity=16):
-    self._data = dataFactory.createData(capacity)
+    self._data = Proton.data(capacity)
 
   def __del__(self):
     if hasattr(self, "_data"):
@@ -1251,9 +1245,9 @@ class Messenger(object):
 
   def __init__(self, name=None):
     if name:
-      self.impl = messengerFactory.createMessenger(name)
+      self.impl = Proton.messenger(name)
     else:
-      self.impl = messengerFactory.createMessenger()
+      self.impl = Proton.messenger()
 
   def route(self, *args, **kwargs):
     raise Skipped()
@@ -1367,7 +1361,7 @@ class Message(object):
   DEFAULT_PRIORITY = JMessage.DEFAULT_PRIORITY
 
   def __init__(self):
-    self.impl = messageFactory.createMessage()
+    self.impl = Proton.message()
 
   def clear(self):
     self.impl.clear()
@@ -1598,7 +1592,7 @@ class SSLDomain(object):
 
   def __init__(self, mode):
     try:
-      self._domain = engineFactory.createSslDomain()
+      self._domain = Proton.sslDomain()
     except NoClassDefFoundError, e:
       raise SSLUnavailable()
     self._domain.init(mode)
@@ -1622,7 +1616,7 @@ class SSLDomain(object):
 class SSLSessionDetails(object):
 
   def __init__(self, session_id):
-    self._session_details = engineFactory.createSslPeerDetails(session_id, 1)
+    self._session_details = Proton.sslPeerDetails(session_id, 1)
 
 class SSL(object):
 

Modified: qpid/proton/trunk/proton-j/proton/src/main/java/org/apache/qpid/proton/messenger/impl/MessengerImpl.java
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-j/proton/src/main/java/org/apache/qpid/proton/messenger/impl/MessengerImpl.java?rev=1504633&r1=1504632&r2=1504633&view=diff
==============================================================================
--- qpid/proton/trunk/proton-j/proton/src/main/java/org/apache/qpid/proton/messenger/impl/MessengerImpl.java (original)
+++ qpid/proton/trunk/proton-j/proton/src/main/java/org/apache/qpid/proton/messenger/impl/MessengerImpl.java Thu Jul 18 20:19:04 2013
@@ -28,6 +28,7 @@ import java.util.Iterator;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
+import org.apache.qpid.proton.Proton;
 import org.apache.qpid.proton.ProtonFactoryLoader;
 import org.apache.qpid.proton.InterruptException;
 import org.apache.qpid.proton.TimeoutException;
@@ -58,8 +59,6 @@ import org.apache.qpid.proton.amqp.Binar
 
 public class MessengerImpl implements Messenger
 {
-    @SuppressWarnings("rawtypes")
-    private static ProtonFactoryLoader protonFactoryLoader = new ProtonFactoryLoader();
 
     private static final EnumSet<EndpointState> UNINIT = EnumSet.of(EndpointState.UNINITIALIZED);
     private static final EnumSet<EndpointState> ACTIVE = EnumSet.of(EndpointState.ACTIVE);
@@ -68,9 +67,6 @@ public class MessengerImpl implements Me
 
     private final Logger _logger = Logger.getLogger("proton.messenger");
     private final String _name;
-    private final EngineFactory _engineFactory;
-    private final DriverFactory _driverFactory;
-    private final MessageFactory _messageFactory;
     private long _timeout = -1;
     private boolean _blocking = true;
     private long _nextTag = 1;
@@ -99,19 +95,7 @@ public class MessengerImpl implements Me
      */
     @Deprecated public MessengerImpl(String name)
     {
-        this(name, defaultEngineFactory(), defaultDriverFactory(), defaultMessageFactory());
-    }
-
-    /**
-     * @deprecated This constructor's visibility will be reduced to the default scope in a future release.
-     * Client code outside this module should use a {@link MessengerFactory} instead
-     */
-    @Deprecated public MessengerImpl(String name, EngineFactory engineFactory, DriverFactory driverFactory, MessageFactory messageFactory)
-    {
         _name = name;
-        _engineFactory = engineFactory;
-        _driverFactory = driverFactory;
-        _messageFactory = messageFactory;
     }
 
     public void setTimeout(long timeInMillis)
@@ -136,7 +120,7 @@ public class MessengerImpl implements Me
 
     public void start() throws IOException
     {
-        _driver = _driverFactory.createDriver();
+        _driver = Proton.driver();
     }
 
     public void stop()
@@ -277,7 +261,7 @@ public class MessengerImpl implements Me
                 {
                     _logger.log(Level.FINE, "Readable delivery found: " + delivery);
                     int size = read((Receiver) delivery.getLink());
-                    Message message = _messageFactory.createMessage();
+                    Message message = Proton.message();
                     message.decode(_buffer, 0, size);
                     delivery.getLink().advance();
                     _incoming.add(delivery);
@@ -459,7 +443,7 @@ public class MessengerImpl implements Me
         {
             _worked = true;
             Connector<?> c = l.accept();
-            Connection connection = _engineFactory.createConnection();
+            Connection connection = Proton.connection();
             connection.setContainer(_name);
             c.setConnection(connection);
             //TODO: SSL and full SASL
@@ -869,7 +853,7 @@ public class MessengerImpl implements Me
         {
             Connector<?> connector = _driver.createConnector(host, port, null);
             _logger.log(Level.FINE, "Connecting to " + host + ":" + port);
-            connection = _engineFactory.createConnection();
+            connection = Proton.connection();
             connection.setContainer(_name);
             connection.setHostname(host);
             connection.setContext(service);
@@ -1049,24 +1033,6 @@ public class MessengerImpl implements Me
         else return 5672;
     }
 
-    @SuppressWarnings("unchecked")
-    private static EngineFactory defaultEngineFactory()
-    {
-        return (EngineFactory) protonFactoryLoader.loadFactory(EngineFactory.class);
-    }
-
-    @SuppressWarnings("unchecked")
-    private static DriverFactory defaultDriverFactory()
-    {
-        return (DriverFactory) protonFactoryLoader.loadFactory(DriverFactory.class);
-    }
-
-    @SuppressWarnings("unchecked")
-    private static MessageFactory defaultMessageFactory()
-    {
-        return (MessageFactory) protonFactoryLoader.loadFactory(MessageFactory.class);
-    }
-
     @Override
     public String toString()
     {



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org