diff --git a/bundles/org.openhab.transform.map/src/main/java/org/openhab/transform/map/internal/MapTransformationService.java b/bundles/org.openhab.transform.map/src/main/java/org/openhab/transform/map/internal/MapTransformationService.java index 95e101a417d..6e6c466e1ec 100644 --- a/bundles/org.openhab.transform.map/src/main/java/org/openhab/transform/map/internal/MapTransformationService.java +++ b/bundles/org.openhab.transform.map/src/main/java/org/openhab/transform/map/internal/MapTransformationService.java @@ -14,8 +14,16 @@ package org.openhab.transform.map.internal; import java.io.FileReader; import java.io.IOException; +import java.net.URI; +import java.util.Collection; +import java.util.Locale; import java.util.Properties; +import java.util.stream.Collectors; +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.openhab.core.config.core.ConfigOptionProvider; +import org.openhab.core.config.core.ParameterOption; import org.openhab.core.transform.AbstractFileTransformationService; import org.openhab.core.transform.TransformationException; import org.openhab.core.transform.TransformationService; @@ -30,11 +38,18 @@ import org.slf4j.LoggerFactory; * @author Kai Kreuzer - Initial contribution and API * @author Gaël L'hopital - Make it localizable */ -@Component(service = TransformationService.class, property = { "openhab.transform=MAP" }) -public class MapTransformationService extends AbstractFileTransformationService { +@NonNullByDefault +@Component(service = { TransformationService.class, ConfigOptionProvider.class }, property = { + "openhab.transform=MAP" }) +public class MapTransformationService extends AbstractFileTransformationService + implements ConfigOptionProvider { private final Logger logger = LoggerFactory.getLogger(MapTransformationService.class); + private static final String PROFILE_CONFIG_URI = "profile:transform:MAP"; + private static final String CONFIG_PARAM_FUNCTION = "function"; + private static final String[] FILE_NAME_EXTENSIONS = { "map" }; + /** *

* Transforms the input source by mapping it to another string. It expects the mappings to be read from @@ -43,9 +58,10 @@ public class MapTransformationService extends AbstractFileTransformationService< * * @param properties the list of properties which contains the key value pairs for the mapping. * @param source the input to transform + * @return the transformed result or null if the transformation couldn't be completed for any reason. */ @Override - protected String internalTransform(Properties properties, String source) throws TransformationException { + protected @Nullable String internalTransform(Properties properties, String source) throws TransformationException { String target = properties.getProperty(source); if (target == null) { @@ -69,4 +85,17 @@ public class MapTransformationService extends AbstractFileTransformationService< throw new TransformationException("An error occurred while opening file.", e); } } + + @Override + public @Nullable Collection getParameterOptions(URI uri, String param, @Nullable String context, + @Nullable Locale locale) { + if (PROFILE_CONFIG_URI.equals(uri.toString())) { + switch (param) { + case CONFIG_PARAM_FUNCTION: + return getFilenames(FILE_NAME_EXTENSIONS).stream().map(f -> new ParameterOption(f, f)) + .collect(Collectors.toList()); + } + } + return null; + } } diff --git a/bundles/org.openhab.transform.map/src/main/java/org/openhab/transform/map/internal/profiles/MapTransformationProfile.java b/bundles/org.openhab.transform.map/src/main/java/org/openhab/transform/map/internal/profiles/MapTransformationProfile.java index 0792737c696..0ab69b4bccc 100644 --- a/bundles/org.openhab.transform.map/src/main/java/org/openhab/transform/map/internal/profiles/MapTransformationProfile.java +++ b/bundles/org.openhab.transform.map/src/main/java/org/openhab/transform/map/internal/profiles/MapTransformationProfile.java @@ -30,8 +30,7 @@ import org.slf4j.LoggerFactory; /** * Profile to offer the MapTransformationservice on a ItemChannelLink * - * @author Stefan Triller - initial contribution - * + * @author Stefan Triller - Initial contribution */ @NonNullByDefault public class MapTransformationProfile implements StateProfile { diff --git a/bundles/org.openhab.transform.map/src/main/java/org/openhab/transform/map/internal/profiles/MapTransformationProfileFactory.java b/bundles/org.openhab.transform.map/src/main/java/org/openhab/transform/map/internal/profiles/MapTransformationProfileFactory.java index 2a31e3d7047..6ee4394e38f 100644 --- a/bundles/org.openhab.transform.map/src/main/java/org/openhab/transform/map/internal/profiles/MapTransformationProfileFactory.java +++ b/bundles/org.openhab.transform.map/src/main/java/org/openhab/transform/map/internal/profiles/MapTransformationProfileFactory.java @@ -12,8 +12,8 @@ */ package org.openhab.transform.map.internal.profiles; -import java.util.Arrays; import java.util.Collection; +import java.util.List; import java.util.Locale; import org.eclipse.jdt.annotation.NonNullByDefault; @@ -27,14 +27,14 @@ import org.openhab.core.thing.profiles.ProfileTypeBuilder; import org.openhab.core.thing.profiles.ProfileTypeProvider; import org.openhab.core.thing.profiles.ProfileTypeUID; import org.openhab.core.transform.TransformationService; +import org.openhab.transform.map.internal.MapTransformationService; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; /** - * Profilefactory that creates the transformation profile for the map transformation service - * - * @author Stefan Triller - initial contribution + * {@link ProfileFactory} that creates the transformation profile for the {@link MapTransformationService}. * + * @author Stefan Triller - Initial contribution */ @NonNullByDefault @Component(service = { ProfileFactory.class, ProfileTypeProvider.class }) @@ -45,7 +45,7 @@ public class MapTransformationProfileFactory implements ProfileFactory, ProfileT @Override public Collection getProfileTypes(@Nullable Locale locale) { - return Arrays.asList(ProfileTypeBuilder + return List.of(ProfileTypeBuilder .newState(MapTransformationProfile.PROFILE_TYPE_UID, MapTransformationProfile.PROFILE_TYPE_UID.getId()) .build()); } @@ -58,7 +58,7 @@ public class MapTransformationProfileFactory implements ProfileFactory, ProfileT @Override public Collection getSupportedProfileTypeUIDs() { - return Arrays.asList(MapTransformationProfile.PROFILE_TYPE_UID); + return List.of(MapTransformationProfile.PROFILE_TYPE_UID); } @Reference(target = "(openhab.transform=MAP)") diff --git a/bundles/org.openhab.transform.map/src/main/resources/OH-INF/config/mapProfile.xml b/bundles/org.openhab.transform.map/src/main/resources/OH-INF/config/mapProfile.xml index 577ecdc053b..b07c41a586b 100644 --- a/bundles/org.openhab.transform.map/src/main/resources/OH-INF/config/mapProfile.xml +++ b/bundles/org.openhab.transform.map/src/main/resources/OH-INF/config/mapProfile.xml @@ -8,8 +8,9 @@ Filename containing the mapping information. + false - + How to format the state on the channel before transforming it, i.e. %s or %.1f °C (default is %s) true diff --git a/bundles/org.openhab.transform.map/src/main/resources/readme.txt b/bundles/org.openhab.transform.map/src/main/resources/readme.txt deleted file mode 100644 index a2ee892dc45..00000000000 --- a/bundles/org.openhab.transform.map/src/main/resources/readme.txt +++ /dev/null @@ -1 +0,0 @@ -Bundle resources go in here!