package org.asamk.signal.dbus; import org.asamk.Signal; import org.freedesktop.dbus.interfaces.Properties; import org.freedesktop.dbus.types.Variant; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; public abstract class DbusProperties implements Properties { private final List handlers = new ArrayList<>(); protected void addPropertiesHandler(DbusInterfacePropertiesHandler handler) { this.handlers.add(handler); } DbusInterfacePropertiesHandler getHandler(String interfaceName) { final var handler = getHandlerOptional(interfaceName); if (handler.isEmpty()) { throw new Signal.Error.Failure("Property not found"); } return handler.get(); } private Optional getHandlerOptional(final String interfaceName) { return handlers.stream().filter(h -> h.getInterfaceName().equals(interfaceName)).findFirst(); } @Override @SuppressWarnings("unchecked") public A Get(final String interface_name, final String property_name) { final var handler = getHandler(interface_name); final var getter = handler.getGetter(property_name); if (getter == null) { throw new Signal.Error.Failure("Property not found"); } return (A) getter.get(); } @Override public void Set(final String interface_name, final String property_name, final A value) { final var handler = getHandler(interface_name); final var setter = handler.getSetter(property_name); if (setter == null) { throw new Signal.Error.Failure("Property not found"); } setter.accept(value); } @Override public Map> GetAll(final String interface_name) { final var handler = getHandlerOptional(interface_name); if (handler.isEmpty()) { return Map.of(); } return handler.get() .getProperties() .stream() .filter(p -> p.getGetter() != null) .collect(Collectors.toMap(DbusProperty::getName, p -> { final Object o = p.getGetter().get(); return o instanceof Variant variant ? variant : new Variant<>(o); })); } }