/* * Licensed to csti consulting * You may obtain a copy of the License at * * http://www.csticonsulting.com * Copyright (c) 2006-Dec 7, 2010 Consultation CS-TI inc. * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package com.salesmanager.core.util; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import org.codehaus.jackson.map.ObjectMapper; import com.salesmanager.core.constants.ConfigurationConstants; import com.salesmanager.core.entity.system.Field; import com.salesmanager.core.entity.system.FieldOption; /** * JSON to String helper class * @author Carl Samson * */ public class ConfigurationFieldUtil { private static Logger log = Logger.getLogger(ConfigurationFieldUtil.class); public static String getMerchantConfigurationKey(String page, String module) { return new StringBuilder().append(ConfigurationConstants.PAGE_PORTLET_PREFIX).append(page).append("_").append(module).toString(); } public static String getMerchantConfigurationKeyLike(String page) { return new StringBuilder().append(ConfigurationConstants.PAGE_PORTLET_PREFIX).append(page).append("_").toString(); } /** * This method de-serializes fields instructions formated as JSON objects * Multiple fields instructions can be de-serialized using this class * The string must be formated as an array of fields * {"fields":[field,field]} * The system currently supports Text, Select, Radio and checkbox fields * Text field: * {"field":{"type":"text","name":"nameOfTheField","label":"Field Label"}} * Select field * {"field":{"type":"select","name":"option",,"label":"Field Label","values":[{"name":"option label","value":"option value","isDefault":"false"},{"name":"option label2","value":"option value2","isDefault":"false"}]}} * Radio field * {"field":{"type":"radio","name":"option","label":"Field Label","values":[{"name":"option label","value":"option value","isDefault":"false"},{"name":"option label2","value":"option value2","isDefault":"false"}]}} * Returns a Map of String[fieldName] and Field field content * * Full example * {"fields":[{"field":{"type":"text","label":"Invitation type text","name":"invitationType"}},{"field":{"type":"text","label":"Action text","name":"actionText"}},{"field":{"type":"select","label":"Select Action text","name":"selectActionText","values":[{"name":"select1","value":"option value1","isDefault":"false"},{"name":"select2","value":"option value2","isDefault":"false"}]}},{"field":{"type":"radio","label":"Radio Action text","name":"radioActionText","values":[{"name":"radioActionText","value":"yes","isDefault":"false"},{"name":"radioActionText","value":"no","isDefault":"true"}]}},{"field":{"type":"checkbox","label":"Checkbox Action text","name":"checkboxActionText"}}]} * * Returns Map<String->fieldName,Field> * @author Carl Samson * @param fields * @return * @throws Exception */ public static Map<String,Field> parseFields(String fields) throws Exception { Map returnMap = new HashMap(); Map<String, String> data = new ObjectMapper().readValue(fields, HashMap.class); if(data!=null) { for(Object o: data.keySet()) { if(o instanceof String && ((String)o).equals("fields")) { // can parse Object oo = data.get(o); if(oo instanceof List) {//List for(Object ooo:(List)oo) { if(ooo instanceof LinkedHashMap) { Map m = (Map)ooo; //get each fields Map field = (Map)m.get("field"); //get field type String type = (String)field.get("type"); String name = (String)field.get("name"); String label = (String)field.get("label"); //System.out.println("This field is of type [" + type + "] and name [" + name + "]"); Field f = new Field(); f.setName(name); f.setType(type); f.setLabel(label); returnMap.put(name, f); List valuesList = (List)field.get("values"); if(valuesList!=null) { for(Object oooo:valuesList) { FieldOption fo = new FieldOption(); Map values = (Map)oooo; String valueName = (String)values.get("name"); String valueValue = (String)values.get("value"); String defaultOption = (String)values.get("isDefault"); boolean def = false; try { def = new Boolean(defaultOption).booleanValue(); } catch (Exception e) { log.error("Invalid value for isDefault " + name); } //System.out.println("This field is of type [" + type + "] has option [" + valueName + "] and value [" + valueValue + "]"); fo.setName(valueName); fo.setValue(valueValue); fo.setDefaultOption(def); f.addFieldOption(fo); } } } } } } } } return returnMap; } /** * Accepts a list of json string and creates a full json object, then * returns a Map<String->module,List<Field>) * @param fields * @return * @throws Exception */ public static Map<String,List<Field>> parseFieldsValues(List<String> stringFields) throws Exception { Map returnMap = new HashMap(); StringBuilder sb = new StringBuilder(); sb.append("{\"page\":\"p\",\"modules\":["); int i = 0; for(Object o:stringFields) { String s = (String)o; sb.append(s); if(i<stringFields.size()-1) { sb.append(","); } i++; } sb.append("]}"); Map<String, String> data = new ObjectMapper().readValue(sb.toString(), HashMap.class); if(data!=null) { for(Object o: data.keySet()) { if(o instanceof String && ((String)o).equals("modules")) { // can parse Object oo = data.get(o); if(oo instanceof List) {//List for(Object ooo:(List)oo) { if(ooo instanceof LinkedHashMap) { Map m = (Map)ooo; String module = (String)m.get("module"); List valuesList = (List)m.get("values"); List returnList = new ArrayList(); if(valuesList!=null) { for(Object oooo:valuesList) { Field f = new Field(); Map values = (Map)oooo; String valueName = (String)values.get("name"); String valueValue = (String)values.get("value"); f.setName(valueName); f.setFieldValue(valueValue); returnList.add(f); } } returnMap.put(module, returnList); } } } } } } return returnMap; } /** * {"fields":[{"module":"moduleName","values":[{"name":"fieldName","value":"fieldValue"}...]}...]} * @param fields * @return String->module, List<Field> * @throws Exception */ public static Map<String,List<Field>> parseFieldsValues(String fields) throws Exception { Map returnMap = new HashMap(); Map<String, String> data = new ObjectMapper().readValue(fields, HashMap.class); if(data!=null) { for(Object o: data.keySet()) { if(o instanceof String && ((String)o).equals("fields")) { // can parse Object oo = data.get(o); if(oo instanceof List) {//List for(Object ooo:(List)oo) { if(ooo instanceof LinkedHashMap) { Map m = (Map)ooo; String module = (String)m.get("module"); List valuesList = (List)m.get("values"); List returnList = new ArrayList(); if(valuesList!=null) { for(Object oooo:valuesList) { Field f = new Field(); Map values = (Map)oooo; String valueName = (String)values.get("name"); String valueValue = (String)values.get("value"); f.setName(valueName); f.setFieldValue(valueValue); returnList.add(f); } } returnMap.put(module, returnList); } } } } } } return returnMap; } /** * Builds a JSON string with all fields values for a given module * @param fieldValues * @return */ public static String buildFieldValuesString(Map<String,List<Field>> fieldValues) { if(fieldValues==null) return null; if(fieldValues.size()==0) return null; StringBuilder sb = new StringBuilder(); sb.append("{"); for(Object o: fieldValues.keySet()){ String module = (String)o; //{"fields":[{"module":"moduleName","values":[{"name":"fieldName","value":"fieldValue"}...]}...]} sb.append("\"module\":\"").append(module).append("\","); List fv = fieldValues.get(module); int i = 0; if(fv!=null && fv.size()>0) { sb.append("\"values\":["); for(Object v:fv) { Field f = (Field)v; sb.append("{\"name\":\"").append(f.getName()).append("\",\"value\":\"").append(f.getFieldValue()).append("\"}"); if(i<fv.size()-1) { sb.append(","); } i++; } sb.append("]"); } } sb.append("}"); return sb.toString(); } }