Search in sources :

Example 1 with ReflectionException

use of io.openems.api.exception.ReflectionException in project openems by OpenEMS.

the class SupplyBusSwitchController method generateSupplybuses.

private List<Supplybus> generateSupplybuses() {
    if (esss.valueOptional().isPresent() && supplyBusConfig.valueOptional().isPresent() && switchDelay.valueOptional().isPresent()) {
        List<Supplybus> buses = new ArrayList<>();
        for (JsonElement bus : supplyBusConfig.valueOptional().get()) {
            try {
                String name = JsonUtils.getAsString(bus, "bus");
                String primaryEssName = JsonUtils.getAsString(bus, "primaryEss");
                JsonElement supplybusOnIndicationElement = bus.getAsJsonObject().get("supplybusOnIndication");
                JsonElement loads = bus.getAsJsonObject().get("loads");
                Optional<Channel> supplybusOnIndication = Optional.empty();
                if (supplybusOnIndicationElement != null) {
                    supplybusOnIndication = repo.getChannelByAddress(supplybusOnIndicationElement.getAsString());
                }
                List<WriteChannel<Long>> loadChannels = new ArrayList<>();
                if (loads != null) {
                    for (JsonElement load : loads.getAsJsonArray()) {
                        Optional<Channel> loadChannel = repo.getChannelByAddress(load.getAsString());
                        if (loadChannel.isPresent() && loadChannel.get() instanceof WriteChannel<?>) {
                            @SuppressWarnings("unchecked") WriteChannel<Long> writeChannel = (WriteChannel<Long>) loadChannel.get();
                            loadChannels.add(writeChannel);
                        }
                    }
                }
                Ess primaryEss = getEss(primaryEssName);
                HashMap<Ess, WriteChannel<Boolean>> switchEssMapping = new HashMap<>();
                JsonArray switches = JsonUtils.getAsJsonArray(bus, "switches");
                for (JsonElement e : switches) {
                    try {
                        String essName = JsonUtils.getAsString(e, "ess");
                        try {
                            Ess ess = getEss(essName);
                            String channelAddress = JsonUtils.getAsString(e, "switchAddress");
                            Optional<Channel> outputChannel = repo.getChannelByAddress(channelAddress);
                            if (ess != null) {
                                if (outputChannel.isPresent() && outputChannel.get() instanceof WriteChannel<?>) {
                                    @SuppressWarnings("unchecked") WriteChannel<Boolean> channel = (WriteChannel<Boolean>) outputChannel.get();
                                    channel.required();
                                    switchEssMapping.put(ess, channel);
                                } else {
                                    log.error(channelAddress + " not found!");
                                }
                            } else {
                                log.error(essName + "not found!");
                            }
                        } catch (InvalidValueException e1) {
                            log.error(essName + " is missing in the 'esss' config parameter", e1);
                        }
                    } catch (ReflectionException e2) {
                        log.error("can't find JsonElement 'ess' or 'switchAddress'!", e2);
                    }
                }
                WriteChannel<Long> supplybusOnIndicationChannel = null;
                if (supplybusOnIndication.isPresent()) {
                    if (supplybusOnIndication.get() instanceof WriteChannel<?>) {
                        @SuppressWarnings("unchecked") WriteChannel<Long> writeChannel = (WriteChannel<Long>) supplybusOnIndication.get();
                        supplybusOnIndicationChannel = writeChannel;
                    }
                }
                Supplybus sb = new Supplybus(switchEssMapping, name, primaryEss, switchDelay.value(), supplybusOnIndicationChannel, loadChannels);
                buses.add(sb);
            } catch (ReflectionException e) {
                log.error("can't find JsonElement 'bus' or 'switches' in config parameter 'supplyBuses'!", e);
            } catch (InvalidValueException e3) {
                log.error("primaryEss not found", e3);
            } catch (OpenemsException e4) {
                log.error(e4.getMessage());
            }
        }
        return buses;
    } else {
        return null;
    }
}
Also used : ReflectionException(io.openems.api.exception.ReflectionException) HashMap(java.util.HashMap) WriteChannel(io.openems.api.channel.WriteChannel) ConfigChannel(io.openems.api.channel.ConfigChannel) Channel(io.openems.api.channel.Channel) ArrayList(java.util.ArrayList) OpenemsException(io.openems.common.exceptions.OpenemsException) JsonArray(com.google.gson.JsonArray) InvalidValueException(io.openems.api.exception.InvalidValueException) JsonElement(com.google.gson.JsonElement) WriteChannel(io.openems.api.channel.WriteChannel)

Example 2 with ReflectionException

use of io.openems.api.exception.ReflectionException in project openems by OpenEMS.

the class Config method getJson.

/**
 * Gets the Config as Json in the given format
 *
 * @param format
 * @return
 * @throws NotImplementedException
 */
public synchronized JsonObject getJson(ConfigFormat format, Role role, String language) throws NotImplementedException {
    JsonObject jConfig = new JsonObject();
    if (format == ConfigFormat.FILE) {
        /*
			 * Prepare Json in format for config.json file
			 */
        // Bridge
        jConfig.add("things", getBridgesJson(format, role));
        // Scheduler
        jConfig.add("scheduler", getSchedulerJson(format, role));
        // Persistence
        jConfig.add("persistence", getPersistenceJson(format, role));
        // Users
        jConfig.add("users", getUsersJson());
    } else {
        /*
			 * Prepare Json in format for OpenEMS UI
			 */
        // things...
        JsonObject jThings = new JsonObject();
        Set<Thing> things = ThingRepository.getInstance().getThings();
        for (Thing thing : things) {
            JsonObject jThing = (JsonObject) ConfigUtils.getAsJsonElement(thing, format, role);
            jThings.add(thing.id(), jThing);
        }
        jConfig.add("things", jThings);
        // meta...
        JsonObject jMeta = new JsonObject();
        try {
            Iterable<ThingDoc> availableThings = ClassRepository.getInstance().getAvailableThings();
            for (ThingDoc availableThing : availableThings) {
                jMeta.add(availableThing.getClazz().getName(), availableThing.getAsJsonObject());
            }
        } catch (ReflectionException e) {
            log.error(e.getMessage());
            e.printStackTrace();
        }
        jConfig.add("meta", jMeta);
    }
    return jConfig;
}
Also used : ReflectionException(io.openems.api.exception.ReflectionException) JsonObject(com.google.gson.JsonObject) Thing(io.openems.api.thing.Thing) ThingDoc(io.openems.api.doc.ThingDoc)

Example 3 with ReflectionException

use of io.openems.api.exception.ReflectionException in project openems by OpenEMS.

the class ConfigUtils method getLongArrayFromConfig.

private static Object getLongArrayFromConfig(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;
    if (Collection.class.isAssignableFrom(expectedObjectClass)) {
        if (j.isJsonArray()) {
            Set<Long[]> erg = new HashSet<>();
            for (JsonElement e : j.getAsJsonArray()) {
                if (e.isJsonArray()) {
                    JsonArray arr = e.getAsJsonArray();
                    Long[] larr = new Long[arr.size()];
                    for (int i = 0; i < arr.size(); i++) {
                        larr[i] = arr.get(i).getAsLong();
                    }
                    erg.add(larr);
                } else {
                    throw new ReflectionException("The Json object for ConfigChannel [" + channel.address() + "] is no twodimensional array!");
                }
            }
            if (Set.class.isAssignableFrom(expectedObjectClass)) {
                return erg;
            } else if (List.class.isAssignableFrom(expectedObjectClass)) {
                return new ArrayList<>(erg);
            } else {
                throw new ReflectionException("Only List and Set ConfigChannels are currently implemented, not [" + expectedObjectClass + "]. ConfigChannel [" + channel.address() + "]");
            }
        } else {
            throw new ReflectionException("The Json object for ConfigChannel [" + channel.address() + "] is no array!");
        }
    } else {
        if (j.isJsonArray()) {
            JsonArray arr = j.getAsJsonArray();
            Long[] larr = new Long[arr.size()];
            for (int i = 0; i < arr.size(); i++) {
                larr[i] = arr.get(i).getAsLong();
            }
            return larr;
        } else {
            throw new ReflectionException("The Json object for ConfigChannel [" + channel.address() + "] is no array!");
        }
    }
}
Also used : ReflectionException(io.openems.api.exception.ReflectionException) ParameterizedType(java.lang.reflect.ParameterizedType) JsonArray(com.google.gson.JsonArray) Field(java.lang.reflect.Field) ParameterizedType(java.lang.reflect.ParameterizedType) Type(java.lang.reflect.Type) JsonElement(com.google.gson.JsonElement) ArrayList(java.util.ArrayList) LinkedList(java.util.LinkedList) List(java.util.List) HashSet(java.util.HashSet)

Example 4 with ReflectionException

use of io.openems.api.exception.ReflectionException in project openems by OpenEMS.

the class ConfigUtils method getAvailableClasses.

public static Set<Class<? extends Thing>> getAvailableClasses(String topLevelPackage, Class<? extends Thing> clazz, String suffix) throws ReflectionException {
    Set<Class<? extends Thing>> clazzes = new HashSet<>();
    try {
        ClassPath classpath = ClassPath.from(ClassLoader.getSystemClassLoader());
        for (ClassPath.ClassInfo classInfo : classpath.getTopLevelClassesRecursive(topLevelPackage)) {
            if (classInfo.getName().endsWith(suffix)) {
                Class<?> thisClazz = classInfo.load();
                if (clazz.isAssignableFrom(thisClazz)) {
                    @SuppressWarnings("unchecked") Class<? extends Thing> thisThingClazz = (Class<? extends Thing>) thisClazz;
                    clazzes.add(thisThingClazz);
                }
            }
        }
    } catch (IllegalArgumentException | IOException e) {
        throw new ReflectionException(e.getMessage());
    }
    return clazzes;
}
Also used : ClassPath(com.google.common.reflect.ClassPath) ReflectionException(io.openems.api.exception.ReflectionException) IOException(java.io.IOException) Thing(io.openems.api.thing.Thing) HashSet(java.util.HashSet)

Example 5 with ReflectionException

use of io.openems.api.exception.ReflectionException in project openems by OpenEMS.

the class InjectionUtils method getInstance.

// private final static Logger log = LoggerFactory.getLogger(InjectionUtils.class);
/**
 * Creates an instance of the given {@link Class}. {@link Object} arguments are optional.
 *
 * Restriction: this implementation tries only the first constructor of the Class.
 *
 * @param clazz
 * @param args
 * @return
 * @throws ConfigException
 */
public static Object getInstance(Class<?> clazz, Object... args) throws ReflectionException {
    try {
        if (args.length == 0) {
            return clazz.newInstance();
        } else {
            Constructor<?>[] constructors = clazz.getConstructors();
            Constructor<?> constructor = null;
            for (Constructor<?> ct : constructors) {
                List<Class<?>> types = new ArrayList<>(Arrays.asList(ct.getParameterTypes()));
                if (types.size() == args.length) {
                    boolean isType = true;
                    for (Object arg : args) {
                        boolean isAssignable = false;
                        for (Class<?> type : types) {
                            if (type.isAssignableFrom(arg.getClass())) {
                                isAssignable = true;
                            }
                        }
                        if (!isAssignable) {
                            isType = false;
                        }
                    }
                    if (isType) {
                        constructor = ct;
                    }
                }
            }
            if (constructor != null) {
                return constructor.newInstance(args);
            } else {
                throw new ReflectionException("Unable to instantiate class [" + clazz.getName() + "] no matching constructor found.");
            }
        }
    } catch (InstantiationException | IllegalAccessException | InvocationTargetException | IllegalArgumentException | NullPointerException e) {
        e.printStackTrace();
        throw new ReflectionException("Unable to instantiate class [" + clazz.getName() + "]: " + e.getMessage());
    }
}
Also used : ReflectionException(io.openems.api.exception.ReflectionException) Constructor(java.lang.reflect.Constructor) ArrayList(java.util.ArrayList) InvocationTargetException(java.lang.reflect.InvocationTargetException)

Aggregations

ReflectionException (io.openems.api.exception.ReflectionException)9 ArrayList (java.util.ArrayList)5 JsonArray (com.google.gson.JsonArray)4 JsonElement (com.google.gson.JsonElement)4 Thing (io.openems.api.thing.Thing)4 HashSet (java.util.HashSet)4 ClassPath (com.google.common.reflect.ClassPath)2 JsonObject (com.google.gson.JsonObject)2 ConfigChannel (io.openems.api.channel.ConfigChannel)2 ThingMap (io.openems.api.controller.ThingMap)2 OpenemsException (io.openems.common.exceptions.OpenemsException)2 IOException (java.io.IOException)2 Constructor (java.lang.reflect.Constructor)2 Field (java.lang.reflect.Field)2 InvocationTargetException (java.lang.reflect.InvocationTargetException)2 ParameterizedType (java.lang.reflect.ParameterizedType)2 Type (java.lang.reflect.Type)2 List (java.util.List)2 Bridge (io.openems.api.bridge.Bridge)1 Channel (io.openems.api.channel.Channel)1