/* package whatever; // don't place package name! */

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
	public static void main(String[] args) {
		List<StringListPair> mappings=Arrays.asList(
				new StringListPair("{url}",Arrays.asList("point1","point2")),
				new StringListPair("{live}",Arrays.asList("10","20","30")));
		String base="I have sample {url} with time to {live}";
		System.out.println("Recursive:");
		for(String combination:userecursive(mappings,base))
			System.out.println(combination);
		System.out.println("Direct:");
		for(String combination:usedirect(mappings,base))
			System.out.println(combination);
	}
	
	static List<String> userecursive(List<StringListPair> mappings,String base){
		List<String> result=new ArrayList<>();
		recursive(result, mappings, base, 0);
		return result;
	}
	static void recursive(List<String> result,List<StringListPair> mappings,String sofar,int partindex) {
		if(partindex>=mappings.size()) {
			result.add(sofar);
			return;
		}
		StringListPair p=mappings.get(partindex);
		for(String item:p.l)
			recursive(result,mappings,sofar.replace(p.s,item),partindex+1);
	}
	
	static List<String> usedirect(List<StringListPair> mappings,String base){
		int total=1;
		for(StringListPair p:mappings)
			total*=p.l.size();
		List<String> result=new ArrayList<>();
		for(int i=0;i<total;i++)
			result.add(direct(mappings,base,i));
		return result;
	}
	static String direct(List<StringListPair> mappings,String base,int index) {
		for(StringListPair p:mappings) {
			base=base.replace(p.s,p.l.get(index % p.l.size()));
			index/=p.l.size();
		}
		return base;
	}
	
	static class StringListPair{
		final String s;
		final List<String> l;
		StringListPair(String s,List<String> l){
			this.s=s;
			this.l=l;
		}
	}
}