[jboss-svn-commits] JBL Code SVN: r29348 - in labs/jbossesb/branches/JBESB_4_4_GA_CP/product/rosetta: tests/src/org/jboss/soa/esb/listeners/config/mappers and 1 other directory.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Sep 15 07:05:31 EDT 2009


Author: kevin.conner at jboss.com
Date: 2009-09-15 07:05:30 -0400 (Tue, 15 Sep 2009)
New Revision: 29348

Added:
   labs/jbossesb/branches/JBESB_4_4_GA_CP/product/rosetta/tests/src/org/jboss/soa/esb/listeners/config/mappers/jbossesb_config_escaping.xml
Modified:
   labs/jbossesb/branches/JBESB_4_4_GA_CP/product/rosetta/src/org/jboss/soa/esb/listeners/config/mappers/FtpListenerMapper.java
   labs/jbossesb/branches/JBESB_4_4_GA_CP/product/rosetta/tests/src/org/jboss/soa/esb/listeners/config/mappers/FtpListenerMapperUnitTest.java
Log:
Fix FTP URL escaping: JBESB-2828

Modified: labs/jbossesb/branches/JBESB_4_4_GA_CP/product/rosetta/src/org/jboss/soa/esb/listeners/config/mappers/FtpListenerMapper.java
===================================================================
--- labs/jbossesb/branches/JBESB_4_4_GA_CP/product/rosetta/src/org/jboss/soa/esb/listeners/config/mappers/FtpListenerMapper.java	2009-09-15 08:46:31 UTC (rev 29347)
+++ labs/jbossesb/branches/JBESB_4_4_GA_CP/product/rosetta/src/org/jboss/soa/esb/listeners/config/mappers/FtpListenerMapper.java	2009-09-15 11:05:30 UTC (rev 29348)
@@ -20,6 +20,9 @@
 
 package org.jboss.soa.esb.listeners.config.mappers;
 
+import java.net.URI;
+import java.net.URISyntaxException;
+
 import org.jboss.soa.esb.ConfigurationException;
 import org.jboss.soa.esb.addressing.eprs.FTPEpr;
 import org.jboss.soa.esb.addressing.eprs.FTPSEpr;
@@ -112,16 +115,56 @@
 	 */
 	private static final String FTP_SEPARATOR = "/";
 
-	private static void mapFtpEprProperties(Element toElement, FtpProvider provider, FtpMessageFilter messageFilter) 
+	private static void mapFtpEprProperties(Element toElement, FtpProvider provider, FtpMessageFilter messageFilter)
+		throws ConfigurationException
 	{
 		String inputDir = messageFilter.getDirectory();
 		if ( ! inputDir.startsWith( FTP_SEPARATOR ) )
 			inputDir = FTP_SEPARATOR + inputDir;
 		
 		final String filterPassword = messageFilter.getPassword() ;
-		final String urlPassword = (filterPassword == null ? "" : ":" + filterPassword) ;
-		toElement.setAttribute(ListenerTagNames.URL_TAG, messageFilter.getProtocol() + "://" + messageFilter.getUsername()
-				+ urlPassword + "@" + provider.getHostname() + inputDir );
+		final String username = encodeUsername(messageFilter.getUsername()) ;
+		final String userInfo = (filterPassword == null ? username : username + ":" + filterPassword) ;
+		final String origHostname = provider.getHostname() ;
+		final int colonLocation = origHostname.indexOf(':') ;
+		final String hostname ;
+		final int port ;
+		if (colonLocation > -1)
+		{
+			hostname = origHostname.substring(0, colonLocation) ;
+			final int portLocation = colonLocation+1 ;
+			if (portLocation < origHostname.length())
+			{
+				try
+				{
+					port = Integer.parseInt(origHostname.substring(portLocation)) ;
+				}
+				catch (final NumberFormatException nfe)
+				{
+					throw new ConfigurationException("Failed to parse port value") ;
+				}
+			}
+			else
+			{
+				port = -1 ;
+			}
+		}
+		else
+		{
+			hostname = origHostname ;
+			port = -1 ;
+		}
+		final URI uri ;
+		try
+		{
+			uri = new URI(messageFilter.getProtocol().toString(),
+				userInfo, hostname, port, inputDir, null, null) ;
+		}
+		catch (final URISyntaxException urise)
+		{
+			throw new ConfigurationException("Unexpected exception creating FTP URI, " + urise.getMessage()) ;
+		}
+		toElement.setAttribute(ListenerTagNames.URL_TAG, uri.toASCIIString());
 		toElement.setAttribute(FTPEpr.INPUT_SUFFIX_TAG, messageFilter.getInputSuffix());
 		toElement.setAttribute(FTPEpr.WORK_SUFFIX_TAG, messageFilter.getWorkSuffix());
 		toElement.setAttribute(FTPEpr.POST_DEL_TAG, String.valueOf(messageFilter.getPostDelete()));
@@ -144,4 +187,30 @@
 			toElement.setAttribute(FTPSEpr.CERTIFICATE_NAME_TAG, messageFilter.getCertificateName());
 		}
 	}
+	
+	private static String encodeUsername(final String username)
+	{
+		if (username != null)
+		{
+			int colonPosn = username.indexOf(':') ;
+			if (colonPosn > -1)
+			{
+				int currentIndex = 0 ;
+				final StringBuilder sb = new StringBuilder() ;
+				while(colonPosn > 0)
+				{
+					sb.append(username.substring(currentIndex, colonPosn)) ;
+					sb.append("%3A") ;
+					currentIndex = colonPosn+1 ;
+					colonPosn = username.indexOf(':', currentIndex) ;
+				}
+				if (currentIndex < username.length())
+				{
+					sb.append(username.substring(currentIndex)) ;
+				}
+				return sb.toString() ;
+			}
+		}
+		return username ;
+	}
 }

Modified: labs/jbossesb/branches/JBESB_4_4_GA_CP/product/rosetta/tests/src/org/jboss/soa/esb/listeners/config/mappers/FtpListenerMapperUnitTest.java
===================================================================
--- labs/jbossesb/branches/JBESB_4_4_GA_CP/product/rosetta/tests/src/org/jboss/soa/esb/listeners/config/mappers/FtpListenerMapperUnitTest.java	2009-09-15 08:46:31 UTC (rev 29347)
+++ labs/jbossesb/branches/JBESB_4_4_GA_CP/product/rosetta/tests/src/org/jboss/soa/esb/listeners/config/mappers/FtpListenerMapperUnitTest.java	2009-09-15 11:05:30 UTC (rev 29348)
@@ -28,11 +28,14 @@
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.URI;
 import java.util.List;
 
 import org.apache.log4j.Logger;
 import org.jboss.soa.esb.ConfigurationException;
 import org.jboss.soa.esb.dom.YADOMUtil;
+import org.jboss.soa.esb.listeners.ListenerTagNames;
+import org.jboss.soa.esb.listeners.config.GatewayGenerator;
 import org.jboss.soa.esb.listeners.config.Generator;
 import org.jboss.soa.esb.listeners.config.xbeanmodel.FtpListenerDocument;
 import org.jboss.soa.esb.listeners.config.xbeanmodel.Listener;
@@ -44,6 +47,7 @@
 import org.w3c.dom.Element;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
 
 /**
  * Tests the class FtpListenerMapper 
@@ -57,6 +61,7 @@
 	private Logger log = Logger.getLogger(FtpListenerMapperUnitTest.class);
 	
 	private static final String ESB_CONFIG_READ_ONLY = "jbossesb_config_readonly.xml";
+	private static final String ESB_CONFIG_ESCAPING = "jbossesb_config_escaping.xml";
 	
 	private static final String GATEWAY_CLASS_ATTRIBUTE = "gatewayClass";
 		
@@ -85,6 +90,29 @@
 		assertEquals( ReadOnlyRemoteGatewayListener.class.getName(), gatewayClass.getNodeValue() );
 	}
 	
+	@Test
+	public void testEscaping() throws Exception
+	{
+		final InputStream is = getClass().getResourceAsStream(ESB_CONFIG_ESCAPING) ;
+		final XMLBeansModel model = Generator.parseConfig(is) ;
+		final GatewayGenerator gatewayGenerator = new GatewayGenerator(model);
+		final Document gatewayConfig = gatewayGenerator.generate();
+		final Element root = gatewayConfig.getDocumentElement() ;
+		final NodeList listenerList = root.getElementsByTagName("listener") ;
+		assertEquals("Listener count", 1, listenerList.getLength()) ;
+		final Node listener = listenerList.item(0) ;
+		final NamedNodeMap attributes = listener.getAttributes() ;
+		final Node urlNode = attributes.getNamedItem(ListenerTagNames.URL_TAG) ;
+		assertNotNull("URL node", urlNode) ;
+		final String urlValue = urlNode.getNodeValue() ;
+		assertNotNull("URL value", urlValue) ;
+		final URI uri = new URI(urlValue) ;
+		assertEquals("host", "localhost", uri.getHost()) ;
+		assertEquals("port", 21, uri.getPort()) ;
+		assertEquals("path", "/directory/####", uri.getPath()) ;
+		assertEquals("userInfo", "user%3A##user:password:##password", uri.getUserInfo()) ;
+	}
+	
 	private XMLBeansModel getXmlBeanModel( String fileName ) throws ConfigurationException, IOException
 	{
 		InputStream inputStream = getClass().getResourceAsStream( ESB_CONFIG_READ_ONLY );

Added: labs/jbossesb/branches/JBESB_4_4_GA_CP/product/rosetta/tests/src/org/jboss/soa/esb/listeners/config/mappers/jbossesb_config_escaping.xml
===================================================================
--- labs/jbossesb/branches/JBESB_4_4_GA_CP/product/rosetta/tests/src/org/jboss/soa/esb/listeners/config/mappers/jbossesb_config_escaping.xml	                        (rev 0)
+++ labs/jbossesb/branches/JBESB_4_4_GA_CP/product/rosetta/tests/src/org/jboss/soa/esb/listeners/config/mappers/jbossesb_config_escaping.xml	2009-09-15 11:05:30 UTC (rev 29348)
@@ -0,0 +1,18 @@
+<?xml version = "1.0" encoding = "UTF-8"?>
+<jbossesb xmlns="http://anonsvn.labs.jboss.com/labs/jbossesb/trunk/product/etc/schemas/xml/jbossesb-1.0.1.xsd">
+    <providers>
+        <ftp-provider name="FTP" hostname="localhost:21">
+            <ftp-bus busid="FTPbus">
+                <ftp-message-filter directory="/directory/####" username="user:##user" password="password:##password"/>
+            </ftp-bus>
+        </ftp-provider>
+    </providers>
+    
+    <services>
+        <service category="Test" name="FTPTest" description="FTP escaping Test">
+            <listeners>
+                <ftp-listener name="FtpMapperListener" busidref="FTPbus" is-gateway="true"/>
+            </listeners>
+        </service>
+    </services>
+</jbossesb>


Property changes on: labs/jbossesb/branches/JBESB_4_4_GA_CP/product/rosetta/tests/src/org/jboss/soa/esb/listeners/config/mappers/jbossesb_config_escaping.xml
___________________________________________________________________
Name: svn:mime-type
   + text/xml
Name: svn:keywords
   + Rev Date
Name: svn:eol-style
   + native



More information about the jboss-svn-commits mailing list