private void validateTypes(List<JcrNodeType> typesPendingRegistration)
      throws RepositoryException {
    NodeTypes nodeTypes = this.nodeTypesCache;

    for (JcrNodeType nodeType : typesPendingRegistration) {
      for (JcrNodeDefinition nodeDef : nodeType.getDeclaredChildNodeDefinitions()) {
        Name[] requiredPrimaryTypeNames = nodeDef.requiredPrimaryTypeNames();
        for (Name primaryTypeName : requiredPrimaryTypeNames) {
          JcrNodeType requiredPrimaryType =
              nodeTypes.findTypeInMapOrList(primaryTypeName, typesPendingRegistration);
          if (requiredPrimaryType == null) {
            String msg = JcrI18n.invalidPrimaryTypeName.text(primaryTypeName, nodeType.getName());
            throw new RepositoryException(msg);
          }
        }
      }

      if (nodeType.isMixin()) {
        for (NodeType superType : nodeType.getSupertypes()) {
          if (!superType.isMixin()) {
            String msg =
                JcrI18n.invalidMixinSupertype.text(nodeType.getName(), superType.getName());
            throw new RepositoryException(msg);
          }
        }
      }
    }
  }