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> and others
6    *
7    * This program and the accompanying materials are made available under the
8    * terms of the Eclipse Distribution License v. 1.0 which is available at
9    * https://www.eclipse.org/org/documents/edl-v10.php.
10   *
11   * SPDX-License-Identifier: BSD-3-Clause
12   */
13  
14  package org.eclipse.jgit.transport;
15  
16  import java.io.IOException;
17  import java.io.InputStream;
18  
19  import org.eclipse.jgit.errors.NotSupportedException;
20  import org.eclipse.jgit.errors.TransportException;
21  import org.eclipse.jgit.internal.JGitText;
22  import org.eclipse.jgit.lib.Repository;
23  
24  /**
25   * Single shot fetch from a streamed Git bundle.
26   * <p>
27   * The bundle is read from an unbuffered input stream, which limits the
28   * transport to opening at most one FetchConnection before needing to recreate
29   * the transport instance.
30   */
31  public class TransportBundleStream extends Transport implements TransportBundle {
32  	private InputStream src;
33  
34  	/**
35  	 * Create a new transport to fetch objects from a streamed bundle.
36  	 * <p>
37  	 * The stream can be unbuffered (buffering is automatically provided
38  	 * internally to smooth out short reads) and unpositionable (the stream is
39  	 * read from only once, sequentially).
40  	 * <p>
41  	 * When the FetchConnection or the this instance is closed the supplied
42  	 * input stream is also automatically closed. This frees callers from
43  	 * needing to keep track of the supplied stream.
44  	 *
45  	 * @param db
46  	 *            repository the fetched objects will be loaded into.
47  	 * @param uri
48  	 *            symbolic name of the source of the stream. The URI can
49  	 *            reference a non-existent resource. It is used only for
50  	 *            exception reporting.
51  	 * @param in
52  	 *            the stream to read the bundle from.
53  	 */
54  	public TransportBundleStream(final Repository db, final URIish uri,
55  			final InputStream in) {
56  		super(db, uri);
57  		src = in;
58  	}
59  
60  	/** {@inheritDoc} */
61  	@Override
62  	public FetchConnection openFetch() throws TransportException {
63  		if (src == null)
64  			throw new TransportException(uri, JGitText.get().onlyOneFetchSupported);
65  		try {
66  			return new BundleFetchConnection(this, src);
67  		} finally {
68  			src = null;
69  		}
70  	}
71  
72  	/** {@inheritDoc} */
73  	@Override
74  	public PushConnection openPush() throws NotSupportedException {
75  		throw new NotSupportedException(
76  				JGitText.get().pushIsNotSupportedForBundleTransport);
77  	}
78  
79  	/** {@inheritDoc} */
80  	@Override
81  	public void close() {
82  		if (src != null) {
83  			try {
84  				src.close();
85  			} catch (IOException err) {
86  				// Ignore a close error.
87  			} finally {
88  				src = null;
89  			}
90  		}
91  	}
92  }