protected void validateDisabled(FacesContext facesContext, String label, List<?> newEntries, List<?> oldEntries) {
        if (!isValid()) {
            return;
        }

        Map<String, Object> requestMap = facesContext.getExternalContext().getRequestMap();
        String varName = getVar();
        String clientId = getClientId(facesContext);
        Object originalItem = requestMap.get(varName);

        for (int i = 0; i < newEntries.size(); i++) {
            Object item = newEntries.get(i);
            // Set the current item in request map to get its properties via stateHelper().eval() call
            requestMap.put(varName, item);
            boolean itemDisabled = isItemDisabled();
            // Check if disabled item has been moved from its former/original list
            if (itemDisabled && !oldEntries.contains(item)) {
                FacesMessage message = MessageFactory.getFacesMessage(facesContext, UPDATE_MESSAGE_ID, FacesMessage.SEVERITY_ERROR, label);
                facesContext.addMessage(clientId, message);
                setValid(false);
                break;
            }
        }

        // put the original value back
        requestMap.put(varName, originalItem);
    }
Prohibits client-side manipulation of disabled entries, when CSS style-class ui-state-disabled is removed.

@param facesContext The current FacesContext.
@param label The label to be used in the error message.
@param newEntries new/set entries of model source/target list
@param oldEntries old/former entries of model source/target list
@see <a href="https://github.com/primefaces/primefaces/issues/2127">GitHub #2127</a>
primefaces/src/main/java/org/primefaces/component/picklist/PickList.java