1 /*
2 * Copyright (C) 2009, Constantine Plotnikov <constantine.plotnikov@gmail.com>
3 * Copyright (C) 2009, Google Inc.
4 * Copyright (C) 2009, JetBrains s.r.o.
5 * Copyright (C) 2008, Marek Zawirski <marek.zawirski@gmail.com>
6 * Copyright (C) 2008-2009, Shawn O. Pearce <spearce@spearce.org>
7 * and other copyright owners as documented in the project's IP log.
8 *
9 * This program and the accompanying materials are made available
10 * under the terms of the Eclipse Distribution License v1.0 which
11 * accompanies this distribution, is reproduced below, and is
12 * available at http://www.eclipse.org/org/documents/edl-v10.php
13 *
14 * All rights reserved.
15 *
16 * Redistribution and use in source and binary forms, with or
17 * without modification, are permitted provided that the following
18 * conditions are met:
19 *
20 * - Redistributions of source code must retain the above copyright
21 * notice, this list of conditions and the following disclaimer.
22 *
23 * - Redistributions in binary form must reproduce the above
24 * copyright notice, this list of conditions and the following
25 * disclaimer in the documentation and/or other materials provided
26 * with the distribution.
27 *
28 * - Neither the name of the Eclipse Foundation, Inc. nor the
29 * names of its contributors may be used to endorse or promote
30 * products derived from this software without specific prior
31 * written permission.
32 *
33 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
34 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
35 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
36 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
37 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
38 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
39 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
40 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
41 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
42 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
43 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
44 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
45 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
46 */
47
48 package org.eclipse.jgit.transport;
49
50 import org.eclipse.jgit.errors.TransportException;
51 import org.eclipse.jgit.internal.JGitText;
52 import org.eclipse.jgit.lib.Repository;
53 import org.eclipse.jgit.util.FS;
54
55 /**
56 * The base class for transports that use SSH protocol. This class allows
57 * customizing SSH connection settings.
58 */
59 public abstract class SshTransport extends TcpTransport {
60
61 private SshSessionFactory sch;
62
63 /**
64 * The open SSH session
65 */
66 private RemoteSession sock;
67
68 /**
69 * Create a new transport instance.
70 *
71 * @param local
72 * the repository this instance will fetch into, or push out of.
73 * This must be the repository passed to
74 * {@link #open(Repository, URIish)}.
75 * @param uri
76 * the URI used to access the remote repository. This must be the
77 * URI passed to {@link #open(Repository, URIish)}.
78 */
79 protected SshTransport(Repository local, URIish uri) {
80 super(local, uri);
81 sch = SshSessionFactory.getInstance();
82 }
83
84 /**
85 * Create a new transport instance without a local repository.
86 *
87 * @param uri the URI used to access the remote repository. This must be the
88 * URI passed to {@link #open(URIish)}.
89 * @since 3.5
90 */
91 protected SshTransport(URIish uri) {
92 super(uri);
93 sch = SshSessionFactory.getInstance();
94 }
95
96 /**
97 * Set SSH session factory instead of the default one for this instance of
98 * the transport.
99 *
100 * @param factory
101 * a factory to set, must not be null
102 * @throws java.lang.IllegalStateException
103 * if session has been already created.
104 */
105 public void setSshSessionFactory(SshSessionFactory factory) {
106 if (factory == null)
107 throw new NullPointerException(JGitText.get().theFactoryMustNotBeNull);
108 if (sock != null)
109 throw new IllegalStateException(
110 JGitText.get().anSSHSessionHasBeenAlreadyCreated);
111 sch = factory;
112 }
113
114 /**
115 * Get the SSH session factory
116 *
117 * @return the SSH session factory that will be used for creating SSH
118 * sessions
119 */
120 public SshSessionFactory getSshSessionFactory() {
121 return sch;
122 }
123
124 /**
125 * Get the default SSH session
126 *
127 * @return a remote session
128 * @throws org.eclipse.jgit.errors.TransportException
129 * in case of error with opening SSH session
130 */
131 protected RemoteSession getSession() throws TransportException {
132 if (sock != null)
133 return sock;
134
135 final int tms = getTimeout() > 0 ? getTimeout() * 1000 : 0;
136
137 final FS fs = local == null ? FS.detect() : local.getFS();
138
139 sock = sch
140 .getSession(uri, getCredentialsProvider(), fs, tms);
141 return sock;
142 }
143
144 /** {@inheritDoc} */
145 @Override
146 public void close() {
147 if (sock != null) {
148 try {
149 sch.releaseSession(sock);
150 } finally {
151 sock = null;
152 }
153 }
154 }
155 }