You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ra...@apache.org on 2007/08/18 01:32:54 UTC

svn commit: r567174 - in /incubator/qpid/trunk/qpid/java: ./ client/src/main/java/org/apache/qpidity/jms/ common/src/main/java/org/apache/qpidity/ common/src/main/java/org/apache/qpidity/url/

Author: rajith
Date: Fri Aug 17 16:32:53 2007
New Revision: 567174

URL: http://svn.apache.org/viewvc?view=rev&rev=567174
Log:
wrote a parser for the new URL format

Modified:
    incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/jms/ConnectionFactoryImpl.java
    incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/BrokerDetails.java
    incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/BrokerDetailsImpl.java
    incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/url/QpidURLImpl.java
    incubator/qpid/trunk/qpid/java/pom.xml

Modified: incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/jms/ConnectionFactoryImpl.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/jms/ConnectionFactoryImpl.java?view=diff&rev=567174&r1=567173&r2=567174
==============================================================================
--- incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/jms/ConnectionFactoryImpl.java (original)
+++ incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/jms/ConnectionFactoryImpl.java Fri Aug 17 16:32:53 2007
@@ -474,6 +474,16 @@
                     return new TopicImpl(new BindingURLImpl((String) addr.getContent()));
                 }
             }
+            
+            if (ref.getClassName().equals(DestinationImpl.class.getName()))
+            {
+                RefAddr addr = ref.get(DestinationImpl.class.getName());
+
+                if (addr != null)
+                {
+                    return new DestinationImpl(new BindingURLImpl((String) addr.getContent()));
+                }
+            }
 
             if (ref.getClassName().equals(ConnectionFactoryImpl.class.getName()))
             {

Modified: incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/BrokerDetails.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/BrokerDetails.java?view=diff&rev=567174&r1=567173&r2=567174
==============================================================================
--- incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/BrokerDetails.java (original)
+++ incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/BrokerDetails.java Fri Aug 17 16:32:53 2007
@@ -17,6 +17,8 @@
  */
 package org.apache.qpidity;
 
+import java.util.Map;
+
 /**
  * This interface represents a broker and provides the basic information
  * required for opening a connection with a broker.
@@ -28,6 +30,11 @@
      */
     public static final String PROTOCOL_TCP = "tcp";
     public static final String PROTOCOL_TLS = "tls";
+    
+    public static final String VIRTUAL_HOST = "virtualhost";
+    public static final String CLIENT_ID = "client_id";
+    public static final String USERNAME = "username";
+    public static final String PASSWORD = "password";
 
     /**
      * Get the broker host name.
@@ -97,7 +104,7 @@
      *
      * @param userName The user name
      */
-    public void getUserName(String userName);
+    public void setUserName(String userName);
 
     /**
      * Set the user password
@@ -112,4 +119,20 @@
      * @param protocol the protocol used to connect to the broker.
      */
     public void setProtocol(String protocol);
+    
+    /**
+     * Ex: keystore path
+     * 
+     * @return the Properties associated with this connection.
+     */
+    public Map<String,String> getProperties();
+    
+    /**
+     * Sets the properties associated with this connection
+     * 
+     * @param props
+     */
+    public void setProperties(Map<String,String> props);
+    
+    public void setProperty(String key,String value);
 }

Modified: incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/BrokerDetailsImpl.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/BrokerDetailsImpl.java?view=diff&rev=567174&r1=567173&r2=567174
==============================================================================
--- incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/BrokerDetailsImpl.java (original)
+++ incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/BrokerDetailsImpl.java Fri Aug 17 16:32:53 2007
@@ -17,6 +17,9 @@
  */
 package org.apache.qpidity;
 
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * Implements the interface BrokerDetails
  */
@@ -31,11 +34,17 @@
     private String _host;
     private int _port;
     private String _virtualHost;
-    private String _userName;
-    private String _password;
+    private String _userName = DEFAULT_USERNAME;
+    private String _password = DEFAULT_PASSWORD;
     private String _protocol;
+    private Map<String,String> _props = new HashMap<String,String>();;
+    
     //--- Constructors
 
+    public BrokerDetailsImpl()
+    {        
+    }
+    
     /**
      * Create a new broker details given all the reuqired information
      *
@@ -47,7 +56,7 @@
      * @param password    The user password.
      */
     public BrokerDetailsImpl(String protocol, String host, int port, String virtualHost, String userName,
-                             String password)
+                             String password,Map<String,String> props)
     {
         _protocol = protocol;
         _host = host;
@@ -55,6 +64,7 @@
         _virtualHost = virtualHost;
         _userName = userName;
         _password = password;
+        _props = props;
     }
 
     /**
@@ -177,7 +187,7 @@
      *
      * @param userName The user name
      */
-    public void getUserName(String userName)
+    public void setUserName(String userName)
     {
         _userName = userName;
     }
@@ -200,5 +210,51 @@
     public void setProtocol(String protocol)
     {
         _protocol = protocol;
+    }
+    
+    /**
+     * Ex: keystore path
+     * 
+     * @return the Properties associated with this connection.
+     */
+    public Map<String,String> getProperties()
+    {
+        return _props;
+    }
+    
+    /**
+     * Sets the properties associated with this connection
+     * 
+     * @param props
+     */
+    public void setProperties(Map<String,String> props)
+    {
+        _props = props;
+    }
+    
+    public void setProperty(String key,String value)
+    {
+        _props.put(key, value);
+    }
+    
+    public String toString()
+    {
+        StringBuilder b = new StringBuilder();
+        b.append("[username=" + _userName);
+        b.append(",password=" + _password);
+        b.append(",transport="+ _protocol);
+        b.append(",host=" + _host);
+        b.append(",port=" + _port + "]");
+        b.append(" - Properties[");
+        if (_props != null)
+        {
+            for (String k:_props.keySet())
+            {
+                b.append(k + "=" + _props.get(k) + ",");
+            }
+        }
+        b.append("]");
+        
+        return b.toString();
     }
 }

Modified: incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/url/QpidURLImpl.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/url/QpidURLImpl.java?view=diff&rev=567174&r1=567173&r2=567174
==============================================================================
--- incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/url/QpidURLImpl.java (original)
+++ incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/url/QpidURLImpl.java Fri Aug 17 16:32:53 2007
@@ -18,7 +18,10 @@
 package org.apache.qpidity.url;
 
 import org.apache.qpidity.BrokerDetails;
+import org.apache.qpidity.BrokerDetailsImpl;
 
+import java.net.MalformedURLException;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -39,27 +42,361 @@
  * <p> future_prot_id    = <placeholder, must end in ":". Example "sctp:">
  * <p> future_prot_addr  = <placeholder, protocl-specific address>
  * <p> future_parameters = <placeholder, not used in failover addresses>
+ * 
+ * Ex: qpid:virtualhost=test@client_id1:tcp:myhost.com:5672,virtualhost=prod,keystore=/opt/keystore@client_id2:tls:mysecurehost.com:5672
  */
 public class QpidURLImpl implements QpidURL
 {
-    //-- Constructors
-
-    public QpidURLImpl(String url)
+    private static final char[] URL_START_SEQ = new char[]{'q','p','i','d',':'}; 
+    private static final char PROPERTY_EQUALS_CHAR = '=';
+    private static final char PROPERTY_SEPARATOR_CHAR = ',';
+    private static final char ADDRESS_SEPERATOR_CHAR = ',';
+    private static final char CLIENT_ID_TRANSPORT_SEPARATOR_CHAR = ':';
+    private static final char TRANSPORT_HOST_SEPARATOR_CHAR = ':';
+    private static final char HOST_PORT_SEPARATOR_CHAR = ':';
+    private static final char AT_CHAR = '@';
+    
+    enum URLParserState
     {
-        // todo pars this URL
+       QPID_URL_START,       
+       ADDRESS_START,
+       PROPERTY_NAME,
+       PROPERTY_EQUALS,
+       PROPERTY_VALUE,
+       PROPERTY_SEPARATOR,
+       AT_CHAR,
+       CLIENT_ID,
+       CLIENT_ID_TRANSPORT_SEPARATOR,
+       TRANSPORT,
+       TRANSPORT_HOST_SEPARATOR,
+       HOST,
+       HOST_PORT_SEPARATOR,
+       PORT,
+       ADDRESS_END,
+       ADDRESS_SEPERATOR,
+       QPID_URL_END,
+       ERROR;
     }
-
+       
+    //-- Constructors
+    
+    private char[] _url;    
+    private List<BrokerDetails> _brokerDetailList = new ArrayList<BrokerDetails>();
+    private String _error;
+    private int _index = 0;
+    private BrokerDetails _currentBroker;
+    private String _currentPropName;
+    private boolean _endOfURL = false;
+    private URLParserState _currentParserState;
+    
+    public QpidURLImpl(String url) throws MalformedURLException
+    {    
+        _url = url.toCharArray();
+        _endOfURL = false;
+        _currentParserState = URLParserState.QPID_URL_START;
+        URLParserState prevState = _currentParserState; // for error handling        
+        BrokerDetails _brokerDetails = new BrokerDetailsImpl();
+        try
+        {   
+            while ( _currentParserState != URLParserState.ERROR && _currentParserState != URLParserState.QPID_URL_END)
+            {
+                prevState = _currentParserState;
+                _currentParserState = next();
+            }   
+            
+            if(_currentParserState == URLParserState.ERROR)
+            {
+                _error = "Invalid URL format [current_state = " +  prevState + ", broker details parsed so far " + _currentBroker + " ] error at (" + _index +") due to " + _error;            
+                MalformedURLException ex = new MalformedURLException(_error);
+                throw ex;
+            }
+        }
+        catch(ArrayIndexOutOfBoundsException e)
+        {
+            _error = "Invalid URL format [current_state = " +  prevState + ", broker details parsed so far " + _currentBroker + " ] error at (" + _index +")";            
+            MalformedURLException ex = new MalformedURLException(_error);
+            throw ex;
+        }
+    }
+    
     //-- interface QpidURL
-
     public List<BrokerDetails> getAllBrokerDetails()
     {
-        // TODO
-        return null;
+        return _brokerDetailList;
     }
 
      public String getURL()
      {
-         //TODO
-         return "";
+         return new String(_url);
+     }
+     
+     private URLParserState next()
+     {
+         switch(_currentParserState)      
+         {
+         case QPID_URL_START:             
+             return checkSequence(URL_START_SEQ,URLParserState.ADDRESS_START);
+         case ADDRESS_START:
+             return startAddress();
+         case PROPERTY_NAME:    
+             return extractPropertyName();
+         case PROPERTY_EQUALS:   
+             _index++; // skip the equal sign
+             return URLParserState.PROPERTY_VALUE;
+         case PROPERTY_VALUE:    
+             return extractPropertyValue();
+         case PROPERTY_SEPARATOR:
+             _index++; // skip ","
+             return URLParserState.PROPERTY_NAME;
+         case AT_CHAR:
+             _index++; // skip the @ sign
+         case CLIENT_ID:    
+             return extractClientId();
+         case CLIENT_ID_TRANSPORT_SEPARATOR:
+             _index++; // skip ":"
+             return URLParserState.TRANSPORT;
+         case TRANSPORT:    
+             return extractTransport();
+         case TRANSPORT_HOST_SEPARATOR:
+             _index++; // skip ":"
+             return URLParserState.HOST;
+         case HOST:
+             return extractHost();
+         case HOST_PORT_SEPARATOR:
+             _index++; // skip ":"
+             return URLParserState.PORT;
+         case PORT:
+             extractPort();
+         case ADDRESS_END:
+             return endAddress();
+         case ADDRESS_SEPERATOR:
+             _index++; // skip ","
+             return URLParserState.ADDRESS_START;
+         default:
+             return URLParserState.ERROR;
+         }
+     }
+     
+     private URLParserState checkSequence(char[] expected,URLParserState nextPart)
+     {   
+         for(int i=0;i<expected.length;i++)
+         {
+             if(expected[i] != _url[_index])
+             {
+                 _error = "Excepted (" + expected[i] + ") at position " + _index + ", got (" + _url[_index] + ")";
+                 return URLParserState.ERROR;
+             }
+             _index++;
+         }
+         return nextPart;
+     }   
+     
+     private URLParserState startAddress()
+     {
+         _currentBroker = new BrokerDetailsImpl();
+         return URLParserState.PROPERTY_NAME;
+     }
+     
+     private URLParserState endAddress()
+     {
+         _brokerDetailList.add(_currentBroker);
+         if(_endOfURL)
+         {
+             return URLParserState.QPID_URL_END;
+         }
+         else
+         {
+             return URLParserState.ADDRESS_SEPERATOR;
+         }
+     }
+     
+     private URLParserState extractPropertyName()
+     {
+         StringBuilder b = new StringBuilder();
+         char next = _url[_index];
+         while(next != PROPERTY_EQUALS_CHAR && next != AT_CHAR)
+         {
+             b.append(next);
+             next = _url[++_index];
+         }
+         _currentPropName = b.toString();         
+         if(_currentPropName.trim().equals(""))
+         {
+             _error = "Property name cannot be empty";
+             return URLParserState.ERROR;
+         }
+         else if (next == PROPERTY_EQUALS_CHAR)
+         {
+             return URLParserState.PROPERTY_EQUALS;
+         }
+         else
+         {
+             return URLParserState.AT_CHAR;
+         }
+     }
+     
+     private URLParserState extractPropertyValue()
+     {
+         StringBuilder b = new StringBuilder();
+         char next = _url[_index];
+         while(next != PROPERTY_SEPARATOR_CHAR && next != AT_CHAR)
+         {
+             b.append(next);
+             next = _url[++_index];
+         }
+         String propValue = b.toString();
+         if(propValue.trim().equals(""))
+         {
+             _error = "Property values cannot be empty";
+             return URLParserState.ERROR;
+         }
+         else
+         {
+             _currentBroker.setProperty(_currentPropName, propValue);
+             if (next == PROPERTY_SEPARATOR_CHAR)
+             {
+                 return URLParserState.PROPERTY_SEPARATOR;
+             }
+             else
+             {
+                 return URLParserState.AT_CHAR;
+             }
+         }
+     }
+     
+     private URLParserState extractClientId()
+     {
+         //Check if atleast virtualhost is there
+         if (_currentBroker.getProperties().get(BrokerDetails.VIRTUAL_HOST) == null)
+         {
+             _error = "Virtual host is a mandatory property";
+             return URLParserState.ERROR;
+         }
+         else
+         {
+             _currentBroker.setVirtualHost(_currentBroker.getProperties().get(BrokerDetails.VIRTUAL_HOST));
+             _currentBroker.getProperties().remove(BrokerDetails.VIRTUAL_HOST);
+         }
+         
+         if (_currentBroker.getProperties().get(BrokerDetails.USERNAME) != null)
+         {
+             String username = _currentBroker.getProperties().get(BrokerDetails.USERNAME);
+             _currentBroker.setUserName(username);
+         }
+         if (_currentBroker.getProperties().get(BrokerDetails.PASSWORD) != null)
+         {
+             String password = _currentBroker.getProperties().get(BrokerDetails.PASSWORD);
+             _currentBroker.setPassword(password);
+         }
+         
+         String clientId = buildUntil(CLIENT_ID_TRANSPORT_SEPARATOR_CHAR);
+         if (clientId.trim().equals(""))
+         {
+             _error = "Client Id cannot be empty";
+             return URLParserState.ERROR;
+         }
+         else
+         {
+             _currentBroker.setProperty(BrokerDetails.CLIENT_ID, clientId);
+             return URLParserState.CLIENT_ID_TRANSPORT_SEPARATOR;
+         }
+     }
+     
+     private URLParserState extractTransport()
+     {
+         String transport = buildUntil(TRANSPORT_HOST_SEPARATOR_CHAR);
+         if (transport.trim().equals(""))
+         {
+             _error = "Transport cannot be empty";
+             return URLParserState.ERROR;
+         }
+         else
+         {
+             _currentBroker.setProtocol(transport);
+             return URLParserState.TRANSPORT_HOST_SEPARATOR;
+         }
+     }
+     
+     private URLParserState extractHost()
+     {
+         String host = buildUntil(HOST_PORT_SEPARATOR_CHAR);
+         if (host.trim().equals(""))
+         {
+             _error = "Host cannot be empty";
+             return URLParserState.ERROR;
+         }
+         else
+         {
+             _currentBroker.setHost(host);
+             return URLParserState.HOST_PORT_SEPARATOR;
+         }
+     }
+     
+     private URLParserState extractPort()
+     {
+         
+         StringBuilder b = new StringBuilder();
+         try
+         {
+             char next = _url[_index];
+             while(next != ADDRESS_SEPERATOR_CHAR)
+             {
+                 b.append(next);
+                 next = _url[++_index];
+             }
+         }
+         catch(ArrayIndexOutOfBoundsException e)
+         {
+             _endOfURL = true;
+         }         
+         String portStr = b.toString();
+         if (portStr.trim().equals(""))
+         {
+             _error = "Host cannot be empty";
+             return URLParserState.ERROR;
+         }         
+         else
+         {
+             try
+             {
+                 int port = Integer.parseInt(portStr);
+                 _currentBroker.setPort(port);
+                 return URLParserState.ADDRESS_END;
+             }
+             catch(NumberFormatException e)
+             {
+                 _error = "Illegal number for port";
+                 return URLParserState.ERROR;
+             }
+         }
+     }
+     
+     private String buildUntil(char c)
+     {
+         StringBuilder b = new StringBuilder();
+         char next = _url[_index];
+         while(next != c)
+         {
+             b.append(next);
+             next = _url[++_index];
+         }
+         return b.toString();
+     }
+     
+     public static void main(String[] args)
+     {
+         String testurl = "qpid:virtualhost=test@client_id1:tcp:myhost.com:5672,virtualhost=prod,keystore=/opt/keystore@client_id2:tls:mysecurehost.com:5672";
+         try
+         {
+             QpidURLImpl impl = new QpidURLImpl(testurl);
+             for (BrokerDetails d : impl.getAllBrokerDetails())
+             {
+                 System.out.println(d);
+             }
+         }
+         catch(Exception e)
+         {
+             e.printStackTrace();
+         }
      }
 }

Modified: incubator/qpid/trunk/qpid/java/pom.xml
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/pom.xml?view=diff&rev=567174&r1=567173&r2=567174
==============================================================================
--- incubator/qpid/trunk/qpid/java/pom.xml (original)
+++ incubator/qpid/trunk/qpid/java/pom.xml Fri Aug 17 16:32:53 2007
@@ -154,7 +154,7 @@
         <module>cluster</module>
         <module>systests</module>
         <module>perftests</module>
-        <module>integrationtests</module>
+       <!-- <module>integrationtests</module> -->
         <module>management/eclipse-plugin</module>
         <module>client/example</module>
         <module>client-java14</module>