package com.intrbiz.bergamot.model.message; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import java.util.UUID; import java.util.stream.Collectors; import com.intrbiz.Util; public interface ParameterisedMO { List<ParameterMO> getParameters(); void setParameters(List<ParameterMO> parameters); default void addParameter(String name, String value) { this.getParameters().add(new ParameterMO(name, value)); } default void setParameter(String name, String value) { this.removeParameter(name); this.addParameter(name, value); } default void removeParameter(String name) { this.getParameters().removeIf((p) -> {return name.equals(p.getName());}); } default void clearParameters() { this.getParameters().clear(); } default String getParameter(String name) { return this.getParameter(name, null); } default String getParameter(String name, String defaultValue) { return this.getParameters().stream() .filter((p) -> {return name.equals(p.getName());}) .findFirst() .map(ParameterMO::getValue) .orElse(defaultValue); } default boolean containsParameter(String name) { return this.getParameter(name) != null; } default List<ParameterMO> getParameters(String name) { return this.getParameters().stream() .filter((p) -> {return name.equals(p.getName());}) .collect(Collectors.toList()); } default List<ParameterMO> getParametersStartingWith(final String prefix) { return this.getParameters().stream() .filter((p) -> {return p.getName().startsWith(prefix);}) .collect(Collectors.toList()); } default List<String> getParametersStartingWithValues(final String prefix) { return this.getParameters().stream() .filter((p) -> {return p.getName().startsWith(prefix);}) .map(ParameterMO::getValue) .collect(Collectors.toList()); } default int getIntParameter(String name) { return this.getIntParameter(name, -1); } default int getIntParameter(String name, int defaultValue) { return this.getParameters().stream() .filter((p) -> {return name.equals(p.getName());}) .findFirst() .map(ParameterMO::getValue) .map(Integer::parseInt) .orElse(defaultValue); } default long getLongParameter(String name) { return this.getLongParameter(name, -1); } default long getLongParameter(String name, long defaultValue) { return this.getParameters().stream() .filter((p) -> {return name.equals(p.getName());}) .findFirst() .map(ParameterMO::getValue) .map(Long::parseLong) .orElse(defaultValue); } default double getDoubleParameter(String name) { return this.getDoubleParameter(name, -1); } default double getDoubleParameter(String name, double defaultValue) { return this.getParameters().stream() .filter((p) -> {return name.equals(p.getName());}) .findFirst() .map(ParameterMO::getValue) .map(Double::parseDouble) .orElse(defaultValue); } default float getFloatParameter(String name) { return this.getFloatParameter(name, -1); } default float getFloatParameter(String name, float defaultValue) { return this.getParameters().stream() .filter((p) -> {return name.equals(p.getName());}) .findFirst() .map(ParameterMO::getValue) .map(Float::parseFloat) .orElse(defaultValue); } default double getPercentParameter(String name) { return this.getFloatParameter(name, -1); } /** * Get a normalised percentage, in the range of 0 to 1 by dividing the parameter by 100 * @param name the parameter name * @param defaultValue (in the range 0 to 1) * @return the normalised percentage value of the parameter */ default double getPercentParameter(String name, double defaultValue) { return this.getParameters().stream() .filter((p) -> {return name.equals(p.getName());}) .findFirst() .map(ParameterMO::getValue) .map(Double::parseDouble) .map((v) -> { return v / 100F; }) .orElse(defaultValue); } default boolean getBooleanParameter(String name) { return this.getBooleanParameter(name, false); } default boolean getBooleanParameter(String name, boolean defaultValue) { return this.getParameters().stream() .filter((p) -> {return name.equals(p.getName());}) .findFirst() .map(ParameterMO::getValue) .map((v) -> { return "yes".equalsIgnoreCase(v) || "true".equalsIgnoreCase(v) || "on".equalsIgnoreCase(v); }) .orElse(defaultValue); } default UUID getUUIDParameter(String name) { return this.getUUIDParameter(name, null); } default UUID getUUIDParameter(String name, UUID defaultValue) { return this.getParameters().stream() .filter((p) -> {return name.equals(p.getName());}) .findFirst() .map(ParameterMO::getValue) .map(UUID::fromString) .orElse(defaultValue); } default Set<String> getParameterCSV(String name) { return this.getParameterCSV(name, null); } default Set<String> getParameterCSV(String name, String defaultValue) { String value = this.getParameter(name, defaultValue); if (value == null) return new LinkedHashSet<String>(); Set<String> r = new LinkedHashSet<String>(); for (String s : value.split(", ?")) { s = s.trim(); if (! Util.isEmpty(s)) { r.add(s); } } return r; } default Set<Integer> getIntParameterCSV(String name) { return this.getIntParameterCSV(name, null); } default Set<Integer> getIntParameterCSV(String name, String defaultValue) { return this.getParameterCSV(name, defaultValue) .stream() .map(Integer::parseInt) .collect(LinkedHashSet::new, Set::add, Set::addAll); } default Set<Long> getLongParameterCSV(String name) { return this.getLongParameterCSV(name, null); } default Set<Long> getLongParameterCSV(String name, String defaultValue) { return this.getParameterCSV(name, defaultValue) .stream() .map(Long::parseLong) .collect(LinkedHashSet::new, Set::add, Set::addAll); } default Set<Double> getDoubleParameterCSV(String name) { return this.getDoubleParameterCSV(name, null); } default Set<Double> getDoubleParameterCSV(String name, String defaultValue) { return this.getParameterCSV(name, defaultValue) .stream() .map(Double::parseDouble) .collect(LinkedHashSet::new, Set::add, Set::addAll); } default Set<Float> getFloatParameterCSV(String name) { return this.getFloatParameterCSV(name, null); } default Set<Float> getFloatParameterCSV(String name, String defaultValue) { return this.getParameterCSV(name, defaultValue) .stream() .map(Float::parseFloat) .collect(LinkedHashSet::new, Set::add, Set::addAll); } /** * Get a range parameter, eg: '0:10' for 0 to 10 */ default Integer[] getIntRangeParameter(String name, Integer[] defaultValue) { String value = this.getParameter(name); if (value == null || value.length() == 0 || ! value.contains(":")) return defaultValue; String[] values = value.split(":"); if (values.length != 2) return defaultValue; return new Integer[] { Integer.parseInt(values[0]), Integer.parseInt(values[1]), }; } /** * Get a range parameter, eg: '0:10' for 0 to 10 */ default Long[] getLongRangeParameter(String name, Long[] defaultValue) { String value = this.getParameter(name); if (value == null || value.length() == 0 || ! value.contains(":")) return defaultValue; String[] values = value.split(":"); if (values.length != 2) return defaultValue; return new Long[] { Long.parseLong(values[0]), Long.parseLong(values[1]), }; } /** * Get a range parameter, eg: '0:10' for 0 to 10 */ default Float[] getFloatRangeParameter(String name, Float[] defaultValue) { String value = this.getParameter(name); if (value == null || value.length() == 0 || ! value.contains(":")) return defaultValue; String[] values = value.split(":"); if (values.length != 2) return defaultValue; return new Float[] { Float.parseFloat(values[0]), Float.parseFloat(values[1]), }; } /** * Get a range parameter, eg: '0:10' for 0 to 10 */ default Double[] getDoubleRangeParameter(String name, Double[] defaultValue) { String value = this.getParameter(name); if (value == null || value.length() == 0 || ! value.contains(":")) return defaultValue; String[] values = value.split(":"); if (values.length != 2) return defaultValue; return new Double[] { Double.parseDouble(values[0]), Double.parseDouble(values[1]), }; } }