@Override
    public void validate(FacesContext context) {
        super.validate(context);
        if (isValid() && customEvents != null) {
            for (Map.Entry<String, AjaxBehaviorEvent> event : customEvents.entrySet()) {
                String eventName = event.getKey();
                AjaxBehaviorEvent behaviorEvent = event.getValue();

                Map<String, String> params = context.getExternalContext().getRequestParameterMap();
                String clientId = getClientId(context);
                DualListModel<?> list = (DualListModel<?>) getValue();
                FacesEvent wrapperEvent = null;

                if ("select".equals(eventName)) {
                    String listName = params.get(clientId + "_listName");
                    int itemIndex = Integer.parseInt(params.get(clientId + "_itemIndex"));

                    if ("target".equals(listName)) {
                        wrapperEvent = new SelectEvent<>(this, behaviorEvent.getBehavior(), list.getTarget().get(itemIndex));
                    }
                    else {
                        wrapperEvent = new SelectEvent<>(this, behaviorEvent.getBehavior(), list.getSource().get(itemIndex));
                    }
                }
                else if ("unselect".equals(eventName)) {
                    String listName = params.get(clientId + "_listName");
                    int itemIndex = Integer.parseInt(params.get(clientId + "_itemIndex"));

                    if ("target".equals(listName)) {
                        wrapperEvent = new UnselectEvent<>(this, behaviorEvent.getBehavior(), list.getTarget().get(itemIndex));
                    }
                    else {
                        wrapperEvent = new UnselectEvent<>(this, behaviorEvent.getBehavior(), list.getSource().get(itemIndex));
                    }
                }
                else if ("reorder".equals(eventName)) {
                    wrapperEvent = behaviorEvent;
                }

                if (wrapperEvent == null) {
                    throw new FacesException("Component " + this.getClass().getName() + " does not support event " + eventName + "!");
                }

                wrapperEvent.setPhaseId(behaviorEvent.getPhaseId());

                super.queueEvent(wrapperEvent);
            }
        }
    }
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