package com.akjava.lib.common.form; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import com.akjava.lib.common.functions.LabelAndValueDto; import com.akjava.lib.common.functions.SplitLineFunction; import com.akjava.lib.common.tag.LabelAndValue; import com.akjava.lib.common.tag.Tag; import com.akjava.lib.common.tag.TagBuilder; import com.akjava.lib.common.utils.HTMLUtils; import com.google.common.base.Function; import com.google.common.base.Joiner; public class FormFieldDataDto { private static final CsvToFormFieldFunction csvToFormFieldFunctionOptionWithNumber=new CsvToFormFieldFunction(true); private static final CsvToFormFieldFunction csvToFormFieldFunction=new CsvToFormFieldFunction(false); //TODO convert list public static CsvToFormFieldFunction getCsvToFormFieldFunction(boolean withNumber){ if(withNumber){ return csvToFormFieldFunctionOptionWithNumber; }else{ return csvToFormFieldFunction; } } public static Map<String,String> formDataToMap(FormFieldData data){ Map<String,String> hashMap=new LinkedHashMap<String, String>(); hashMap.put("name", data.getName()); hashMap.put("key", data.getKey()); hashMap.put("type", FormFieldData.getTypeByNumber(data.getType())); hashMap.put("optionValues", LabelAndValueDto.labelAndValueToString(data.getOptionValues())); hashMap.put("defaultValue", data.getDefaultValue()); hashMap.put("createAuto", data.isCreateAuto()?"yes":""); hashMap.put("validators", ValidatorDto.validatorListToNamesLine(data.getValidators())); hashMap.put("modifiers", ModifierDto.modifierListToNamesLine(data.getModifiers())); hashMap.put("placeHolder", data.getPlaceHolder()); hashMap.put("comment", data.getComment()); return hashMap; } public static class OptionLabelToValueFunction implements Function<String,String >{ private List<LabelAndValue> optionValues; public OptionLabelToValueFunction(List<LabelAndValue> optionValues){ this.optionValues=optionValues; } @Override public String apply(String label) { for(LabelAndValue lv:optionValues){ if(lv.getPrintValue().equals(label)){ return lv.getValue(); } } return null; } } public static class OptionValueToLabelFunction implements Function<String,String >{ private List<LabelAndValue> optionValues; public OptionValueToLabelFunction(List<LabelAndValue> optionValues){ this.optionValues=optionValues; } @Override public String apply(String value) { for(LabelAndValue lv:optionValues){ if(lv.getValue().equals(value)){ return lv.getPrintValue(); } } return null; } } public static FormFieldToNameFunction getFormFieldToNameFunction(){ return FormFieldToNameFunction.INSTANCE; } public enum FormFieldToNameFunction implements Function<FormFieldData,String >{ INSTANCE; @Override public String apply(FormFieldData data) { // TODO Auto-generated method stub return data.getName(); } } public static FormFieldToHiddenTagFunction getFormFieldToHiddenTagFunction(){ return FormFieldToHiddenTagFunction.INSTANCE; } public enum FormFieldToHiddenTagFunction implements Function<FormFieldData,Tag>{ INSTANCE; @Override public Tag apply(FormFieldData data) { Tag tag=null; tag=TagBuilder.createHidden(data.getKey(), null); return tag; } } /* public static FormFieldToEditTagFunction getFormFieldToEditTagFunction(){ return FormFieldToEditTagFunction.INSTANCE; } public enum FormFieldToEditTagFunction implements Function<FormFieldData,Tag>{ INSTANCE; @Override public Tag apply(FormFieldData data) { Tag tag=null; if(data.getType()==FormFieldData.TYPE_TEXT_LONG){ tag=TagBuilder.createTextArea(data.getKey(), null); }else if(data.getType()==FormFieldData.TYPE_ID){//usually ignore it tag=TagBuilder.createText(data.getKey(), null); }else if(data.getType()==FormFieldData.TYPE_CHECK){ tag=TagBuilder.createCheckbox(data.getKey(), null,false); }else if(data.getType()==FormFieldData.TYPE_SELECT_SINGLE){ tag=TagBuilder.createSelect(data.getKey(), data.getOptionValues(), false); }else if(data.getType()==FormFieldData.TYPE_SELECT_MULTI){ tag=TagBuilder.createSelect(data.getKey(), data.getOptionValues(), true); }else if(data.getType()==FormFieldData.TYPE_CREATE_DATE){//usually ignore it tag=TagBuilder.createText(data.getKey(), null); }else if(data.getType()==FormFieldData.TYPE_CREATE_USER){//usually ignore it tag=TagBuilder.createText(data.getKey(), null); }else{ //default text tag=TagBuilder.createText(data.getKey(), null); } return tag; } } */ public static FormFieldToInputTagFunction getFormFieldToInputTagFunction(){ return FormFieldToInputTagFunction.INSTANCE; } public enum FormFieldToInputTagFunction implements Function<FormFieldData,Tag>{ INSTANCE; @Override public Tag apply(FormFieldData data) { Tag tag=null; if(data.getType()==FormFieldData.TYPE_TEXT_LONG){ String defaultValue=null; if(data.getDefaultValue()!=null && !data.getDefaultValue().isEmpty()){ defaultValue=HTMLUtils.sanitize(data.getDefaultValue()); } tag=TagBuilder.createTextArea(data.getKey(), defaultValue); }else if(data.getType()==FormFieldData.TYPE_ID){//usually ignore it tag=TagBuilder.createText(data.getKey(), null); }else if(data.getType()==FormFieldData.TYPE_CHECK){ String defaultValue=null; boolean selection=false; if(data.getDefaultValue()!=null && !data.getDefaultValue().isEmpty()){ defaultValue=data.getDefaultValue(); if(data.getOptionValues().size()>0){ if(data.getOptionValues().get(0).getPrintValue().equals(defaultValue)){ selection=true; } } } tag=TagBuilder.createCheckbox(data.getKey(), null,selection); }else if(data.getType()==FormFieldData.TYPE_SELECT_SINGLE){ //defautl value already selected tag=TagBuilder.createSelect(data.getKey(), data.getOptionValues(), false); }else if(data.getType()==FormFieldData.TYPE_SELECT_MULTI){ //defautl value already selected tag=TagBuilder.createSelect(data.getKey(), data.getOptionValues(), true); }else if(data.getType()==FormFieldData.TYPE_CREATE_DATE){//usually ignore it tag=TagBuilder.createText(data.getKey(), null); }else if(data.getType()==FormFieldData.TYPE_CREATE_USER){//usually ignore it tag=TagBuilder.createText(data.getKey(), null); }else if(data.getType()==FormFieldData.TYPE_HIDDEN){ String defaultValue=null; if(data.getDefaultValue()!=null && !data.getDefaultValue().isEmpty()){ defaultValue=HTMLUtils.sanitize(data.getDefaultValue()); } tag=TagBuilder.createHidden(data.getKey(), defaultValue); } else{ //TEXT or NUMBER String defaultValue=null; if(data.getDefaultValue()!=null && !data.getDefaultValue().isEmpty()){ defaultValue=HTMLUtils.sanitize(data.getDefaultValue()); } tag=TagBuilder.createText(data.getKey(), defaultValue); } return tag; } } public static class FormFieldToHiddenTagWithValueFunction implements Function<FormFieldData,Tag>{ private Map<String,String> valueMap; public FormFieldToHiddenTagWithValueFunction(Map<String,String> valueMap){ this.valueMap=valueMap; } @Override public Tag apply(FormFieldData data) { Tag tag=null; tag=TagBuilder.createHidden(data.getKey(), valueMap.get(data.getKey())); return tag; } } public static FormFieldToInputTemplateTagFunction getFormFieldToInputTemplateTagFunction(){ return FormFieldToInputTemplateTagFunction.INSTANCE; } public static enum FormFieldToInputTemplateTagFunction implements Function<FormFieldData,Tag>{ INSTANCE; @Override public Tag apply(FormFieldData data) { Tag tag=null; if(data.getType()==FormFieldData.TYPE_TEXT_LONG){ tag=TagBuilder.createTextArea(data.getKey(), "${value_"+data.getKey()+"}"); }else if(data.getType()==FormFieldData.TYPE_ID){//usually ignore it tag=TagBuilder.createText(data.getKey(), "${value_"+data.getKey()+"}"); }else if(data.getType()==FormFieldData.TYPE_CHECK){ tag=TagBuilder.createCheckbox(data.getKey(), null,false); tag.setSpecialEnd("${checked_"+data.getKey()+"}"); }else if(data.getType()==FormFieldData.TYPE_SELECT_SINGLE){ tag=TagBuilder.createSelect(data.getKey(), null, false); int index=0; for(LabelAndValue lv:data.getOptionValues()){ Tag option=new Tag("option"); String value=lv.getValue(); String label=lv.getLabel(); if(label!=null){ option.setText(label); option.setAttribute("value", value); }else{ option.setText(value); } option.setSpecialEnd("${selected_"+data.getKey()+index+"}"); index++; tag.addChild(option); } }else if(data.getType()==FormFieldData.TYPE_SELECT_MULTI){ tag=TagBuilder.createSelect(data.getKey(), null, true); int index=0; for(LabelAndValue lv:data.getOptionValues()){ Tag option=new Tag("option"); String value=lv.getValue(); String label=lv.getLabel(); if(label!=null){ option.setText(label); option.setAttribute("value", value); }else{ option.setText(value); } option.setSpecialEnd("${selected_"+data.getKey()+index+"}"); index++; tag.addChild(option); } }else if(data.getType()==FormFieldData.TYPE_CREATE_DATE){//usually ignore it tag=TagBuilder.createText(data.getKey(), "${value_"+data.getKey()+"}"); }else if(data.getType()==FormFieldData.TYPE_CREATE_USER){//usually ignore it tag=TagBuilder.createText(data.getKey(), "${value_"+data.getKey()+"}"); }else if(data.getType()==FormFieldData.TYPE_HIDDEN){//usually ignore it tag=TagBuilder.createHidden(data.getKey(), "${value_"+data.getKey()+"}"); }else{ //TEXT or NUMBER //default text tag=TagBuilder.createText(data.getKey(), "${value_"+data.getKey()+"}"); } return tag; } } public static class FormFieldToInputEditTagFunction implements Function<FormFieldData,Tag>{ private Map<String,String> valueMap; public FormFieldToInputEditTagFunction(Map<String,String> valueMap){ this.valueMap=valueMap; } @Override public Tag apply(FormFieldData data) { Tag tag=null; if(data.getType()==FormFieldData.TYPE_TEXT_LONG){ tag=TagBuilder.createTextArea(data.getKey(), valueMap.get(data.getKey())); }else if(data.getType()==FormFieldData.TYPE_ID){//usually ignore it tag=TagBuilder.createText(data.getKey(), valueMap.get(data.getKey())); }else if(data.getType()==FormFieldData.TYPE_CHECK){ String value=valueMap.get(data.getKey()); boolean checked=false; if(value!=null && value.equals("on")){ checked=true; } tag=TagBuilder.createCheckbox(data.getKey(), null,checked); }else if(data.getType()==FormFieldData.TYPE_SELECT_SINGLE){ String value=valueMap.get(data.getKey()); List<LabelAndValue> lvalues=new ArrayList<LabelAndValue>(); for(LabelAndValue lv:data.getOptionValues()){ LabelAndValue cloned=lv.clone(); if(cloned.getValue().equals(value)){ cloned.setSelected(true); }else{ cloned.setSelected(false); } lvalues.add(cloned); } tag=TagBuilder.createSelect(data.getKey(), lvalues, false); }else if(data.getType()==FormFieldData.TYPE_SELECT_MULTI){ String value=valueMap.get(data.getKey()); List<String> valueList=new ArrayList<String>(); if(value!=null){ String[] values=value.split(":"); for(String v:values){ valueList.add(v); } } List<LabelAndValue> lvalues=new ArrayList<LabelAndValue>(); for(LabelAndValue lv:data.getOptionValues()){ LabelAndValue cloned=lv.clone(); if(valueList.contains(cloned.getValue())){ cloned.setSelected(true); }else{ cloned.setSelected(false); } lvalues.add(cloned); } tag=TagBuilder.createSelect(data.getKey(), lvalues, true); }else if(data.getType()==FormFieldData.TYPE_CREATE_DATE){//usually ignore it tag=TagBuilder.createText(data.getKey(), valueMap.get(data.getKey())); }else if(data.getType()==FormFieldData.TYPE_CREATE_USER){//usually ignore it tag=TagBuilder.createText(data.getKey(), valueMap.get(data.getKey())); }else if(data.getType()==FormFieldData.TYPE_HIDDEN){//usually ignore it tag=TagBuilder.createHidden(data.getKey(), valueMap.get(data.getKey())); }else{//TEXT_SHORT || NUMBER //default text tag=TagBuilder.createText(data.getKey(), valueMap.get(data.getKey())); } return tag; } } public static FormFieldToKeyFunction getFormFieldToKeyFunction(){ return FormFieldToKeyFunction.INSTANCE; } public enum FormFieldToKeyFunction implements Function<FormFieldData,String >{ INSTANCE; @Override public String apply(FormFieldData data) { // TODO Auto-generated method stub return data.getKey(); } } public static FormFieldToCsvFunction getFormFieldToCsvFunction(){ return FormFieldToCsvFunction.INSTANCE; } public enum FormFieldToCsvFunction implements Function<FormFieldData,String >{ INSTANCE; @Override public String apply(FormFieldData data) { Map<String,String> map=formDataToMap(data); return Joiner.on("\t").useForNull("").join(map.values()); } } static class CsvToFormFieldFunction implements Function<String, FormFieldData>{ private boolean optionWithNumber=true; public CsvToFormFieldFunction(boolean optionWithNumber){ this.optionWithNumber=optionWithNumber; } /* public void setOptionWithNumber(boolean optionWithNumber) { this.optionWithNumber = optionWithNumber; }*/ @Override public FormFieldData apply(String value) { FormFieldData data=new FormFieldData(); List<String> csvs=new SplitLineFunction(true, false).apply(value); if(csvs.size()>0){ data.setName(csvs.get(0));//String } if(csvs.size()>1){ data.setKey(csvs.get(1));//String } if(csvs.size()>2){//TODO not use number int type=0; String v=csvs.get(2).toLowerCase(); type=FormFieldData.getTypeByLabel(v); data.setType(type); } if(csvs.size()>3){ String optionText=csvs.get(3); if(!optionText.isEmpty()){ data.setOptionText(optionText); if(optionWithNumber && data.getType()!=FormFieldData.TYPE_CHECK){ data.setOptionValues(LabelAndValueDto.lineToLabelAndValuesWithNumber(optionText)); }else{ data.setOptionValues(LabelAndValueDto.lineToLabelAndValues(optionText)); } } } if(csvs.size()>4){ data.setDefaultValue(csvs.get(4)); if(data.getDefaultValue()!=null && !data.getDefaultValue().isEmpty()){//empty not support String[] vs=data.getDefaultValue().split(",");// List<String> selections=new ArrayList<String>(); for(String v:vs){ selections.add(v); } //watch out lists.transform list cant edit for(int i=0;i<data.getOptionValues().size();i++){ LabelAndValue lv=data.getOptionValues().get(i); if(selections.contains(lv.getPrintValue())){ lv.setSelected(true); } } } } if(csvs.size()>5){ String isAuto=csvs.get(5).toLowerCase(); if(isAuto.equals("true") || isAuto.equals("yes")){ data.setCreateAuto(true); } } //TODO parse validator if(csvs.size()>6){ String validatorText=csvs.get(6); if(!validatorText.isEmpty()){ data.setValidators(ValidatorDto.namesLineToValidatorList(validatorText)); } } // if(csvs.size()>7){ String modifierText=csvs.get(7); if(!modifierText.isEmpty()){ data.setModifiers(ModifierDto.namesLineToModifierList(modifierText)); } } if(csvs.size()>8){ data.setPlaceHolder(csvs.get(8)); } if(csvs.size()>9){ data.setComment(csvs.get(9)); } return data; } } public static String formFieldToCsv(FormFieldData field) { // TODO Auto-generated method stub return getFormFieldToCsvFunction().apply(field); } public static FormFieldData csvToFormField(String collect) { // TODO Auto-generated method stub return getCsvToFormFieldFunction(true).apply(collect); } }