protected final Template getTemplate(Operator<?> op) { return templates.getTemplate(op); }
@Override public String visit(Path<?> p, Templates templates) { final Path<?> parent = p.getMetadata().getParent(); final Object elem = p.getMetadata().getElement(); if (parent != null) { Template pattern = templates.getTemplate(p.getMetadata().getPathType()); if (pattern != null) { final List<?> args = Arrays.asList(parent, elem); final StringBuilder builder = new StringBuilder(); for (Template.Element element : pattern.getElements()) { Object rv = element.convert(args); if (rv instanceof Expression) { builder.append(((Expression)rv).accept(this, templates)); } else { builder.append(rv.toString()); } } return builder.toString(); } else { throw new IllegalArgumentException("No pattern for " + p.getMetadata().getPathType()); } } else { return elem.toString(); } }
@Override public String visit(Operation<?> o, Templates templates) { final Template template = templates.getTemplate(o.getOperator()); if (template != null) { final int precedence = templates.getPrecedence(o.getOperator()); final StringBuilder builder = new StringBuilder(); for (Template.Element element : template.getElements()) { final Object rv = element.convert(o.getArgs()); if (rv instanceof Expression) { if (precedence > -1 && rv instanceof Operation) { if (precedence < templates.getPrecedence(((Operation<?>)rv).getOperator())) { builder.append("("); builder.append(((Expression)rv).accept(this, templates)); builder.append(")"); continue; } } builder.append(((Expression)rv).accept(this, templates)); } else { builder.append(rv.toString()); } } return builder.toString(); } else { return "unknown operation with operator " + o.getOperator().getId() + " and args " + o.getArgs(); } }
@Override public Void visit(Path<?> path, Void context) { final PathType pathType = path.getMetadata().getPathType(); final Template template = templates.getTemplate(pathType); final Object element = path.getMetadata().getElement(); List<Object> args; if (path.getMetadata().getParent() != null) { args = ImmutableList.of(path.getMetadata().getParent(), element); } else { args = ImmutableList.of(element); } handleTemplate(template, args); return null; }
@Test public void Escape() { List<Templates> templates = Arrays.<Templates>asList( new JPQLTemplates(), new HQLTemplates(), new EclipseLinkTemplates(), new OpenJPATemplates() ); for (Templates t : templates) { assertEquals("{0} like {1} escape '!'", t.getTemplate(Ops.LIKE).toString()); } }
@Test public void Custom_Escape() { List<Templates> templates = Arrays.<Templates>asList( new JPQLTemplates('X'), new HQLTemplates('X'), new EclipseLinkTemplates('X'), new OpenJPATemplates('X') ); for (Templates t : templates) { assertEquals("{0} like {1} escape 'X'", t.getTemplate(Ops.LIKE).toString()); } }
protected void visitOperation(Class<?> type, Operator<?> operator, final List<? extends Expression<?>> args) { final Template template = templates.getTemplate(operator); if (template != null) { final int precedence = templates.getPrecedence(operator);