All Downloads are FREE. Search and download functionalities are using the official Maven repository.

prerna.reactor.export.mustache.MustacheUtility Maven / Gradle / Ivy

The newest version!
package prerna.reactor.export.mustache;

import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;
import java.lang.reflect.Array;
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.github.mustachejava.DefaultMustacheFactory;
import com.github.mustachejava.Mustache;
import com.github.mustachejava.SafeMustacheFactory;
import com.github.mustachejava.reflect.ReflectionObjectHandler;

public class MustacheUtility {

	private MustacheUtility() {

	}

	public static String compile(String template, Map variables) throws Exception {
		if(variables == null || variables.isEmpty()) {
			return template;
		}
		ReflectionObjectHandler oh = new ReflectionObjectHandler() {
			@Override
			public Object coerce(final Object object) {
				if (object != null && object.getClass().isArray()) {
					return new ArrayMap(object);
				} else if(object instanceof List) {
					return new ListMap(object);
				} else if(object instanceof Collection) {
					return new ListMap(new ArrayList((Collection) object));
				}
				return super.coerce(object);
			}
		};
		DefaultMustacheFactory mf = new SafeMustacheFactory(new HashSet<>(), "");
		mf.setObjectHandler(oh);
		Mustache m = mf.compile(new StringReader(template), "template");
		Writer writer = new StringWriter();
		m.execute(writer, variables).flush();
		return writer.toString();
	}

	private static class ArrayMap extends AbstractMap implements Iterable {
		private final Object object;

		public ArrayMap(Object object) {
			this.object = object;
		}

		@Override
		public Object get(Object key) {
			try {
				int index = Integer.parseInt(key.toString());
				return Array.get(object, index);
			} catch (NumberFormatException nfe) {
				return null;
			}
		}

		@Override
		public boolean containsKey(Object key) {
			return get(key) != null;
		}

		@Override
		public Set> entrySet() {
			Set> retSet = new LinkedHashSet<>();
			Iterator it = this.iterator();
			int counter = 0;
			while(it.hasNext()) {
				Object val = it.next();
				Entry e = new AbstractMap.SimpleEntry<>(counter++, val);
				retSet.add(e);
			}
			
			return retSet;
		}

		/**
		 * Returns an iterator over a set of elements of type T.
		 *
		 * @return an Iterator.
		 */
		@Override
		public Iterator iterator() {
			return new Iterator() {

				int index = 0;
				int length = Array.getLength(object);

				@Override
				public boolean hasNext() {
					return index < length;
				}

				@Override
				public Object next() {
					return Array.get(object, index++);
				}

				@Override
				public void remove() {
					throw new UnsupportedOperationException();
				}
			};
		}
	}
	
	private static class ListMap extends AbstractMap implements Iterable {
		private final Object object;

		public ListMap(Object object) {
			this.object = object;
		}

		@Override
		public Object get(Object key) {
			try {
				int index = Integer.parseInt(key.toString());
				return ((List) object).get(index);
			} catch (NumberFormatException nfe) {
				return null;
			}
		}

		@Override
		public boolean containsKey(Object key) {
			return get(key) != null;
		}

		@Override
		public Set> entrySet() {
			Set> retSet = new LinkedHashSet<>();
			Iterator it = this.iterator();
			int counter = 0;
			while(it.hasNext()) {
				Object val = it.next();
				Entry e = new AbstractMap.SimpleEntry<>(counter++, val);
				retSet.add(e);
			}
			
			return retSet;
		}

		/**
		 * Returns an iterator over a set of elements of type T.
		 *
		 * @return an Iterator.
		 */
		@Override
		public Iterator iterator() {
			return ((List) object).iterator();
		}
	}
	
	
//	public static void main(String[] args) throws Exception {
//		Map taskOutput = new HashMap<>();
//		taskOutput.put("headers", new String[] {"header1", "header2", "header3"});
//		taskOutput.put("values", new ArrayList());
//		((List) taskOutput.get("values")).add(new Object[] {"row11", 1, "row13"});
//		((List) taskOutput.get("values")).add(new Object[] {"row21", 2, "row23"});
//		((List) taskOutput.get("values")).add(new Object[] {"row23", 3, "row33"});
//
//		Map variables = new HashMap<>();
//		variables.put("data", taskOutput);
//		
//		String template = ""
//				+ "\n" + 
//				"  \n" + 
//				"    \n" + 
//				"    \n" + 
//				"    \n" + 
//				"  \n" + 
//				"  \n" + 
//				"    \n" + 
//				"    \n" + 
//				"    \n" + 
//				"  \n" + 
//				"  \n" + 
//				"    \n" + 
//				"    \n" + 
//				"    \n" + 
//				"  \n" + 
//				"
{{data.headers.0}}{{data.headers.1}}{{data.headers.2}}
{{data.values.0.0}}{{data.values.0.1}}{{data.values.0.2}}
{{data.values.1.0}}{{data.values.1.2}}{{data.values.1.2}}
\n"; // // System.out.println("Example 1"); // System.out.println(MustacheUtility.compile(template, variables)); // System.out.println(""); // System.out.println("Example 2"); // // template = "" // + "\n" + // " \n" + // " \n" + // " \n" + // " \n" + // " \n" // + "{{#data.values}}" // + " \n" // + "{{#.}}" // + " \n" // +"{{/.}}" // + "\n \n" // + "{{/data.values}}" + // "
{{data.headers.0}}{{data.headers.1}}{{data.headers.2}}
{{.}}
\n"; // // System.out.println(MustacheUtility.compile(template, variables)); // } }