import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.channels.FileChannel;
private String branch;
private PersonIdent author;
private RemoteReader callback;
+ private InputStream inputStream;
private List<Project> bareProjects;
private Git git;
private static class XmlManifest extends DefaultHandler {
private final RepoCommand command;
+ private final InputStream inputStream;
private final String filename;
private final String baseUrl;
private final Map<String, String> remotes;
private String defaultRevision;
private Project currentProject;
- XmlManifest(RepoCommand command, String filename, String baseUrl, String groups) {
+ XmlManifest(RepoCommand command, InputStream inputStream,
+ String filename, String baseUrl, String groups) {
this.command = command;
+ this.inputStream = inputStream;
this.filename = filename;
this.baseUrl = baseUrl;
remotes = new HashMap<String, String>();
throw new IOException(JGitText.get().noXMLParserAvailable);
}
xr.setContentHandler(this);
- final FileInputStream in = new FileInputStream(filename);
try {
- xr.parse(new InputSource(in));
+ xr.parse(new InputSource(inputStream));
} catch (SAXException e) {
- IOException error = new IOException(MessageFormat.format(
- RepoText.get().errorParsingManifestFile, filename));
+ IOException error = new IOException(
+ RepoText.get().errorParsingManifestFile);
error.initCause(e);
throw error;
- } finally {
- in.close();
}
}
@Override
public void endDocument() throws SAXException {
if (defaultRemote == null) {
- throw new SAXException(MessageFormat.format(
- RepoText.get().errorNoDefault, filename));
+ if (filename != null)
+ throw new SAXException(MessageFormat.format(
+ RepoText.get().errorNoDefaultFilename, filename));
+ else
+ throw new SAXException(RepoText.get().errorNoDefault);
}
final String remoteUrl;
try {
}
/**
- * Set path to the manifest XML file
+ * Set path to the manifest XML file.
+ *
+ * Calling {@link #setInputStream} will ignore the path set here.
*
* @param path
* (with <code>/</code> as separator)
return this;
}
+ /**
+ * Set the input stream to the manifest XML.
+ *
+ * Setting inputStream will ignore the path set.
+ * It will be closed in {@link #call}.
+ *
+ * @param inputStream
+ * @return this command
+ */
+ public RepoCommand setInputStream(final InputStream inputStream) {
+ this.inputStream = inputStream;
+ return this;
+ }
+
/**
* Set base URI of the pathes inside the XML
*
@Override
public RevCommit call() throws GitAPIException {
- checkCallable();
- if (path == null || path.length() == 0)
- throw new IllegalArgumentException(JGitText.get().pathNotConfigured);
- if (uri == null || uri.length() == 0)
- throw new IllegalArgumentException(JGitText.get().uriNotConfigured);
-
- if (repo.isBare()) {
- bareProjects = new ArrayList<Project>();
- if (author == null)
- author = new PersonIdent(repo);
- if (callback == null)
- callback = new DefaultRemoteReader();
- } else
- git = new Git(repo);
-
- XmlManifest manifest = new XmlManifest(this, path, uri, groups);
try {
- manifest.read();
- } catch (IOException e) {
- throw new ManifestErrorException(e);
+ checkCallable();
+ if (uri == null || uri.length() == 0)
+ throw new IllegalArgumentException(
+ JGitText.get().uriNotConfigured);
+ if (inputStream == null) {
+ if (path == null || path.length() == 0)
+ throw new IllegalArgumentException(
+ JGitText.get().pathNotConfigured);
+ try {
+ inputStream = new FileInputStream(path);
+ } catch (IOException e) {
+ throw new IllegalArgumentException(
+ JGitText.get().pathNotConfigured);
+ }
+ }
+
+ if (repo.isBare()) {
+ bareProjects = new ArrayList<Project>();
+ if (author == null)
+ author = new PersonIdent(repo);
+ if (callback == null)
+ callback = new DefaultRemoteReader();
+ } else
+ git = new Git(repo);
+
+ XmlManifest manifest = new XmlManifest(
+ this, inputStream, path, uri, groups);
+ try {
+ manifest.read();
+ } catch (IOException e) {
+ throw new ManifestErrorException(e);
+ }
+ } finally {
+ try {
+ if (inputStream != null)
+ inputStream.close();
+ } catch (IOException e) {
+ // Just ignore it, it's not important.
+ }
}
if (repo.isBare()) {