docs: final JcrPropertyDefinition propertyDefinitionFor( org.modeshape.jcr.value.Property property,
                                                         Name primaryType,
                                                         Set<Name> mixinTypes,
                                                         NodeTypes nodeTypes ) throws ConstraintViolationException {
  
          // Figure out the JCR property type ...
          boolean single = property.isSingle();
          boolean skipProtected = false;
          JcrPropertyDefinition defn = findBestPropertyDefinition(primaryType, mixinTypes, property, single, skipProtected, false,
                                                                  nodeTypes);
          if (defn != null) return defn;
  
          // See if there is a definition that has constraints that were violated ...
          defn = findBestPropertyDefinition(primaryType, mixinTypes, property, single, skipProtected, true, nodeTypes);
          String pName = readable(property.getName());
          String loc = location();
          if (defn != null) {
              I18n msg = JcrI18n.propertyNoLongerSatisfiesConstraints;
              throw new ConstraintViolationException(msg.text(pName, loc, defn.getName(), defn.getDeclaringNodeType().getName()));
          }
          CachedNode node = sessionCache().getNode(key);
          String ptype = readable(node.getPrimaryType(sessionCache()));
          String mixins = readable(node.getMixinTypes(sessionCache()));
          String pstr = property.getString(session.namespaces());
          throw new ConstraintViolationException(JcrI18n.propertyNoLongerHasValidDefinition.text(pstr, loc, ptype, mixins));
      }