From: AsamK Date: Sat, 2 Oct 2021 15:16:08 +0000 (+0200) Subject: Add helper classes for exporting dbus properties X-Git-Tag: v0.9.1~33 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/1548ce9c795662a0dcd6666415c2ecc0a5a88852 Add helper classes for exporting dbus properties --- diff --git a/src/main/java/org/asamk/signal/dbus/DbusInterfacePropertiesHandler.java b/src/main/java/org/asamk/signal/dbus/DbusInterfacePropertiesHandler.java new file mode 100644 index 00000000..d3c2ca83 --- /dev/null +++ b/src/main/java/org/asamk/signal/dbus/DbusInterfacePropertiesHandler.java @@ -0,0 +1,46 @@ +package org.asamk.signal.dbus; + +import org.asamk.Signal; + +import java.util.Collection; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Supplier; + +public class DbusInterfacePropertiesHandler { + + private final String interfaceName; + private final List> properties; + + public DbusInterfacePropertiesHandler( + final String interfaceName, final List> properties + ) { + this.interfaceName = interfaceName; + this.properties = properties; + } + + public String getInterfaceName() { + return interfaceName; + } + + @SuppressWarnings("unchecked") + private DbusProperty findProperty(String propertyName) { + final var property = properties.stream().filter(p -> p.getName().equals(propertyName)).findFirst(); + if (property.isEmpty()) { + throw new Signal.Error.Failure("Property not found"); + } + return (DbusProperty) property.get(); + } + + Consumer getSetter(String propertyName) { + return this.findProperty(propertyName).getSetter(); + } + + Supplier getGetter(String propertyName) { + return this.findProperty(propertyName).getGetter(); + } + + Collection> getProperties() { + return properties; + } +} diff --git a/src/main/java/org/asamk/signal/dbus/DbusProperties.java b/src/main/java/org/asamk/signal/dbus/DbusProperties.java new file mode 100644 index 00000000..37cc35e3 --- /dev/null +++ b/src/main/java/org/asamk/signal/dbus/DbusProperties.java @@ -0,0 +1,66 @@ +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.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 java.util.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 -> new Variant<>(p.getGetter().get()))); + } +} diff --git a/src/main/java/org/asamk/signal/dbus/DbusProperty.java b/src/main/java/org/asamk/signal/dbus/DbusProperty.java new file mode 100644 index 00000000..e0557786 --- /dev/null +++ b/src/main/java/org/asamk/signal/dbus/DbusProperty.java @@ -0,0 +1,35 @@ +package org.asamk.signal.dbus; + +import java.util.function.Consumer; +import java.util.function.Supplier; + +public class DbusProperty { + + private final String name; + private final Supplier getter; + private final Consumer setter; + + public DbusProperty(final String name, final Supplier getter, final Consumer setter) { + this.name = name; + this.getter = getter; + this.setter = setter; + } + + public DbusProperty(final String name, final Supplier getter) { + this.name = name; + this.getter = getter; + this.setter = null; + } + + public String getName() { + return name; + } + + public Consumer getSetter() { + return setter; + } + + public Supplier getGetter() { + return getter; + } +}