Return-Path: X-Original-To: apmail-camel-commits-archive@www.apache.org Delivered-To: apmail-camel-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 9731E186E4 for ; Sat, 18 Jul 2015 09:09:19 +0000 (UTC) Received: (qmail 65897 invoked by uid 500); 18 Jul 2015 09:09:19 -0000 Delivered-To: apmail-camel-commits-archive@camel.apache.org Received: (qmail 65730 invoked by uid 500); 18 Jul 2015 09:09:18 -0000 Mailing-List: contact commits-help@camel.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@camel.apache.org Delivered-To: mailing list commits@camel.apache.org Received: (qmail 65156 invoked by uid 99); 18 Jul 2015 09:09:18 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 18 Jul 2015 09:09:18 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 8E4F6E6833; Sat, 18 Jul 2015 09:09:18 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: acosentino@apache.org To: commits@camel.apache.org Date: Sat, 18 Jul 2015 09:09:31 -0000 Message-Id: <6ee402f6b07f4366a2c4b2c6469db9ba@git.apache.org> In-Reply-To: <7e83c096651b4e1f9c2cb80f5ba7a9d9@git.apache.org> References: <7e83c096651b4e1f9c2cb80f5ba7a9d9@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [14/23] camel git commit: CAMEL-7982: camel-git - A generic git component, make git Consumer abstract CAMEL-7982: camel-git - A generic git component, make git Consumer abstract Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/8239d6f7 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/8239d6f7 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/8239d6f7 Branch: refs/heads/master Commit: 8239d6f7cd21eea3763fad80024e8f7799244035 Parents: 8205bbe Author: Andrea Cosentino Authored: Sat Jul 18 11:06:50 2015 +0200 Committer: Andrea Cosentino Committed: Sat Jul 18 11:08:15 2015 +0200 ---------------------------------------------------------------------- .../apache/camel/component/git/GitConsumer.java | 65 ---- .../apache/camel/component/git/GitEndpoint.java | 18 +- .../camel/component/git/GitOperation.java | 33 -- .../apache/camel/component/git/GitProducer.java | 334 ------------------- .../git/consumer/AbstractGitConsumer.java | 66 ++++ .../git/consumer/GitCommitConsumer.java | 36 ++ .../camel/component/git/consumer/GitType.java | 23 ++ .../component/git/producer/GitOperation.java | 33 ++ .../component/git/producer/GitProducer.java | 331 ++++++++++++++++++ .../github/consumer/GitConsumerTest.java | 4 +- 10 files changed, 507 insertions(+), 436 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/8239d6f7/components/camel-git/src/main/java/org/apache/camel/component/git/GitConsumer.java ---------------------------------------------------------------------- diff --git a/components/camel-git/src/main/java/org/apache/camel/component/git/GitConsumer.java b/components/camel-git/src/main/java/org/apache/camel/component/git/GitConsumer.java deleted file mode 100644 index ac3a5f4..0000000 --- a/components/camel-git/src/main/java/org/apache/camel/component/git/GitConsumer.java +++ /dev/null @@ -1,65 +0,0 @@ -package org.apache.camel.component.git; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import org.apache.camel.Exchange; -import org.apache.camel.Processor; -import org.apache.camel.impl.ScheduledPollConsumer; -import org.eclipse.jgit.api.Git; -import org.eclipse.jgit.lib.Repository; -import org.eclipse.jgit.revwalk.RevCommit; -import org.eclipse.jgit.storage.file.FileRepositoryBuilder; - -public class GitConsumer extends ScheduledPollConsumer { - - private GitEndpoint endpoint; - - private Repository repository; - - private Git git; - - private List used; - - public GitConsumer(GitEndpoint endpoint, Processor processor) { - super(endpoint, processor); - this.endpoint = endpoint; - this.repository = getLocalRepository(); - this.git = new Git(repository); - this.used = new ArrayList(); - } - - @Override - protected int poll() throws Exception { - int count = 0; - Iterable commits = git.log().all().call(); - for (RevCommit commit : commits) { - if (!used.contains(commit.getId())) { - Exchange e = getEndpoint().createExchange(); - e.getOut().setBody(commit.getShortMessage()); - getProcessor().process(e); - used.add(commit.getId()); - count++; - } - } - return count; - } - - private Repository getLocalRepository(){ - FileRepositoryBuilder builder = new FileRepositoryBuilder(); - Repository repo = null; - try { - repo = builder.setGitDir(new File(endpoint.getLocalPath(), ".git")) - .readEnvironment() // scan environment GIT_* variables - .findGitDir() // scan up the file system tree - .build(); - } catch (IOException e) { - //LOG.error("There was an error, cannot open " + endpoint.getLocalPath() + " repository"); - e.printStackTrace(); - } - return repo; - } - -} http://git-wip-us.apache.org/repos/asf/camel/blob/8239d6f7/components/camel-git/src/main/java/org/apache/camel/component/git/GitEndpoint.java ---------------------------------------------------------------------- diff --git a/components/camel-git/src/main/java/org/apache/camel/component/git/GitEndpoint.java b/components/camel-git/src/main/java/org/apache/camel/component/git/GitEndpoint.java index de09f95..247b60d 100644 --- a/components/camel-git/src/main/java/org/apache/camel/component/git/GitEndpoint.java +++ b/components/camel-git/src/main/java/org/apache/camel/component/git/GitEndpoint.java @@ -19,6 +19,9 @@ package org.apache.camel.component.git; import org.apache.camel.Consumer; import org.apache.camel.Processor; import org.apache.camel.Producer; +import org.apache.camel.component.git.consumer.GitCommitConsumer; +import org.apache.camel.component.git.consumer.GitType; +import org.apache.camel.component.git.producer.GitProducer; import org.apache.camel.impl.DefaultEndpoint; import org.apache.camel.spi.Metadata; import org.apache.camel.spi.UriEndpoint; @@ -30,8 +33,10 @@ public class GitEndpoint extends DefaultEndpoint { @UriPath @Metadata(required = "true") private String localPath; - @UriPath(label = "consumer") + @UriPath private String branchName; + @UriPath(label = "consumer") + private GitType type; @UriParam private String username; @UriParam @@ -52,7 +57,8 @@ public class GitEndpoint extends DefaultEndpoint { @Override public Consumer createConsumer(Processor processor) throws Exception { - return new GitConsumer(this, processor); + if (type == GitType.COMMIT) return new GitCommitConsumer(this, processor); + else throw new IllegalArgumentException("Cannot create producer with type " + type); } @Override @@ -108,4 +114,12 @@ public class GitEndpoint extends DefaultEndpoint { public void setOperation(String operation) { this.operation = operation; } + + public GitType getType() { + return type; + } + + public void setType(GitType type) { + this.type = type; + } } http://git-wip-us.apache.org/repos/asf/camel/blob/8239d6f7/components/camel-git/src/main/java/org/apache/camel/component/git/GitOperation.java ---------------------------------------------------------------------- diff --git a/components/camel-git/src/main/java/org/apache/camel/component/git/GitOperation.java b/components/camel-git/src/main/java/org/apache/camel/component/git/GitOperation.java deleted file mode 100644 index 8d7b69a..0000000 --- a/components/camel-git/src/main/java/org/apache/camel/component/git/GitOperation.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.component.git; - -public interface GitOperation { - - public final static String CLONE_OPERATION = "clone"; - public final static String INIT_OPERATION = "init"; - public final static String ADD_OPERATION = "add"; - public final static String REMOVE_OPERATION = "remove"; - public final static String COMMIT_OPERATION = "commit"; - public final static String COMMIT_ALL_OPERATION = "commitAll"; - public final static String CREATE_BRANCH_OPERATION = "createBranch"; - public final static String DELETE_BRANCH_OPERATION = "deleteBranch"; - public final static String STATUS_OPERATION = "status"; - public final static String LOG_OPERATION = "log"; - public final static String PUSH_OPERATION = "push"; - public final static String PULL_OPERATION = "pull"; -} http://git-wip-us.apache.org/repos/asf/camel/blob/8239d6f7/components/camel-git/src/main/java/org/apache/camel/component/git/GitProducer.java ---------------------------------------------------------------------- diff --git a/components/camel-git/src/main/java/org/apache/camel/component/git/GitProducer.java b/components/camel-git/src/main/java/org/apache/camel/component/git/GitProducer.java deleted file mode 100644 index 42a55e6..0000000 --- a/components/camel-git/src/main/java/org/apache/camel/component/git/GitProducer.java +++ /dev/null @@ -1,334 +0,0 @@ -package org.apache.camel.component.git; - -import java.io.File; -import java.io.IOException; - -import org.apache.camel.Exchange; -import org.apache.camel.impl.DefaultProducer; -import org.apache.camel.util.ObjectHelper; -import org.eclipse.jgit.api.Git; -import org.eclipse.jgit.api.PullResult; -import org.eclipse.jgit.api.Status; -import org.eclipse.jgit.lib.Repository; -import org.eclipse.jgit.revwalk.RevCommit; -import org.eclipse.jgit.storage.file.FileRepositoryBuilder; -import org.eclipse.jgit.transport.PushResult; -import org.eclipse.jgit.transport.RefSpec; -import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class GitProducer extends DefaultProducer{ - - private static final Logger LOG = LoggerFactory.getLogger(GitProducer.class); - private final GitEndpoint endpoint; - - public GitProducer(GitEndpoint endpoint) { - super(endpoint); - this.endpoint = endpoint; - } - - @Override - public void process(Exchange exchange) throws Exception { - String operation; - Repository repo; - if (ObjectHelper.isEmpty(endpoint.getOperation())) { - operation = exchange.getIn().getHeader(GitConstants.GIT_OPERATION, String.class); - } else { - operation = endpoint.getOperation(); - } - if (ObjectHelper.isEmpty(endpoint.getLocalPath())) { - throw new IllegalArgumentException("Local path must specified to execute " + operation); - } - repo = getLocalRepository(); - - switch (operation) { - case GitOperation.CLONE_OPERATION: - doClone(exchange, operation); - break; - - case GitOperation.INIT_OPERATION: - doInit(exchange, operation); - break; - - case GitOperation.ADD_OPERATION: - doAdd(exchange, operation, repo); - break; - - case GitOperation.REMOVE_OPERATION: - doRemove(exchange, operation, repo); - break; - - case GitOperation.COMMIT_OPERATION: - doCommit(exchange, operation, repo); - break; - - case GitOperation.COMMIT_ALL_OPERATION: - doCommitAll(exchange, operation, repo); - break; - - case GitOperation.CREATE_BRANCH_OPERATION: - doCreateBranch(exchange, operation, repo); - break; - - case GitOperation.DELETE_BRANCH_OPERATION: - doDeleteBranch(exchange, operation, repo); - break; - - case GitOperation.STATUS_OPERATION: - doStatus(exchange, operation, repo); - break; - - case GitOperation.LOG_OPERATION: - doLog(exchange, operation, repo); - break; - - case GitOperation.PUSH_OPERATION: - doPush(exchange, operation, repo); - break; - - case GitOperation.PULL_OPERATION: - doPull(exchange, operation, repo); - break; - } - repo.close(); - } - - protected void doClone(Exchange exchange, String operation) { - Git result = null; - if (ObjectHelper.isEmpty(endpoint.getLocalPath())) { - throw new IllegalArgumentException("Local path must specified to execute " + operation); - } - try { - File localRepo = new File(endpoint.getLocalPath(), ""); - if (!localRepo.exists()) { - result = Git.cloneRepository().setURI(endpoint.getRemotePath()).setDirectory(new File(endpoint.getLocalPath(),"")).call(); - } else { - throw new IllegalArgumentException("The local repository directory already exists"); - } - } catch (Exception e) { - LOG.error("There was an error in Git " + operation + " operation"); - e.printStackTrace(); - } finally { - result.close(); - } - } - - protected void doInit(Exchange exchange, String operation) { - Git result = null; - if (ObjectHelper.isEmpty(endpoint.getLocalPath())) { - throw new IllegalArgumentException("Local path must specified to execute " + operation); - } - try { - result = Git.init().setDirectory(new File(endpoint.getLocalPath(),"")).setBare(false).call(); - } catch (Exception e) { - LOG.error("There was an error in Git " + operation + " operation"); - e.printStackTrace(); - } finally { - result.close(); - } - } - - protected void doAdd(Exchange exchange, String operation, Repository repo) { - Git git = null; - String fileName = null; - if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(GitConstants.GIT_FILE_NAME))) { - fileName = exchange.getIn().getHeader(GitConstants.GIT_FILE_NAME, String.class); - } else { - throw new IllegalArgumentException("File name must be specified to execute " + operation); - } - try { - git = new Git(repo); - if (ObjectHelper.isNotEmpty(endpoint.getBranchName())) { - git.checkout().setCreateBranch(false).setName(endpoint.getBranchName()).call(); - } - git.add().addFilepattern(fileName).call(); - } catch (Exception e) { - LOG.error("There was an error in Git " + operation + " operation"); - e.printStackTrace(); - } - } - - protected void doRemove(Exchange exchange, String operation, Repository repo) { - Git git = null; - String fileName = null; - if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(GitConstants.GIT_FILE_NAME))) { - fileName = exchange.getIn().getHeader(GitConstants.GIT_FILE_NAME, String.class); - } else { - throw new IllegalArgumentException("File name must be specified to execute " + operation); - } - try { - git = new Git(repo); - if (ObjectHelper.isNotEmpty(endpoint.getBranchName())) { - git.checkout().setCreateBranch(false).setName(endpoint.getBranchName()).call(); - } - git.rm().addFilepattern(fileName).call(); - } catch (Exception e) { - LOG.error("There was an error in Git " + operation + " operation"); - e.printStackTrace(); - } - } - - protected void doCommit(Exchange exchange, String operation, Repository repo) { - Git git = null; - String commitMessage = null; - if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(GitConstants.GIT_COMMIT_MESSAGE))) { - commitMessage = exchange.getIn().getHeader(GitConstants.GIT_COMMIT_MESSAGE, String.class); - } else { - throw new IllegalArgumentException("Commit message must be specified to execute " + operation); - } - try { - git = new Git(repo); - if (ObjectHelper.isNotEmpty(endpoint.getBranchName())) { - git.checkout().setCreateBranch(false).setName(endpoint.getBranchName()).call(); - } - git.commit().setMessage(commitMessage).call(); - } catch (Exception e) { - LOG.error("There was an error in Git " + operation + " operation"); - e.printStackTrace(); - } - } - - protected void doCommitAll(Exchange exchange, String operation, Repository repo) { - Git git = null; - String commitMessage = null; - if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(GitConstants.GIT_COMMIT_MESSAGE))) { - commitMessage = exchange.getIn().getHeader(GitConstants.GIT_COMMIT_MESSAGE, String.class); - } else { - throw new IllegalArgumentException("Commit message must be specified to execute " + operation); - } - try { - git = new Git(repo); - if (ObjectHelper.isNotEmpty(endpoint.getBranchName())) { - git.checkout().setCreateBranch(false).setName(endpoint.getBranchName()).call(); - } - git.commit().setAll(true).setMessage(commitMessage).call(); - } catch (Exception e) { - LOG.error("There was an error in Git " + operation + " operation"); - e.printStackTrace(); - } - } - - protected void doCreateBranch(Exchange exchange, String operation, Repository repo) { - Git git = null; - if (ObjectHelper.isEmpty(endpoint.getBranchName())) { - throw new IllegalArgumentException("Branch Name must be specified to execute " + operation); - } - try { - git = new Git(repo); - git.branchCreate().setName(endpoint.getBranchName()).call(); - } catch (Exception e) { - LOG.error("There was an error in Git " + operation + " operation"); - e.printStackTrace(); - } - } - - protected void doDeleteBranch(Exchange exchange, String operation, Repository repo) { - Git git = null; - if (ObjectHelper.isEmpty(endpoint.getBranchName())) { - throw new IllegalArgumentException("Branch Name must be specified to execute " + operation); - } - try { - git = new Git(repo); - git.branchDelete().setBranchNames(endpoint.getBranchName()).call(); - } catch (Exception e) { - LOG.error("There was an error in Git " + operation + " operation"); - e.printStackTrace(); - } - } - - protected void doStatus(Exchange exchange, String operation, Repository repo) { - Git git = null; - Status status = null; - try { - git = new Git(repo); - if (ObjectHelper.isNotEmpty(endpoint.getBranchName())) { - git.checkout().setCreateBranch(false).setName(endpoint.getBranchName()).call(); - } - status = git.status().call(); - } catch (Exception e) { - LOG.error("There was an error in Git " + operation + " operation"); - e.printStackTrace(); - } - exchange.getOut().setBody(status); - } - - protected void doLog(Exchange exchange, String operation, Repository repo) { - Git git = null; - Iterable revCommit = null; - try { - git = new Git(repo); - if (ObjectHelper.isNotEmpty(endpoint.getBranchName())) { - git.checkout().setCreateBranch(false).setName(endpoint.getBranchName()).call(); - } - revCommit = git.log().call(); - } catch (Exception e) { - LOG.error("There was an error in Git " + operation + " operation"); - e.printStackTrace(); - } - exchange.getOut().setBody(revCommit); - } - - protected void doPush(Exchange exchange, String operation, Repository repo) { - Git git = null; - Iterable result = null; - try { - git = new Git(repo); - if (ObjectHelper.isEmpty(endpoint.getRemotePath())) { - throw new IllegalArgumentException("Remote path must be specified to execute " + operation); - } - if (ObjectHelper.isNotEmpty(endpoint.getBranchName())) { - git.checkout().setCreateBranch(false).setName(endpoint.getBranchName()).call(); - } - if (ObjectHelper.isNotEmpty(endpoint.getUsername()) && ObjectHelper.isNotEmpty(endpoint.getPassword())) { - UsernamePasswordCredentialsProvider credentials = new UsernamePasswordCredentialsProvider(endpoint.getUsername(), endpoint.getPassword()); - result = git.push().setCredentialsProvider(credentials).setRemote(endpoint.getRemotePath()).call(); - } else { - result = git.push().setRemote(endpoint.getRemotePath()).call(); - } - } catch (Exception e) { - LOG.error("There was an error in Git " + operation + " operation"); - e.printStackTrace(); - } - exchange.getOut().setBody(result); - } - - protected void doPull(Exchange exchange, String operation, Repository repo) { - Git git = null; - PullResult result = null; - try { - git = new Git(repo); - if (ObjectHelper.isEmpty(endpoint.getRemotePath())) { - throw new IllegalArgumentException("Remote path must be specified to execute " + operation); - } - if (ObjectHelper.isNotEmpty(endpoint.getBranchName())) { - git.checkout().setCreateBranch(false).setName(endpoint.getBranchName()).call(); - } - if (ObjectHelper.isNotEmpty(endpoint.getUsername()) && ObjectHelper.isNotEmpty(endpoint.getPassword())) { - UsernamePasswordCredentialsProvider credentials = new UsernamePasswordCredentialsProvider(endpoint.getUsername(), endpoint.getPassword()); - result = git.pull().setCredentialsProvider(credentials).setRemote(endpoint.getRemotePath()).call(); - } else { - result = git.pull().setRemote(endpoint.getRemotePath()).call(); - } - } catch (Exception e) { - LOG.error("There was an error in Git " + operation + " operation"); - e.printStackTrace(); - } - exchange.getOut().setBody(result); - } - - private Repository getLocalRepository(){ - FileRepositoryBuilder builder = new FileRepositoryBuilder(); - Repository repo = null; - try { - repo = builder.setGitDir(new File(endpoint.getLocalPath(), ".git")) - .readEnvironment() // scan environment GIT_* variables - .findGitDir() // scan up the file system tree - .build(); - } catch (IOException e) { - LOG.error("There was an error, cannot open " + endpoint.getLocalPath() + " repository"); - e.printStackTrace(); - } - return repo; - } -} http://git-wip-us.apache.org/repos/asf/camel/blob/8239d6f7/components/camel-git/src/main/java/org/apache/camel/component/git/consumer/AbstractGitConsumer.java ---------------------------------------------------------------------- diff --git a/components/camel-git/src/main/java/org/apache/camel/component/git/consumer/AbstractGitConsumer.java b/components/camel-git/src/main/java/org/apache/camel/component/git/consumer/AbstractGitConsumer.java new file mode 100644 index 0000000..5ceec5d --- /dev/null +++ b/components/camel-git/src/main/java/org/apache/camel/component/git/consumer/AbstractGitConsumer.java @@ -0,0 +1,66 @@ +package org.apache.camel.component.git.consumer; + +import java.io.File; +import java.io.IOException; + +import org.apache.camel.Processor; +import org.apache.camel.component.git.GitEndpoint; +import org.apache.camel.impl.ScheduledPollConsumer; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.storage.file.FileRepositoryBuilder; + +public abstract class AbstractGitConsumer extends ScheduledPollConsumer { + + private final GitEndpoint endpoint; + + private Repository repo; + + private Git git; + + public AbstractGitConsumer(GitEndpoint endpoint, Processor processor) { + super(endpoint, processor); + this.endpoint = endpoint; + this.repo = getLocalRepository(); + this.git = new Git(repo); + } + + @Override + protected void doStart() throws Exception { + super.doStart(); + this.repo = getLocalRepository(); + this.git = new Git(repo); + } + + @Override + protected void doStop() throws Exception { + super.doStop(); + repo.close(); + git.close(); + } + + private Repository getLocalRepository(){ + FileRepositoryBuilder builder = new FileRepositoryBuilder(); + Repository repo = null; + try { + repo = builder.setGitDir(new File(endpoint.getLocalPath(), ".git")) + .readEnvironment() // scan environment GIT_* variables + .findGitDir() // scan up the file system tree + .build(); + } catch (IOException e) { + //LOG.error("There was an error, cannot open " + endpoint.getLocalPath() + " repository"); + e.printStackTrace(); + } + return repo; + } + + protected Repository getRepository() { + return repo; + } + + protected Git getGit() { + return git; + } + + protected abstract int poll() throws Exception; +} http://git-wip-us.apache.org/repos/asf/camel/blob/8239d6f7/components/camel-git/src/main/java/org/apache/camel/component/git/consumer/GitCommitConsumer.java ---------------------------------------------------------------------- diff --git a/components/camel-git/src/main/java/org/apache/camel/component/git/consumer/GitCommitConsumer.java b/components/camel-git/src/main/java/org/apache/camel/component/git/consumer/GitCommitConsumer.java new file mode 100644 index 0000000..d289c26 --- /dev/null +++ b/components/camel-git/src/main/java/org/apache/camel/component/git/consumer/GitCommitConsumer.java @@ -0,0 +1,36 @@ +package org.apache.camel.component.git.consumer; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.component.git.GitEndpoint; +import org.eclipse.jgit.revwalk.RevCommit; + +public class GitCommitConsumer extends AbstractGitConsumer { + + private List used; + + public GitCommitConsumer(GitEndpoint endpoint, Processor processor) { + super(endpoint, processor); + this.used = new ArrayList(); + } + + @Override + protected int poll() throws Exception { + int count = 0; + Iterable commits = getGit().log().all().call(); + for (RevCommit commit : commits) { + if (!used.contains(commit.getId())) { + Exchange e = getEndpoint().createExchange(); + e.getOut().setBody(commit.getShortMessage()); + getProcessor().process(e); + used.add(commit.getId()); + count++; + } + } + return count; + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/8239d6f7/components/camel-git/src/main/java/org/apache/camel/component/git/consumer/GitType.java ---------------------------------------------------------------------- diff --git a/components/camel-git/src/main/java/org/apache/camel/component/git/consumer/GitType.java b/components/camel-git/src/main/java/org/apache/camel/component/git/consumer/GitType.java new file mode 100644 index 0000000..af3729e --- /dev/null +++ b/components/camel-git/src/main/java/org/apache/camel/component/git/consumer/GitType.java @@ -0,0 +1,23 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.git.consumer; + +public enum GitType { + + COMMIT + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/camel/blob/8239d6f7/components/camel-git/src/main/java/org/apache/camel/component/git/producer/GitOperation.java ---------------------------------------------------------------------- diff --git a/components/camel-git/src/main/java/org/apache/camel/component/git/producer/GitOperation.java b/components/camel-git/src/main/java/org/apache/camel/component/git/producer/GitOperation.java new file mode 100644 index 0000000..de03fc7 --- /dev/null +++ b/components/camel-git/src/main/java/org/apache/camel/component/git/producer/GitOperation.java @@ -0,0 +1,33 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.git.producer; + +public interface GitOperation { + + public final static String CLONE_OPERATION = "clone"; + public final static String INIT_OPERATION = "init"; + public final static String ADD_OPERATION = "add"; + public final static String REMOVE_OPERATION = "remove"; + public final static String COMMIT_OPERATION = "commit"; + public final static String COMMIT_ALL_OPERATION = "commitAll"; + public final static String CREATE_BRANCH_OPERATION = "createBranch"; + public final static String DELETE_BRANCH_OPERATION = "deleteBranch"; + public final static String STATUS_OPERATION = "status"; + public final static String LOG_OPERATION = "log"; + public final static String PUSH_OPERATION = "push"; + public final static String PULL_OPERATION = "pull"; +} http://git-wip-us.apache.org/repos/asf/camel/blob/8239d6f7/components/camel-git/src/main/java/org/apache/camel/component/git/producer/GitProducer.java ---------------------------------------------------------------------- diff --git a/components/camel-git/src/main/java/org/apache/camel/component/git/producer/GitProducer.java b/components/camel-git/src/main/java/org/apache/camel/component/git/producer/GitProducer.java new file mode 100644 index 0000000..b9d88fe --- /dev/null +++ b/components/camel-git/src/main/java/org/apache/camel/component/git/producer/GitProducer.java @@ -0,0 +1,331 @@ +package org.apache.camel.component.git.producer; + +import java.io.File; +import java.io.IOException; + +import org.apache.camel.Exchange; +import org.apache.camel.component.git.GitConstants; +import org.apache.camel.component.git.GitEndpoint; +import org.apache.camel.impl.DefaultProducer; +import org.apache.camel.util.ObjectHelper; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.PullResult; +import org.eclipse.jgit.api.Status; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.storage.file.FileRepositoryBuilder; +import org.eclipse.jgit.transport.PushResult; +import org.eclipse.jgit.transport.RefSpec; +import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class GitProducer extends DefaultProducer{ + + private static final Logger LOG = LoggerFactory.getLogger(GitProducer.class); + private final GitEndpoint endpoint; + + private Repository repo; + + private Git git; + + public GitProducer(GitEndpoint endpoint) { + super(endpoint); + this.endpoint = endpoint; + } + + @Override + protected void doStart() throws Exception { + super.doStart(); + this.repo = getLocalRepository(); + this.git = new Git(repo); + } + + @Override + protected void doStop() throws Exception { + super.doStop(); + repo.close(); + git.close(); + } + + @Override + public void process(Exchange exchange) throws Exception { + String operation; + if (ObjectHelper.isEmpty(endpoint.getOperation())) { + operation = exchange.getIn().getHeader(GitConstants.GIT_OPERATION, String.class); + } else { + operation = endpoint.getOperation(); + } + if (ObjectHelper.isEmpty(endpoint.getLocalPath())) { + throw new IllegalArgumentException("Local path must specified to execute " + operation); + } + + switch (operation) { + case GitOperation.CLONE_OPERATION: + doClone(exchange, operation); + break; + + case GitOperation.INIT_OPERATION: + doInit(exchange, operation); + break; + + case GitOperation.ADD_OPERATION: + doAdd(exchange, operation); + break; + + case GitOperation.REMOVE_OPERATION: + doRemove(exchange, operation); + break; + + case GitOperation.COMMIT_OPERATION: + doCommit(exchange, operation); + break; + + case GitOperation.COMMIT_ALL_OPERATION: + doCommitAll(exchange, operation); + break; + + case GitOperation.CREATE_BRANCH_OPERATION: + doCreateBranch(exchange, operation); + break; + + case GitOperation.DELETE_BRANCH_OPERATION: + doDeleteBranch(exchange, operation); + break; + + case GitOperation.STATUS_OPERATION: + doStatus(exchange, operation); + break; + + case GitOperation.LOG_OPERATION: + doLog(exchange, operation); + break; + + case GitOperation.PUSH_OPERATION: + doPush(exchange, operation); + break; + + case GitOperation.PULL_OPERATION: + doPull(exchange, operation); + break; + } + } + + protected void doClone(Exchange exchange, String operation) throws Exception { + Git result = null; + if (ObjectHelper.isEmpty(endpoint.getLocalPath())) { + throw new IllegalArgumentException("Local path must specified to execute " + operation); + } + try { + File localRepo = new File(endpoint.getLocalPath(), ""); + if (!localRepo.exists()) { + result = Git.cloneRepository().setURI(endpoint.getRemotePath()).setDirectory(new File(endpoint.getLocalPath(),"")).call(); + } else { + throw new IllegalArgumentException("The local repository directory already exists"); + } + } catch (Exception e) { + LOG.error("There was an error in Git " + operation + " operation"); + throw e; + } finally { + result.close(); + } + } + + protected void doInit(Exchange exchange, String operation) throws Exception { + Git result = null; + if (ObjectHelper.isEmpty(endpoint.getLocalPath())) { + throw new IllegalArgumentException("Local path must specified to execute " + operation); + } + try { + result = Git.init().setDirectory(new File(endpoint.getLocalPath(),"")).setBare(false).call(); + } catch (Exception e) { + LOG.error("There was an error in Git " + operation + " operation"); + throw e; + } finally { + result.close(); + } + } + + protected void doAdd(Exchange exchange, String operation) throws Exception { + String fileName = null; + if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(GitConstants.GIT_FILE_NAME))) { + fileName = exchange.getIn().getHeader(GitConstants.GIT_FILE_NAME, String.class); + } else { + throw new IllegalArgumentException("File name must be specified to execute " + operation); + } + try { + if (ObjectHelper.isNotEmpty(endpoint.getBranchName())) { + git.checkout().setCreateBranch(false).setName(endpoint.getBranchName()).call(); + } + git.add().addFilepattern(fileName).call(); + } catch (Exception e) { + LOG.error("There was an error in Git " + operation + " operation"); + throw e; + } + } + + protected void doRemove(Exchange exchange, String operation) throws Exception { + String fileName = null; + if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(GitConstants.GIT_FILE_NAME))) { + fileName = exchange.getIn().getHeader(GitConstants.GIT_FILE_NAME, String.class); + } else { + throw new IllegalArgumentException("File name must be specified to execute " + operation); + } + try { + if (ObjectHelper.isNotEmpty(endpoint.getBranchName())) { + git.checkout().setCreateBranch(false).setName(endpoint.getBranchName()).call(); + } + git.rm().addFilepattern(fileName).call(); + } catch (Exception e) { + LOG.error("There was an error in Git " + operation + " operation"); + throw e; + } + } + + protected void doCommit(Exchange exchange, String operation) throws Exception { + String commitMessage = null; + if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(GitConstants.GIT_COMMIT_MESSAGE))) { + commitMessage = exchange.getIn().getHeader(GitConstants.GIT_COMMIT_MESSAGE, String.class); + } else { + throw new IllegalArgumentException("Commit message must be specified to execute " + operation); + } + try { + if (ObjectHelper.isNotEmpty(endpoint.getBranchName())) { + git.checkout().setCreateBranch(false).setName(endpoint.getBranchName()).call(); + } + git.commit().setMessage(commitMessage).call(); + } catch (Exception e) { + LOG.error("There was an error in Git " + operation + " operation"); + throw e; + } + } + + protected void doCommitAll(Exchange exchange, String operation) throws Exception { + String commitMessage = null; + if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(GitConstants.GIT_COMMIT_MESSAGE))) { + commitMessage = exchange.getIn().getHeader(GitConstants.GIT_COMMIT_MESSAGE, String.class); + } else { + throw new IllegalArgumentException("Commit message must be specified to execute " + operation); + } + try { + if (ObjectHelper.isNotEmpty(endpoint.getBranchName())) { + git.checkout().setCreateBranch(false).setName(endpoint.getBranchName()).call(); + } + git.commit().setAll(true).setMessage(commitMessage).call(); + } catch (Exception e) { + LOG.error("There was an error in Git " + operation + " operation"); + throw e; + } + } + + protected void doCreateBranch(Exchange exchange, String operation) throws Exception { + if (ObjectHelper.isEmpty(endpoint.getBranchName())) { + throw new IllegalArgumentException("Branch Name must be specified to execute " + operation); + } + try { + git.branchCreate().setName(endpoint.getBranchName()).call(); + } catch (Exception e) { + LOG.error("There was an error in Git " + operation + " operation"); + throw e; + } + } + + protected void doDeleteBranch(Exchange exchange, String operation) throws Exception { + if (ObjectHelper.isEmpty(endpoint.getBranchName())) { + throw new IllegalArgumentException("Branch Name must be specified to execute " + operation); + } + try { + git.branchDelete().setBranchNames(endpoint.getBranchName()).call(); + } catch (Exception e) { + LOG.error("There was an error in Git " + operation + " operation"); + throw e; + } + } + + protected void doStatus(Exchange exchange, String operation) throws Exception { + Status status = null; + try { + if (ObjectHelper.isNotEmpty(endpoint.getBranchName())) { + git.checkout().setCreateBranch(false).setName(endpoint.getBranchName()).call(); + } + status = git.status().call(); + } catch (Exception e) { + LOG.error("There was an error in Git " + operation + " operation"); + throw e; + } + exchange.getOut().setBody(status); + } + + protected void doLog(Exchange exchange, String operation) throws Exception { + Iterable revCommit = null; + try { + if (ObjectHelper.isNotEmpty(endpoint.getBranchName())) { + git.checkout().setCreateBranch(false).setName(endpoint.getBranchName()).call(); + } + revCommit = git.log().call(); + } catch (Exception e) { + LOG.error("There was an error in Git " + operation + " operation"); + throw e; + } + exchange.getOut().setBody(revCommit); + } + + protected void doPush(Exchange exchange, String operation) throws Exception { + Iterable result = null; + try { + if (ObjectHelper.isEmpty(endpoint.getRemotePath())) { + throw new IllegalArgumentException("Remote path must be specified to execute " + operation); + } + if (ObjectHelper.isNotEmpty(endpoint.getBranchName())) { + git.checkout().setCreateBranch(false).setName(endpoint.getBranchName()).call(); + } + if (ObjectHelper.isNotEmpty(endpoint.getUsername()) && ObjectHelper.isNotEmpty(endpoint.getPassword())) { + UsernamePasswordCredentialsProvider credentials = new UsernamePasswordCredentialsProvider(endpoint.getUsername(), endpoint.getPassword()); + result = git.push().setCredentialsProvider(credentials).setRemote(endpoint.getRemotePath()).call(); + } else { + result = git.push().setRemote(endpoint.getRemotePath()).call(); + } + } catch (Exception e) { + LOG.error("There was an error in Git " + operation + " operation"); + throw e; + } + exchange.getOut().setBody(result); + } + + protected void doPull(Exchange exchange, String operation) throws Exception { + PullResult result = null; + try { + if (ObjectHelper.isEmpty(endpoint.getRemotePath())) { + throw new IllegalArgumentException("Remote path must be specified to execute " + operation); + } + if (ObjectHelper.isNotEmpty(endpoint.getBranchName())) { + git.checkout().setCreateBranch(false).setName(endpoint.getBranchName()).call(); + } + if (ObjectHelper.isNotEmpty(endpoint.getUsername()) && ObjectHelper.isNotEmpty(endpoint.getPassword())) { + UsernamePasswordCredentialsProvider credentials = new UsernamePasswordCredentialsProvider(endpoint.getUsername(), endpoint.getPassword()); + result = git.pull().setCredentialsProvider(credentials).setRemote(endpoint.getRemotePath()).call(); + } else { + result = git.pull().setRemote(endpoint.getRemotePath()).call(); + } + } catch (Exception e) { + LOG.error("There was an error in Git " + operation + " operation"); + throw e; + } + exchange.getOut().setBody(result); + } + + private Repository getLocalRepository(){ + FileRepositoryBuilder builder = new FileRepositoryBuilder(); + Repository repo = null; + try { + repo = builder.setGitDir(new File(endpoint.getLocalPath(), ".git")) + .readEnvironment() // scan environment GIT_* variables + .findGitDir() // scan up the file system tree + .build(); + } catch (IOException e) { + LOG.error("There was an error, cannot open " + endpoint.getLocalPath() + " repository"); + e.printStackTrace(); + } + return repo; + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/8239d6f7/components/camel-git/src/test/java/org/apache/camel/component/github/consumer/GitConsumerTest.java ---------------------------------------------------------------------- diff --git a/components/camel-git/src/test/java/org/apache/camel/component/github/consumer/GitConsumerTest.java b/components/camel-git/src/test/java/org/apache/camel/component/github/consumer/GitConsumerTest.java index 6071d23..d45591b 100644 --- a/components/camel-git/src/test/java/org/apache/camel/component/github/consumer/GitConsumerTest.java +++ b/components/camel-git/src/test/java/org/apache/camel/component/github/consumer/GitConsumerTest.java @@ -33,7 +33,7 @@ import org.junit.Test; public class GitConsumerTest extends GitTestSupport { @Test - public void commitTest() throws Exception { + public void commitConsumerTest() throws Exception { Repository repository = getTestRepository(); MockEndpoint added = getMockEndpoint("mock:result"); @@ -116,7 +116,7 @@ public class GitConsumerTest extends GitTestSupport { .to("git://" + GIT_LOCAL_REPO + "?operation=add"); from("direct:commit") .to("git://" + GIT_LOCAL_REPO + "?operation=commit"); - from("git://" + GIT_LOCAL_REPO) + from("git://" + GIT_LOCAL_REPO + "?type=commit") .to("mock:result"); } };