/* * Snippet to add a basic implementation of PropertyManager */ public class PartImpl implements Part { private PartType type; private class Property { public final Supplier getter; public final Consumer setter; public final Set possibleValues; Property(Supplier getter, Consumer setter, Set possibleValues) { this.getter = getter; this.setter = setter; this.possibleValues = possibleValues; } } private Map properties = new HashMap<>(); protected void addProperty(String name, Supplier getter, Consumer setter, Set possibleValues) { properties.put(name, new Property(getter, setter, possibleValues)); } @Override public Set getPropertyNames() { return Collections.unmodifiableSet(properties.keySet()); } @Override public Optional getProperty(String propertyName) { Objects.requireNonNull(propertyName); if (properties.containsKey(propertyName)) { return Optional.of(properties.get(propertyName).getter.get()); } return Optional.empty(); } @Override public void setProperty(String propertyName, String propertyValue) { Objects.requireNonNull(propertyName); Objects.requireNonNull(propertyValue); if ((properties.containsKey(propertyName)) && (properties.get(propertyName).setter != null)) { properties.get(propertyName).setter.accept(propertyValue); } else { throw new IllegalArgumentException("bad property name or value: " + propertyName); } } @Override public Set getAvailablePropertyValues(String propertyName) { if (properties.containsKey(propertyName)) { return Collections.unmodifiableSet(properties.get(propertyName).possibleValues); } return Collections.emptySet(); }