docs: @Override
      public synchronized boolean updateNode(IUserLayoutNodeDescription node) throws PortalException {
          if (canUpdateNode(node)) {
              String nodeId = node.getId();
              IUserLayoutNodeDescription oldNode = getNode(nodeId);
  
              if (oldNode instanceof IUserLayoutChannelDescription) {
                  IUserLayoutChannelDescription oldChanDesc = (IUserLayoutChannelDescription) oldNode;
                  if (!(node instanceof IUserLayoutChannelDescription)) {
                      throw new PortalException(
                              "Change channel to folder is "
                                      + "not allowed by updateNode() method! Occurred "
                                      + "in layout for "
                                      + owner.getUserName()
                                      + ".");
                  }
                  IUserLayoutChannelDescription newChanDesc = (IUserLayoutChannelDescription) node;
                  updateChannelNode(nodeId, newChanDesc, oldChanDesc);
              } else {
                  // must be a folder
                  IUserLayoutFolderDescription oldFolderDesc = (IUserLayoutFolderDescription) oldNode;
                  if (oldFolderDesc.getId().equals(getRootFolderId()))
                      throw new PortalException("Update of root node is not currently allowed!");
  
                  if (node instanceof IUserLayoutFolderDescription) {
                      IUserLayoutFolderDescription newFolderDesc =
                              (IUserLayoutFolderDescription) node;
                      updateFolderNode(nodeId, newFolderDesc, oldFolderDesc);
                  }
              }
              this.updateCacheKey();
              return true;
          }
          return false;
      }