private boolean applyHolderChange(JsonObject changeInfo) {
            String type = changeInfo.get("type").getAsString();
            String id = changeInfo.get("id").getAsString();

            PermissionHolder holder;
            if (type.equals("user")) {
                // user
                UUID uuid = Uuids.parse(id);
                if (uuid == null) {
                    Message.APPLY_EDITS_TARGET_USER_NOT_UUID.send(this.sender, id);
                    return false;
                }
                holder = this.plugin.getStorage().loadUser(uuid, null).join();
                if (holder == null) {
                    Message.APPLY_EDITS_TARGET_USER_UNABLE_TO_LOAD.send(this.sender, uuid.toString());
                    return false;
                }
            } else {
                // group
                holder = this.plugin.getStorage().loadGroup(id).join().orElse(null);
                if (holder == null) {
                    holder = this.plugin.getStorage().createAndLoadGroup(id, CreationCause.WEB_EDITOR).join();
                    if (this.session != null) {
                        this.session.includeCreatedGroup((Group) holder);
                    }
                }
            }

            if (ArgumentPermissions.checkModifyPerms(this.plugin, this.sender, CommandPermission.APPLY_EDITS, holder) || ArgumentPermissions.checkGroup(this.plugin, this.sender, holder, ImmutableContextSetImpl.EMPTY)) {
                Message.COMMAND_NO_PERMISSION.send(this.sender);
                return false;
            }

            Set<Node> nodes = NodeJsonSerializer.deserializeNodes(changeInfo.getAsJsonArray("nodes"));
            Difference<Node> res = applyNodeChanges(holder, nodes);

            if (res.isEmpty()) {
                return false;
            }

            Set<Node> added = res.getAdded();
            Set<Node> removed = res.getRemoved();

            for (Node n : added) {
                LoggedAction.build().source(this.sender).target(holder)
                        .description("webeditor", "add", n.getKey(), n.getValue(), n.getContexts())
                        .build().submit(this.plugin, this.sender);
            }
            for (Node n : removed) {
                LoggedAction.build().source(this.sender).target(holder)
                        .description("webeditor", "remove", n.getKey(), n.getValue(), n.getContexts())
                        .build().submit(this.plugin, this.sender);
            }

            Message.APPLY_EDITS_SUCCESS.send(this.sender, type, holder.getFormattedDisplayName());
            Message.APPLY_EDITS_SUCCESS_SUMMARY.send(this.sender, added.size(), removed.size());

            for (Node n : added) {
                Message.APPLY_EDITS_DIFF_ADDED.send(this.sender, n);
            }
            for (Node n : removed) {
                Message.APPLY_EDITS_DIFF_REMOVED.send(this.sender, n);
            }

            StorageAssistant.save(holder, this.sender, this.plugin);
            return true;
        }
Represents the application of a given editor session on this platform.
common/src/main/java/me/lucko/luckperms/common/webeditor/WebEditorResponse.java