// Path: src/main/java/com/bazoud/elasticsearch/river/git/beans/Context.java
// @Data
// @SuppressWarnings("PMD.UnusedPrivateField")
// public class Context {
//     private String name;
//     private String uri;
//     private File projectPath;
//     private Repository repository;
//     private String workingDir =
//         System.getProperty("user.home") + File.separator + ".elasticsearch-river-git";
//     private Collection<Ref> refs;
//     private Client client;
//     private Optional<Pattern> issuePattern = Optional.absent();
//     private String issueRegex;
//     private boolean indexingDiff;
//     private long updateRate = TimeUnit.MILLISECONDS.convert(15, TimeUnit.MINUTES);
//     private String type = "git";
//     private String riverName;
//     private String riverIndexName;
// }
// 
// Path: src/main/java/com/bazoud/elasticsearch/river/git/flow/functions/TagToIndexTag.java
// public class TagToIndexTag extends MyFunction<Map.Entry<String, Ref>, IndexTag> {
//     private static ESLogger logger = Loggers.getLogger(TagToIndexTag.class);
//     private Context context;
//     private final RevWalk walk;
// 
//     public TagToIndexTag(Context context, RevWalk walk) {
//         this.context = context;
//         this.walk = walk;
//     }
// 
//     @Override
//     public IndexTag doApply(Map.Entry<String, Ref> tag) throws Throwable {
//         RevCommit revCommit = walk.parseCommit(tag.getValue().getObjectId());
//         String id = String.format("%s|%s|%s", TAG.name().toLowerCase(), context.getName(), revCommit.name());
//         return IndexTag.indexTag()
//             .id(id)
//             .tag(tag.getKey())
//             .ref(tag.getValue().getName())
//             .sha1(revCommit.name())
//             .build();
//     }
// }
// 
// Path: src/main/java/com/bazoud/elasticsearch/river/git/flow/visitors/BulkVisitor.java
// public class BulkVisitor<T extends Id> implements Visitor<T> {
//     private static ESLogger logger = Loggers.getLogger(BulkVisitor.class);
// 
//     private BulkRequestBuilder bulk;
//     private Context context;
//     private String type;
// 
//     public BulkVisitor(Context context, String type) {
//         this.context = context;
//         this.type = type;
//     }
// 
//     @Override
//     public void before() {
//         this.bulk = context.getClient().prepareBulk();
//     }
// 
//     @Override
//     public void visit(Id input) {
//         try {
//             bulk.add(indexRequest(context.getRiverName())
//                 .type(type)
//                 .id(input.getId())
//                 .source(toJson(input)));
//         } catch (Throwable e) {
//             logger.error(this.getClass().getName(), e);
//             Throwables.propagate(e);
//         }
//     }
// 
//     @Override
//     public void after() {
//         logger.info("Executing bulk {} actions", bulk.numberOfActions());
//         if (bulk.numberOfActions() > 0) {
//             BulkResponse response = bulk.execute().actionGet();
//             logger.info("Bulk actions tooks {} ms", response.getTookInMillis());
//             if (response.hasFailures()) {
//                 logger.warn("failed to execute bulk: {}", response.buildFailureMessage());
//             }
//         } else {
//             logger.info("Sorry nothing to do");
//         }
//     }
// 
//     public String toJson(Object object) throws JsonProcessingException {
//         ObjectMapper mapper = new ObjectMapper();
//         return mapper.writeValueAsString(object);
//     }
// }
// 
// Path: src/main/java/com/bazoud/elasticsearch/river/git/guava/MyFunction.java
// public abstract class MyFunction<F, T> implements Function<F, T> {
//     private static ESLogger logger = Loggers.getLogger(MyFunction.class);
// 
//     @Override
//     public T apply(F input) {
//         T output = null;
//         try {
//             output = doApply(input);
//         } catch (Throwable e) {
//             logger.error(this.getClass().getName(), e);
//             Throwables.propagate(e);
//         }
//         return output;
//     }
// 
//     public abstract T doApply(F input) throws Throwable;
// }
// 
// Path: src/main/java/com/bazoud/elasticsearch/river/git/guava/Visitors.java
// public final class Visitors {
//     private Visitors() {
//     }
// 
//     public static <T> void visit(Iterable<T> iterable, Visitor<T> visitor) throws Exception {
//         visitor.before();
//         for (T current : iterable) {
//             visitor.visit(current);
//         }
//         visitor.after();
// 
//     }
// }


import org.eclipse.jgit.revwalk.RevWalk;
import com.bazoud.elasticsearch.river.git.beans.Context;
import com.bazoud.elasticsearch.river.git.flow.functions.TagToIndexTag;
import com.bazoud.elasticsearch.river.git.flow.visitors.BulkVisitor;
import com.bazoud.elasticsearch.river.git.guava.MyFunction;
import com.bazoud.elasticsearch.river.git.guava.Visitors;
import com.google.common.collect.FluentIterable;
import static com.bazoud.elasticsearch.river.git.IndexedDocumentType.TAG;
package com.bazoud.elasticsearch.river.git.flow;




/**
 * @author Olivier Bazoud
 */
public class TagIndexFunction extends MyFunction<Context, Context> {

    @Override
// Path: src/main/java/com/bazoud/elasticsearch/river/git/beans/Context.java
// @Data
// @SuppressWarnings("PMD.UnusedPrivateField")
// public class Context {
//     private String name;
//     private String uri;
//     private File projectPath;
//     private Repository repository;
//     private String workingDir =
//         System.getProperty("user.home") + File.separator + ".elasticsearch-river-git";
//     private Collection<Ref> refs;
//     private Client client;
//     private Optional<Pattern> issuePattern = Optional.absent();
//     private String issueRegex;
//     private boolean indexingDiff;
//     private long updateRate = TimeUnit.MILLISECONDS.convert(15, TimeUnit.MINUTES);
//     private String type = "git";
//     private String riverName;
//     private String riverIndexName;
// }
// 
// Path: src/main/java/com/bazoud/elasticsearch/river/git/flow/functions/TagToIndexTag.java
// public class TagToIndexTag extends MyFunction<Map.Entry<String, Ref>, IndexTag> {
//     private static ESLogger logger = Loggers.getLogger(TagToIndexTag.class);
//     private Context context;
//     private final RevWalk walk;
// 
//     public TagToIndexTag(Context context, RevWalk walk) {
//         this.context = context;
//         this.walk = walk;
//     }
// 
//     @Override
//     public IndexTag doApply(Map.Entry<String, Ref> tag) throws Throwable {
//         RevCommit revCommit = walk.parseCommit(tag.getValue().getObjectId());
//         String id = String.format("%s|%s|%s", TAG.name().toLowerCase(), context.getName(), revCommit.name());
//         return IndexTag.indexTag()
//             .id(id)
//             .tag(tag.getKey())
//             .ref(tag.getValue().getName())
//             .sha1(revCommit.name())
//             .build();
//     }
// }
// 
// Path: src/main/java/com/bazoud/elasticsearch/river/git/flow/visitors/BulkVisitor.java
// public class BulkVisitor<T extends Id> implements Visitor<T> {
//     private static ESLogger logger = Loggers.getLogger(BulkVisitor.class);
// 
//     private BulkRequestBuilder bulk;
//     private Context context;
//     private String type;
// 
//     public BulkVisitor(Context context, String type) {
//         this.context = context;
//         this.type = type;
//     }
// 
//     @Override
//     public void before() {
//         this.bulk = context.getClient().prepareBulk();
//     }
// 
//     @Override
//     public void visit(Id input) {
//         try {
//             bulk.add(indexRequest(context.getRiverName())
//                 .type(type)
//                 .id(input.getId())
//                 .source(toJson(input)));
//         } catch (Throwable e) {
//             logger.error(this.getClass().getName(), e);
//             Throwables.propagate(e);
//         }
//     }
// 
//     @Override
//     public void after() {
//         logger.info("Executing bulk {} actions", bulk.numberOfActions());
//         if (bulk.numberOfActions() > 0) {
//             BulkResponse response = bulk.execute().actionGet();
//             logger.info("Bulk actions tooks {} ms", response.getTookInMillis());
//             if (response.hasFailures()) {
//                 logger.warn("failed to execute bulk: {}", response.buildFailureMessage());
//             }
//         } else {
//             logger.info("Sorry nothing to do");
//         }
//     }
// 
//     public String toJson(Object object) throws JsonProcessingException {
//         ObjectMapper mapper = new ObjectMapper();
//         return mapper.writeValueAsString(object);
//     }
// }
// 
// Path: src/main/java/com/bazoud/elasticsearch/river/git/guava/MyFunction.java
// public abstract class MyFunction<F, T> implements Function<F, T> {
//     private static ESLogger logger = Loggers.getLogger(MyFunction.class);
// 
//     @Override
//     public T apply(F input) {
//         T output = null;
//         try {
//             output = doApply(input);
//         } catch (Throwable e) {
//             logger.error(this.getClass().getName(), e);
//             Throwables.propagate(e);
//         }
//         return output;
//     }
// 
//     public abstract T doApply(F input) throws Throwable;
// }
// 
// Path: src/main/java/com/bazoud/elasticsearch/river/git/guava/Visitors.java
// public final class Visitors {
//     private Visitors() {
//     }
// 
//     public static <T> void visit(Iterable<T> iterable, Visitor<T> visitor) throws Exception {
//         visitor.before();
//         for (T current : iterable) {
//             visitor.visit(current);
//         }
//         visitor.after();
// 
//     }
// }


// Path: src/main/java/com/bazoud/elasticsearch/river/git/flow/TagIndexFunction.java
import org.eclipse.jgit.revwalk.RevWalk;
import com.bazoud.elasticsearch.river.git.beans.Context;
import com.bazoud.elasticsearch.river.git.flow.functions.TagToIndexTag;
import com.bazoud.elasticsearch.river.git.flow.visitors.BulkVisitor;
import com.bazoud.elasticsearch.river.git.guava.MyFunction;
import com.bazoud.elasticsearch.river.git.guava.Visitors;
import com.google.common.collect.FluentIterable;
import static com.bazoud.elasticsearch.river.git.IndexedDocumentType.TAG;

package com.bazoud.elasticsearch.river.git.flow;




/**
 * @author Olivier Bazoud
 */
public class TagIndexFunction extends MyFunction<Context, Context> {

    @Override
    public Context doApply(Context context) throws Throwable {