@SuppressWarnings("rawtypes") private String getPropertyName(ConstraintViolation violation) { Iterator iterator = violation.getPropertyPath().iterator(); Path.Node property = (Path.Node) iterator.next(); while (iterator.hasNext()) { property = (Path.Node) iterator.next(); } return property.getName(); }
@Test public void testNonStringMapKey() { Validator validator = ValidatorUtil.getValidator(); Container container = new Container(); Key id = new Key(); container.addItem(id, new Item(null)); Set<ConstraintViolation<Container>> constraintViolations = validator.validate(container); assertNumberOfViolations(constraintViolations, 1); ConstraintViolation<Container> violation = constraintViolations.iterator().next(); Path path = violation.getPropertyPath(); Iterator<Path.Node> iter = path.iterator(); iter.next(); Path.Node node = iter.next(); assertNotNull(node); assertTrue(node.isInIterable()); assertEquals(node.getKey(), id); }
private String getMessage( Member member, Object[] args, Set<? extends ConstraintViolation<?>> violations) { StringBuilder message = new StringBuilder(); message.append(violations.size()); message.append(" constraint violation(s) occurred during method validation."); message.append("\nConstructor or Method: "); message.append(member); message.append("\nArgument values: "); message.append(Arrays.toString(args)); message.append("\nConstraint violations: "); int i = 1; for (ConstraintViolation<?> constraintViolation : violations) { Path.Node leafNode = getLeafNode(constraintViolation); message.append("\n ("); message.append(i); message.append(")"); message.append(" Kind: "); message.append(leafNode.getKind()); if (leafNode.getKind() == ElementKind.PARAMETER) { message.append("\n parameter index: "); message.append(leafNode.as(Path.ParameterNode.class).getParameterIndex()); } message.append("\n message: "); message.append(constraintViolation.getMessage()); message.append("\n root bean: "); message.append(constraintViolation.getRootBean()); message.append("\n property path: "); message.append(constraintViolation.getPropertyPath()); message.append("\n constraint: "); message.append(constraintViolation.getConstraintDescriptor().getAnnotation()); i++; } return message.toString(); }
/** * Called only if isReachable returns true * * @return false for any associatons of root object being validated true otherwise */ public boolean isCascadable( Object traversableObject, Path.Node traversableProperty, Class<?> rootBeanType, Path pathToTraversableObject, ElementType elementType) { boolean cascadable = true; if (isRootObjectPath(pathToTraversableObject)) { String attributeName = traversableProperty .getName(); // Refer to section 4.2 of Bean Validation spec for more details about // Path DatabaseMapping mapping = getMappingForAttributeName(attributeName); if (mapping != null && mapping.isForeignReferenceMapping()) { cascadable = false; } } return cascadable; }
/** @return false for any lazily loaded property of root object being validated */ public boolean isReachable( Object traversableObject, Path.Node traversableProperty, Class<?> rootBeanType, Path pathToTraversableObject, ElementType elementType) { boolean reachable = true; String attributeName = null; if (isRootObjectPath(pathToTraversableObject)) { attributeName = traversableProperty .getName(); // Refer to section 4.2 of Bean Validation spec for more details about // Path.Node DatabaseMapping mapping = getMappingForAttributeName(attributeName); if (mapping != null) { if (mapping.isForeignReferenceMapping()) { // For lazy relationships check whether it is instantiated if (mapping.isLazy()) { Object attributeValue = mapping.getAttributeAccessor().getAttributeValueFromObject(traversableObject); reachable = ((ForeignReferenceMapping) mapping) .getIndirectionPolicy() .objectIsInstantiatedOrChanged(attributeValue); } } else { // For lazy non relationship attributes, check whether it is fetched FetchGroupManager fetchGroupManager = descriptor.getFetchGroupManager(); if (fetchGroupManager != null) { reachable = fetchGroupManager.isAttributeFetched(traversableObject, attributeName); } } } } return reachable; }
@Test public void testParseMapBasedProperty() { String property = "order[foo].deliveryAddress"; Path path = PathImpl.createPathFromString(property); Iterator<Path.Node> propIter = path.iterator(); assertTrue(propIter.hasNext()); Path.Node elem = propIter.next(); assertEquals("order", elem.getName()); assertFalse(elem.isInIterable()); assertTrue(propIter.hasNext()); elem = propIter.next(); assertEquals("deliveryAddress", elem.getName()); assertTrue(elem.isInIterable()); assertEquals("foo", elem.getKey()); assertFalse(propIter.hasNext()); }
@Test public void testParsing() { String property = "orders[3].deliveryAddress.addressline[1]"; Path path = PathImpl.createPathFromString(property); Iterator<Path.Node> propIter = path.iterator(); assertTrue(propIter.hasNext()); Path.Node elem = propIter.next(); assertEquals(elem.getName(), "orders"); assertFalse(elem.isInIterable()); assertTrue(propIter.hasNext()); elem = propIter.next(); assertEquals(elem.getName(), "deliveryAddress"); assertTrue(elem.isInIterable()); assertEquals(elem.getIndex(), new Integer(3)); assertTrue(propIter.hasNext()); elem = propIter.next(); assertEquals(elem.getName(), "addressline"); assertFalse(elem.isInIterable()); assertTrue(propIter.hasNext()); elem = propIter.next(); assertEquals(elem.getName(), null); assertTrue(elem.isInIterable()); assertEquals(elem.getIndex(), new Integer(1)); assertFalse(propIter.hasNext()); assertEquals(path.toString(), property); }