Search in sources :

Example 16 with Thing

use of io.openems.api.thing.Thing in project openems by OpenEMS.

the class ConfigUtils method getConfigObject.

/**
 * Receives a matching value for the ConfigChannel from a JsonElement
 *
 * @param channel
 * @param j
 * @return
 * @throws OpenemsException
 */
public static Object getConfigObject(ConfigChannel<?> channel, JsonElement j, Object... args) throws OpenemsException {
    Optional<Class<?>> typeOptional = channel.type();
    if (!typeOptional.isPresent()) {
        String clazz = channel.parent() != null ? " in implementation [" + channel.parent().getClass() + "]" : "";
        throw new ReflectionException("Type is null for channel [" + channel.address() + "]" + clazz);
    }
    Class<?> type = typeOptional.get();
    /*
		 * test for simple types
		 */
    try {
        return JsonUtils.getAsType(type, j);
    } catch (NotImplementedException e1) {
        ;
    }
    if (Thing.class.isAssignableFrom(type)) {
        /*
			 * Asking for a Thing
			 */
        @SuppressWarnings("unchecked") Class<Thing> thingType = (Class<Thing>) type;
        return getThingFromConfig(thingType, j, args);
    } else if (ThingMap.class.isAssignableFrom(type)) {
        /*
			 * Asking for a ThingMap
			 */
        return InjectionUtils.getThingMapsFromConfig(channel, j);
    } else if (Inet4Address.class.isAssignableFrom(type)) {
        /*
			 * Asking for an IPv4
			 */
        try {
            return Inet4Address.getByName(j.getAsString());
        } catch (UnknownHostException e) {
            throw new ReflectionException("Unable to convert [" + j + "] to IPv4 address");
        }
    } else if (Long[].class.isAssignableFrom(type)) {
        /*
			 * Asking for an Array of Long
			 */
        return getLongArrayFromConfig(channel, j);
    }
    throw new ReflectionException("Unable to match config [" + j + "] to class type [" + type + "]");
}
Also used : ReflectionException(io.openems.api.exception.ReflectionException) UnknownHostException(java.net.UnknownHostException) NotImplementedException(io.openems.common.exceptions.NotImplementedException) ThingMap(io.openems.api.controller.ThingMap) Thing(io.openems.api.thing.Thing)

Example 17 with Thing

use of io.openems.api.thing.Thing in project openems by OpenEMS.

the class InjectionUtils method getThingMapsFromConfig.

public static Object getThingMapsFromConfig(ConfigChannel<?> channel, JsonElement j) throws ReflectionException {
    /*
		 * Get "Field" in Channels parent class
		 */
    Field field;
    try {
        field = channel.parent().getClass().getField(channel.id());
    } catch (NoSuchFieldException | SecurityException e) {
        throw new ReflectionException("Field for ConfigChannel [" + channel.address() + "] is not named [" + channel.id() + "] in [" + channel.getClass().getSimpleName() + "]");
    }
    /*
		 * Get expected Object Type (List, Set, simple Object)
		 */
    Type expectedObjectType = ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0];
    if (expectedObjectType instanceof ParameterizedType) {
        expectedObjectType = ((ParameterizedType) expectedObjectType).getRawType();
    }
    Class<?> expectedObjectClass = (Class<?>) expectedObjectType;
    /*
		 * Get the ThingMap class
		 */
    Class<?> thingMapClass = channel.type().get();
    /*
		 * Get the referenced Thing class
		 */
    IsThingMap isThingMapAnnotation = thingMapClass.getAnnotation(IsThingMap.class);
    Class<? extends Thing> thingClass = isThingMapAnnotation.type();
    /*
		 * Prepare filter for matching Things
		 * - Empty filter: accept nothing
		 * - Asterisk: accept everything
		 * - Otherwise: accept only exact string matches on the thing id
		 */
    Set<String> filter = new HashSet<>();
    if (j.isJsonPrimitive()) {
        String id = j.getAsJsonPrimitive().getAsString();
        filter.add(id);
    } else if (j.isJsonArray()) {
        j.getAsJsonArray().forEach(id -> filter.add(id.getAsString()));
    }
    /*
		 * Create ThingMap instance(s) for each matching Thing
		 */
    ThingRepository thingRepository = ThingRepository.getInstance();
    Set<Thing> matchingThings = thingRepository.getThingsAssignableByClass(thingClass);
    Set<ThingMap> thingMaps = new HashSet<>();
    for (Thing thing : matchingThings) {
        if (filter.contains(thing.id()) || filter.contains("*")) {
            ThingMap thingMap = (ThingMap) InjectionUtils.getInstance(thingMapClass, thing);
            thingMaps.add(thingMap);
        }
    }
    /*
		 * Prepare return
		 */
    if (thingMaps.isEmpty() && !filter.isEmpty()) {
        throw new ReflectionException("No matching ThingMap found for ConfigChannel [" + channel.address() + "]");
    }
    if (Collection.class.isAssignableFrom(expectedObjectClass)) {
        if (Set.class.isAssignableFrom(expectedObjectClass)) {
            return thingMaps;
        } else if (List.class.isAssignableFrom(expectedObjectClass)) {
            return new ArrayList<>(thingMaps);
        } else {
            throw new ReflectionException("Only List and Set ConfigChannels are currently implemented, not [" + expectedObjectClass + "]. ConfigChannel [" + channel.address() + "]");
        }
    } else {
        // No collection
        if (thingMaps.size() > 1) {
            throw new ReflectionException("Field for ConfigChannel [" + channel.address() + "] is no collection, but more than one ThingMaps [" + thingMaps + "] is fitting for [" + channel.id() + "] in [" + channel.getClass().getSimpleName() + "]");
        } else {
            return thingMaps.iterator().next();
        }
    }
}
Also used : Arrays(java.util.Arrays) ReflectionException(io.openems.api.exception.ReflectionException) Collection(java.util.Collection) ConfigException(io.openems.api.exception.ConfigException) Set(java.util.Set) Thing(io.openems.api.thing.Thing) ConfigChannel(io.openems.api.channel.ConfigChannel) Field(java.lang.reflect.Field) Constructor(java.lang.reflect.Constructor) InvocationTargetException(java.lang.reflect.InvocationTargetException) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) JsonElement(com.google.gson.JsonElement) List(java.util.List) JsonArray(com.google.gson.JsonArray) ParameterizedType(java.lang.reflect.ParameterizedType) Type(java.lang.reflect.Type) IsThingMap(io.openems.api.controller.IsThingMap) ThingRepository(io.openems.core.ThingRepository) DeviceNature(io.openems.api.device.nature.DeviceNature) ThingMap(io.openems.api.controller.ThingMap) ReflectionException(io.openems.api.exception.ReflectionException) ParameterizedType(java.lang.reflect.ParameterizedType) ThingRepository(io.openems.core.ThingRepository) Field(java.lang.reflect.Field) ParameterizedType(java.lang.reflect.ParameterizedType) Type(java.lang.reflect.Type) ArrayList(java.util.ArrayList) List(java.util.List) IsThingMap(io.openems.api.controller.IsThingMap) ThingMap(io.openems.api.controller.ThingMap) IsThingMap(io.openems.api.controller.IsThingMap) Thing(io.openems.api.thing.Thing) HashSet(java.util.HashSet)

Aggregations

Thing (io.openems.api.thing.Thing)17 JsonArray (com.google.gson.JsonArray)6 JsonElement (com.google.gson.JsonElement)5 JsonObject (com.google.gson.JsonObject)5 ConfigChannel (io.openems.api.channel.ConfigChannel)4 ThingDoc (io.openems.api.doc.ThingDoc)4 ReflectionException (io.openems.api.exception.ReflectionException)4 ArrayList (java.util.ArrayList)4 HashSet (java.util.HashSet)4 Channel (io.openems.api.channel.Channel)3 ReadChannel (io.openems.api.channel.ReadChannel)3 ThingMap (io.openems.api.controller.ThingMap)3 Device (io.openems.api.device.Device)3 ChannelDoc (io.openems.api.doc.ChannelDoc)3 Field (java.lang.reflect.Field)3 Bridge (io.openems.api.bridge.Bridge)2 ThingStateChannel (io.openems.api.channel.ThingStateChannel)2 WriteChannel (io.openems.api.channel.WriteChannel)2 DeviceNature (io.openems.api.device.nature.DeviceNature)2 ChargerNature (io.openems.api.device.nature.charger.ChargerNature)2