blob: 0a2eec4d4461b302102bbaf69d86336fbb0595b8 [file] [log] [blame]
package org.apache.wicket.bean.validation;
import java.util.ArrayList;
import java.util.List;
import jakarta.validation.ConstraintViolation;
import jakarta.validation.metadata.ConstraintDescriptor;
import org.apache.wicket.util.string.Strings;
import org.apache.wicket.validation.ValidationError;
/**
* A default implementation of {@link IViolationTranslator}. The validation error is created with
* the constraint violation's default error message. Further, the violation is checked for a message
* key and if is found it is also added as a message key to the validation error. The keys are only
* used if they are in the bean validation's default format of '{key}'.
*
* @author igor
*/
public class DefaultViolationTranslator implements IViolationTranslator
{
@Override
public <T> ValidationError convert(ConstraintViolation<T> violation)
{
ConstraintDescriptor<?> desc = violation.getConstraintDescriptor();
ValidationError error = new ValidationError();
error.setMessage(violation.getMessage());
List<String> messages = getViolationMessages(violation, desc);
addErrorKeys(error, violation.getInvalidValue(), messages);
for (String key : desc.getAttributes().keySet())
{
error.setVariable(key, desc.getAttributes().get(key));
}
return error;
}
private List<String> getViolationMessages(ConstraintViolation<?> violation,
ConstraintDescriptor<?> desc)
{
String defaultMessage = (String)desc.getAttributes().get("message");
String violationMessage = violation.getMessage();
String violationMessageTemplate = violation.getMessageTemplate();
List<String> messages = new ArrayList<String>();
//violation message is considered only if it is different from
//the interpolated message
if (!Strings.isEqual(violationMessage, violationMessageTemplate))
{
messages.add(violationMessageTemplate);
}
messages.add(violationMessage);
//the default message is considered only if it is different from
//the violation message template
if (!Strings.isEqual(defaultMessage, violationMessageTemplate))
{
messages.add(defaultMessage);
}
return messages;
}
private void addErrorKeys(ValidationError error, Object invalidValue, List<String> messages)
{
for (String message : messages)
{
String messageKey = getMessageKey(message);
if (messageKey != null)
{
if (invalidValue != null)
{
error.addKey(messageKey + "." + invalidValue.getClass().getSimpleName());
}
error.addKey(messageKey);
}
}
}
private String getMessageKey(String message)
{
if (!Strings.isEmpty(message) && message.startsWith("{") && message.endsWith("}"))
{
return message.substring(1, message.length() - 1);
}
return null;
}
}