package nl.ipo.cds.validation.format;
import java.util.Set;
import nl.ipo.cds.validation.AbstractUnaryTestExpression;
import nl.ipo.cds.validation.AttributeExpression;
import nl.ipo.cds.validation.Expression;
import nl.ipo.cds.validation.ValidationMessage;
import nl.ipo.cds.validation.Validator;
import nl.ipo.cds.validation.ValidatorContext;
import nl.ipo.cds.validation.constants.Constant;
import nl.ipo.cds.validation.flow.ForEachExpression;
import nl.ipo.cds.validation.logical.AndExpression;
import nl.ipo.cds.validation.logical.NotExpression;
import nl.ipo.cds.validation.operators.In;
public class HtmlFormatter<K extends Enum<K> & ValidationMessage<K, C>, C extends ValidatorContext<K, C>> extends ValidatorFormatter<K, C> {
public HtmlFormatter (final Validator<K, C> exp) {
super (exp);
}
public String format (final Validator<K, C> validator) {
if (validator.messageKey == null) {
return formatExpression (validator.expression);
}
return formatExpression (validator.expression);
}
public String format (final AndExpression<K, C> exp) {
final StringBuilder b = new StringBuilder ();
b.append ("<p><strong>De volgende constraints moeten gelden:</strong></b>\n");
b.append ("<ul>\n");
for (final Expression<K, C, ?> e: exp.inputs) {
b.append ("<li>\n");
b.append (formatExpression (e));
b.append ('\n');
b.append ("</li>\n");
}
b.append ("</ul>\n");
return b.toString ();
}
public String format (final In<K, C, ?> exp) {
return String.format ("%s komt voor in %s", formatExpression (exp.a), formatExpression (exp.b));
}
public String format (final Constant<K, C, ?> exp) {
if (Set.class.isAssignableFrom (exp.type)) {
final StringBuilder b = new StringBuilder ();
b.append ('(');
for (final Object o: (Set<?>)exp.value) {
if (b.length () > 1) {
b.append (", ");
}
b.append ("<em>\"" + o.toString () + "\"</em>");
}
b.append (')');
return b.toString ();
} else {
return String.format ("<em>\"%s\"</em>", exp.value.toString ());
}
}
public String format (final ForEachExpression<K, C, ?> exp) {
return String.format ("<p><strong>Voor iedere <em>%s</em> in %s moet gelden:</strong></p>\n<ul>\n<li>\n%s\n</li>\n</ul>\n",
exp.variableName,
formatExpression (exp.input),
formatExpression (exp.validator.expression)
);
}
public String format (final AttributeExpression<K, C, ?> exp) {
return "<em>" + (exp.label != null ? exp.label : exp.name) + "</em>";
}
public String format (final NotExpression<K, C> exp) {
return String.format ("<strong>Niet toegestaan</strong>: %s", formatExpression (exp.input));
}
public String format (final AbstractUnaryTestExpression<K, C, ?> exp) {
if (exp.name.equals ("IsNull")) {
return String.format ("%s heeft geen waarde (null)", formatExpression (exp.input));
} else {
return String.format ("%s %s", formatExpression (exp.input), exp.name);
}
}
}