the data access layer behind jsf app uses 2 different formats date fields (sometimes ddmmyyyy, yyyymmdd); displayed date dd/mm/yyyy.
is there way use 2 different converters single field , decide 1 use dynamically? "if command button clicked, use converter, else if other command button clicked, use converter".
balusc explains why difficult here: https://stackoverflow.com/a/7123153/3284943
based on suggestions, created this:
in jsf file, use custom converter , defined attributes, select converter , dynamic attributes @ runtime. snippet dynamic primefaces datatable:
<h:outputtext rendered = "#{column.datetime}" value="#{table[column.name]}"> <f:converter converterid="runtimeconverterselector" /> <f:attribute name="converterid" value="#{column.convertername}" /> <f:attribute name="pattern" value="#{column.converterpattern}" /> </h:outputtext>
the custom converter:
@facesconverter ("runtimeconverterselector") public class runtimeconverterselector implements converter { converter delegateconverter; @override public object getasobject(facescontext context, uicomponent component, string value) { retrieveattributes(component); return delegateconverter.getasobject(context, component, value); } @override public string getasstring(facescontext context, uicomponent component, object value) { retrieveattributes(component); return delegateconverter.getasstring(context, component, value); } private void retrieveattributes(uicomponent component) { object attribute; attribute = component.getattributes().get("converterid"); if (attribute != null) { string convertername = (string)attribute; switch (convertername) { case "javax.faces.bigdecimal": delegateconverter = new bigdecimalconverter(); break; case "javax.faces.biginteger": delegateconverter = new bigintegerconverter(); break; case "javax.faces.boolean": delegateconverter = new booleanconverter(); break; case "javax.faces.byte": delegateconverter = new byteconverter(); break; case "javax.faces.character": delegateconverter = new characterconverter(); break; case "javax.faces.datetimeconverter": delegateconverter = new datetimeconverter(); attribute = component.getattributes().get("pattern"); if (attribute != null) ((datetimeconverter)delegateconverter).setpattern((string)attribute); attribute = component.getattributes().get("timezone"); if (attribute != null) ((datetimeconverter)delegateconverter).settimezone(timezone.gettimezone((string)attribute)); attribute = component.getattributes().get("datestyle"); if (attribute != null) ((datetimeconverter)delegateconverter).setdatestyle((string)attribute); attribute = component.getattributes().get("timestyle"); if (attribute != null) ((datetimeconverter)delegateconverter).setdatestyle((string)attribute); attribute = component.getattributes().get("type"); if (attribute != null) ((datetimeconverter)delegateconverter).setdatestyle((string)attribute); break; case "javax.faces.double": delegateconverter = new doubleconverter(); break; case "javax.faces.enum": delegateconverter = new enumconverter(); break; case "javax.faces.float": delegateconverter = new floatconverter(); break; case "javax.faces.integer": delegateconverter = new integerconverter(); break; case "javax.faces.long": delegateconverter = new longconverter(); break; case "javax.faces.number": delegateconverter = new numberconverter(); attribute = component.getattributes().get("currencycode"); if (attribute != null) ((numberconverter)delegateconverter).setcurrencycode((string)attribute); attribute = component.getattributes().get("currencysymbol"); if (attribute != null) ((numberconverter)delegateconverter).setcurrencysymbol((string)attribute); attribute = component.getattributes().get("groupingused"); if (attribute != null) ((numberconverter)delegateconverter).setgroupingused(boolean.parseboolean((string)attribute)); attribute = component.getattributes().get("integeronly"); if (attribute != null) ((numberconverter)delegateconverter).setintegeronly(boolean.parseboolean((string)attribute)); attribute = component.getattributes().get("locale"); if (attribute != null) ((numberconverter)delegateconverter).setlocale(new locale((string)attribute)); attribute = component.getattributes().get("maxfractiondigits"); if (attribute != null) ((numberconverter)delegateconverter).setmaxfractiondigits(integer.parseint((string)attribute)); attribute = component.getattributes().get("maxintegerdigits"); if (attribute != null) ((numberconverter)delegateconverter).setmaxintegerdigits(integer.parseint((string)attribute)); attribute = component.getattributes().get("minfractiondigits"); if (attribute != null) ((numberconverter)delegateconverter).setminfractiondigits(integer.parseint((string)attribute)); attribute = component.getattributes().get("minintegerdigits"); if (attribute != null) ((numberconverter)delegateconverter).setminintegerdigits(integer.parseint((string)attribute)); attribute = component.getattributes().get("pattern"); if (attribute != null) ((numberconverter)delegateconverter).setpattern((string)attribute); attribute = component.getattributes().get("type"); if (attribute != null) ((numberconverter)delegateconverter).settype((string)attribute); break; case "javax.faces.short": delegateconverter = new shortconverter(); break; default: system.err.println("converterid provided runtimeconverterselector, '" + convertername + "' invalid. default converter used"); break; } } else { system.err.println("no converterid provided runtimeconverterselector. default converter used."); } } }
Comments
Post a Comment