private void handleMessage()

in dbus-java/src/main/java/org/freedesktop/dbus/connections/AbstractConnection.java [857:938]


    private void handleMessage(final DBusSignal _signal, boolean _useThreadPool) {
        logger.debug("Handling incoming signal: {}", _signal);

        List<DBusSigHandler<? extends DBusSignal>> handlers = new ArrayList<>();
        List<DBusSigHandler<DBusSignal>> genericHandlers = new ArrayList<>();

        Queue<DBusSigHandler<? extends DBusSignal>> t;
        t = getHandledSignals().get(new SignalTuple(_signal.getInterface(), _signal.getName(), null, null));
        if (null != t) {
            handlers.addAll(t);
        }
        t = getHandledSignals().get(new SignalTuple(_signal.getInterface(), _signal.getName(), _signal.getPath(), null));
        if (null != t) {
            handlers.addAll(t);
        }
        t = getHandledSignals().get(new SignalTuple(_signal.getInterface(), _signal.getName(), null, _signal.getSource()));
        if (null != t) {
            handlers.addAll(t);
        }
        t = getHandledSignals().get(new SignalTuple(_signal.getInterface(), _signal.getName(), _signal.getPath(), _signal.getSource()));
        if (null != t) {
            handlers.addAll(t);
            }

        Queue<DBusSigHandler<DBusSignal>> gt;
        Set<SignalTuple> allTuples = SignalTuple.getAllPossibleTuples(_signal.getInterface(), _signal.getName(), _signal.getPath(), _signal.getSource());
        for( SignalTuple tuple : allTuples ){
           gt = getGenericHandledSignals().get(tuple);
            if (null != gt) {
                genericHandlers.addAll(gt);
            }
        }

        if (handlers.isEmpty() && genericHandlers.isEmpty()) {
            return;
        }

        final AbstractConnection conn = this;
        for (final DBusSigHandler<? extends DBusSignal> h : handlers) {
            logger.trace("Adding Runnable for signal {} with handler {}",  _signal, h);
            Runnable command = new Runnable() {

                @Override
                public void run() {
                    try {
                        DBusSignal rs;
                        if (_signal instanceof InternalSignal || _signal.getClass().equals(DBusSignal.class)) {
                            rs = _signal.createReal(conn);
                        } else {
                            rs = _signal;
                        }
                        ((DBusSigHandler<DBusSignal>) h).handle(rs);
                    } catch (DBusException _ex) {
                        logger.warn("Exception while running signal handler '{}' for signal '{}':", h, _signal, _ex);
                        handleException(conn, _signal, new DBusExecutionException("Error handling signal " + _signal.getInterface()
                                + "." + _signal.getName() + ": " + _ex.getMessage()));
                    }
                }
            };
            if (_useThreadPool) {
                executeInWorkerThreadPool(command);
            } else {
                command.run();
            }
        }

        for (final DBusSigHandler<DBusSignal> h : genericHandlers) {
            logger.trace("Adding Runnable for signal {} with handler {}",  _signal, h);
            Runnable command = new Runnable() {

                @Override
                public void run() {
                    h.handle(_signal);
                }
            };
            if (_useThreadPool) {
                executeInWorkerThreadPool(command);
            } else {
                command.run();
            }
        }
    }