{"thread":{"id":"18915","subject":"[JGIT PATCH (resending) 2/3] Moved common SSH related functionality to the base class SshTransport","startedAt":"2009-04-17T15:27:14Z","lastAt":"2009-04-17T15:27:14Z","messageCount":1,"participants":["Constantine Plotnikov"],"isPatch":true,"patchVersion":1,"patchTotal":3},"messages":[{"id":"111494","messageId":"85647ef50904170827se6b4d3fw68c3d48082e0ad3d@mail.gmail.com","threadId":"18915","inReplyTo":null,"subject":"[JGIT PATCH (resending) 2/3] Moved common SSH related functionality to the base class SshTransport","fromName":"Constantine Plotnikov","fromEmail":"constantine.plotnikov@gmail.com","sentAt":"2009-04-17T15:27:14Z","receivedAt":"2009-04-17T15:27:14Z","isPatch":true,"sender":{"key":"constantine.plotnikov@gmail.com","avatar":null},"body":"The common SSH-related functionality moved from subclasses\nto base class (creating and closing sessions). The ability\nto configure SSH session factory was added as well.\n\nSigned-off-by: Constantine Plotnikov <constantine.plotnikov@gmail.com>\n---\nResending the patch using git imap-send\n\n .../org/spearce/jgit/transport/SshTransport.java   |   84 +++++++++++++++++++-\n .../spearce/jgit/transport/TransportGitSsh.java    |   40 ---------\n .../org/spearce/jgit/transport/TransportSftp.java  |   41 ----------\n 3 files changed, 82 insertions(+), 83 deletions(-)\n\ndiff --git a/org.spearce.jgit/src/org/spearce/jgit/transport/SshTransport.java\nb/org.spearce.jgit/src/org/spearce/jgit/transport/SshTransport.java\nindex 4532590..f053f28 100644\n--- a/org.spearce.jgit/src/org/spearce/jgit/transport/SshTransport.java\n+++ b/org.spearce.jgit/src/org/spearce/jgit/transport/SshTransport.java\n@@ -37,14 +37,28 @@\n  */\n package org.spearce.jgit.transport;\n\n+import java.net.ConnectException;\n+import java.net.UnknownHostException;\n+\n+import org.spearce.jgit.errors.TransportException;\n import org.spearce.jgit.lib.Repository;\n\n+import com.jcraft.jsch.JSchException;\n+import com.jcraft.jsch.Session;\n+\n /**\n- * The base class for transports that use SSH protocol. This class\n- * allows customizing SSH connection settings.\n+ * The base class for transports that use SSH protocol. This class allows\n+ * customizing SSH connection settings.\n  */\n public abstract class SshTransport extends TcpTransport {\n\n+\tprivate SshSessionFactory sch;\n+\n+\t/**\n+\t * The open SSH session\n+\t */\n+\tprotected Session sock;\n+\n \t/**\n \t * Create a new transport instance.\n \t *\n@@ -58,5 +72,71 @@\n \t */\n \tpublic SshTransport(Repository local, URIish uri) {\n \t\tsuper(local, uri);\n+\t\tsch = SshSessionFactory.getInstance();\n+\t}\n+\n+\t/**\n+\t * Set SSH session factory instead of the default one for this instance of\n+\t * the transport.\n+\t *\n+\t * @param factory\n+\t *            a factory to set, must not be null\n+\t * @throws IllegalStateException\n+\t *             if session has been already created.\n+\t */\n+\tpublic void setSshSessionFactory(SshSessionFactory factory) {\n+\t\tif (factory == null)\n+\t\t\tthrow new NullPointerException(\"The factory must not be null\");\n+\t\tif (sock != null)\n+\t\t\tthrow new IllegalStateException(\n+\t\t\t\t\t\"An SSH session has been already created\");\n+\t\tsch = factory;\n+\t}\n+\n+\t/**\n+\t * @return the SSH session factory that will be used for creating SSH sessions\n+\t */\n+\tpublic SshSessionFactory getSshSessionFactory() {\n+\t\treturn sch;\n+\t}\n+\n+\n+\t/**\n+\t * Initialize SSH session\n+\t *\n+\t * @throws TransportException\n+\t *             in case of error with opening SSH session\n+\t */\n+\tprotected void initSession() throws TransportException {\n+\t\tif (sock != null)\n+\t\t\treturn;\n+\n+\t\tfinal String user = uri.getUser();\n+\t\tfinal String pass = uri.getPass();\n+\t\tfinal String host = uri.getHost();\n+\t\tfinal int port = uri.getPort();\n+\t\ttry {\n+\t\t\tsock = sch.getSession(user, pass, host, port);\n+\t\t\tif (!sock.isConnected())\n+\t\t\t\tsock.connect();\n+\t\t} catch (JSchException je) {\n+\t\t\tfinal Throwable c = je.getCause();\n+\t\t\tif (c instanceof UnknownHostException)\n+\t\t\t\tthrow new TransportException(uri, \"unknown host\");\n+\t\t\tif (c instanceof ConnectException)\n+\t\t\t\tthrow new TransportException(uri, c.getMessage());\n+\t\t\tthrow new TransportException(uri, je.getMessage(), je);\n+\t\t}\n+\t}\n+\n+\t@Override\n+\tpublic void close() {\n+\t\tif (sock != null) {\n+\t\t\ttry {\n+\t\t\t\tsch.releaseSession(sock);\n+\t\t\t} finally {\n+\t\t\t\tsock = null;\n+\t\t\t}\n+\t\t}\n \t}\n }\ndiff --git a/org.spearce.jgit/src/org/spearce/jgit/transport/TransportGitSsh.java\nb/org.spearce.jgit/src/org/spearce/jgit/transport/TransportGitSsh.java\nindex 1f69ed7..a24878a 100644\n--- a/org.spearce.jgit/src/org/spearce/jgit/transport/TransportGitSsh.java\n+++ b/org.spearce.jgit/src/org/spearce/jgit/transport/TransportGitSsh.java\n@@ -41,8 +41,6 @@\n\n import java.io.IOException;\n import java.io.OutputStream;\n-import java.net.ConnectException;\n-import java.net.UnknownHostException;\n\n import org.spearce.jgit.errors.NoRemoteRepositoryException;\n import org.spearce.jgit.errors.TransportException;\n@@ -51,7 +49,6 @@\n\n import com.jcraft.jsch.ChannelExec;\n import com.jcraft.jsch.JSchException;\n-import com.jcraft.jsch.Session;\n\n /**\n  * Transport through an SSH tunnel.\n@@ -80,15 +77,10 @@ static boolean canHandle(final URIish uri) {\n \t\treturn false;\n \t}\n\n-\tprivate final SshSessionFactory sch;\n-\n-\tprivate Session sock;\n-\n \tOutputStream errStream;\n\n \tTransportGitSsh(final Repository local, final URIish uri) {\n \t\tsuper(local, uri);\n-\t\tsch = SshSessionFactory.getInstance();\n \t}\n\n \t@Override\n@@ -101,17 +93,6 @@ public PushConnection openPush() throws TransportException {\n \t\treturn new SshPushConnection();\n \t}\n\n-\t@Override\n-\tpublic void close() {\n-\t\tif (sock != null) {\n-\t\t\ttry {\n-\t\t\t\tsch.releaseSession(sock);\n-\t\t\t} finally {\n-\t\t\t\tsock = null;\n-\t\t\t}\n-\t\t}\n-\t}\n-\n \tprivate static void sqMinimal(final StringBuilder cmd, final String val) {\n \t\tif (val.matches(\"^[a-zA-Z0-9._/-]*$\")) {\n \t\t\t// If the string matches only generally safe characters\n@@ -135,27 +116,6 @@ private static void sq(final StringBuilder cmd,\nfinal String val) {\n \t\t\tcmd.append(QuotedString.BOURNE.quote(val));\n \t}\n\n-\tprivate void initSession() throws TransportException {\n-\t\tif (sock != null)\n-\t\t\treturn;\n-\n-\t\tfinal String user = uri.getUser();\n-\t\tfinal String pass = uri.getPass();\n-\t\tfinal String host = uri.getHost();\n-\t\tfinal int port = uri.getPort();\n-\t\ttry {\n-\t\t\tsock = sch.getSession(user, pass, host, port);\n-\t\t\tif (!sock.isConnected())\n-\t\t\t\tsock.connect();\n-\t\t} catch (JSchException je) {\n-\t\t\tfinal Throwable c = je.getCause();\n-\t\t\tif (c instanceof UnknownHostException)\n-\t\t\t\tthrow new TransportException(uri, \"unknown host\");\n-\t\t\tif (c instanceof ConnectException)\n-\t\t\t\tthrow new TransportException(uri, c.getMessage());\n-\t\t\tthrow new TransportException(uri, je.getMessage(), je);\n-\t\t}\n-\t}\n\n \tChannelExec exec(final String exe) throws TransportException {\n \t\tinitSession();\ndiff --git a/org.spearce.jgit/src/org/spearce/jgit/transport/TransportSftp.java\nb/org.spearce.jgit/src/org/spearce/jgit/transport/TransportSftp.java\nindex 50bd564..e18d128 100644\n--- a/org.spearce.jgit/src/org/spearce/jgit/transport/TransportSftp.java\n+++ b/org.spearce.jgit/src/org/spearce/jgit/transport/TransportSftp.java\n@@ -41,8 +41,6 @@\n import java.io.FileNotFoundException;\n import java.io.IOException;\n import java.io.OutputStream;\n-import java.net.ConnectException;\n-import java.net.UnknownHostException;\n import java.util.ArrayList;\n import java.util.Collection;\n import java.util.Collections;\n@@ -63,7 +61,6 @@\n import com.jcraft.jsch.Channel;\n import com.jcraft.jsch.ChannelSftp;\n import com.jcraft.jsch.JSchException;\n-import com.jcraft.jsch.Session;\n import com.jcraft.jsch.SftpATTRS;\n import com.jcraft.jsch.SftpException;\n\n@@ -92,13 +89,8 @@ static boolean canHandle(final URIish uri) {\n \t\treturn uri.isRemote() && \"sftp\".equals(uri.getScheme());\n \t}\n\n-\tprivate final SshSessionFactory sch;\n-\n-\tprivate Session sock;\n-\n \tTransportSftp(final Repository local, final URIish uri) {\n \t\tsuper(local, uri);\n-\t\tsch = SshSessionFactory.getInstance();\n \t}\n\n \t@Override\n@@ -117,39 +109,6 @@ public PushConnection openPush() throws\nTransportException {\n \t\treturn r;\n \t}\n\n-\t@Override\n-\tpublic void close() {\n-\t\tif (sock != null) {\n-\t\t\ttry {\n-\t\t\t\tsch.releaseSession(sock);\n-\t\t\t} finally {\n-\t\t\t\tsock = null;\n-\t\t\t}\n-\t\t}\n-\t}\n-\n-\tprivate void initSession() throws TransportException {\n-\t\tif (sock != null)\n-\t\t\treturn;\n-\n-\t\tfinal String user = uri.getUser();\n-\t\tfinal String pass = uri.getPass();\n-\t\tfinal String host = uri.getHost();\n-\t\tfinal int port = uri.getPort();\n-\t\ttry {\n-\t\t\tsock = sch.getSession(user, pass, host, port);\n-\t\t\tif (!sock.isConnected())\n-\t\t\t\tsock.connect();\n-\t\t} catch (JSchException je) {\n-\t\t\tfinal Throwable c = je.getCause();\n-\t\t\tif (c instanceof UnknownHostException)\n-\t\t\t\tthrow new TransportException(uri, \"unknown host\");\n-\t\t\tif (c instanceof ConnectException)\n-\t\t\t\tthrow new TransportException(uri, c.getMessage());\n-\t\t\tthrow new TransportException(uri, je.getMessage(), je);\n-\t\t}\n-\t}\n-\n \tChannelSftp newSftp() throws TransportException {\n \t\tinitSession();\n\n-- \n1.6.0.2.1172.ga5ed0\n"}]}