From: Constantine Plotnikov <constantine.plotnikov@gmail.com>
To: "Shawn O. Pearce" <spearce@spearce.org>, git@vger.kernel.org
Subject: [JGIT PATCH 2/3] Moved common SSH related functionality to the base class SshTransport
Date: Thu, 16 Apr 2009 18:04:42 +0400 [thread overview]
Message-ID: <85647ef50904160704w1ef283bcn2f0e0a146ca63d69@mail.gmail.com> (raw)
The common SSH-related functionality moved from subclasses
to base class (creating and closing sessions). The ability
to configure SSH session factory was added as well.
Signed-off-by: Constantine Plotnikov <constantine.plotnikov@gmail.com>
---
.../org/spearce/jgit/transport/SshTransport.java | 84 +++++++++++++++++++-
.../spearce/jgit/transport/TransportGitSsh.java | 40 ---------
.../org/spearce/jgit/transport/TransportSftp.java | 41 ----------
3 files changed, 82 insertions(+), 83 deletions(-)
diff --git a/org.spearce.jgit/src/org/spearce/jgit/transport/SshTransport.java
b/org.spearce.jgit/src/org/spearce/jgit/transport/SshTransport.java
index 4532590..f053f28 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/transport/SshTransport.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/transport/SshTransport.java
@@ -37,14 +37,28 @@
*/
package org.spearce.jgit.transport;
+import java.net.ConnectException;
+import java.net.UnknownHostException;
+
+import org.spearce.jgit.errors.TransportException;
import org.spearce.jgit.lib.Repository;
+import com.jcraft.jsch.JSchException;
+import com.jcraft.jsch.Session;
+
/**
- * The base class for transports that use SSH protocol. This class
- * allows customizing SSH connection settings.
+ * The base class for transports that use SSH protocol. This class allows
+ * customizing SSH connection settings.
*/
public abstract class SshTransport extends TcpTransport {
+ private SshSessionFactory sch;
+
+ /**
+ * The open SSH session
+ */
+ protected Session sock;
+
/**
* Create a new transport instance.
*
@@ -58,5 +72,71 @@
*/
public SshTransport(Repository local, URIish uri) {
super(local, uri);
+ sch = SshSessionFactory.getInstance();
+ }
+
+ /**
+ * Set SSH session factory instead of the default one for this instance of
+ * the transport.
+ *
+ * @param factory
+ * a factory to set, must not be null
+ * @throws IllegalStateException
+ * if session has been already created.
+ */
+ public void setSshSessionFactory(SshSessionFactory factory) {
+ if (factory == null)
+ throw new NullPointerException("The factory must not be null");
+ if (sock != null)
+ throw new IllegalStateException(
+ "An SSH session has been already created");
+ sch = factory;
+ }
+
+ /**
+ * @return the SSH session factory that will be used for creating SSH sessions
+ */
+ public SshSessionFactory getSshSessionFactory() {
+ return sch;
+ }
+
+
+ /**
+ * Initialize SSH session
+ *
+ * @throws TransportException
+ * in case of error with opening SSH session
+ */
+ protected void initSession() throws TransportException {
+ if (sock != null)
+ return;
+
+ final String user = uri.getUser();
+ final String pass = uri.getPass();
+ final String host = uri.getHost();
+ final int port = uri.getPort();
+ try {
+ sock = sch.getSession(user, pass, host, port);
+ if (!sock.isConnected())
+ sock.connect();
+ } catch (JSchException je) {
+ final Throwable c = je.getCause();
+ if (c instanceof UnknownHostException)
+ throw new TransportException(uri, "unknown host");
+ if (c instanceof ConnectException)
+ throw new TransportException(uri, c.getMessage());
+ throw new TransportException(uri, je.getMessage(), je);
+ }
+ }
+
+ @Override
+ public void close() {
+ if (sock != null) {
+ try {
+ sch.releaseSession(sock);
+ } finally {
+ sock = null;
+ }
+ }
}
}
diff --git a/org.spearce.jgit/src/org/spearce/jgit/transport/TransportGitSsh.java
b/org.spearce.jgit/src/org/spearce/jgit/transport/TransportGitSsh.java
index 1f69ed7..a24878a 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/transport/TransportGitSsh.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/transport/TransportGitSsh.java
@@ -41,8 +41,6 @@
import java.io.IOException;
import java.io.OutputStream;
-import java.net.ConnectException;
-import java.net.UnknownHostException;
import org.spearce.jgit.errors.NoRemoteRepositoryException;
import org.spearce.jgit.errors.TransportException;
@@ -51,7 +49,6 @@
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSchException;
-import com.jcraft.jsch.Session;
/**
* Transport through an SSH tunnel.
@@ -80,15 +77,10 @@ static boolean canHandle(final URIish uri) {
return false;
}
- private final SshSessionFactory sch;
-
- private Session sock;
-
OutputStream errStream;
TransportGitSsh(final Repository local, final URIish uri) {
super(local, uri);
- sch = SshSessionFactory.getInstance();
}
@Override
@@ -101,17 +93,6 @@ public PushConnection openPush() throws TransportException {
return new SshPushConnection();
}
- @Override
- public void close() {
- if (sock != null) {
- try {
- sch.releaseSession(sock);
- } finally {
- sock = null;
- }
- }
- }
-
private static void sqMinimal(final StringBuilder cmd, final String val) {
if (val.matches("^[a-zA-Z0-9._/-]*$")) {
// If the string matches only generally safe characters
@@ -135,27 +116,6 @@ private static void sq(final StringBuilder cmd,
final String val) {
cmd.append(QuotedString.BOURNE.quote(val));
}
- private void initSession() throws TransportException {
- if (sock != null)
- return;
-
- final String user = uri.getUser();
- final String pass = uri.getPass();
- final String host = uri.getHost();
- final int port = uri.getPort();
- try {
- sock = sch.getSession(user, pass, host, port);
- if (!sock.isConnected())
- sock.connect();
- } catch (JSchException je) {
- final Throwable c = je.getCause();
- if (c instanceof UnknownHostException)
- throw new TransportException(uri, "unknown host");
- if (c instanceof ConnectException)
- throw new TransportException(uri, c.getMessage());
- throw new TransportException(uri, je.getMessage(), je);
- }
- }
ChannelExec exec(final String exe) throws TransportException {
initSession();
diff --git a/org.spearce.jgit/src/org/spearce/jgit/transport/TransportSftp.java
b/org.spearce.jgit/src/org/spearce/jgit/transport/TransportSftp.java
index 50bd564..e18d128 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/transport/TransportSftp.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/transport/TransportSftp.java
@@ -41,8 +41,6 @@
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
-import java.net.ConnectException;
-import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -63,7 +61,6 @@
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSchException;
-import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpATTRS;
import com.jcraft.jsch.SftpException;
@@ -92,13 +89,8 @@ static boolean canHandle(final URIish uri) {
return uri.isRemote() && "sftp".equals(uri.getScheme());
}
- private final SshSessionFactory sch;
-
- private Session sock;
-
TransportSftp(final Repository local, final URIish uri) {
super(local, uri);
- sch = SshSessionFactory.getInstance();
}
@Override
@@ -117,39 +109,6 @@ public PushConnection openPush() throws
TransportException {
return r;
}
- @Override
- public void close() {
- if (sock != null) {
- try {
- sch.releaseSession(sock);
- } finally {
- sock = null;
- }
- }
- }
-
- private void initSession() throws TransportException {
- if (sock != null)
- return;
-
- final String user = uri.getUser();
- final String pass = uri.getPass();
- final String host = uri.getHost();
- final int port = uri.getPort();
- try {
- sock = sch.getSession(user, pass, host, port);
- if (!sock.isConnected())
- sock.connect();
- } catch (JSchException je) {
- final Throwable c = je.getCause();
- if (c instanceof UnknownHostException)
- throw new TransportException(uri, "unknown host");
- if (c instanceof ConnectException)
- throw new TransportException(uri, c.getMessage());
- throw new TransportException(uri, je.getMessage(), je);
- }
- }
-
ChannelSftp newSftp() throws TransportException {
initSession();
--
1.6.0.2.1172.ga5ed0
reply other threads:[~2009-04-16 14:06 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=85647ef50904160704w1ef283bcn2f0e0a146ca63d69@mail.gmail.com \
--to=constantine.plotnikov@gmail.com \
--cc=git@vger.kernel.org \
--cc=spearce@spearce.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).