View Javadoc
1   /*
2    * Copyright (C) 2009, Constantine Plotnikov <constantine.plotnikov@gmail.com>
3    * Copyright (C) 2008, Google Inc.
4    * Copyright (C) 2008, Marek Zawirski <marek.zawirski@gmail.com>
5    * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
6    * and other copyright owners as documented in the project's IP log.
7    *
8    * This program and the accompanying materials are made available
9    * under the terms of the Eclipse Distribution License v1.0 which
10   * accompanies this distribution, is reproduced below, and is
11   * available at http://www.eclipse.org/org/documents/edl-v10.php
12   *
13   * All rights reserved.
14   *
15   * Redistribution and use in source and binary forms, with or
16   * without modification, are permitted provided that the following
17   * conditions are met:
18   *
19   * - Redistributions of source code must retain the above copyright
20   *   notice, this list of conditions and the following disclaimer.
21   *
22   * - Redistributions in binary form must reproduce the above
23   *   copyright notice, this list of conditions and the following
24   *   disclaimer in the documentation and/or other materials provided
25   *   with the distribution.
26   *
27   * - Neither the name of the Eclipse Foundation, Inc. nor the
28   *   names of its contributors may be used to endorse or promote
29   *   products derived from this software without specific prior
30   *   written permission.
31   *
32   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
33   * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
34   * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
35   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
36   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
37   * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
38   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
39   * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
40   * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
41   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
42   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
43   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
44   * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
45   */
46  
47  package org.eclipse.jgit.transport;
48  
49  import java.io.File;
50  import java.io.FileInputStream;
51  import java.io.FileNotFoundException;
52  import java.io.InputStream;
53  import java.util.Arrays;
54  import java.util.Collections;
55  import java.util.LinkedHashSet;
56  import java.util.Set;
57  
58  import org.eclipse.jgit.errors.NotSupportedException;
59  import org.eclipse.jgit.errors.TransportException;
60  import org.eclipse.jgit.internal.JGitText;
61  import org.eclipse.jgit.lib.Repository;
62  import org.eclipse.jgit.util.FS;
63  
64  class TransportBundleFile extends Transport implements TransportBundle {
65  	static final TransportProtocol PROTO_BUNDLE = new TransportProtocol() {
66  		private final String[] schemeNames = { "bundle", "file" }; //$NON-NLS-1$ //$NON-NLS-2$
67  
68  		private final Set<String> schemeSet = Collections
69  				.unmodifiableSet(new LinkedHashSet<String>(Arrays
70  						.asList(schemeNames)));
71  
72  		@Override
73  		public String getName() {
74  			return JGitText.get().transportProtoBundleFile;
75  		}
76  
77  		public Set<String> getSchemes() {
78  			return schemeSet;
79  		}
80  
81  		@Override
82  		public boolean canHandle(URIish uri, Repository local, String remoteName) {
83  			if (uri.getPath() == null
84  					|| uri.getPort() > 0
85  					|| uri.getUser() != null
86  					|| uri.getPass() != null
87  					|| uri.getHost() != null
88  					|| (uri.getScheme() != null && !getSchemes().contains(uri.getScheme())))
89  				return false;
90  			return true;
91  		}
92  
93  		@Override
94  		public Transport open(URIish uri, Repository local, String remoteName)
95  				throws NotSupportedException, TransportException {
96  			if ("bundle".equals(uri.getScheme())) { //$NON-NLS-1$
97  				File path = FS.DETECTED.resolve(new File("."), uri.getPath()); //$NON-NLS-1$
98  				return new TransportBundleFile(local, uri, path);
99  			}
100 
101 			// This is an ambiguous reference, it could be a bundle file
102 			// or it could be a Git repository. Allow TransportLocal to
103 			// resolve the path and figure out which type it is by testing
104 			// the target.
105 			//
106 			return TransportLocal.PROTO_LOCAL.open(uri, local, remoteName);
107 		}
108 
109 		public Transport open(URIish uri) throws NotSupportedException,
110 				TransportException {
111 			if ("bundle".equals(uri.getScheme())) { //$NON-NLS-1$
112 				File path = FS.DETECTED.resolve(new File("."), uri.getPath()); //$NON-NLS-1$
113 				return new TransportBundleFile(uri, path);
114 			}
115 			return TransportLocal.PROTO_LOCAL.open(uri);
116 		}
117 	};
118 
119 	private final File bundle;
120 
121 	TransportBundleFile(Repository local, URIish uri, File bundlePath) {
122 		super(local, uri);
123 		bundle = bundlePath;
124 	}
125 
126 	public TransportBundleFile(URIish uri, File bundlePath) {
127 		super(uri);
128 		bundle = bundlePath;
129 	}
130 
131 	@Override
132 	public FetchConnection openFetch() throws NotSupportedException,
133 			TransportException {
134 		final InputStream src;
135 		try {
136 			src = new FileInputStream(bundle);
137 		} catch (FileNotFoundException err) {
138 			throw new TransportException(uri, JGitText.get().notFound);
139 		}
140 		return new BundleFetchConnection(this, src);
141 	}
142 
143 	@Override
144 	public PushConnection openPush() throws NotSupportedException {
145 		throw new NotSupportedException(
146 				JGitText.get().pushIsNotSupportedForBundleTransport);
147 	}
148 
149 	@Override
150 	public void close() {
151 		// Resources must be established per-connection.
152 	}
153 
154 }