Index: C:/Dokumente und Einstellungen/kiehl/Eigene Dateien/Entwicklung/java/jackrabbit-original/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java =================================================================== --- C:/Dokumente und Einstellungen/kiehl/Eigene Dateien/Entwicklung/java/jackrabbit-original/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java (revision 514641) +++ C:/Dokumente und Einstellungen/kiehl/Eigene Dateien/Entwicklung/java/jackrabbit-original/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java (working copy) @@ -585,6 +585,7 @@ && def.getRequiredType() == PropertyType.REFERENCE) { for (int i = 0; i < values.length; i++) { boolean satisfied = false; + String constraintViolationMsg = null; try { UUID targetUUID = (UUID) values[i].internalValue(); Node targetNode = session.getNodeByUUID(targetUUID); @@ -604,6 +605,22 @@ break; } } + if (!satisfied) { + NodeType[] mixinNodeTypes = targetNode.getMixinNodeTypes(); + String[] targetMixins = new String[mixinNodeTypes.length]; + for (int j = 0; j < mixinNodeTypes.length; j++) { + targetMixins[j] = mixinNodeTypes[j].getName(); + } + String targetMixinsString = join(targetMixins); + String constraintsString = join(constraints); + constraintViolationMsg = prop.safeGetJCRPath() + + ": is constraint to [" + + constraintsString + + "] but references [primaryType='" + + targetNode.getPrimaryNodeType().getName() + + "', mixins=" + + targetMixinsString + "]"; + } } catch (RepositoryException re) { String msg = prop.safeGetJCRPath() + ": failed to check REFERENCE value constraint"; @@ -611,11 +628,8 @@ throw new ConstraintViolationException(msg, re); } if (!satisfied) { - String msg = prop.safeGetJCRPath() - + ": does not satisfy the value constraint " - + constraints[0]; // just report the 1st - log.debug(msg); - throw new ConstraintViolationException(msg); + log.debug(constraintViolationMsg); + throw new ConstraintViolationException(constraintViolationMsg); } } } @@ -643,6 +657,17 @@ } } + private String join(String[] array) { + String constraintsString = ""; + for (int j = 0; j < array.length; j++) { + if (j > 0) { + constraintsString += ", "; + } + constraintsString += "'" + array[j] + "'"; + } + return constraintsString; + } + private void removeTransientItems(Iterator iter) { /**