[map] Added ConfigOptionProvider to provide file names ending with '.map' in Profile configuration (#9641)

Signed-off-by: Christoph Weitkamp <github@christophweitkamp.de>
pull/9670/head
Christoph Weitkamp 2021-01-03 14:38:21 +01:00 committed by GitHub
parent 6b693ff73b
commit b7495f9699
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 41 additions and 13 deletions

View File

@ -14,8 +14,16 @@ package org.openhab.transform.map.internal;
import java.io.FileReader; import java.io.FileReader;
import java.io.IOException; import java.io.IOException;
import java.net.URI;
import java.util.Collection;
import java.util.Locale;
import java.util.Properties; 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.AbstractFileTransformationService;
import org.openhab.core.transform.TransformationException; import org.openhab.core.transform.TransformationException;
import org.openhab.core.transform.TransformationService; import org.openhab.core.transform.TransformationService;
@ -30,11 +38,18 @@ import org.slf4j.LoggerFactory;
* @author Kai Kreuzer - Initial contribution and API * @author Kai Kreuzer - Initial contribution and API
* @author Gaël L'hopital - Make it localizable * @author Gaël L'hopital - Make it localizable
*/ */
@Component(service = TransformationService.class, property = { "openhab.transform=MAP" }) @NonNullByDefault
public class MapTransformationService extends AbstractFileTransformationService<Properties> { @Component(service = { TransformationService.class, ConfigOptionProvider.class }, property = {
"openhab.transform=MAP" })
public class MapTransformationService extends AbstractFileTransformationService<Properties>
implements ConfigOptionProvider {
private final Logger logger = LoggerFactory.getLogger(MapTransformationService.class); 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" };
/** /**
* <p> * <p>
* Transforms the input <code>source</code> by mapping it to another string. It expects the mappings to be read from * Transforms the input <code>source</code> 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 properties the list of properties which contains the key value pairs for the mapping.
* @param source the input to transform * @param source the input to transform
* @return the transformed result or null if the transformation couldn't be completed for any reason.
*/ */
@Override @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); String target = properties.getProperty(source);
if (target == null) { if (target == null) {
@ -69,4 +85,17 @@ public class MapTransformationService extends AbstractFileTransformationService<
throw new TransformationException("An error occurred while opening file.", e); throw new TransformationException("An error occurred while opening file.", e);
} }
} }
@Override
public @Nullable Collection<ParameterOption> 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;
}
} }

View File

@ -30,8 +30,7 @@ import org.slf4j.LoggerFactory;
/** /**
* Profile to offer the MapTransformationservice on a ItemChannelLink * Profile to offer the MapTransformationservice on a ItemChannelLink
* *
* @author Stefan Triller - initial contribution * @author Stefan Triller - Initial contribution
*
*/ */
@NonNullByDefault @NonNullByDefault
public class MapTransformationProfile implements StateProfile { public class MapTransformationProfile implements StateProfile {

View File

@ -12,8 +12,8 @@
*/ */
package org.openhab.transform.map.internal.profiles; package org.openhab.transform.map.internal.profiles;
import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.List;
import java.util.Locale; import java.util.Locale;
import org.eclipse.jdt.annotation.NonNullByDefault; 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.ProfileTypeProvider;
import org.openhab.core.thing.profiles.ProfileTypeUID; import org.openhab.core.thing.profiles.ProfileTypeUID;
import org.openhab.core.transform.TransformationService; 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.Component;
import org.osgi.service.component.annotations.Reference; import org.osgi.service.component.annotations.Reference;
/** /**
* Profilefactory that creates the transformation profile for the map transformation service * {@link ProfileFactory} that creates the transformation profile for the {@link MapTransformationService}.
*
* @author Stefan Triller - initial contribution
* *
* @author Stefan Triller - Initial contribution
*/ */
@NonNullByDefault @NonNullByDefault
@Component(service = { ProfileFactory.class, ProfileTypeProvider.class }) @Component(service = { ProfileFactory.class, ProfileTypeProvider.class })
@ -45,7 +45,7 @@ public class MapTransformationProfileFactory implements ProfileFactory, ProfileT
@Override @Override
public Collection<ProfileType> getProfileTypes(@Nullable Locale locale) { public Collection<ProfileType> getProfileTypes(@Nullable Locale locale) {
return Arrays.asList(ProfileTypeBuilder return List.of(ProfileTypeBuilder
.newState(MapTransformationProfile.PROFILE_TYPE_UID, MapTransformationProfile.PROFILE_TYPE_UID.getId()) .newState(MapTransformationProfile.PROFILE_TYPE_UID, MapTransformationProfile.PROFILE_TYPE_UID.getId())
.build()); .build());
} }
@ -58,7 +58,7 @@ public class MapTransformationProfileFactory implements ProfileFactory, ProfileT
@Override @Override
public Collection<ProfileTypeUID> getSupportedProfileTypeUIDs() { public Collection<ProfileTypeUID> getSupportedProfileTypeUIDs() {
return Arrays.asList(MapTransformationProfile.PROFILE_TYPE_UID); return List.of(MapTransformationProfile.PROFILE_TYPE_UID);
} }
@Reference(target = "(openhab.transform=MAP)") @Reference(target = "(openhab.transform=MAP)")

View File

@ -8,8 +8,9 @@
<parameter name="function" type="text" required="true"> <parameter name="function" type="text" required="true">
<label>Filename</label> <label>Filename</label>
<description>Filename containing the mapping information.</description> <description>Filename containing the mapping information.</description>
<limitToOptions>false</limitToOptions>
</parameter> </parameter>
<parameter name="sourceFormat" type="text" required="false"> <parameter name="sourceFormat" type="text">
<label>State Formatter</label> <label>State Formatter</label>
<description>How to format the state on the channel before transforming it, i.e. %s or %.1f °C (default is %s)</description> <description>How to format the state on the channel before transforming it, i.e. %s or %.1f °C (default is %s)</description>
<advanced>true</advanced> <advanced>true</advanced>

View File

@ -1 +0,0 @@
Bundle resources go in here!