package lucee.runtime.db; import java.net.URLDecoder; import org.w3c.dom.Element; import lucee.print; import lucee.commons.lang.StringUtil; import lucee.commons.net.URLEncoder; import lucee.runtime.exp.PageException; import lucee.runtime.op.Caster; import lucee.runtime.type.Struct; public class ParamSyntax { public static final ParamSyntax DEFAULT = new ParamSyntax("?","&","="); public final String leadingDelimiter; public final String delimiter; public final String separator; private ParamSyntax(String leadingDelimiter, String delimiter, String separator) { this.leadingDelimiter=leadingDelimiter; this.delimiter=delimiter; this.separator=separator; } public static ParamSyntax toParamSyntax(String leadingDelimiter, String delimiter, String separator) { if(DEFAULT.delimiter.equals(delimiter) && DEFAULT.leadingDelimiter.equals(leadingDelimiter) && DEFAULT.separator.equals(separator)) return DEFAULT; return new ParamSyntax(leadingDelimiter, delimiter, separator); } public static ParamSyntax toParamSyntax(Struct sct) throws PageException { String del = Caster.toString(sct.get("delimiter")); String ledel = Caster.toString(sct.get("leadingDelimiter",null),null); if(StringUtil.isEmpty(ledel)) ledel=del; return toParamSyntax(ledel, del, Caster.toString(sct.get("separator"))); } public static ParamSyntax toParamSyntax(Struct sct, ParamSyntax defaultValue) { String del = Caster.toString(sct.get("param_delimiter",null),null); String sep=Caster.toString(sct.get("param_separator",null),null); if(del==null || sep==null) return defaultValue; String ledel = Caster.toString(sct.get("param_leadingDelimiter",null),null); if(StringUtil.isEmpty(ledel)) ledel=del; return toParamSyntax(ledel, del, sep); } public static ParamSyntax toParamSyntax(Element el, ParamSyntax defaultValue) { if(!el.hasAttribute("param-delimiter") || !el.hasAttribute("param-separator")) return defaultValue; String del = URLDecoder.decode(el.getAttribute("param-delimiter")); String ledel = el.getAttribute("param-leading-delimiter"); String sep = el.getAttribute("param-separator"); if(StringUtil.isEmpty(ledel)) ledel=del; return toParamSyntax(ledel, del, sep); } public String toString() { return "delimiter:"+delimiter+";leadingDelimiter:"+leadingDelimiter+";separator:"+separator; } public boolean equals(Object obj) { if(!(obj instanceof ParamSyntax)) return false; ParamSyntax other=(ParamSyntax) obj; return other.delimiter.equals(delimiter) && other.leadingDelimiter.equals(leadingDelimiter) && other.separator.equals(separator); } }