Search in sources :

Example 1 with IsThingMap

use of io.openems.api.controller.IsThingMap in project openems by OpenEMS.

the class ChannelDoc method getAsJsonObject.

public JsonObject getAsJsonObject() {
    JsonObject j = new JsonObject();
    j.addProperty("name", this.name);
    j.addProperty("title", this.title);
    j.addProperty("description", this.description);
    if (typeOpt.isPresent()) {
        Class<?> type = this.typeOpt.get();
        if (ThingMap.class.isAssignableFrom(type)) {
            // for ThingMap type: get the types from annotation and return JsonArray
            IsThingMap isThingMapAnnotation = type.getAnnotation(IsThingMap.class);
            j.add("type", InjectionUtils.getImplementsAsJson(isThingMapAnnotation.type()));
        } else if (DeviceNature.class.isAssignableFrom(type)) {
            // for DeviceNatures add complete class name
            j.addProperty("type", type.getCanonicalName());
        } else {
            // for simple types, use only simple name (e.g. 'Long', 'Integer',...)
            j.addProperty("type", type.getSimpleName());
        }
    }
    j.addProperty("optional", this.optional);
    j.addProperty("array", this.array);
    JsonArray jReadRoles = new JsonArray();
    for (Role role : this.readRoles) {
        jReadRoles.add(role.name().toLowerCase());
    }
    j.add("readRoles", jReadRoles);
    JsonArray jWriteRoles = new JsonArray();
    for (Role role : this.writeRoles) {
        jWriteRoles.add(role.name().toLowerCase());
    }
    j.add("writeRoles", jWriteRoles);
    j.addProperty("defaultValue", this.defaultValue);
    j.addProperty("jsonSchema", this.jsonSchema);
    return j;
}
Also used : JsonArray(com.google.gson.JsonArray) Role(io.openems.common.session.Role) JsonObject(com.google.gson.JsonObject) DeviceNature(io.openems.api.device.nature.DeviceNature) IsThingMap(io.openems.api.controller.IsThingMap)

Example 2 with IsThingMap

use of io.openems.api.controller.IsThingMap 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

JsonArray (com.google.gson.JsonArray)2 IsThingMap (io.openems.api.controller.IsThingMap)2 DeviceNature (io.openems.api.device.nature.DeviceNature)2 JsonElement (com.google.gson.JsonElement)1 JsonObject (com.google.gson.JsonObject)1 ConfigChannel (io.openems.api.channel.ConfigChannel)1 ThingMap (io.openems.api.controller.ThingMap)1 ConfigException (io.openems.api.exception.ConfigException)1 ReflectionException (io.openems.api.exception.ReflectionException)1 Thing (io.openems.api.thing.Thing)1 Role (io.openems.common.session.Role)1 ThingRepository (io.openems.core.ThingRepository)1 Constructor (java.lang.reflect.Constructor)1 Field (java.lang.reflect.Field)1 InvocationTargetException (java.lang.reflect.InvocationTargetException)1 ParameterizedType (java.lang.reflect.ParameterizedType)1 Type (java.lang.reflect.Type)1 ArrayList (java.util.ArrayList)1 Arrays (java.util.Arrays)1 Collection (java.util.Collection)1