package com.floreysoft.jmte;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Convenience class for simple model creation.
*
* <p>
* Sample usage
*
* <pre>
* Map<String, Object> model = new ModelBuilder("1", "arg1", "2", "arg2").build();
* </pre>
*
* </p>
*/
public final class ModelBuilder {
private final Map<String, Object> model = new HashMap<String, Object>();
public ModelBuilder(String name1, Object value1) {
model.put(name1, value1);
}
public ModelBuilder(String name1, Object value1, String name2, Object value2) {
model.put(name1, value1);
model.put(name2, value2);
}
public ModelBuilder(String name1, Object value1, String name2,
Object value2, String name3, Object value3) {
model.put(name1, value1);
model.put(name2, value2);
model.put(name3, value3);
}
public ModelBuilder(String name1, Object value1, String name2,
Object value2, String name3, Object value3, String name4,
Object value4) {
model.put(name1, value1);
model.put(name2, value2);
model.put(name3, value3);
model.put(name4, value4);
}
public ModelBuilder(String name1, Object value1, String name2,
Object value2, String name3, Object value3, String name4,
Object value4, String name5, Object value5) {
model.put(name1, value1);
model.put(name2, value2);
model.put(name3, value3);
model.put(name4, value4);
model.put(name5, value4);
}
/**
* Transforms an array to a model using the index of the elements (starting
* from 1) in the array and a prefix to form their names.
*
* @param prefix
* the prefix to add to the index or <code>null</code> if none
* shall be applied
* @param args
* the array to be transformed into the model
* @return the model containing the arguments
*/
public ModelBuilder(String prefix, Object... args) {
if (prefix == null) {
prefix = "";
}
for (int i = 0; i < args.length; i++) {
Object value = args[i];
String name = prefix + (i + 1);
model.put(name, value);
}
}
/**
* Merges any number of named lists into a single one containing their
* combined values. Can be very handy in case of a servlet request which
* might contain several lists of parameters that you want to iterate over
* in a combined way.
*
* @param names
* the names of the variables in the following lists
* @param lists
* the lists containing the values for the named variables
* @return a merge list containing the combined values of the lists
*/
public static List<Map<String, Object>> mergeLists(String[] names,
List<Object>... lists) {
List<Map<String, Object>> resultList = new ArrayList<Map<String, Object>>();
if (lists.length != 0) {
// first check if all looks good
int expectedSize = lists[0].size();
for (int i = 1; i < lists.length; i++) {
List<Object> list = lists[i];
if (list.size() != expectedSize) {
throw new IllegalArgumentException(
"All lists and array of names must have the same size!");
}
}
// yes, things are ok
List<Object> masterList = lists[0];
for (int i = 0; i < masterList.size(); i++) {
Map<String, Object> map = new HashMap<String, Object>();
for (int j = 0; j < lists.length; j++) {
String name = names[j];
List<Object> list = lists[j];
Object value = list.get(i);
map.put(name, value);
}
resultList.add(map);
}
}
return resultList;
}
public Map<String, Object> build() {
return model;
}
}