package org.radargun.util; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * @author Matej Cimbora */ public class MapReduceTraitRepository extends CoreTraitRepository { public static Map<Class<?>, Object> getAllTraits() { Map<Class<?>, Object> traitMap = new HashMap<>(CoreTraitRepository.getAllTraits()); ConcurrentHashMap concurrentHashMap = new ConcurrentHashMap(); traitMap.put(org.radargun.traits.MapReducer.class, new MapReducer(concurrentHashMap)); return traitMap; } public static class MapReducer implements org.radargun.traits.MapReducer { private ConcurrentHashMap cache; public MapReducer(ConcurrentHashMap cache) { this.cache = cache; } @Override public Builder builder() { return new Builder(cache); } @Override public boolean supportsCombiner() { return true; } @Override public boolean supportsTimeout() { return true; } private static class Builder implements org.radargun.traits.MapReducer.Builder { private ConcurrentHashMap cache; public Builder(ConcurrentHashMap cache) { this.cache = cache; } @Override public Builder timeout(long timeout) { return this; } @Override public org.radargun.traits.MapReducer.Builder source(String source) { return this; } @Override public Task build() { return new Task(cache); } @Override public Builder collator(String collatorFqn, Collection collatorParameters) { return this; } @Override public Builder combiner(String combinerFqn, Collection combinerParameters) { return this; } @Override public Builder reducer(String reducerFqn, Collection reducerParameters) { return this; } @Override public Builder mapper(String mapperFqn, Collection mapperParameters) { return this; } } private static class Task implements org.radargun.traits.MapReducer.Task { private ConcurrentHashMap cache; public Task(ConcurrentHashMap cache) { this.cache = cache; } @Override public Map execute() { return Collections.unmodifiableMap(cache); } @Override public Object executeWithCollator() { return cache.size(); } } } }