Mercurial > jhg
comparison src/org/tmatesoft/hg/repo/HgLookup.java @ 699:a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Thu, 08 Aug 2013 19:18:50 +0200 |
| parents | 822f3a83ff57 |
| children |
comparison
equal
deleted
inserted
replaced
| 698:822f3a83ff57 | 699:a483b2b68a2e |
|---|---|
| 17 package org.tmatesoft.hg.repo; | 17 package org.tmatesoft.hg.repo; |
| 18 | 18 |
| 19 import static org.tmatesoft.hg.util.LogFacility.Severity.Warn; | 19 import static org.tmatesoft.hg.util.LogFacility.Severity.Warn; |
| 20 | 20 |
| 21 import java.io.File; | 21 import java.io.File; |
| 22 import java.io.InputStream; | |
| 23 import java.net.URI; | 22 import java.net.URI; |
| 24 import java.net.URISyntaxException; | 23 import java.net.URISyntaxException; |
| 25 import java.net.URL; | 24 import java.net.URL; |
| 26 import java.net.URLStreamHandler; | 25 import java.net.URLStreamHandler; |
| 27 import java.net.URLStreamHandlerFactory; | 26 import java.net.URLStreamHandlerFactory; |
| 31 import org.tmatesoft.hg.core.HgRepositoryNotFoundException; | 30 import org.tmatesoft.hg.core.HgRepositoryNotFoundException; |
| 32 import org.tmatesoft.hg.core.SessionContext; | 31 import org.tmatesoft.hg.core.SessionContext; |
| 33 import org.tmatesoft.hg.internal.BasicSessionContext; | 32 import org.tmatesoft.hg.internal.BasicSessionContext; |
| 34 import org.tmatesoft.hg.internal.ConfigFile; | 33 import org.tmatesoft.hg.internal.ConfigFile; |
| 35 import org.tmatesoft.hg.internal.DataAccessProvider; | 34 import org.tmatesoft.hg.internal.DataAccessProvider; |
| 36 import org.tmatesoft.hg.internal.Experimental; | |
| 37 import org.tmatesoft.hg.internal.RequiresFile; | 35 import org.tmatesoft.hg.internal.RequiresFile; |
| 38 import org.tmatesoft.hg.repo.HgRepoConfig.PathsSection; | 36 import org.tmatesoft.hg.repo.HgRepoConfig.PathsSection; |
| 39 | 37 |
| 40 /** | 38 /** |
| 41 * Utility methods to find Mercurial repository at a given location | 39 * Utility methods to find Mercurial repository at a given location |
| 182 * @param uriRemote remote repository location | 180 * @param uriRemote remote repository location |
| 183 * @return instance to interact with remote repository | 181 * @return instance to interact with remote repository |
| 184 * @throws HgBadArgumentException | 182 * @throws HgBadArgumentException |
| 185 */ | 183 */ |
| 186 public HgRemoteRepository detectRemote(URI uriRemote) throws HgBadArgumentException { | 184 public HgRemoteRepository detectRemote(URI uriRemote) throws HgBadArgumentException { |
| 187 RemoteDescriptor rd = getSessionContext().getRemoteDescriptor(uriRemote); | 185 HgRemoteRepository.RemoteDescriptor rd = getSessionContext().getRemoteDescriptor(uriRemote); |
| 188 if (rd == null) { | 186 if (rd == null) { |
| 189 throw new HgBadArgumentException(String.format("Unsupported remote repository location:%s", uriRemote), null); | 187 throw new HgBadArgumentException(String.format("Unsupported remote repository location:%s", uriRemote), null); |
| 190 } | 188 } |
| 191 return new HgRemoteRepository(getSessionContext(), rd); | 189 return new HgRemoteRepository(getSessionContext(), rd); |
| 192 } | 190 } |
| 208 if (sessionContext == null) { | 206 if (sessionContext == null) { |
| 209 sessionContext = new BasicSessionContext(null); | 207 sessionContext = new BasicSessionContext(null); |
| 210 } | 208 } |
| 211 return sessionContext; | 209 return sessionContext; |
| 212 } | 210 } |
| 213 | |
| 214 | |
| 215 /** | |
| 216 * Session context ({@link SessionContext#getRemoteDescriptor(URI)} gives descriptor of remote when asked. | |
| 217 */ | |
| 218 @Experimental(reason="Work in progress") | |
| 219 public interface RemoteDescriptor { | |
| 220 URI getURI(); | |
| 221 Authenticator getAuth(); | |
| 222 } | |
| 223 | |
| 224 @Experimental(reason="Work in progress") | |
| 225 public interface Authenticator { | |
| 226 public void authenticate(RemoteDescriptor remote, AuthMethod authMethod); | |
| 227 } | |
| 228 | |
| 229 /** | |
| 230 * Clients do not implement this interface, instead, they invoke appropriate authentication method | |
| 231 * once they got user input | |
| 232 */ | |
| 233 @Experimental(reason="Work in progress") | |
| 234 public interface AuthMethod { | |
| 235 public void noCredentials() throws AuthFailedException; | |
| 236 public boolean supportsPassword(); | |
| 237 public void withPassword(String username, byte[] password) throws AuthFailedException; | |
| 238 public boolean supportsPublicKey(); | |
| 239 public void withPublicKey(String username, InputStream publicKey, String passphrase) throws AuthFailedException; | |
| 240 public boolean supportsCertificate(); | |
| 241 public void withCertificate() throws AuthFailedException; | |
| 242 } | |
| 243 | |
| 244 @SuppressWarnings("serial") | |
| 245 public class AuthFailedException extends Exception /*XXX HgRemoteException?*/ { | |
| 246 public AuthFailedException(String message, Throwable cause) { | |
| 247 super(message, cause); | |
| 248 } | |
| 249 } | |
| 250 } | 211 } |
