package org.hackreduce.storm; import java.io.IOException; import java.util.List; import java.util.Map; import java.util.Random; import com.google.common.base.Charsets; import com.google.common.base.Function; import com.google.common.collect.Lists; import com.google.common.io.Resources; import backtype.storm.StormSubmitter; import backtype.storm.generated.AlreadyAliveException; import backtype.storm.generated.InvalidTopologyException; import backtype.storm.generated.StormTopology; public class HackReduceStormSubmitter { public static void submitTopology(String name, Map<?,?> conf, StormTopology topology) throws AlreadyAliveException, InvalidTopologyException { StormSubmitter.submitTopology(teamPrefix(name), conf, topology); } public static String teamPrefix(String name) { return String.format("%s-%s", teamName(), name); } public static String teamName() { String envTeamName = System.getenv("TEAM_NAME"); String propTeamName = System.getProperty("TEAM_NAME", randomName()); return envTeamName != null ? envTeamName : propTeamName; } private static Random rnd = new Random(); private static String randomName() { List<String> n = someNames(); return n.get(rnd.nextInt(n.size())); } private static final List<String> names = Lists.newArrayList(); private static List<String> someNames() { try { if(names.isEmpty()) { names.addAll( Lists.transform( Resources.readLines(Resources.getResource(HackReduceStormSubmitter.class, "names.txt"), Charsets.UTF_8), new Function<String, String>() { public String apply(String str) { return str.toLowerCase().trim(); } } ) ); } } catch(IOException e) { names.add("error-reading-names"); } return names; } }