diff --git a/src/main/java/edu/ie3/datamodel/io/factory/EntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/EntityData.java index 6a5a51f3e..86ceffaf3 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/EntityData.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/EntityData.java @@ -7,7 +7,7 @@ import static edu.ie3.util.quantities.PowerSystemUnits.KILOVOLT; -import edu.ie3.datamodel.exceptions.FactoryException; +import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.exceptions.VoltageLevelException; import edu.ie3.datamodel.models.Entity; import edu.ie3.datamodel.models.voltagelevels.GermanVoltageLevelUtils; @@ -45,6 +45,10 @@ public EntityData(Map fieldsToAttributes, Class fieldsToAttributes) { + super(fieldsToAttributes, null); + } + /** * Creates a new EntityData object based on a given {@link FactoryData} object * @@ -61,35 +65,35 @@ public Class getTargetClass() { } /** - * Returns boolean value for given field name. Throws {@link FactoryException} if field does not + * Returns boolean value for given field name. Throws {@link SourceException} if field does not * exist, or field value is null or empty. * * @param field field name * @return true if value is "1" or "true", false otherwise */ - public boolean getBoolean(String field) { + public boolean getBoolean(String field) throws SourceException { final String value = getField(field); if (value == null || value.trim().isEmpty()) - throw new FactoryException(String.format("Field \"%s\" is null or empty", field)); + throw new SourceException(String.format("Field \"%s\" is null or empty", field)); return value.trim().equals("1") || value.trim().equalsIgnoreCase("true"); } /** * Parses and returns a geometry from field value of given field name. Throws {@link - * FactoryException} if field does not exist or parsing fails. + * SourceException} if field does not exist or parsing fails. * * @param field field name * @return Geometry if field value is not empty, empty Optional otherwise */ - private Optional getGeometry(String field) { + private Optional getGeometry(String field) throws SourceException { String value = getField(field); try { if (value.trim().isEmpty()) return Optional.empty(); else return Optional.of(geoJsonReader.read(value)); } catch (ParseException pe) { - throw new FactoryException( + throw new SourceException( String.format( "Exception while trying to parse geometry of field \"%s\" with value \"%s\"", field, value), @@ -99,17 +103,17 @@ private Optional getGeometry(String field) { /** * Parses and returns a geometrical LineString from field value of given field name. Throws {@link - * FactoryException} if field does not exist or parsing fails. + * SourceException} if field does not exist or parsing fails. * * @param field field name * @return LineString if field value is not empty, empty Optional otherwise */ - public Optional getLineString(String field) { + public Optional getLineString(String field) throws SourceException { Optional geom = getGeometry(field); if (geom.isPresent()) { if (geom.get() instanceof LineString lineString) return Optional.of(lineString); else - throw new FactoryException( + throw new SourceException( "Geometry is of type " + geom.getClass().getSimpleName() + ", but type LineString is required"); @@ -118,17 +122,17 @@ public Optional getLineString(String field) { /** * Parses and returns a geometrical Point from field value of given field name. Throws {@link - * FactoryException} if field does not exist or parsing fails. + * SourceException} if field does not exist or parsing fails. * * @param field field name * @return Point if field value is not empty, empty Optional otherwise */ - public Optional getPoint(String field) { + public Optional getPoint(String field) throws SourceException { Optional geom = getGeometry(field); if (geom.isPresent()) { if (geom.get() instanceof Point point) return Optional.of(point); else - throw new FactoryException( + throw new SourceException( "Geometry is of type " + geom.getClass().getSimpleName() + ", but type Point is required"); @@ -137,20 +141,21 @@ public Optional getPoint(String field) { /** * Parses and returns a voltage level from field value of given field name. Throws {@link - * FactoryException} if field does not exist or parsing fails. + * SourceException} if field does not exist or parsing fails. * * @param voltLvlField name of the field containing the voltage level * @param ratedVoltField name of the field containing the rated voltage * @return Voltage level */ - public VoltageLevel getVoltageLvl(String voltLvlField, String ratedVoltField) { + public VoltageLevel getVoltageLvl(String voltLvlField, String ratedVoltField) + throws SourceException { try { final String voltLvlId = getField(voltLvlField); final ComparableQuantity vRated = getQuantity(ratedVoltField, KILOVOLT); return parseToGermanVoltLvlOrIndividual(voltLvlId, vRated); } catch (IllegalArgumentException iae) { - throw new FactoryException("VoltageLevel could not be parsed", iae); + throw new SourceException("VoltageLevel could not be parsed", iae); } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/Factory.java b/src/main/java/edu/ie3/datamodel/io/factory/Factory.java index 35a0daef3..e2d1776fb 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/Factory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/Factory.java @@ -6,12 +6,10 @@ package edu.ie3.datamodel.io.factory; import edu.ie3.datamodel.exceptions.FactoryException; -import edu.ie3.datamodel.exceptions.FailedValidationException; -import edu.ie3.datamodel.exceptions.ValidationException; +import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.utils.Try; import edu.ie3.datamodel.utils.Try.*; -import edu.ie3.util.StringUtils; import java.util.*; import java.util.stream.Collectors; import org.slf4j.Logger; @@ -26,7 +24,8 @@ * @param Type of the intended return type (might differ slightly from target class (cf. {@link * edu.ie3.datamodel.io.factory.timeseries.TimeBasedValueFactory})). */ -public abstract class Factory implements SourceValidator { +@Deprecated +public abstract class Factory extends SourceValidator { public static final Logger log = LoggerFactory.getLogger(Factory.class); private final List> supportedClasses; @@ -54,7 +53,7 @@ public Try get(D data) { try { // build the model return Success.of(buildModel(data)); - } catch (FactoryException | IllegalArgumentException e) { + } catch (FactoryException | SourceException | IllegalArgumentException e) { return Failure.of( new FactoryException( "An error occurred when creating instance of " @@ -84,7 +83,7 @@ public Try get(Try data) { * @return model created from data * @throws FactoryException if the model cannot be build */ - protected abstract R buildModel(D data); + protected abstract R buildModel(D data) throws SourceException; /** * Checks, if the specific given class can be handled by this factory. @@ -101,153 +100,4 @@ private void isSupportedClass(Class desiredClass) { .map(Class::getSimpleName) .collect(Collectors.joining("\n - "))); } - - /** - * Returns list of sets of attribute names that the entity requires to be built. At least one of - * these sets needs to be delivered for entity creation to be successful. - * - * @param entityClass class that can be used to specify the fields that are returned - * @return list of possible attribute sets - */ - protected abstract List> getFields(Class entityClass); - - /** - * Method to find and return additional fields that were found in a source and are not used by the - * data model. This method will return the minimal unused fields among all field sets, meaning - * that the set of actual fields is compared to the field set with the least unused fields. - * - * @param actualFields found in the source - * @param validFieldSets that contains at least all fields found in the source - * @return a set of unused fields - */ - protected Set getUnusedFields( - Set actualFields, List> validFieldSets) { - // checking for additional fields - // and returning the set with the least additional fields - return validFieldSets.stream() - .map( - s -> { - Set set = new HashSet<>(actualFields); - set.removeAll(s); - return set; - }) - .min(Comparator.comparing(Collection::size)) - .orElse(Collections.emptySet()); - } - - /** - * Method for validating the actual fields. The actual fields need to fully contain at least one - * of the sets returned by {@link #getFields(Class)}. If the actual fields don't contain all - * necessary fields, an {@link FactoryException} with a detail message is thrown. If the actual - * fields contain more fields than necessary, these fields are ignored. - * - * @param actualFields that were found - * @param entityClass of the build data - * @return either an exception wrapped by a {@link Failure} or an empty success - */ - public Try validate( - Set actualFields, Class entityClass) { - List> fieldSets = getFields(entityClass); - Set harmonizedActualFields = toCamelCase(actualFields); - - // comparing the actual fields to a list of possible fields (allows additional fields) - // if not all fields were found in a set, this set is filtered out - // all other fields are saved as a list - // allows snake, camel and mixed cases - List> validFieldSets = - fieldSets.stream().filter(harmonizedActualFields::containsAll).toList(); - - if (validFieldSets.isEmpty()) { - // build the exception string with extensive debug information - String providedKeysString = "[" + String.join(", ", actualFields) + "]"; - - String possibleOptions = getFieldsString(fieldSets).toString(); - - return Failure.of( - new FailedValidationException( - "The provided fields " - + providedKeysString - + " are invalid for instance of '" - + entityClass.getSimpleName() - + "'. \nThe following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of '" - + entityClass.getSimpleName() - + "' are possible (NOT case-sensitive!):\n" - + possibleOptions)); - } else { - // find all unused fields - Set unused = getUnusedFields(harmonizedActualFields, validFieldSets); - - if (!unused.isEmpty()) { - log.info( - "The following additional fields were found for entity class of '{}': {}", - entityClass.getSimpleName(), - unused); - } - - return Success.empty(); - } - } - - protected static StringBuilder getFieldsString(List> fieldSets) { - StringBuilder possibleOptions = new StringBuilder(); - for (int i = 0; i < fieldSets.size(); i++) { - Set fieldSet = fieldSets.get(i); - String option = - i - + ": [" - + String.join(", ", fieldSet) - + "] or [" - + String.join(", ", toSnakeCase(fieldSet)) - + "]\n"; - possibleOptions.append(option); - } - return possibleOptions; - } - - /** - * Creates a new set of attribute names from given list of attributes. This method should always - * be used when returning attribute sets, i.e. through {@link #getFields(Class)}. - * - * @param attributes attribute names - * @return new set exactly containing attribute names - */ - protected static TreeSet newSet(String... attributes) { - TreeSet set = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); - set.addAll(Arrays.asList(attributes)); - return set; - } - - /** - * Expands a set of attributes with further attributes. This method should always be used when - * returning attribute sets, i.e. through getting the needed fields. The set maintains a - * lexicographic order, that is case-insensitive. - * - * @param attributeSet set of attributes to expand - * @param more attribute names to expand given set with - * @return new set exactly containing given attribute set plus additional attributes - */ - protected static TreeSet expandSet(Set attributeSet, String... more) { - TreeSet newSet = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); - newSet.addAll(attributeSet); - newSet.addAll(Arrays.asList(more)); - return newSet; - } - - protected static Set toSnakeCase(Set set) { - TreeSet newSet = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); - newSet.addAll(set.stream().map(StringUtils::camelCaseToSnakeCase).toList()); - return newSet; - } - - protected static Set toCamelCase(Set set) { - TreeSet newSet = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); - newSet.addAll(set.stream().map(StringUtils::snakeCaseToCamelCase).toList()); - return newSet; - } - - protected static Set toLowerCase(Set set) { - TreeSet newSet = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); - newSet.addAll(set.stream().map(String::toLowerCase).toList()); - return newSet; - } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/FactoryData.java b/src/main/java/edu/ie3/datamodel/io/factory/FactoryData.java index cc0cdd357..c544a9206 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/FactoryData.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/FactoryData.java @@ -6,6 +6,7 @@ package edu.ie3.datamodel.io.factory; import edu.ie3.datamodel.exceptions.FactoryException; +import edu.ie3.datamodel.exceptions.SourceException; import java.util.*; import javax.measure.Quantity; import javax.measure.Unit; @@ -48,9 +49,9 @@ public boolean containsKey(String key) { * @param field field name * @return field value */ - public String getField(String field) { + public String getField(String field) throws SourceException { if (!fieldsToAttributes.containsKey(field)) - throw new FactoryException(String.format("Field \"%s\" not found in EntityData", field)); + throw new SourceException(String.format("Field \"%s\" not found in EntityData", field)); return fieldsToAttributes.get(field); } @@ -74,7 +75,8 @@ public Optional getFieldOptional(String field) { * @param unit type parameter * @return Quantity of given field with given unit */ - public > ComparableQuantity getQuantity(String field, Unit unit) { + public > ComparableQuantity getQuantity(String field, Unit unit) + throws SourceException { return Quantities.getQuantity(getDouble(field), unit); } @@ -101,11 +103,11 @@ public > Optional> getQuantityOption * @param field field name * @return int value */ - public int getInt(String field) { + public int getInt(String field) throws SourceException { try { return Integer.parseInt(getField(field)); } catch (NumberFormatException nfe) { - throw new FactoryException( + throw new SourceException( String.format( "Exception while trying to parse field \"%s\" with supposed int value \"%s\"", field, getField(field)), @@ -120,11 +122,11 @@ field, getField(field)), * @param field field name * @return double value */ - public double getDouble(String field) { + public double getDouble(String field) throws SourceException { try { return Double.parseDouble(getField(field)); } catch (NumberFormatException nfe) { - throw new FactoryException( + throw new SourceException( String.format( "Exception while trying to parse field \"%s\" with supposed double value \"%s\"", field, getField(field)), @@ -139,11 +141,11 @@ field, getField(field)), * @param field field name * @return UUID */ - public UUID getUUID(String field) { + public UUID getUUID(String field) throws SourceException { try { return UUID.fromString(getField(field)); } catch (IllegalArgumentException iae) { - throw new FactoryException( + throw new SourceException( String.format( "Exception while trying to parse UUID of field \"%s\" with value \"%s\"", field, getField(field)), diff --git a/src/main/java/edu/ie3/datamodel/io/factory/UniqueEntityFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/UniqueEntityFactory.java deleted file mode 100644 index 016630fb2..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/UniqueEntityFactory.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * © 2024. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory; - -import edu.ie3.datamodel.models.Entity; - -/** - * Universal factory class for creating entities with unique fields uuid and id. - * - * @param Type of entity that this factory can create. Can be a subclass of the entities that - * this factory creates. - * @param Type of data class that is required for entity creation - */ -public abstract class UniqueEntityFactory - extends EntityFactory { - - protected static final String UUID = "uuid"; - - protected static final String ID = "id"; - - @SafeVarargs - protected UniqueEntityFactory(Class... allowedClasses) { - super(allowedClasses); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/AbstractThermalStorageInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/AbstractThermalStorageInputFactory.java deleted file mode 100644 index 718de20eb..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/AbstractThermalStorageInputFactory.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * © 2024. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input; - -import edu.ie3.datamodel.models.StandardUnits; -import edu.ie3.datamodel.models.input.thermal.AbstractStorageInput; -import edu.ie3.util.quantities.interfaces.SpecificHeatCapacity; -import javax.measure.quantity.Power; -import javax.measure.quantity.Temperature; -import javax.measure.quantity.Volume; -import tech.units.indriya.ComparableQuantity; - -public abstract class AbstractThermalStorageInputFactory - extends AssetInputEntityFactory { - - private static final String STORAGE_VOLUME_LVL = "storageVolumeLvl"; - private static final String INLET_TEMP = "inletTemp"; - private static final String RETURN_TEMP = "returnTemp"; - private static final String C = "c"; - private static final String P_THERMAL_MAX = "pThermalMax"; - - public AbstractThermalStorageInputFactory(Class clazz) { - super(clazz); - } - - @Override - protected String[] getAdditionalFields() { - return new String[] {STORAGE_VOLUME_LVL, INLET_TEMP, RETURN_TEMP, C, P_THERMAL_MAX}; - } - - protected ComparableQuantity getStorageVolumeLvl(ThermalUnitInputEntityData data) { - return data.getQuantity(STORAGE_VOLUME_LVL, StandardUnits.VOLUME); - } - - protected ComparableQuantity getInletTemp(ThermalUnitInputEntityData data) { - return data.getQuantity(INLET_TEMP, StandardUnits.TEMPERATURE); - } - - protected ComparableQuantity getReturnTemp(ThermalUnitInputEntityData data) { - return data.getQuantity(RETURN_TEMP, StandardUnits.TEMPERATURE); - } - - protected ComparableQuantity getSpecificHeatCapacity( - ThermalUnitInputEntityData data) { - return data.getQuantity(C, StandardUnits.SPECIFIC_HEAT_CAPACITY); - } - - protected ComparableQuantity getMaxThermalPower(ThermalUnitInputEntityData data) { - return data.getQuantity(P_THERMAL_MAX, StandardUnits.ACTIVE_POWER_IN); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/AssetInputEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/AssetInputEntityData.java deleted file mode 100644 index 10f93153e..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/AssetInputEntityData.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input; - -import edu.ie3.datamodel.io.factory.EntityData; -import edu.ie3.datamodel.models.UniqueEntity; -import edu.ie3.datamodel.models.input.OperatorInput; -import java.util.Map; -import java.util.Objects; - -/** - * Data used for the construction of {@link edu.ie3.datamodel.models.input.AssetInput} entities. - * This data object can include additional information about the {@link OperatorInput}, which cannot - * be provided through the attribute map as it is a complex shared entity. - */ -public class AssetInputEntityData extends EntityData { - private final OperatorInput operator; - - /** - * Creates a new AssetInputEntityData object without operator. - * - * @param fieldsToAttributes attribute map: field name to value - * @param entityClass class of the entity to be created with this data - */ - public AssetInputEntityData( - Map fieldsToAttributes, Class entityClass) { - this(fieldsToAttributes, entityClass, OperatorInput.NO_OPERATOR_ASSIGNED); - } - - /** - * Creates a new AssetInputEntityData object with operator. - * - * @param fieldsToAttributes attribute map: field name to value - * @param entityClass class of the entity to be created with this data - * @param operator operator input - */ - public AssetInputEntityData( - Map fieldsToAttributes, - Class entityClass, - OperatorInput operator) { - super(fieldsToAttributes, entityClass); - this.operator = operator; - } - - /** - * Creates a new AssetInputEntityData object based on a given {@link EntityData} object and given - * operator - * - * @param entityData The entity data object to use attributes of - * @param operator The operator input to use - */ - public AssetInputEntityData(EntityData entityData, OperatorInput operator) { - super(entityData); - this.operator = operator; - } - - public OperatorInput getOperatorInput() { - return operator; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - AssetInputEntityData that = (AssetInputEntityData) o; - return operator.equals(that.operator); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), operator); - } - - @Override - public String toString() { - return "AssetInputEntityData{" - + "fieldsToValues=" - + getFieldsToValues() - + ", targetClass=" - + getTargetClass() - + ", operatorInput=" - + operator.getUuid() - + '}'; - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/AssetInputEntityFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/AssetInputEntityFactory.java deleted file mode 100644 index 9670eca99..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/AssetInputEntityFactory.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input; - -import edu.ie3.datamodel.io.factory.UniqueEntityFactory; -import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.input.AssetInput; -import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.system.SystemParticipantInput; -import java.time.ZonedDateTime; -import java.util.*; - -/** - * Abstract factory class that can be extended in order for creating {@link AssetInput} entities - * with {@link AssetInputEntityData} data objects. - * - * @param Type of entity that this factory can create. Must be a subclass of {@link AssetInput} - * @param Type of data class that is required for entity creation - * @since 19.02.20 - */ -public abstract class AssetInputEntityFactory - extends UniqueEntityFactory { - - protected static final String OPERATOR = "operator"; - protected static final String OPERATES_FROM = "operatesFrom"; - protected static final String OPERATES_UNTIL = "operatesUntil"; - - @SafeVarargs - protected AssetInputEntityFactory(Class... allowedClasses) { - super(allowedClasses); - } - - /** - * Returns list of sets of attribute names that the entity requires to be built. - * - *

The mandatory attributes required to create an {@link AssetInput} are enhanced with custom - * attribute names that each subclass factory determines in {@link #getAdditionalFields()}. - * - * @param entityClass class of the entity - * @return list of possible attribute sets - */ - @Override - protected List> getFields(Class entityClass) { - Set constructorParamsMin = newSet(UUID, ID); - Set constructorParamsFrom = expandSet(constructorParamsMin, OPERATES_FROM); - Set constructorParamsUntil = expandSet(constructorParamsMin, OPERATES_UNTIL); - Set constructorParamsBoth = expandSet(constructorParamsFrom, OPERATES_UNTIL); - - // with operator field - Set constructorParamsOperator = expandSet(constructorParamsMin, OPERATOR); - Set constructorParamsOperatorFrom = expandSet(constructorParamsFrom, OPERATOR); - Set constructorParamsOperatorUntil = expandSet(constructorParamsUntil, OPERATOR); - Set constructorParamsOperatorBoth = expandSet(constructorParamsBoth, OPERATOR); - - final String[] additionalFields = getAdditionalFields(); - - constructorParamsMin = expandSet(constructorParamsMin, additionalFields); - constructorParamsFrom = expandSet(constructorParamsFrom, additionalFields); - constructorParamsUntil = expandSet(constructorParamsUntil, additionalFields); - constructorParamsBoth = expandSet(constructorParamsBoth, additionalFields); - - constructorParamsOperator = expandSet(constructorParamsOperator, additionalFields); - constructorParamsOperatorFrom = expandSet(constructorParamsOperatorFrom, additionalFields); - constructorParamsOperatorUntil = expandSet(constructorParamsOperatorUntil, additionalFields); - constructorParamsOperatorBoth = expandSet(constructorParamsOperatorBoth, additionalFields); - - return Arrays.asList( - constructorParamsMin, - constructorParamsFrom, - constructorParamsUntil, - constructorParamsBoth, - constructorParamsOperator, - constructorParamsOperatorFrom, - constructorParamsOperatorUntil, - constructorParamsOperatorBoth); - } - - /** - * Returns fields other than the required fields of {@link SystemParticipantInput} that have to be - * present. - * - * @return Array of field names, can be empty but not null - */ - protected abstract String[] getAdditionalFields(); - - @Override - protected T buildModel(D data) { - UUID uuid = data.getUUID(UUID); - String id = data.getField(ID); - OperatorInput operator = data.getOperatorInput(); - OperationTime operationTime = buildOperationTime(data); - - return buildModel(data, uuid, id, operator, operationTime); - } - - /** - * Creates asset input entity with given parameters - * - * @param data entity data - * @param uuid UUID of the input entity - * @param id ID - * @param operator Operator of the asset - * @param operationTime time in which the entity is operated - * @return newly created asset object - */ - protected abstract T buildModel( - D data, UUID uuid, String id, OperatorInput operator, OperationTime operationTime); - - /** - * Creates an {@link OperationTime} from the entity data from attributes OPERATES_FROM and - * OPERATES_UNTIL. Both or one of these can be empty or non-existing. - * - * @param data entity data to take the dates from - * @return Operation time object - */ - private static OperationTime buildOperationTime(AssetInputEntityData data) { - final String from = data.getFieldOptional(OPERATES_FROM).orElse(null); - final String until = data.getFieldOptional(OPERATES_UNTIL).orElse(null); - - OperationTime.OperationTimeBuilder builder = new OperationTime.OperationTimeBuilder(); - if (from != null && !from.trim().isEmpty()) builder.withStart(ZonedDateTime.parse(from)); - if (until != null && !until.trim().isEmpty()) builder.withEnd(ZonedDateTime.parse(until)); - - return builder.build(); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/ConnectorInputEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/ConnectorInputEntityData.java deleted file mode 100644 index 4c795e89d..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/ConnectorInputEntityData.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input; - -import edu.ie3.datamodel.models.UniqueEntity; -import edu.ie3.datamodel.models.input.NodeInput; -import edu.ie3.datamodel.models.input.OperatorInput; -import java.util.Map; -import java.util.Objects; - -/** - * Data used by {@link ConnectorInputEntityFactory} to create an instance of {@link - * edu.ie3.datamodel.models.input.connector.ConnectorInput}, thus needing additional information - * about the {@link edu.ie3.datamodel.models.input.NodeInput}, which cannot be provided through the - * attribute map. - */ -public class ConnectorInputEntityData extends AssetInputEntityData { - private final NodeInput nodeA; - private final NodeInput nodeB; - - public ConnectorInputEntityData( - Map fieldsToAttributes, - Class entityClass, - NodeInput nodeA, - NodeInput nodeB) { - super(fieldsToAttributes, entityClass); - this.nodeA = nodeA; - this.nodeB = nodeB; - } - - public ConnectorInputEntityData( - Map fieldsToAttributes, - Class entityClass, - OperatorInput operator, - NodeInput nodeA, - NodeInput nodeB) { - super(fieldsToAttributes, entityClass, operator); - this.nodeA = nodeA; - this.nodeB = nodeB; - } - - /** - * Creates a new ConnectorInputEntityData object based on a given {@link AssetInputEntityData} - * object and given nodes - * - * @param entityData The AssetInputEntityData object to enhance - * @param nodeA The first node to add - * @param nodeB The second node to add - */ - public ConnectorInputEntityData( - AssetInputEntityData entityData, NodeInput nodeA, NodeInput nodeB) { - super(entityData, entityData.getOperatorInput()); - this.nodeA = nodeA; - this.nodeB = nodeB; - } - - public NodeInput getNodeA() { - return nodeA; - } - - public NodeInput getNodeB() { - return nodeB; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - ConnectorInputEntityData that = (ConnectorInputEntityData) o; - return nodeA.equals(that.nodeA) && nodeB.equals(that.nodeB); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), nodeA, nodeB); - } - - @Override - public String toString() { - return "ConnectorInputEntityData{" - + "fieldsToValues=" - + getFieldsToValues() - + ", targetClass=" - + getTargetClass() - + ", operatorInput=" - + getOperatorInput().getUuid() - + ", nodeA=" - + nodeA.getUuid() - + ", nodeB=" - + nodeB.getUuid() - + '}'; - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/ConnectorInputEntityFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/ConnectorInputEntityFactory.java deleted file mode 100644 index ef333524d..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/ConnectorInputEntityFactory.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input; - -import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.input.NodeInput; -import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.connector.ConnectorInput; -import java.util.UUID; - -/** - * Abstract factory class that can be extended in order for creating {@link ConnectorInput} entities - * with {@link ConnectorInputEntityData} data objects. - * - * @param Type of entity that this factory can create. Must be a subclass of {@link - * ConnectorInput} - * @param Type of data class that is required for entity creation - * @since 19.02.20 - */ -public abstract class ConnectorInputEntityFactory< - T extends ConnectorInput, D extends ConnectorInputEntityData> - extends AssetInputEntityFactory { - - protected static final String NODE_A = "nodeA"; - protected static final String NODE_B = "nodeB"; - - /** - * Attribute that _can_, but does not _have to_ be present for the creation of {@link - * ConnectorInput}s. Thus, this attribute name declaration can be used in subclasses of {@link - * ConnectorInputEntityFactory} - */ - protected static final String PARALLEL_DEVICES = "parallelDevices"; - - @SafeVarargs - protected ConnectorInputEntityFactory(Class... allowedClasses) { - super(allowedClasses); - } - - @Override - protected T buildModel( - D data, UUID uuid, String id, OperatorInput operator, OperationTime operationTime) { - final NodeInput nodeA = data.getNodeA(); - final NodeInput nodeB = data.getNodeB(); - - return buildModel(data, uuid, id, nodeA, nodeB, operator, operationTime); - } - - protected abstract T buildModel( - D data, - UUID uuid, - String id, - NodeInput nodeA, - NodeInput nodeB, - OperatorInput operator, - OperationTime operationTime); -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactory.java deleted file mode 100644 index 541aa7f56..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactory.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input; - -import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.thermal.CylindricalStorageInput; -import edu.ie3.datamodel.models.input.thermal.ThermalBusInput; -import java.util.UUID; - -public class CylindricalStorageInputFactory - extends AbstractThermalStorageInputFactory { - - public CylindricalStorageInputFactory() { - super(CylindricalStorageInput.class); - } - - @Override - protected CylindricalStorageInput buildModel( - ThermalUnitInputEntityData data, - UUID uuid, - String id, - OperatorInput operator, - OperationTime operationTime) { - - final ThermalBusInput bus = data.getBusInput(); - return new CylindricalStorageInput( - uuid, - id, - operator, - operationTime, - bus, - getStorageVolumeLvl(data), - getInletTemp(data), - getReturnTemp(data), - getSpecificHeatCapacity(data), - getMaxThermalPower(data)); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/DomesticHotWaterStorageInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/DomesticHotWaterStorageInputFactory.java deleted file mode 100644 index b59ed35bb..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/DomesticHotWaterStorageInputFactory.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * © 2024. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input; - -import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.thermal.DomesticHotWaterStorageInput; -import edu.ie3.datamodel.models.input.thermal.ThermalBusInput; -import java.util.UUID; - -public class DomesticHotWaterStorageInputFactory - extends AbstractThermalStorageInputFactory { - - public DomesticHotWaterStorageInputFactory() { - super(DomesticHotWaterStorageInput.class); - } - - @Override - protected DomesticHotWaterStorageInput buildModel( - ThermalUnitInputEntityData data, - UUID uuid, - String id, - OperatorInput operator, - OperationTime operationTime) { - - final ThermalBusInput bus = data.getBusInput(); - return new DomesticHotWaterStorageInput( - uuid, - id, - operator, - operationTime, - bus, - getStorageVolumeLvl(data), - getInletTemp(data), - getReturnTemp(data), - getSpecificHeatCapacity(data), - getMaxThermalPower(data)); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/EmAssetInputEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/EmAssetInputEntityData.java deleted file mode 100644 index a51835568..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/EmAssetInputEntityData.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * © 2023. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input; - -import edu.ie3.datamodel.models.UniqueEntity; -import edu.ie3.datamodel.models.input.EmInput; -import edu.ie3.datamodel.models.input.OperatorInput; -import java.util.Map; -import java.util.Objects; - -/** - * Data used for the construction of {@link edu.ie3.datamodel.models.input.AssetInput} entities - * which also require an EM attribute. This data object can include additional information about the - * {@link EmInput}, which cannot be provided through the attribute map as it is a complex shared - * entity. - */ -public class EmAssetInputEntityData extends AssetInputEntityData { - - private final EmInput controllingEm; - - public EmAssetInputEntityData( - Map fieldsToAttributes, - Class entityClass, - EmInput controllingEm) { - super(fieldsToAttributes, entityClass); - this.controllingEm = controllingEm; - } - - public EmAssetInputEntityData( - Map fieldsToAttributes, - Class entityClass, - OperatorInput operator, - EmInput controllingEm) { - super(fieldsToAttributes, entityClass, operator); - this.controllingEm = controllingEm; - } - - /** - * Creates a new EmAssetInputEntityData object based on a given {@link AssetInputEntityData} - * object and given em unit - * - * @param entityData The entity data object to use attributes of - * @param controllingEm The controlling em input to use - */ - public EmAssetInputEntityData(AssetInputEntityData entityData, EmInput controllingEm) { - super(entityData, entityData.getOperatorInput()); - this.controllingEm = controllingEm; - } - - public EmInput getControllingEm() { - return controllingEm; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - EmAssetInputEntityData that = (EmAssetInputEntityData) o; - return Objects.equals(controllingEm, that.controllingEm); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), controllingEm); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/EmInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/EmInputFactory.java deleted file mode 100644 index 85e15822d..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/EmInputFactory.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * © 2022. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input; - -import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.input.EmInput; -import edu.ie3.datamodel.models.input.OperatorInput; -import java.util.*; - -public class EmInputFactory extends AssetInputEntityFactory { - - private static final String CONTROL_STRATEGY = "controlStrategy"; - - public static final String CONTROLLING_EM = "controllingEm"; - - public EmInputFactory() { - super(EmInput.class); - } - - @Override - protected String[] getAdditionalFields() { - return new String[] {CONTROL_STRATEGY, CONTROLLING_EM}; - } - - @Override - protected EmInput buildModel( - EmAssetInputEntityData data, - UUID uuid, - String id, - OperatorInput operator, - OperationTime operationTime) { - String controlStrategy = data.getField(CONTROL_STRATEGY); - - EmInput parentEm = data.getControllingEm(); - - return new EmInput(uuid, id, operator, operationTime, controlStrategy, parentEm); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/LineInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/LineInputFactory.java deleted file mode 100644 index be0f1af6f..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/LineInputFactory.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input; - -import edu.ie3.datamodel.exceptions.FactoryException; -import edu.ie3.datamodel.exceptions.ParsingException; -import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.StandardUnits; -import edu.ie3.datamodel.models.input.NodeInput; -import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.connector.LineInput; -import edu.ie3.datamodel.models.input.connector.type.LineTypeInput; -import edu.ie3.datamodel.models.input.system.characteristic.OlmCharacteristicInput; -import edu.ie3.datamodel.utils.GridAndGeoUtils; -import java.util.UUID; -import javax.measure.quantity.Length; -import org.locationtech.jts.geom.LineString; -import tech.units.indriya.ComparableQuantity; - -public class LineInputFactory - extends ConnectorInputEntityFactory> { - private static final String LENGTH = "length"; - private static final String GEO_POSITION = "geoPosition"; - private static final String OLM_CHARACTERISTIC = "olmCharacteristic"; - private static final String TYPE = "type"; - - public LineInputFactory() { - super(LineInput.class); - } - - @Override - protected String[] getAdditionalFields() { - return new String[] { - NODE_A, NODE_B, PARALLEL_DEVICES, LENGTH, GEO_POSITION, OLM_CHARACTERISTIC, TYPE - }; - } - - @Override - protected LineInput buildModel( - TypedConnectorInputEntityData data, - UUID uuid, - String id, - NodeInput nodeA, - NodeInput nodeB, - OperatorInput operator, - OperationTime operationTime) { - final int parallelDevices = data.getInt(PARALLEL_DEVICES); - final LineTypeInput type = data.getType(); - final ComparableQuantity length = data.getQuantity(LENGTH, StandardUnits.LINE_LENGTH); - final LineString geoPosition = - data.getLineString(GEO_POSITION) - .orElse(GridAndGeoUtils.buildSafeLineStringBetweenNodes(nodeA, nodeB)); - final OlmCharacteristicInput olmCharacteristic; - try { - olmCharacteristic = - data.containsKey(OLM_CHARACTERISTIC) && !data.getField(OLM_CHARACTERISTIC).isEmpty() - ? new OlmCharacteristicInput(data.getField(OLM_CHARACTERISTIC)) - : OlmCharacteristicInput.CONSTANT_CHARACTERISTIC; - } catch (ParsingException e) { - throw new FactoryException( - "Cannot parse the following overhead line monitoring characteristic: '" - + data.getField(OLM_CHARACTERISTIC) - + "'", - e); - } - return new LineInput( - uuid, - id, - operator, - operationTime, - nodeA, - nodeB, - parallelDevices, - type, - length, - geoPosition, - olmCharacteristic); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/MeasurementUnitInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/MeasurementUnitInputFactory.java deleted file mode 100644 index d4bb56c65..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/MeasurementUnitInputFactory.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input; - -import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.input.MeasurementUnitInput; -import edu.ie3.datamodel.models.input.NodeInput; -import edu.ie3.datamodel.models.input.OperatorInput; -import java.util.UUID; - -public class MeasurementUnitInputFactory - extends AssetInputEntityFactory { - private static final String NODE = "node"; - private static final String V_MAG = "vMag"; - private static final String V_ANG = "vAng"; - private static final String P = "p"; - private static final String Q = "q"; - - public MeasurementUnitInputFactory() { - super(MeasurementUnitInput.class); - } - - @Override - protected String[] getAdditionalFields() { - return new String[] {NODE, V_MAG, V_ANG, P, Q}; - } - - @Override - protected MeasurementUnitInput buildModel( - NodeAssetInputEntityData data, - UUID uuid, - String id, - OperatorInput operator, - OperationTime operationTime) { - final NodeInput node = data.getNode(); - final boolean vMag = data.getBoolean(V_MAG); - final boolean vAng = data.getBoolean(V_ANG); - final boolean p = data.getBoolean(P); - final boolean q = data.getBoolean(Q); - return new MeasurementUnitInput(uuid, id, operator, operationTime, node, vMag, vAng, p, q); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/NodeAssetInputEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/NodeAssetInputEntityData.java deleted file mode 100644 index f911b6dfd..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/NodeAssetInputEntityData.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input; - -import edu.ie3.datamodel.models.UniqueEntity; -import edu.ie3.datamodel.models.input.NodeInput; -import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.UniqueInputEntity; -import java.util.Map; -import java.util.Objects; - -/** - * Data used by all factories used to create instances of {@link UniqueInputEntity}s holding one - * {@link NodeInput} entity, thus needing additional information about the {@link NodeInput}, which - * cannot be provided through the attribute map. - */ -public class NodeAssetInputEntityData extends AssetInputEntityData { - private final NodeInput node; - - /** - * Creates a new UntypedSingleNodeEntityData object for an operated, always on system participant - * input - * - * @param fieldsToAttributes attribute map: field name to value - * @param entityClass class of the entity to be created with this data - * @param node input node - */ - public NodeAssetInputEntityData( - Map fieldsToAttributes, - Class entityClass, - NodeInput node) { - super(fieldsToAttributes, entityClass); - this.node = node; - } - - /** - * Creates a new UntypedSingleNodeEntityData object for an operable system participant input - * - * @param fieldsToAttributes attribute map: field name to value - * @param entityClass class of the entity to be created with this data - * @param node input node - * @param operator operator input - */ - public NodeAssetInputEntityData( - Map fieldsToAttributes, - Class entityClass, - OperatorInput operator, - NodeInput node) { - super(fieldsToAttributes, entityClass, operator); - this.node = node; - } - - /** - * Creates a new NodeAssetInputEntityData object based on a given {@link AssetInputEntityData} - * object and given node - * - * @param assetInputEntityData The asset entity data object to use attributes of - * @param node input node - */ - public NodeAssetInputEntityData(AssetInputEntityData assetInputEntityData, NodeInput node) { - super(assetInputEntityData, assetInputEntityData.getOperatorInput()); - this.node = node; - } - - public NodeInput getNode() { - return node; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - NodeAssetInputEntityData that = (NodeAssetInputEntityData) o; - return getNode().equals(that.getNode()); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), getNode()); - } - - @Override - public String toString() { - return "NodeAssetInputEntityData{" - + "fieldsToValues=" - + getFieldsToValues() - + ", targetClass=" - + getTargetClass() - + ", operatorInput=" - + getOperatorInput().getUuid() - + ", node=" - + node.getUuid() - + '}'; - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/NodeInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/NodeInputFactory.java deleted file mode 100644 index 96aa8859d..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/NodeInputFactory.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input; - -import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.StandardUnits; -import edu.ie3.datamodel.models.input.NodeInput; -import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.voltagelevels.VoltageLevel; -import java.util.UUID; -import javax.measure.quantity.Dimensionless; -import org.locationtech.jts.geom.Point; -import tech.units.indriya.ComparableQuantity; - -public class NodeInputFactory extends AssetInputEntityFactory { - private static final String V_TARGET = "vTarget"; - public static final String V_RATED = "vRated"; - private static final String SLACK = "slack"; - private static final String GEO_POSITION = "geoPosition"; - public static final String VOLT_LVL = "voltLvl"; - private static final String SUBNET = "subnet"; - - public NodeInputFactory() { - super(NodeInput.class); - } - - @Override - protected String[] getAdditionalFields() { - return new String[] {V_TARGET, V_RATED, SLACK, GEO_POSITION, VOLT_LVL, SUBNET}; - } - - @Override - protected NodeInput buildModel( - AssetInputEntityData data, - UUID uuid, - String id, - OperatorInput operator, - OperationTime operationTime) { - final ComparableQuantity vTarget = - data.getQuantity(V_TARGET, StandardUnits.TARGET_VOLTAGE_MAGNITUDE); - final boolean slack = data.getBoolean(SLACK); - final Point geoPosition = data.getPoint(GEO_POSITION).orElse(NodeInput.DEFAULT_GEO_POSITION); - final VoltageLevel voltLvl = data.getVoltageLvl(VOLT_LVL.toLowerCase(), V_RATED.toLowerCase()); - final int subnet = data.getInt(SUBNET); - return new NodeInput( - uuid, id, operator, operationTime, vTarget, slack, geoPosition, voltLvl, subnet); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/OperatorInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/OperatorInputFactory.java deleted file mode 100644 index 76c01a6cc..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/OperatorInputFactory.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input; - -import edu.ie3.datamodel.io.factory.EntityData; -import edu.ie3.datamodel.io.factory.UniqueEntityFactory; -import edu.ie3.datamodel.models.input.OperatorInput; -import java.util.Collections; -import java.util.List; -import java.util.Set; - -public class OperatorInputFactory extends UniqueEntityFactory { - - public OperatorInputFactory() { - super(OperatorInput.class); - } - - @Override - protected List> getFields(Class entityClass) { - Set constructorParams = newSet(UUID, ID); - return Collections.singletonList(constructorParams); - } - - @Override - protected OperatorInput buildModel(EntityData data) { - return new OperatorInput(data.getUUID(UUID), data.getField(ID)); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/SwitchInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/SwitchInputFactory.java deleted file mode 100644 index eec533e16..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/SwitchInputFactory.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input; - -import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.input.NodeInput; -import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.connector.SwitchInput; -import java.util.UUID; - -public class SwitchInputFactory - extends ConnectorInputEntityFactory { - private static final String CLOSED = "closed"; - - public SwitchInputFactory() { - super(SwitchInput.class); - } - - @Override - protected String[] getAdditionalFields() { - return new String[] {NODE_A, NODE_B, CLOSED}; - } - - @Override - protected SwitchInput buildModel( - ConnectorInputEntityData data, - UUID uuid, - String id, - NodeInput nodeA, - NodeInput nodeB, - OperatorInput operator, - OperationTime operationTime) { - final boolean closed = data.getBoolean(CLOSED); - - if (data.containsKey(PARALLEL_DEVICES)) { - String parallelDevices = data.getField(PARALLEL_DEVICES); - - log.warn( - "The SwitchInput with id `{}` specifies the unused parameter `parallelDevices` with a value of `{}`." - + " SwitchInputs do not need to specify `parallelDevices`, as its physical value depends on" - + " the electrotechnical context of where the switch is embedded.", - id, - parallelDevices); - } - - return new SwitchInput(uuid, id, operator, operationTime, nodeA, nodeB, closed); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/ThermalBusInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/ThermalBusInputFactory.java deleted file mode 100644 index 7f80971d8..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/ThermalBusInputFactory.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input; - -import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.thermal.ThermalBusInput; -import java.util.UUID; - -public class ThermalBusInputFactory - extends AssetInputEntityFactory { - public ThermalBusInputFactory() { - super(ThermalBusInput.class); - } - - @Override - protected String[] getAdditionalFields() { - return new String[0]; - } - - @Override - protected ThermalBusInput buildModel( - AssetInputEntityData data, - UUID uuid, - String id, - OperatorInput operator, - OperationTime operationTime) { - return new ThermalBusInput(uuid, id, operator, operationTime); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/ThermalHouseInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/ThermalHouseInputFactory.java deleted file mode 100644 index 6972f99a0..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/ThermalHouseInputFactory.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input; - -import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.StandardUnits; -import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.thermal.ThermalBusInput; -import edu.ie3.datamodel.models.input.thermal.ThermalHouseInput; -import edu.ie3.util.quantities.interfaces.HeatCapacity; -import edu.ie3.util.quantities.interfaces.ThermalConductance; -import java.util.UUID; -import javax.measure.quantity.Temperature; -import tech.units.indriya.ComparableQuantity; - -public class ThermalHouseInputFactory - extends AssetInputEntityFactory { - private static final String ETH_LOSSES = "ethLosses"; - private static final String ETH_CAPA = "ethCapa"; - private static final String TARGET_TEMPERATURE = "targetTemperature"; - private static final String UPPER_TEMPERATURE_LIMIT = "upperTemperatureLimit"; - private static final String LOWER_TEMPERATURE_LIMIT = "lowerTemperatureLimit"; - private static final String HOUSING_TYPE = "housingType"; - private static final String NUMBER_INHABITANTS = "numberInhabitants"; - - public ThermalHouseInputFactory() { - super(ThermalHouseInput.class); - } - - @Override - protected String[] getAdditionalFields() { - return new String[] { - ETH_LOSSES, - ETH_CAPA, - TARGET_TEMPERATURE, - UPPER_TEMPERATURE_LIMIT, - LOWER_TEMPERATURE_LIMIT, - HOUSING_TYPE, - NUMBER_INHABITANTS - }; - } - - @Override - protected ThermalHouseInput buildModel( - ThermalUnitInputEntityData data, - UUID uuid, - String id, - OperatorInput operator, - OperationTime operationTime) { - final ThermalBusInput busInput = data.getBusInput(); - final ComparableQuantity ethLosses = - data.getQuantity(ETH_LOSSES, StandardUnits.THERMAL_TRANSMISSION); - final ComparableQuantity ethCapa = - data.getQuantity(ETH_CAPA, StandardUnits.HEAT_CAPACITY); - final ComparableQuantity targetTemperature = - data.getQuantity(TARGET_TEMPERATURE, StandardUnits.TEMPERATURE); - final ComparableQuantity upperTemperatureLimit = - data.getQuantity(UPPER_TEMPERATURE_LIMIT, StandardUnits.TEMPERATURE); - final ComparableQuantity lowerTemperatureLimit = - data.getQuantity(LOWER_TEMPERATURE_LIMIT, StandardUnits.TEMPERATURE); - final String housingType = data.getField(HOUSING_TYPE); - final double numberInhabitants = data.getDouble(NUMBER_INHABITANTS); - return new ThermalHouseInput( - uuid, - id, - operator, - operationTime, - busInput, - ethLosses, - ethCapa, - targetTemperature, - upperTemperatureLimit, - lowerTemperatureLimit, - housingType, - numberInhabitants); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/ThermalUnitInputEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/ThermalUnitInputEntityData.java deleted file mode 100644 index c936b58f9..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/ThermalUnitInputEntityData.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input; - -import edu.ie3.datamodel.models.UniqueEntity; -import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.thermal.ThermalBusInput; -import java.util.Map; -import java.util.Objects; - -public class ThermalUnitInputEntityData extends AssetInputEntityData { - private final ThermalBusInput busInput; - - public ThermalUnitInputEntityData( - Map fieldsToAttributes, - Class entityClass, - ThermalBusInput busInput) { - super(fieldsToAttributes, entityClass); - this.busInput = busInput; - } - - public ThermalUnitInputEntityData( - Map fieldsToAttributes, - Class entityClass, - OperatorInput operator, - ThermalBusInput busInput) { - super(fieldsToAttributes, entityClass, operator); - this.busInput = busInput; - } - - /** - * Creates a new ThermalUnitInputEntityData object based on a given {@link AssetInputEntityData} - * object and a bus input - * - * @param entityData The AssetInputEntityData object to enhance - * @param busInput The thermal bus input - */ - public ThermalUnitInputEntityData(AssetInputEntityData entityData, ThermalBusInput busInput) { - super(entityData, entityData.getOperatorInput()); - this.busInput = busInput; - } - - public ThermalBusInput getBusInput() { - return busInput; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof ThermalUnitInputEntityData that)) return false; - if (!super.equals(o)) return false; - return busInput.equals(that.busInput); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), busInput); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/Transformer2WInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/Transformer2WInputFactory.java deleted file mode 100644 index a6046110f..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/Transformer2WInputFactory.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input; - -import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.input.NodeInput; -import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.connector.Transformer2WInput; -import edu.ie3.datamodel.models.input.connector.type.Transformer2WTypeInput; -import java.util.UUID; - -public class Transformer2WInputFactory - extends ConnectorInputEntityFactory< - Transformer2WInput, TypedConnectorInputEntityData> { - - private static final String TAP_POS = "tapPos"; - private static final String AUTO_TAP = "autoTap"; - - public Transformer2WInputFactory() { - super(Transformer2WInput.class); - } - - @Override - protected String[] getAdditionalFields() { - return new String[] {NODE_A, NODE_B, PARALLEL_DEVICES, TAP_POS, AUTO_TAP}; - } - - @Override - protected Transformer2WInput buildModel( - TypedConnectorInputEntityData data, - UUID uuid, - String id, - NodeInput nodeA, - NodeInput nodeB, - OperatorInput operator, - OperationTime operationTime) { - - final int parallelDevices = data.getInt(PARALLEL_DEVICES); - final Transformer2WTypeInput type = data.getType(); - final int tapPos = data.getInt(TAP_POS); - final boolean autoTap = data.getBoolean(AUTO_TAP); - - return new Transformer2WInput( - uuid, id, operator, operationTime, nodeA, nodeB, parallelDevices, type, tapPos, autoTap); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/Transformer3WInputEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/Transformer3WInputEntityData.java deleted file mode 100644 index deed94e8e..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/Transformer3WInputEntityData.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input; - -import edu.ie3.datamodel.models.UniqueEntity; -import edu.ie3.datamodel.models.input.NodeInput; -import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.connector.type.Transformer3WTypeInput; -import java.util.Map; -import java.util.Objects; - -public class Transformer3WInputEntityData - extends TypedConnectorInputEntityData { - private final NodeInput nodeC; - - public Transformer3WInputEntityData( - Map fieldsToAttributes, - Class entityClass, - NodeInput nodeA, - NodeInput nodeB, - NodeInput nodeC, - Transformer3WTypeInput type) { - super(fieldsToAttributes, entityClass, nodeA, nodeB, type); - this.nodeC = nodeC; - } - - public Transformer3WInputEntityData( - Map fieldsToAttributes, - Class entityClass, - OperatorInput operator, - NodeInput nodeA, - NodeInput nodeB, - NodeInput nodeC, - Transformer3WTypeInput type) { - super(fieldsToAttributes, entityClass, operator, nodeA, nodeB, type); - this.nodeC = nodeC; - } - - /** - * Creates a new Transformer3WInputEntityData object based on a given {@link - * ConnectorInputEntityData} object, a given third node as well as a given {@link - * Transformer3WTypeInput}. - * - * @param entityData The TypedConnectorInputEntityData object to enhance - * @param nodeC The third node - * @param type of the transformer - */ - public Transformer3WInputEntityData( - ConnectorInputEntityData entityData, NodeInput nodeC, Transformer3WTypeInput type) { - super(entityData, type); - this.nodeC = nodeC; - } - - /** - * Creates a new Transformer3WInputEntityData object based on a given {@link - * TypedConnectorInputEntityData} object and given third node - * - * @param entityData The TypedConnectorInputEntityData object to enhance - * @param nodeC The third node - */ - public Transformer3WInputEntityData( - TypedConnectorInputEntityData entityData, NodeInput nodeC) { - super(entityData, entityData.getType()); - this.nodeC = nodeC; - } - - public NodeInput getNodeC() { - return nodeC; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - Transformer3WInputEntityData that = (Transformer3WInputEntityData) o; - return Objects.equals(nodeC, that.nodeC); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), nodeC); - } - - @Override - public String toString() { - return "Transformer3WInputEntityData{" - + "fieldsToValues=" - + getFieldsToValues() - + ", targetClass=" - + getTargetClass() - + ", operatorInput=" - + getOperatorInput() - + ", nodeA=" - + getNodeA() - + ", nodeB=" - + getNodeB() - + ", nodeC=" - + nodeC - + ", type=" - + getType() - + '}'; - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/Transformer3WInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/Transformer3WInputFactory.java deleted file mode 100644 index 798c42c93..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/Transformer3WInputFactory.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input; - -import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.input.NodeInput; -import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.connector.Transformer3WInput; -import edu.ie3.datamodel.models.input.connector.type.Transformer3WTypeInput; -import java.util.UUID; - -public class Transformer3WInputFactory - extends ConnectorInputEntityFactory { - - private static final String TAP_POS = "tapPos"; - private static final String AUTO_TAP = "autoTap"; - private static final String NODE_C = "nodeC"; - - public Transformer3WInputFactory() { - super(Transformer3WInput.class); - } - - @Override - protected String[] getAdditionalFields() { - return new String[] {NODE_A, NODE_B, NODE_C, PARALLEL_DEVICES, TAP_POS, AUTO_TAP}; - } - - @Override - protected Transformer3WInput buildModel( - Transformer3WInputEntityData data, - UUID uuid, - String id, - NodeInput nodeA, - NodeInput nodeB, - OperatorInput operator, - OperationTime operationTime) { - final int parallelDevices = data.getInt(PARALLEL_DEVICES); - final NodeInput nodeC = data.getNodeC(); - final Transformer3WTypeInput type = data.getType(); - final int tapPos = data.getInt(TAP_POS); - final boolean autoTap = data.getBoolean(AUTO_TAP); - - return new Transformer3WInput( - uuid, - id, - operator, - operationTime, - nodeA, - nodeB, - nodeC, - parallelDevices, - type, - tapPos, - autoTap); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/TypedConnectorInputEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/TypedConnectorInputEntityData.java deleted file mode 100644 index c70bb2231..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/TypedConnectorInputEntityData.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input; - -import edu.ie3.datamodel.models.UniqueEntity; -import edu.ie3.datamodel.models.input.AssetTypeInput; -import edu.ie3.datamodel.models.input.NodeInput; -import edu.ie3.datamodel.models.input.OperatorInput; -import java.util.Map; -import java.util.Objects; - -/** - * Data used for those classes of {@link edu.ie3.datamodel.models.input.connector.ConnectorInput} - * that need an instance of some type T of {@link - * edu.ie3.datamodel.models.input.connector.type.Transformer2WTypeInput} as well. - * - * @param Subclass of {@link AssetTypeInput} that is required for the construction of the - * ConnectorInput - */ -public class TypedConnectorInputEntityData - extends ConnectorInputEntityData { - - private final T type; - - /** - * Creates a new TypedConnectorInputEntityData object for a connector input that needs a type - * input as well. It sets the operator to default. - * - * @param fieldsToAttributes attribute map: field name to value - * @param entityClass class of the entity to be created with this data - * @param nodeA input nodeA - * @param nodeB input nodeB - * @param type type input - */ - public TypedConnectorInputEntityData( - Map fieldsToAttributes, - Class entityClass, - NodeInput nodeA, - NodeInput nodeB, - T type) { - super(fieldsToAttributes, entityClass, nodeA, nodeB); - this.type = type; - } - - /** - * Creates a new TypedConnectorInputEntityData object for an operable connector input that needs a - * type input as well - * - * @param fieldsToAttributes attribute map: field name to value - * @param entityClass class of the entity to be created with this data - * @param operator specific operator to use - * @param nodeA input nodeA - * @param nodeB input nodeB - * @param type type input - */ - public TypedConnectorInputEntityData( - Map fieldsToAttributes, - Class entityClass, - OperatorInput operator, - NodeInput nodeA, - NodeInput nodeB, - T type) { - super(fieldsToAttributes, entityClass, operator, nodeA, nodeB); - this.type = type; - } - - /** - * Creates a new TypedConnectorInputEntityData object based on a given {@link - * ConnectorInputEntityData} object and given type - * - * @param entityData The ConnectorInputEntityData object to enhance - * @param type type input - */ - public TypedConnectorInputEntityData(ConnectorInputEntityData entityData, T type) { - super(entityData, entityData.getNodeA(), entityData.getNodeB()); - this.type = type; - } - - public T getType() { - return type; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - TypedConnectorInputEntityData that = (TypedConnectorInputEntityData) o; - return type.equals(that.type); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), type); - } - - @Override - public String toString() { - return "TypedConnectorInputEntityData{" - + "fieldsToValues=" - + getFieldsToValues() - + ", targetClass=" - + getTargetClass() - + ", operatorInput=" - + getOperatorInput().getUuid() - + ", nodeA=" - + getNodeA().getUuid() - + ", nodeB=" - + getNodeB().getUuid() - + ", type=" - + type.getUuid() - + '}'; - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/graphics/GraphicInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/graphics/GraphicInputFactory.java deleted file mode 100644 index b7e872525..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/graphics/GraphicInputFactory.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input.graphics; - -import edu.ie3.datamodel.io.factory.EntityData; -import edu.ie3.datamodel.io.factory.EntityFactory; -import edu.ie3.datamodel.models.input.NodeInput; -import edu.ie3.datamodel.models.input.graphics.GraphicInput; -import edu.ie3.util.geo.GeoUtils; -import java.util.*; -import org.locationtech.jts.geom.LineString; - -/** - * Abstract factory implementation for all {@link GraphicInput} elements - * - * @version 0.1 - * @since 08.04.20 - */ -public abstract class GraphicInputFactory - extends EntityFactory { - - private static final String UUID = "uuid"; - private static final String GRAPHIC_LAYER = "graphicLayer"; - private static final String PATH_LINE_STRING = "path"; - - @SafeVarargs - protected GraphicInputFactory(Class... allowedClasses) { - super(allowedClasses); - } - - /** - * Returns list of sets of attribute names that the entity requires to be built. - * - *

The mandatory attributes required to create an {@link GraphicInput} are enhanced with custom - * attribute names that each subclass factory determines in {@link #getAdditionalFields()}. - * - * @param entityClass class of the entity - * @return list of possible attribute sets - */ - @Override - protected List> getFields(Class entityClass) { - Set constructorParamsMin = newSet(UUID, GRAPHIC_LAYER, PATH_LINE_STRING); - final String[] additionalFields = getAdditionalFields(); - constructorParamsMin = expandSet(constructorParamsMin, additionalFields); - return Collections.singletonList(constructorParamsMin); - } - - /** - * Returns fields other than the required fields of {@link GraphicInput} that have to be present. - * - * @return Array of field names, can be empty but not null - */ - protected abstract String[] getAdditionalFields(); - - @Override - protected T buildModel(D data) { - UUID uuid = data.getUUID(UUID); - - final String graphicLayer = data.getField(GRAPHIC_LAYER); - final LineString path = - data.getLineString(PATH_LINE_STRING) - .orElse( - GeoUtils.buildSafeLineStringBetweenCoords( - NodeInput.DEFAULT_GEO_POSITION.getCoordinate(), - NodeInput.DEFAULT_GEO_POSITION.getCoordinate())); - - return buildModel(data, uuid, graphicLayer, path); - } - - /** - * Creates a graphic input entity with given parameters - * - * @param data entity data - * @param uuid UUID of the input entity - * @param graphicLayer Identifier of the graphic layer to place the object on - * @param path Line string of the drawing - * @return newly created asset object - */ - protected abstract T buildModel(D data, UUID uuid, String graphicLayer, LineString path); -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/graphics/LineGraphicInputEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/graphics/LineGraphicInputEntityData.java deleted file mode 100644 index 48b87b088..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/graphics/LineGraphicInputEntityData.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input.graphics; - -import edu.ie3.datamodel.io.factory.EntityData; -import edu.ie3.datamodel.models.input.connector.LineInput; -import edu.ie3.datamodel.models.input.graphics.LineGraphicInput; -import java.util.Map; -import java.util.Objects; - -/** - * Data used by {@link LineGraphicInputFactory} used to create instances of {@link - * edu.ie3.datamodel.models.input.graphics.LineGraphicInput}s holding one {@link LineInput} entity. - */ -public class LineGraphicInputEntityData extends EntityData { - - /** The LineInput to this graphic data */ - private final LineInput line; - - /** - * Creates a new EntityData object - * - * @param fieldsToAttributes attribute map: field name to value - * @param line Referenced electrical line - */ - public LineGraphicInputEntityData(Map fieldsToAttributes, LineInput line) { - super(fieldsToAttributes, LineGraphicInput.class); - this.line = line; - } - - /** - * Creates a new LineGraphicInputEntityData object based on a given {@link EntityData} object and - * a line - * - * @param entityData The EntityData object to enhance - * @param line Referenced electrical line - */ - public LineGraphicInputEntityData(EntityData entityData, LineInput line) { - super(entityData); - this.line = line; - } - - public LineInput getLine() { - return line; - } - - @Override - public String toString() { - return "LineGraphicInputEntityData{" - + "line=" - + line.getUuid() - + ", fieldsToValues=" - + getFieldsToValues() - + ", targetClass=" - + getTargetClass() - + '}'; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - LineGraphicInputEntityData that = (LineGraphicInputEntityData) o; - return getLine().equals(that.getLine()); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), getLine()); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/graphics/LineGraphicInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/graphics/LineGraphicInputFactory.java deleted file mode 100644 index 7ebd4f1a1..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/graphics/LineGraphicInputFactory.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input.graphics; - -import edu.ie3.datamodel.models.input.graphics.LineGraphicInput; -import java.util.UUID; -import org.locationtech.jts.geom.LineString; - -/** - * Factory to create {@link LineGraphicInput} entities - * - * @version 0.1 - * @since 08.04.20 - */ -public final class LineGraphicInputFactory - extends GraphicInputFactory { - - private static final String LINE = "line"; - - public LineGraphicInputFactory() { - super(LineGraphicInput.class); - } - - @Override - protected String[] getAdditionalFields() { - return new String[] {LINE}; - } - - @Override - protected LineGraphicInput buildModel( - LineGraphicInputEntityData data, UUID uuid, String graphicLayer, LineString path) { - return new LineGraphicInput(uuid, graphicLayer, path, data.getLine()); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/graphics/NodeGraphicInputEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/graphics/NodeGraphicInputEntityData.java deleted file mode 100644 index edba66b27..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/graphics/NodeGraphicInputEntityData.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input.graphics; - -import edu.ie3.datamodel.io.factory.EntityData; -import edu.ie3.datamodel.models.input.NodeInput; -import edu.ie3.datamodel.models.input.graphics.NodeGraphicInput; -import java.util.Map; -import java.util.Objects; - -/** - * Data used by {@link NodeGraphicInputFactory} used to create instances of {@link - * edu.ie3.datamodel.models.input.graphics.NodeGraphicInput}s holding one {@link NodeInput} entity. - */ -public class NodeGraphicInputEntityData extends EntityData { - - /** The NodeInput to this graphic data */ - private final NodeInput node; - - /** - * Creates a new NodeGraphicInputentityData object for an a NodeGraphicInput - * - * @param fieldsToAttributes attribute map: field name to value - * @param node node input element of this graphic - */ - public NodeGraphicInputEntityData(Map fieldsToAttributes, NodeInput node) { - super(fieldsToAttributes, NodeGraphicInput.class); - this.node = node; - } - - /** - * Creates a new NodeGraphicInputEntityData object based on a given {@link EntityData} object and - * a node - * - * @param entityData The EntityData object to enhance - * @param node node input element of this graphic - */ - public NodeGraphicInputEntityData(EntityData entityData, NodeInput node) { - super(entityData); - this.node = node; - } - - public NodeInput getNode() { - return node; - } - - @Override - public String toString() { - return "NodeGraphicInputEntityData{" - + "node=" - + node.getUuid() - + ", fieldsToValues=" - + getFieldsToValues() - + ", targetClass=" - + getTargetClass() - + '}'; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - NodeGraphicInputEntityData that = (NodeGraphicInputEntityData) o; - return getNode().equals(that.getNode()); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), getNode()); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/graphics/NodeGraphicInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/graphics/NodeGraphicInputFactory.java deleted file mode 100644 index b443e6dcf..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/graphics/NodeGraphicInputFactory.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input.graphics; - -import edu.ie3.datamodel.models.input.NodeInput; -import edu.ie3.datamodel.models.input.graphics.NodeGraphicInput; -import java.util.UUID; -import org.locationtech.jts.geom.LineString; -import org.locationtech.jts.geom.Point; - -/** - * Factory to create {@link NodeGraphicInput} entities - * - * @version 0.1 - * @since 08.04.20 - */ -public final class NodeGraphicInputFactory - extends GraphicInputFactory { - - private static final String POINT = "point"; - private static final String NODE = "node"; - - public NodeGraphicInputFactory() { - super(NodeGraphicInput.class); - } - - @Override - protected String[] getAdditionalFields() { - return new String[] {POINT, NODE}; - } - - @Override - protected NodeGraphicInput buildModel( - NodeGraphicInputEntityData data, UUID uuid, String graphicLayer, LineString path) { - final Point point = data.getPoint(POINT).orElse(NodeInput.DEFAULT_GEO_POSITION); - return new NodeGraphicInput(uuid, graphicLayer, path, data.getNode(), point); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/BmInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/BmInputFactory.java deleted file mode 100644 index 0c2b36b2a..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/BmInputFactory.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input.participant; - -import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.StandardUnits; -import edu.ie3.datamodel.models.input.EmInput; -import edu.ie3.datamodel.models.input.NodeInput; -import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.system.BmInput; -import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; -import edu.ie3.datamodel.models.input.system.type.BmTypeInput; -import edu.ie3.util.quantities.interfaces.EnergyPrice; -import java.util.UUID; -import tech.units.indriya.ComparableQuantity; - -public class BmInputFactory - extends SystemParticipantInputEntityFactory< - BmInput, SystemParticipantTypedEntityData> { - private static final String TYPE = "type"; - private static final String MARKET_REACTION = "marketReaction"; - private static final String COST_CONTROLLED = "costControlled"; - private static final String FEED_IN_TARIFF = "feedInTariff"; - - public BmInputFactory() { - super(BmInput.class); - } - - @Override - protected String[] getAdditionalFields() { - return new String[] {TYPE, MARKET_REACTION, COST_CONTROLLED, FEED_IN_TARIFF}; - } - - @Override - protected BmInput buildModel( - SystemParticipantTypedEntityData data, - UUID uuid, - String id, - NodeInput node, - ReactivePowerCharacteristic qCharacteristics, - OperatorInput operator, - OperationTime operationTime) { - final EmInput em = data.getControllingEm().orElse(null); - final BmTypeInput typeInput = data.getTypeInput(); - final boolean marketReaction = data.getBoolean(MARKET_REACTION); - final boolean costControlled = data.getBoolean(COST_CONTROLLED); - final ComparableQuantity feedInTariff = - data.getQuantity(FEED_IN_TARIFF, StandardUnits.ENERGY_PRICE); - - return new BmInput( - uuid, - id, - operator, - operationTime, - node, - qCharacteristics, - em, - typeInput, - marketReaction, - costControlled, - feedInTariff); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputEntityData.java deleted file mode 100644 index 81c11572a..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputEntityData.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input.participant; - -import edu.ie3.datamodel.models.input.EmInput; -import edu.ie3.datamodel.models.input.NodeInput; -import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.system.ChpInput; -import edu.ie3.datamodel.models.input.system.type.ChpTypeInput; -import edu.ie3.datamodel.models.input.thermal.ThermalBusInput; -import edu.ie3.datamodel.models.input.thermal.ThermalStorageInput; -import java.util.Map; -import java.util.Objects; - -public class ChpInputEntityData extends SystemParticipantTypedEntityData { - private final ThermalBusInput thermalBusInput; - private final ThermalStorageInput thermalStorageInput; - - public ChpInputEntityData( - Map fieldsToAttributes, - NodeInput node, - EmInput em, - ChpTypeInput typeInput, - ThermalBusInput thermalBusInput, - ThermalStorageInput thermalStorageInput) { - super(fieldsToAttributes, ChpInput.class, node, em, typeInput); - this.thermalBusInput = thermalBusInput; - this.thermalStorageInput = thermalStorageInput; - } - - public ChpInputEntityData( - Map fieldsToAttributes, - OperatorInput operator, - NodeInput node, - EmInput em, - ChpTypeInput typeInput, - ThermalBusInput thermalBusInput, - ThermalStorageInput thermalStorageInput) { - super(fieldsToAttributes, ChpInput.class, operator, node, em, typeInput); - this.thermalBusInput = thermalBusInput; - this.thermalStorageInput = thermalStorageInput; - } - - /** - * Creates a new ChpInputEntityData object based on a given {@link - * SystemParticipantTypedEntityData} object and a thermal bus and storage input - * - * @param entityData The SystemParticipantTypedEntityData object to enhance - * @param thermalBusInput The thermal bus input - * @param thermalStorageInput The thermal storage input - */ - public ChpInputEntityData( - SystemParticipantTypedEntityData entityData, - ThermalBusInput thermalBusInput, - ThermalStorageInput thermalStorageInput) { - super(entityData, entityData.getTypeInput()); - this.thermalBusInput = thermalBusInput; - this.thermalStorageInput = thermalStorageInput; - } - - public ThermalBusInput getThermalBusInput() { - return thermalBusInput; - } - - public ThermalStorageInput getThermalStorageInput() { - return thermalStorageInput; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof ChpInputEntityData that)) return false; - if (!super.equals(o)) return false; - return thermalBusInput.equals(that.thermalBusInput) - && thermalStorageInput.equals(that.thermalStorageInput); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), thermalBusInput, thermalStorageInput); - } - - @Override - public String toString() { - return "ChpInputEntityData{" - + "thermalBusInput=" - + thermalBusInput.getUuid() - + ", thermalStorageInput=" - + thermalStorageInput.getUuid() - + ", typeInput=" - + getTypeInput().getUuid() - + ", node=" - + getNode().getUuid() - + ", operatorInput=" - + getOperatorInput().getUuid() - + ", fieldsToValues=" - + getFieldsToValues() - + ", targetClass=" - + getTargetClass() - + '}'; - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactory.java deleted file mode 100644 index 208c15b98..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactory.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input.participant; - -import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.input.EmInput; -import edu.ie3.datamodel.models.input.NodeInput; -import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.system.ChpInput; -import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; -import java.util.UUID; - -public class ChpInputFactory - extends SystemParticipantInputEntityFactory { - private static final String THERMAL_BUS = "thermalBus"; - private static final String TYPE = "type"; - private static final String THERMAL_STORAGE = "thermalStorage"; - private static final String MARKET_REACTION = "marketReaction"; - - public ChpInputFactory() { - super(ChpInput.class); - } - - @Override - protected String[] getAdditionalFields() { - return new String[] {THERMAL_BUS, TYPE, THERMAL_STORAGE, MARKET_REACTION}; - } - - @Override - protected ChpInput buildModel( - ChpInputEntityData data, - UUID uuid, - String id, - NodeInput node, - ReactivePowerCharacteristic qCharacteristics, - OperatorInput operator, - OperationTime operationTime) { - final EmInput em = data.getControllingEm().orElse(null); - final boolean marketReaction = data.getBoolean(MARKET_REACTION); - - return new ChpInput( - uuid, - id, - operator, - operationTime, - node, - data.getThermalBusInput(), - qCharacteristics, - em, - data.getTypeInput(), - data.getThermalStorageInput(), - marketReaction); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvInputFactory.java deleted file mode 100644 index 1f258467b..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvInputFactory.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input.participant; - -import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.input.EmInput; -import edu.ie3.datamodel.models.input.NodeInput; -import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.system.EvInput; -import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; -import edu.ie3.datamodel.models.input.system.type.EvTypeInput; -import java.util.UUID; - -public class EvInputFactory - extends SystemParticipantInputEntityFactory< - EvInput, SystemParticipantTypedEntityData> { - private static final String TYPE = "type"; - - public EvInputFactory() { - super(EvInput.class); - } - - @Override - protected String[] getAdditionalFields() { - return new String[] {TYPE}; - } - - @Override - protected EvInput buildModel( - SystemParticipantTypedEntityData data, - UUID uuid, - String id, - NodeInput node, - ReactivePowerCharacteristic qCharacteristics, - OperatorInput operator, - OperationTime operationTime) { - final EmInput em = data.getControllingEm().orElse(null); - - return new EvInput( - uuid, id, operator, operationTime, node, qCharacteristics, em, data.getTypeInput()); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactory.java deleted file mode 100644 index 46b75a9f9..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactory.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input.participant; - -import edu.ie3.datamodel.exceptions.ChargingPointTypeException; -import edu.ie3.datamodel.exceptions.FactoryException; -import edu.ie3.datamodel.exceptions.ParsingException; -import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.input.EmInput; -import edu.ie3.datamodel.models.input.NodeInput; -import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.system.EvcsInput; -import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; -import edu.ie3.datamodel.models.input.system.type.chargingpoint.ChargingPointType; -import edu.ie3.datamodel.models.input.system.type.chargingpoint.ChargingPointTypeUtils; -import edu.ie3.datamodel.models.input.system.type.evcslocation.EvcsLocationType; -import edu.ie3.datamodel.models.input.system.type.evcslocation.EvcsLocationTypeUtils; -import java.util.UUID; - -/** - * Factory to create instances of {@link EvcsInput}s based on {@link SystemParticipantEntityData} - * and additional fields. - * - * @version 0.1 - * @since 26.07.20 - */ -public class EvcsInputFactory - extends SystemParticipantInputEntityFactory { - - private static final String TYPE = "type"; - private static final String CHARGING_POINTS = "chargingPoints"; - private static final String COS_PHI_RATED = "cosPhiRated"; - private static final String LOCATION_TYPE = "locationType"; - private static final String V2G_SUPPORT = "v2gSupport"; - - public EvcsInputFactory() { - super(EvcsInput.class); - } - - @Override - protected String[] getAdditionalFields() { - return new String[] {TYPE, CHARGING_POINTS, COS_PHI_RATED, LOCATION_TYPE, V2G_SUPPORT}; - } - - @Override - protected EvcsInput buildModel( - SystemParticipantEntityData data, - UUID uuid, - String id, - NodeInput node, - ReactivePowerCharacteristic qCharacteristics, - OperatorInput operator, - OperationTime operationTime) { - final EmInput em = data.getControllingEm().orElse(null); - final ChargingPointType type; - try { - type = ChargingPointTypeUtils.parse(data.getField(TYPE)); - } catch (ChargingPointTypeException e) { - throw new FactoryException( - String.format( - "Exception while trying to parse field \"%s\" with supposed int value \"%s\"", - TYPE, data.getField(TYPE)), - e); - } - final int chargingPoints = data.getInt(CHARGING_POINTS); - final double cosPhi = data.getDouble(COS_PHI_RATED); - - final EvcsLocationType locationType; - try { - locationType = EvcsLocationTypeUtils.parse(data.getField(LOCATION_TYPE)); - } catch (ParsingException e) { - throw new FactoryException( - String.format( - "Exception while trying to parse field \"%s\" with supposed int value \"%s\"", - LOCATION_TYPE, data.getField(LOCATION_TYPE)), - e); - } - - final boolean v2gSupport = data.getBoolean(V2G_SUPPORT); - - return new EvcsInput( - uuid, - id, - operator, - operationTime, - node, - qCharacteristics, - em, - type, - chargingPoints, - cosPhi, - locationType, - v2gSupport); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactory.java deleted file mode 100644 index 257c40974..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactory.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input.participant; - -import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.StandardUnits; -import edu.ie3.datamodel.models.input.EmInput; -import edu.ie3.datamodel.models.input.NodeInput; -import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.system.FixedFeedInInput; -import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; -import java.util.UUID; -import javax.measure.quantity.Power; -import tech.units.indriya.ComparableQuantity; - -public class FixedFeedInInputFactory - extends SystemParticipantInputEntityFactory { - - private static final String S_RATED = "sRated"; - private static final String COSPHI_RATED = "cosPhiRated"; - - public FixedFeedInInputFactory() { - super(FixedFeedInInput.class); - } - - @Override - protected String[] getAdditionalFields() { - return new String[] {S_RATED, COSPHI_RATED}; - } - - @Override - protected FixedFeedInInput buildModel( - SystemParticipantEntityData data, - UUID uuid, - String id, - NodeInput node, - ReactivePowerCharacteristic qCharacteristics, - OperatorInput operator, - OperationTime operationTime) { - final EmInput em = data.getControllingEm().orElse(null); - final ComparableQuantity sRated = data.getQuantity(S_RATED, StandardUnits.S_RATED); - final double cosPhiRated = data.getDouble(COSPHI_RATED); - - return new FixedFeedInInput( - uuid, id, operator, operationTime, node, qCharacteristics, em, sRated, cosPhiRated); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputEntityData.java deleted file mode 100644 index 83f01970f..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputEntityData.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input.participant; - -import edu.ie3.datamodel.models.input.EmInput; -import edu.ie3.datamodel.models.input.NodeInput; -import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.system.HpInput; -import edu.ie3.datamodel.models.input.system.type.HpTypeInput; -import edu.ie3.datamodel.models.input.thermal.ThermalBusInput; -import java.util.Map; -import java.util.Objects; - -public class HpInputEntityData extends SystemParticipantTypedEntityData { - private final ThermalBusInput thermalBusInput; - - public HpInputEntityData( - Map fieldsToAttributes, - NodeInput node, - EmInput em, - HpTypeInput typeInput, - ThermalBusInput thermalBusInput) { - super(fieldsToAttributes, HpInput.class, node, em, typeInput); - this.thermalBusInput = thermalBusInput; - } - - public HpInputEntityData( - Map fieldsToAttributes, - OperatorInput operator, - NodeInput node, - EmInput em, - HpTypeInput typeInput, - ThermalBusInput thermalBusInput) { - super(fieldsToAttributes, HpInput.class, operator, node, em, typeInput); - this.thermalBusInput = thermalBusInput; - } - - /** - * Creates a new HpInputEntityData object based on a given {@link - * SystemParticipantTypedEntityData} object and given thermal bus input - * - * @param entityData The SystemParticipantTypedEntityData object to enhance - * @param thermalBusInput The thermal bus input - */ - public HpInputEntityData( - SystemParticipantTypedEntityData entityData, ThermalBusInput thermalBusInput) { - super(entityData, entityData.getTypeInput()); - this.thermalBusInput = thermalBusInput; - } - - public ThermalBusInput getThermalBusInput() { - return thermalBusInput; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof HpInputEntityData that)) return false; - if (!super.equals(o)) return false; - return thermalBusInput.equals(that.thermalBusInput); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), thermalBusInput); - } - - @Override - public String toString() { - return "HpInputEntityData{" - + "thermalBusInput=" - + thermalBusInput.getUuid() - + ", typeInput=" - + getTypeInput().getUuid() - + ", node=" - + getNode().getUuid() - + ", operatorInput=" - + getOperatorInput().getUuid() - + ", fieldsToValues=" - + getFieldsToValues() - + ", targetClass=" - + getTargetClass() - + '}'; - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputFactory.java deleted file mode 100644 index 27943ee29..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputFactory.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input.participant; - -import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.input.EmInput; -import edu.ie3.datamodel.models.input.NodeInput; -import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.system.HpInput; -import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; -import java.util.UUID; - -public class HpInputFactory - extends SystemParticipantInputEntityFactory { - private static final String TYPE = "type"; - private static final String THERMAL_BUS = "thermalBus"; - - public HpInputFactory() { - super(HpInput.class); - } - - @Override - protected String[] getAdditionalFields() { - return new String[] {TYPE, THERMAL_BUS}; - } - - @Override - protected HpInput buildModel( - HpInputEntityData data, - UUID uuid, - String id, - NodeInput node, - ReactivePowerCharacteristic qCharacteristics, - OperatorInput operator, - OperationTime operationTime) { - final EmInput em = data.getControllingEm().orElse(null); - - return new HpInput( - uuid, - id, - operator, - operationTime, - node, - data.getThermalBusInput(), - qCharacteristics, - em, - data.getTypeInput()); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactory.java deleted file mode 100644 index 71af7c515..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactory.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input.participant; - -import edu.ie3.datamodel.exceptions.ParsingException; -import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.StandardUnits; -import edu.ie3.datamodel.models.input.EmInput; -import edu.ie3.datamodel.models.input.NodeInput; -import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.system.LoadInput; -import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; -import edu.ie3.datamodel.models.profile.LoadProfile; -import java.util.UUID; -import javax.measure.quantity.Energy; -import javax.measure.quantity.Power; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import tech.units.indriya.ComparableQuantity; - -public class LoadInputFactory - extends SystemParticipantInputEntityFactory { - private static final Logger logger = LoggerFactory.getLogger(LoadInputFactory.class); - - private static final String LOAD_PROFILE = "loadProfile"; - private static final String E_CONS_ANNUAL = "eConsAnnual"; - private static final String S_RATED = "sRated"; - private static final String COS_PHI = "cosPhiRated"; - - public LoadInputFactory() { - super(LoadInput.class); - } - - @Override - protected String[] getAdditionalFields() { - return new String[] {LOAD_PROFILE, E_CONS_ANNUAL, S_RATED, COS_PHI}; - } - - @Override - protected LoadInput buildModel( - SystemParticipantEntityData data, - UUID uuid, - String id, - NodeInput node, - ReactivePowerCharacteristic qCharacteristics, - OperatorInput operator, - OperationTime operationTime) { - LoadProfile loadProfile; - try { - loadProfile = LoadProfile.parse(data.getField(LOAD_PROFILE)); - } catch (ParsingException e) { - logger.warn( - "Cannot parse the standard load profile \"{}\" of load \"{}\". Assign no load profile instead.", - data.getField(LOAD_PROFILE), - id); - loadProfile = LoadProfile.DefaultLoadProfiles.NO_LOAD_PROFILE; - } - final EmInput em = data.getControllingEm().orElse(null); - - final ComparableQuantity eConsAnnual = - data.getQuantity(E_CONS_ANNUAL, StandardUnits.ENERGY_IN); - final ComparableQuantity sRated = data.getQuantity(S_RATED, StandardUnits.S_RATED); - final double cosPhi = data.getDouble(COS_PHI); - - return new LoadInput( - uuid, - id, - operator, - operationTime, - node, - qCharacteristics, - em, - loadProfile, - eConsAnnual, - sRated, - cosPhi); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/PvInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/PvInputFactory.java deleted file mode 100644 index 70f7253fc..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/PvInputFactory.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input.participant; - -import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.StandardUnits; -import edu.ie3.datamodel.models.input.EmInput; -import edu.ie3.datamodel.models.input.NodeInput; -import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.system.PvInput; -import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; -import java.util.UUID; -import javax.measure.quantity.Angle; -import javax.measure.quantity.Dimensionless; -import javax.measure.quantity.Power; -import tech.units.indriya.ComparableQuantity; - -public class PvInputFactory - extends SystemParticipantInputEntityFactory { - private static final String ALBEDO = "albedo"; - private static final String AZIMUTH = "azimuth"; - private static final String ETA_CONV = "etaConv"; - private static final String ELEVATION_ANGLE = "elevationAngle"; - private static final String KG = "kG"; - private static final String KT = "kT"; - private static final String MARKET_REACTION = "marketReaction"; - private static final String S_RATED = "sRated"; - private static final String COS_PHI_RATED = "cosPhiRated"; - - public PvInputFactory() { - super(PvInput.class); - } - - @Override - protected String[] getAdditionalFields() { - return new String[] { - ALBEDO, AZIMUTH, ETA_CONV, ELEVATION_ANGLE, KG, KT, MARKET_REACTION, S_RATED, COS_PHI_RATED - }; - } - - @Override - protected PvInput buildModel( - SystemParticipantEntityData data, - UUID uuid, - String id, - NodeInput node, - ReactivePowerCharacteristic qCharacteristics, - OperatorInput operator, - OperationTime operationTime) { - final EmInput em = data.getControllingEm().orElse(null); - final double albedo = data.getDouble(ALBEDO); - final ComparableQuantity azimuth = data.getQuantity(AZIMUTH, StandardUnits.AZIMUTH); - final ComparableQuantity etaConv = - data.getQuantity(ETA_CONV, StandardUnits.EFFICIENCY); - final ComparableQuantity elevationAngle = - data.getQuantity(ELEVATION_ANGLE, StandardUnits.SOLAR_ELEVATION_ANGLE); - final double kG = data.getDouble(KG); - final double kT = data.getDouble(KT); - final boolean marketReaction = data.getBoolean(MARKET_REACTION); - final ComparableQuantity sRated = data.getQuantity(S_RATED, StandardUnits.S_RATED); - final double cosPhi = data.getDouble(COS_PHI_RATED); - - return new PvInput( - uuid, - id, - operator, - operationTime, - node, - qCharacteristics, - em, - albedo, - azimuth, - etaConv, - elevationAngle, - kG, - kT, - marketReaction, - sRated, - cosPhi); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactory.java deleted file mode 100644 index 82b701f45..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactory.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input.participant; - -import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.input.EmInput; -import edu.ie3.datamodel.models.input.NodeInput; -import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.system.StorageInput; -import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; -import edu.ie3.datamodel.models.input.system.type.StorageTypeInput; -import java.util.UUID; - -public class StorageInputFactory - extends SystemParticipantInputEntityFactory< - StorageInput, SystemParticipantTypedEntityData> { - private static final String TYPE = "type"; - - public StorageInputFactory() { - super(StorageInput.class); - } - - @Override - protected String[] getAdditionalFields() { - return new String[] {TYPE}; - } - - @Override - protected StorageInput buildModel( - SystemParticipantTypedEntityData data, - UUID uuid, - String id, - NodeInput node, - ReactivePowerCharacteristic qCharacteristics, - OperatorInput operator, - OperationTime operationTime) { - final EmInput em = data.getControllingEm().orElse(null); - final StorageTypeInput typeInput = data.getTypeInput(); - return new StorageInput( - uuid, id, operator, operationTime, node, qCharacteristics, em, typeInput); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantEntityData.java deleted file mode 100644 index 5304124f2..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantEntityData.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * © 2023. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input.participant; - -import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData; -import edu.ie3.datamodel.models.UniqueEntity; -import edu.ie3.datamodel.models.input.EmInput; -import edu.ie3.datamodel.models.input.NodeInput; -import edu.ie3.datamodel.models.input.OperatorInput; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -/** - * Data used for those classes of {@link - * edu.ie3.datamodel.models.input.system.SystemParticipantInput}, including an (optional) link to an - * {@link EmInput} entity. - */ -public class SystemParticipantEntityData extends NodeAssetInputEntityData { - - /** Energy management unit that is managing the system participant. Can be null. */ - private final EmInput controllingEm; - - /** - * Creates a new SystemParticipantEntityData object for an operated, always on system participant - * input - * - * @param fieldsToAttributes attribute map: field name to value - * @param entityClass class of the entity to be created with this data - * @param node input node - * @param controllingEm The energy management unit that is managing the system participant. Null, - * if the system participant is not managed. - */ - public SystemParticipantEntityData( - Map fieldsToAttributes, - Class entityClass, - NodeInput node, - EmInput controllingEm) { - super(fieldsToAttributes, entityClass, node); - this.controllingEm = controllingEm; - } - - public Optional getControllingEm() { - return Optional.ofNullable(controllingEm); - } - - /** - * Creates a new SystemParticipantEntityData object for an operable system participant input - * - * @param fieldsToAttributes attribute map: field name to value - * @param entityClass class of the entity to be created with this data - * @param operator operator input - * @param node input node - * @param controllingEm The energy management unit that is managing the system participant. Null, - * if the system participant is not managed. - */ - public SystemParticipantEntityData( - Map fieldsToAttributes, - Class entityClass, - OperatorInput operator, - NodeInput node, - EmInput controllingEm) { - super(fieldsToAttributes, entityClass, operator, node); - this.controllingEm = controllingEm; - } - - /** - * Creates a new SystemParticipantEntityData object based on a given {@link - * NodeAssetInputEntityData} object and given energy management unit - * - * @param nodeAssetInputEntityData The node asset entity data object to use attributes of - * @param controllingEm The energy management unit that is managing the system participant. Null, - * if the system participant is not managed. - */ - public SystemParticipantEntityData( - NodeAssetInputEntityData nodeAssetInputEntityData, EmInput controllingEm) { - super(nodeAssetInputEntityData, nodeAssetInputEntityData.getNode()); - this.controllingEm = controllingEm; - } - - @Override - public String toString() { - return "SystemParticipantEntityData{" - + "em=" - + getControllingEm().map(EmInput::toString).orElse("") - + ", node=" - + getNode().getUuid() - + ", operatorInput=" - + getOperatorInput().getUuid() - + ", fieldsToValues=" - + getFieldsToValues() - + ", targetClass=" - + getTargetClass() - + '}'; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - SystemParticipantEntityData that = (SystemParticipantEntityData) o; - return getControllingEm().equals(that.getControllingEm()); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), getControllingEm()); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantInputEntityFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantInputEntityFactory.java deleted file mode 100644 index 035747601..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantInputEntityFactory.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input.participant; - -import edu.ie3.datamodel.exceptions.FactoryException; -import edu.ie3.datamodel.exceptions.ParsingException; -import edu.ie3.datamodel.io.factory.input.AssetInputEntityFactory; -import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData; -import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.input.NodeInput; -import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.system.SystemParticipantInput; -import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; -import java.util.*; - -/** - * Abstract factory class for creating {@link SystemParticipantInput} entities with {@link - * NodeAssetInputEntityData} data objects. - * - * @param Type of entity that this factory can create. Must be a subclass of {@link - * SystemParticipantInput} - * @param Type of data class that is required for entity creation - * @version 0.1 - * @since 28.01.20 - */ -public abstract class SystemParticipantInputEntityFactory< - T extends SystemParticipantInput, D extends SystemParticipantEntityData> - extends AssetInputEntityFactory { - - private static final String NODE = "node"; - - private static final String Q_CHARACTERISTICS = "qCharacteristics"; - - public static final String CONTROLLING_EM = "controllingEm"; - - @SafeVarargs - protected SystemParticipantInputEntityFactory(Class... allowedClasses) { - super(allowedClasses); - } - - @Override - protected List> getFields(Class entityClass) { - List> fields = new ArrayList<>(super.getFields(entityClass)); - - for (Set set : fields) { - set.add(Q_CHARACTERISTICS); - set.add(NODE); - set.add(CONTROLLING_EM); - } - - return fields; - } - - @Override - protected T buildModel( - D data, UUID uuid, String id, OperatorInput operator, OperationTime operationTime) { - NodeInput node = data.getNode(); - ReactivePowerCharacteristic qCharacteristics; - try { - qCharacteristics = ReactivePowerCharacteristic.parse(data.getField(Q_CHARACTERISTICS)); - } catch (ParsingException e) { - throw new FactoryException( - "Cannot parse the following reactive power characteristic: '" - + data.getField(Q_CHARACTERISTICS) - + "'", - e); - } - - return buildModel(data, uuid, id, node, qCharacteristics, operator, operationTime); - } - - /** - * Creates SystemParticipantInput entity with given parameters - * - * @param data entity data - * @param uuid UUID of the input entity - * @param id ID - * @param node Node that the asset is connected to - * @param qCharacteristics Description of a reactive power characteristic - * @param operator Operator of the asset - * @param operationTime time in which the entity is operated - * @return newly created asset object - */ - protected abstract T buildModel( - D data, - UUID uuid, - String id, - NodeInput node, - ReactivePowerCharacteristic qCharacteristics, - OperatorInput operator, - OperationTime operationTime); -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantTypedEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantTypedEntityData.java deleted file mode 100644 index a57d814ed..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantTypedEntityData.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input.participant; - -import edu.ie3.datamodel.models.UniqueEntity; -import edu.ie3.datamodel.models.input.EmInput; -import edu.ie3.datamodel.models.input.NodeInput; -import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.system.type.SystemParticipantTypeInput; -import java.util.Map; -import java.util.Objects; - -/** - * Data used for those classes of {@link - * edu.ie3.datamodel.models.input.system.SystemParticipantInput} that need an instance of some type - * T of {@link SystemParticipantTypeInput} as well. - * - * @param Subclass of {@link SystemParticipantTypeInput} that is required for the construction - * of the SystemParticipantInput - */ -public class SystemParticipantTypedEntityData - extends SystemParticipantEntityData { - - private final T typeInput; - - /** - * Creates a new SystemParticipantEntityData object for an operated, always on system participant - * input that needs a type input as well - * - * @param fieldsToAttributes attribute map: field name to value - * @param entityClass class of the entity to be created with this data - * @param node input node - * @param em The energy management unit that is managing the system participant. Null, if the - * system participant is not managed. - * @param typeInput type input - */ - public SystemParticipantTypedEntityData( - Map fieldsToAttributes, - Class entityClass, - NodeInput node, - EmInput em, - T typeInput) { - super(fieldsToAttributes, entityClass, node, em); - this.typeInput = typeInput; - } - - /** - * Creates a new SystemParticipantEntityData object for an operable system participant input that - * needs a type input as well - * - * @param fieldsToAttributes attribute map: field name to value - * @param entityClass class of the entity to be created with this data - * @param operator operator input - * @param node input node - * @param em The energy management unit that is managing the system participant. Null, if the - * system participant is not managed. - * @param typeInput type input - */ - public SystemParticipantTypedEntityData( - Map fieldsToAttributes, - Class entityClass, - OperatorInput operator, - NodeInput node, - EmInput em, - T typeInput) { - super(fieldsToAttributes, entityClass, operator, node, em); - this.typeInput = typeInput; - } - - /** - * Creates a new SystemParticipantTypedEntityData object based on a given {@link - * SystemParticipantEntityData} object and given type input - * - * @param systemParticipantEntityData The system participant entity data object to use attributes - * of - * @param typeInput type input - */ - public SystemParticipantTypedEntityData( - SystemParticipantEntityData systemParticipantEntityData, T typeInput) { - super(systemParticipantEntityData, systemParticipantEntityData.getControllingEm().orElse(null)); - this.typeInput = typeInput; - } - - public T getTypeInput() { - return typeInput; - } - - @Override - public String toString() { - return "SystemParticipantTypedEntityData{" - + "typeInput=" - + typeInput.getUuid() - + ", em=" - + getControllingEm().map(EmInput::toString).orElse("") - + ", node=" - + getNode().getUuid() - + ", operatorInput=" - + getOperatorInput().getUuid() - + ", fieldsToValues=" - + getFieldsToValues() - + ", targetClass=" - + getTargetClass() - + '}'; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - SystemParticipantTypedEntityData that = (SystemParticipantTypedEntityData) o; - return getTypeInput().equals(that.getTypeInput()); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), getTypeInput()); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/WecInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/WecInputFactory.java deleted file mode 100644 index 4a65c93f6..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/WecInputFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input.participant; - -import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.input.EmInput; -import edu.ie3.datamodel.models.input.NodeInput; -import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.system.WecInput; -import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; -import edu.ie3.datamodel.models.input.system.type.WecTypeInput; -import java.util.UUID; - -public class WecInputFactory - extends SystemParticipantInputEntityFactory< - WecInput, SystemParticipantTypedEntityData> { - private static final String TYPE = "type"; - private static final String MARKET_REACTION = "marketReaction"; - - public WecInputFactory() { - super(WecInput.class); - } - - @Override - protected String[] getAdditionalFields() { - return new String[] {TYPE, MARKET_REACTION}; - } - - @Override - protected WecInput buildModel( - SystemParticipantTypedEntityData data, - UUID uuid, - String id, - NodeInput node, - ReactivePowerCharacteristic qCharacteristics, - OperatorInput operator, - OperationTime operationTime) { - WecTypeInput typeInput = data.getTypeInput(); - EmInput em = data.getControllingEm().orElse(null); - final boolean marketReaction = data.getBoolean(MARKET_REACTION); - - return new WecInput( - uuid, id, operator, operationTime, node, qCharacteristics, em, typeInput, marketReaction); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/CongestionResultFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/CongestionResultFactory.java deleted file mode 100644 index ea2c7a19b..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/CongestionResultFactory.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * © 2024. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.result; - -import static tech.units.indriya.unit.Units.PERCENT; - -import edu.ie3.datamodel.exceptions.FactoryException; -import edu.ie3.datamodel.exceptions.ParsingException; -import edu.ie3.datamodel.io.factory.EntityData; -import edu.ie3.datamodel.models.result.CongestionResult; -import edu.ie3.datamodel.models.result.CongestionResult.InputModelType; -import edu.ie3.datamodel.utils.Try; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.util.List; -import java.util.Set; -import java.util.UUID; -import javax.measure.quantity.Dimensionless; -import tech.units.indriya.ComparableQuantity; - -public class CongestionResultFactory extends ResultEntityFactory { - private static final String TYPE = "type"; - private static final String SUBGRID = "subgrid"; - private static final String VALUE = "value"; - private static final String MIN = "min"; - private static final String MAX = "max"; - - public CongestionResultFactory() { - super(CongestionResult.class); - } - - public CongestionResultFactory(DateTimeFormatter dateTimeFormatter) { - super(dateTimeFormatter, CongestionResult.class); - } - - @Override - protected List> getFields(Class entityClass) { - return List.of(newSet(TIME, INPUT_MODEL, TYPE, VALUE, SUBGRID, MIN, MAX)); - } - - @Override - protected CongestionResult buildModel(EntityData data) { - ZonedDateTime zdtTime = timeUtil.toZonedDateTime(data.getField(TIME)); - UUID inputModel = data.getUUID(INPUT_MODEL); - - InputModelType type = - Try.of(() -> InputModelType.parse(data.getField(TYPE)), ParsingException.class) - .transformF(FactoryException::new) - .getOrThrow(); - - int subgrid = data.getInt(SUBGRID); - - ComparableQuantity value = data.getQuantity(VALUE, PERCENT); - ComparableQuantity min = data.getQuantity(MIN, PERCENT); - ComparableQuantity max = data.getQuantity(MAX, PERCENT); - - return new CongestionResult(zdtTime, inputModel, type, subgrid, value, min, max); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/ConnectorResultFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/ConnectorResultFactory.java deleted file mode 100644 index be0fa925c..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/ConnectorResultFactory.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.result; - -import edu.ie3.datamodel.exceptions.FactoryException; -import edu.ie3.datamodel.io.factory.EntityData; -import edu.ie3.datamodel.models.Entity; -import edu.ie3.datamodel.models.StandardUnits; -import edu.ie3.datamodel.models.result.connector.ConnectorResult; -import edu.ie3.datamodel.models.result.connector.LineResult; -import edu.ie3.datamodel.models.result.connector.Transformer2WResult; -import edu.ie3.datamodel.models.result.connector.Transformer3WResult; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.util.*; -import javax.measure.quantity.Angle; -import javax.measure.quantity.ElectricCurrent; -import tech.units.indriya.ComparableQuantity; - -public class ConnectorResultFactory extends ResultEntityFactory { - - private static final String IAMAG = "iAMag"; - private static final String IAANG = "iAAng"; - private static final String IBMAG = "iBMag"; - private static final String IBANG = "iBAng"; - private static final String ICMAG = "iCMag"; - private static final String ICANG = "iCAng"; - private static final String TAPPOS = "tapPos"; - - public ConnectorResultFactory() { - super(LineResult.class, Transformer2WResult.class, Transformer3WResult.class); - } - - /** - * Create a new factory to build {@link ConnectorResult}s and utilize the given date time - * formatter pattern to parse date time strings - * - * @param dateTimeFormatter to parse date time strings - */ - public ConnectorResultFactory(DateTimeFormatter dateTimeFormatter) { - super( - dateTimeFormatter, LineResult.class, Transformer2WResult.class, Transformer3WResult.class); - } - - @Override - protected List> getFields(Class entityClass) { - /// all result models have the same constructor except StorageResult - Set minConstructorParams = newSet(TIME, INPUT_MODEL, IAMAG, IAANG, IBMAG, IBANG); - - if (entityClass.equals(Transformer2WResult.class)) { - minConstructorParams = expandSet(minConstructorParams, TAPPOS); - - } else if (entityClass.equals(Transformer3WResult.class)) { - minConstructorParams = expandSet(minConstructorParams, ICMAG, ICANG, TAPPOS); - } - - return List.of(minConstructorParams); - } - - @Override - protected ConnectorResult buildModel(EntityData data) { - final Class entityClass = data.getTargetClass(); - ZonedDateTime time = timeUtil.toZonedDateTime(data.getField(TIME)); - - UUID inputModel = data.getUUID(INPUT_MODEL); - ComparableQuantity iAMag = - data.getQuantity(IAMAG, StandardUnits.ELECTRIC_CURRENT_MAGNITUDE); - ComparableQuantity iAAng = data.getQuantity(IAANG, StandardUnits.ELECTRIC_CURRENT_ANGLE); - ComparableQuantity iBMag = - data.getQuantity(IBMAG, StandardUnits.ELECTRIC_CURRENT_MAGNITUDE); - ComparableQuantity iBAng = data.getQuantity(IBANG, StandardUnits.ELECTRIC_CURRENT_ANGLE); - - if (entityClass.equals(LineResult.class)) - return new LineResult(time, inputModel, iAMag, iAAng, iBMag, iBAng); - else if (entityClass.equals(Transformer2WResult.class)) { - final int tapPos = data.getInt(TAPPOS); - - return new Transformer2WResult(time, inputModel, iAMag, iAAng, iBMag, iBAng, tapPos); - } else if (entityClass.equals(Transformer3WResult.class)) { - ComparableQuantity iCMag = - data.getQuantity(ICMAG, StandardUnits.ELECTRIC_CURRENT_MAGNITUDE); - ComparableQuantity iCAng = - data.getQuantity(ICANG, StandardUnits.ELECTRIC_CURRENT_ANGLE); - final int tapPos = data.getInt(TAPPOS); - - return new Transformer3WResult( - time, inputModel, iAMag, iAAng, iBMag, iBAng, iCMag, iCAng, tapPos); - } else throw new FactoryException("Cannot process " + entityClass.getSimpleName() + ".class."); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/FlexOptionsResultFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/FlexOptionsResultFactory.java deleted file mode 100644 index 1c31ea9db..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/FlexOptionsResultFactory.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * © 2022. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.result; - -import edu.ie3.datamodel.io.factory.EntityData; -import edu.ie3.datamodel.models.StandardUnits; -import edu.ie3.datamodel.models.result.system.FlexOptionsResult; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.util.*; -import javax.measure.quantity.Power; -import tech.units.indriya.ComparableQuantity; - -public class FlexOptionsResultFactory extends ResultEntityFactory { - - private static final String P_REF = "pRef"; - private static final String P_MIN = "pMin"; - private static final String P_MAX = "pMax"; - - public FlexOptionsResultFactory() { - super(FlexOptionsResult.class); - } - - /** - * Create a new factory to build {@link FlexOptionsResult}s and utilize the given date time - * formatter pattern to parse date time strings - * - * @param dateTimeFormatter to parse date time strings - */ - public FlexOptionsResultFactory(DateTimeFormatter dateTimeFormatter) { - super(dateTimeFormatter, FlexOptionsResult.class); - } - - @Override - protected List> getFields(Class entityClass) { - Set minConstructorParams = newSet(TIME, INPUT_MODEL, P_REF, P_MIN, P_MAX); - return List.of(minConstructorParams); - } - - @Override - protected FlexOptionsResult buildModel(EntityData data) { - ZonedDateTime zdtTime = timeUtil.toZonedDateTime(data.getField(TIME)); - UUID inputModelUuid = data.getUUID(INPUT_MODEL); - ComparableQuantity pRef = data.getQuantity(P_REF, StandardUnits.ACTIVE_POWER_RESULT); - ComparableQuantity pMin = data.getQuantity(P_MIN, StandardUnits.ACTIVE_POWER_RESULT); - ComparableQuantity pMax = data.getQuantity(P_MAX, StandardUnits.ACTIVE_POWER_RESULT); - - return new FlexOptionsResult(zdtTime, inputModelUuid, pRef, pMin, pMax); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/NodeResultFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/NodeResultFactory.java deleted file mode 100644 index e7cbf1ea9..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/NodeResultFactory.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.result; - -import edu.ie3.datamodel.io.factory.EntityData; -import edu.ie3.datamodel.models.StandardUnits; -import edu.ie3.datamodel.models.result.NodeResult; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.util.*; -import javax.measure.quantity.Angle; -import javax.measure.quantity.Dimensionless; -import tech.units.indriya.ComparableQuantity; - -public class NodeResultFactory extends ResultEntityFactory { - private static final String VMAG = "vMag"; - private static final String VANG = "vAng"; - - public NodeResultFactory() { - super(NodeResult.class); - } - - /** - * Create a new factory to build {@link NodeResult}s and utilize the given date time formatter - * pattern to parse date time strings - * - * @param dateTimeFormatter to parse date time strings - */ - public NodeResultFactory(DateTimeFormatter dateTimeFormatter) { - super(dateTimeFormatter, NodeResult.class); - } - - @Override - protected List> getFields(Class entityClass) { - Set minConstructorParams = newSet(TIME, INPUT_MODEL, VMAG, VANG); - return List.of(minConstructorParams); - } - - @Override - protected NodeResult buildModel(EntityData data) { - ZonedDateTime zdtTime = timeUtil.toZonedDateTime(data.getField(TIME)); - UUID inputModelUuid = data.getUUID(INPUT_MODEL); - ComparableQuantity vMagValue = - data.getQuantity(VMAG, StandardUnits.VOLTAGE_MAGNITUDE); - ComparableQuantity vAngValue = data.getQuantity(VANG, StandardUnits.VOLTAGE_ANGLE); - - return new NodeResult(zdtTime, inputModelUuid, vMagValue, vAngValue); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/ResultEntityFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/ResultEntityFactory.java deleted file mode 100644 index 6eadf1cd9..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/ResultEntityFactory.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.result; - -import edu.ie3.datamodel.io.factory.EntityData; -import edu.ie3.datamodel.io.factory.EntityFactory; -import edu.ie3.datamodel.models.result.ResultEntity; -import edu.ie3.util.TimeUtil; -import java.time.format.DateTimeFormatter; - -/** - * Internal API for building {@link ResultEntity}s. This additional abstraction layer is necessary - * to create generic reader for {@link ResultEntity}s only and furthermore removes code duplicates. - * - * @version 0.1 - * @since 11.02.20 - */ -public abstract class ResultEntityFactory - extends EntityFactory { - - protected static final String TIME = "time"; - protected static final String INPUT_MODEL = "inputModel"; - - protected final TimeUtil timeUtil; - - @SafeVarargs - protected ResultEntityFactory(Class... allowedClasses) { - super(allowedClasses); - timeUtil = TimeUtil.withDefaults; - } - - @SafeVarargs - protected ResultEntityFactory( - DateTimeFormatter dateTimeFormatter, Class... allowedClasses) { - super(allowedClasses); - timeUtil = new TimeUtil(dateTimeFormatter); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/SwitchResultFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/SwitchResultFactory.java deleted file mode 100644 index 0db6a14dc..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/SwitchResultFactory.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.result; - -import edu.ie3.datamodel.io.factory.EntityData; -import edu.ie3.datamodel.models.result.connector.SwitchResult; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.util.*; - -public class SwitchResultFactory extends ResultEntityFactory { - - private static final String CLOSED = "closed"; - - public SwitchResultFactory() { - super(SwitchResult.class); - } - - /** - * Create a new factory to build {@link SwitchResult}s and utilize the given date time formatter - * pattern to parse date time strings - * - * @param dateTimeFormatter Pattern to parse date time strings - */ - public SwitchResultFactory(DateTimeFormatter dateTimeFormatter) { - super(dateTimeFormatter, SwitchResult.class); - } - - @Override - protected List> getFields(Class entityClass) { - Set minConstructorParams = newSet(TIME, INPUT_MODEL, CLOSED); - return List.of(minConstructorParams); - } - - @Override - protected SwitchResult buildModel(EntityData data) { - ZonedDateTime time = timeUtil.toZonedDateTime(data.getField(TIME)); - UUID inputModel = data.getUUID(INPUT_MODEL); - - final boolean closed = data.getBoolean(CLOSED); - - return new SwitchResult(time, inputModel, closed); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/SystemParticipantResultFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/SystemParticipantResultFactory.java deleted file mode 100644 index 150709946..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/SystemParticipantResultFactory.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.result; - -import static tech.units.indriya.unit.Units.PERCENT; - -import edu.ie3.datamodel.exceptions.FactoryException; -import edu.ie3.datamodel.io.factory.EntityData; -import edu.ie3.datamodel.models.Entity; -import edu.ie3.datamodel.models.StandardUnits; -import edu.ie3.datamodel.models.result.system.*; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.util.*; -import javax.measure.quantity.Dimensionless; -import javax.measure.quantity.Power; -import tech.units.indriya.ComparableQuantity; - -/** - * Factory class for creating {@link SystemParticipantResult} entities from provided {@link - * EntityData} data objects. - */ -public class SystemParticipantResultFactory extends ResultEntityFactory { - - private static final String POWER = "p"; - private static final String REACTIVE_POWER = "q"; - private static final String SOC = "soc"; - private static final String Q_DOT = "qDot"; - - public SystemParticipantResultFactory() { - super( - LoadResult.class, - FixedFeedInResult.class, - BmResult.class, - PvResult.class, - ChpResult.class, - WecResult.class, - StorageResult.class, - EvcsResult.class, - EvResult.class, - HpResult.class, - EmResult.class); - } - - /** - * Create a new factory to build {@link SystemParticipantResult}s and utilize the given date time - * formatter pattern to parse date time strings - * - * @param dateTimeFormatter to parse date time strings - */ - public SystemParticipantResultFactory(DateTimeFormatter dateTimeFormatter) { - super( - dateTimeFormatter, - LoadResult.class, - FixedFeedInResult.class, - BmResult.class, - PvResult.class, - ChpResult.class, - WecResult.class, - StorageResult.class, - EvcsResult.class, - EvResult.class, - HpResult.class, - EmResult.class); - } - - @Override - protected List> getFields(Class entityClass) { - /// all result models have the same constructor except StorageResult - Set minConstructorParams = newSet(TIME, INPUT_MODEL, POWER, REACTIVE_POWER); - - if (ElectricalEnergyStorageResult.class.isAssignableFrom(entityClass)) { - minConstructorParams = expandSet(minConstructorParams, SOC); - } - - if (SystemParticipantWithHeatResult.class.isAssignableFrom(entityClass)) { - minConstructorParams = expandSet(minConstructorParams, Q_DOT); - } - - return List.of(minConstructorParams); - } - - @Override - protected SystemParticipantResult buildModel(EntityData data) { - Class entityClass = data.getTargetClass(); - - ZonedDateTime zdtTime = timeUtil.toZonedDateTime(data.getField(TIME)); - UUID inputModelUuid = data.getUUID(INPUT_MODEL); - ComparableQuantity p = data.getQuantity(POWER, StandardUnits.ACTIVE_POWER_RESULT); - ComparableQuantity q = - data.getQuantity(REACTIVE_POWER, StandardUnits.REACTIVE_POWER_RESULT); - - if (entityClass.equals(LoadResult.class)) { - return new LoadResult(zdtTime, inputModelUuid, p, q); - } else if (entityClass.equals(FixedFeedInResult.class)) { - return new FixedFeedInResult(zdtTime, inputModelUuid, p, q); - } else if (entityClass.equals(BmResult.class)) { - return new BmResult(zdtTime, inputModelUuid, p, q); - } else if (entityClass.equals(PvResult.class)) { - return new PvResult(zdtTime, inputModelUuid, p, q); - } else if (entityClass.equals(EvcsResult.class)) { - return new EvcsResult(zdtTime, inputModelUuid, p, q); - } else if (entityClass.equals(EmResult.class)) { - return new EmResult(zdtTime, inputModelUuid, p, q); - } else if (SystemParticipantWithHeatResult.class.isAssignableFrom(entityClass)) { - /* The following classes all have a heat component as well */ - ComparableQuantity qDot = data.getQuantity(Q_DOT, StandardUnits.Q_DOT_RESULT); - - if (entityClass.equals(ChpResult.class)) { - return new ChpResult(zdtTime, inputModelUuid, p, q, qDot); - } else if (entityClass.equals(HpResult.class)) { - return new HpResult(zdtTime, inputModelUuid, p, q, qDot); - } else { - throw new FactoryException("Cannot process " + entityClass.getSimpleName() + ".class."); - } - } else if (entityClass.equals(WecResult.class)) { - return new WecResult(zdtTime, inputModelUuid, p, q); - } else if (entityClass.equals(EvResult.class)) { - ComparableQuantity socQuantity = data.getQuantity(SOC, PERCENT); - - return new EvResult(zdtTime, inputModelUuid, p, q, socQuantity); - } else if (entityClass.equals(StorageResult.class)) { - ComparableQuantity socQuantity = data.getQuantity(SOC, PERCENT); - - return new StorageResult(zdtTime, inputModelUuid, p, q, socQuantity); - } else { - throw new FactoryException("Cannot process " + entityClass.getSimpleName() + ".class."); - } - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/ThermalResultFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/ThermalResultFactory.java deleted file mode 100644 index 9e522a5a4..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/ThermalResultFactory.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.result; - -import edu.ie3.datamodel.exceptions.FactoryException; -import edu.ie3.datamodel.io.factory.EntityData; -import edu.ie3.datamodel.models.Entity; -import edu.ie3.datamodel.models.StandardUnits; -import edu.ie3.datamodel.models.result.thermal.CylindricalStorageResult; -import edu.ie3.datamodel.models.result.thermal.DomesticHotWaterStorageResult; -import edu.ie3.datamodel.models.result.thermal.ThermalHouseResult; -import edu.ie3.datamodel.models.result.thermal.ThermalUnitResult; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.util.*; -import javax.measure.quantity.Dimensionless; -import javax.measure.quantity.Energy; -import javax.measure.quantity.Power; -import javax.measure.quantity.Temperature; -import tech.units.indriya.ComparableQuantity; - -public class ThermalResultFactory extends ResultEntityFactory { - private static final String Q_DOT = "qDot"; - private static final String INDOOR_TEMPERATURE = "indoorTemperature"; - private static final String ENERGY = "energy"; - private static final String FILL_LEVEL = "fillLevel"; - - public ThermalResultFactory() { - super( - ThermalHouseResult.class, - CylindricalStorageResult.class, - DomesticHotWaterStorageResult.class); - } - - /** - * Create a new factory to build {@link ThermalResultFactory}s and utilize the given date time - * formatter pattern to parse date time strings - * - * @param dateTimeFormatter parse date time strings - */ - public ThermalResultFactory(DateTimeFormatter dateTimeFormatter) { - super( - dateTimeFormatter, - ThermalHouseResult.class, - CylindricalStorageResult.class, - DomesticHotWaterStorageResult.class); - } - - @Override - protected List> getFields(Class entityClass) { - Set minConstructorParams = newSet(TIME, INPUT_MODEL, Q_DOT); - - if (entityClass.equals(ThermalHouseResult.class)) { - minConstructorParams = expandSet(minConstructorParams, INDOOR_TEMPERATURE); - } else if (entityClass.equals(CylindricalStorageResult.class)) { - minConstructorParams = expandSet(minConstructorParams, ENERGY, FILL_LEVEL); - } else if (entityClass.equals(DomesticHotWaterStorageResult.class)) { - minConstructorParams = expandSet(minConstructorParams, ENERGY, FILL_LEVEL); - } - - return List.of(minConstructorParams); - } - - @Override - protected ThermalUnitResult buildModel(EntityData data) { - Class clazz = data.getTargetClass(); - - ZonedDateTime zdtTime = timeUtil.toZonedDateTime(data.getField(TIME)); - UUID inputModelUuid = data.getUUID(INPUT_MODEL); - ComparableQuantity qDotQuantity = data.getQuantity(Q_DOT, StandardUnits.HEAT_DEMAND); - - if (clazz.equals(ThermalHouseResult.class)) { - ComparableQuantity indoorTemperature = - data.getQuantity(INDOOR_TEMPERATURE, StandardUnits.TEMPERATURE); - - return new ThermalHouseResult(zdtTime, inputModelUuid, qDotQuantity, indoorTemperature); - } else if (clazz.equals(CylindricalStorageResult.class)) { - ComparableQuantity energyQuantity = - data.getQuantity(ENERGY, StandardUnits.ENERGY_RESULT); - ComparableQuantity fillLevelQuantity = - data.getQuantity(FILL_LEVEL, StandardUnits.FILL_LEVEL); - - return new CylindricalStorageResult( - zdtTime, inputModelUuid, energyQuantity, qDotQuantity, fillLevelQuantity); - } else if (clazz.equals(DomesticHotWaterStorageResult.class)) { - ComparableQuantity energyQuantity = - data.getQuantity(ENERGY, StandardUnits.ENERGY_RESULT); - ComparableQuantity fillLevelQuantity = - data.getQuantity(FILL_LEVEL, StandardUnits.FILL_LEVEL); - - return new DomesticHotWaterStorageResult( - zdtTime, inputModelUuid, energyQuantity, qDotQuantity, fillLevelQuantity); - } else { - throw new FactoryException("Cannot process " + clazz.getSimpleName() + ".class."); - } - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java index 67451014e..8872b25a5 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java @@ -9,6 +9,7 @@ import edu.ie3.datamodel.exceptions.FactoryException; import edu.ie3.datamodel.exceptions.ParsingException; +import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; import edu.ie3.datamodel.models.timeseries.repetitive.BdewLoadProfileTimeSeries; @@ -42,7 +43,8 @@ public BdewLoadProfileFactory() { } @Override - protected LoadProfileEntry buildModel(LoadProfileData data) { + protected LoadProfileEntry buildModel(LoadProfileData data) + throws SourceException { int quarterHour = data.getInt(QUARTER_HOUR); boolean is1999Scheme = @@ -51,10 +53,29 @@ protected LoadProfileEntry buildModel(LoadProfileData { + try { + return data.getDouble(field); + } catch (SourceException e) { + throw new RuntimeException(e); + } + })); } else { - values = new BdewLoadValues(BdewScheme.BDEW2025, BDEW2025_FIELDS.map(data::getDouble)); + values = + new BdewLoadValues( + BdewScheme.BDEW2025, + BDEW2025_FIELDS.map( + field -> { + try { + return data.getDouble(field); + } catch (SourceException e) { + throw new RuntimeException(e); + } + })); } return new LoadProfileEntry<>(values, quarterHour); diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/CosmoIdCoordinateFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/CosmoIdCoordinateFactory.java index cf6b2cd26..69664aa93 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/CosmoIdCoordinateFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/CosmoIdCoordinateFactory.java @@ -5,6 +5,7 @@ */ package edu.ie3.datamodel.io.factory.timeseries; +import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.io.factory.SimpleFactoryData; import edu.ie3.datamodel.models.input.IdCoordinateInput; import java.util.Collections; @@ -24,7 +25,7 @@ public class CosmoIdCoordinateFactory extends IdCoordinateFactory { private static final String LAT_ROT = "latRot"; @Override - protected IdCoordinateInput buildModel(SimpleFactoryData data) { + protected IdCoordinateInput buildModel(SimpleFactoryData data) throws SourceException { int coordinateId = data.getInt(COORDINATE_ID); double lat = data.getDouble(LAT_GEO); double lon = data.getDouble(LONG_GEO); diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/CosmoTimeBasedWeatherValueFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/CosmoTimeBasedWeatherValueFactory.java index 09048fb89..2d9618311 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/CosmoTimeBasedWeatherValueFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/CosmoTimeBasedWeatherValueFactory.java @@ -5,6 +5,7 @@ */ package edu.ie3.datamodel.io.factory.timeseries; +import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue; import edu.ie3.datamodel.models.value.WeatherValue; @@ -59,7 +60,8 @@ protected List> getFields(Class entityClass) { } @Override - protected TimeBasedValue buildModel(TimeBasedWeatherValueData data) { + protected TimeBasedValue buildModel(TimeBasedWeatherValueData data) + throws SourceException { Point coordinate = data.getCoordinate(); ZonedDateTime time = timeUtil.toZonedDateTime(data.getField(TIME)); ComparableQuantity directIrradiance = diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/IconIdCoordinateFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/IconIdCoordinateFactory.java index 687b6cb3e..f7985f37e 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/IconIdCoordinateFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/IconIdCoordinateFactory.java @@ -5,6 +5,7 @@ */ package edu.ie3.datamodel.io.factory.timeseries; +import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.io.factory.SimpleFactoryData; import edu.ie3.datamodel.models.input.IdCoordinateInput; import java.util.Collections; @@ -22,7 +23,7 @@ public class IconIdCoordinateFactory extends IdCoordinateFactory { private static final String TYPE = "coordinateType"; @Override - protected IdCoordinateInput buildModel(SimpleFactoryData data) { + protected IdCoordinateInput buildModel(SimpleFactoryData data) throws SourceException { int coordinateId = data.getInt(COORDINATE_ID); double lat = data.getDouble(LAT); double lon = data.getDouble(LONG); diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/IconTimeBasedWeatherValueFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/IconTimeBasedWeatherValueFactory.java index 189e40c57..9d59e770e 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/IconTimeBasedWeatherValueFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/IconTimeBasedWeatherValueFactory.java @@ -5,6 +5,7 @@ */ package edu.ie3.datamodel.io.factory.timeseries; +import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue; import edu.ie3.datamodel.models.value.WeatherValue; @@ -77,7 +78,8 @@ protected List> getFields(Class entityClass) { } @Override - protected TimeBasedValue buildModel(TimeBasedWeatherValueData data) { + protected TimeBasedValue buildModel(TimeBasedWeatherValueData data) + throws SourceException { Point coordinate = data.getCoordinate(); ZonedDateTime time = timeUtil.toZonedDateTime(data.getField(TIME)); ComparableQuantity directIrradiance = @@ -112,7 +114,8 @@ protected TimeBasedValue buildModel(TimeBasedWeatherValueData data * @return A {@link ComparableQuantity} of type {@link Speed}, that is converted to {@link * StandardUnits#WIND_VELOCITY} */ - private static ComparableQuantity getWindDirection(TimeBasedWeatherValueData data) { + private static ComparableQuantity getWindDirection(TimeBasedWeatherValueData data) + throws SourceException { /* Get the three dimensional parts of the wind velocity vector in cartesian coordinates */ double u = data.getDouble(WIND_VELOCITY_U); // Wind component from west to east (parallel to latitudes) @@ -136,7 +139,8 @@ private static ComparableQuantity getWindDirection(TimeBasedWeatherValueD * @return A {@link ComparableQuantity} of type {@link Speed}, that is converted to {@link * StandardUnits#WIND_VELOCITY} */ - private static ComparableQuantity getWindVelocity(TimeBasedWeatherValueData data) { + private static ComparableQuantity getWindVelocity(TimeBasedWeatherValueData data) + throws SourceException { /* Get the three dimensional parts of the wind velocity vector in cartesian coordinates */ double u = data.getDouble(WIND_VELOCITY_U); double v = data.getDouble(WIND_VELOCITY_V); diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java index 2addfa46a..7b471547b 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java @@ -8,6 +8,7 @@ import static edu.ie3.datamodel.models.profile.LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE; import static tech.units.indriya.unit.Units.WATT; +import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.models.profile.LoadProfile.RandomLoadProfile; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; import edu.ie3.datamodel.models.timeseries.repetitive.RandomLoadProfileTimeSeries; @@ -37,7 +38,8 @@ public RandomLoadProfileFactory() { } @Override - protected LoadProfileEntry buildModel(LoadProfileData data) { + protected LoadProfileEntry buildModel(LoadProfileData data) + throws SourceException { int quarterHour = data.getInt(QUARTER_HOUR); return new LoadProfileEntry<>( diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/SqlIdCoordinateFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/SqlIdCoordinateFactory.java index 81d7ee963..52520a4bc 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/SqlIdCoordinateFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/SqlIdCoordinateFactory.java @@ -6,6 +6,7 @@ package edu.ie3.datamodel.io.factory.timeseries; import edu.ie3.datamodel.exceptions.FactoryException; +import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.io.factory.SimpleFactoryData; import edu.ie3.datamodel.models.input.IdCoordinateInput; import edu.ie3.util.geo.GeoUtils; @@ -33,7 +34,7 @@ protected IdCoordinateInput buildModel(SimpleFactoryData data) { Point point = GeoUtils.buildPoint(coordinate); return new IdCoordinateInput(coordinateId, point); - } catch (ParseException e) { + } catch (ParseException | SourceException e) { throw new FactoryException(e); } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeBasedSimpleValueFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeBasedSimpleValueFactory.java index 52b39e2d7..cba70661c 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeBasedSimpleValueFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeBasedSimpleValueFactory.java @@ -8,6 +8,7 @@ import static edu.ie3.datamodel.models.StandardUnits.*; import edu.ie3.datamodel.exceptions.FactoryException; +import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue; import edu.ie3.datamodel.models.value.*; @@ -40,7 +41,7 @@ public TimeBasedSimpleValueFactory( @Override @SuppressWarnings("unchecked") - protected TimeBasedValue buildModel(SimpleTimeBasedValueData data) { + protected TimeBasedValue buildModel(SimpleTimeBasedValueData data) throws SourceException { ZonedDateTime time = timeUtil.toZonedDateTime(data.getField(TIME)); V value; diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeBasedWeatherValueData.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeBasedWeatherValueData.java index e9e12aafc..68a5deaec 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeBasedWeatherValueData.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeBasedWeatherValueData.java @@ -5,6 +5,7 @@ */ package edu.ie3.datamodel.io.factory.timeseries; +import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.models.value.WeatherValue; import java.util.Map; import javax.measure.Quantity; @@ -32,7 +33,8 @@ public Point getCoordinate() { } @Override - public > ComparableQuantity getQuantity(String field, Unit unit) { + public > ComparableQuantity getQuantity(String field, Unit unit) + throws SourceException { return getField(field).isEmpty() ? null : super.getQuantity(field, unit); } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMappingFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMappingFactory.java index 9172b99dd..a4b30df24 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMappingFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMappingFactory.java @@ -5,6 +5,7 @@ */ package edu.ie3.datamodel.io.factory.timeseries; +import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.io.factory.EntityFactory; import edu.ie3.datamodel.io.source.TimeSeriesMappingSource; @@ -27,7 +28,8 @@ protected List> getFields(Class entityClass) { } @Override - protected TimeSeriesMappingSource.MappingEntry buildModel(EntityData data) { + protected TimeSeriesMappingSource.MappingEntry buildModel(EntityData data) + throws SourceException { UUID asset = data.getUUID(ASSET); UUID timeSeries = data.getUUID(TIME_SERIES); return new TimeSeriesMappingSource.MappingEntry(asset, timeSeries); diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java index 2c18cdae0..777135e13 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java @@ -5,6 +5,7 @@ */ package edu.ie3.datamodel.io.factory.timeseries; +import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.io.factory.EntityFactory; import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; @@ -39,7 +40,7 @@ protected List> getFields(Class entityClass) { } @Override - protected TimeSeriesMetaInformation buildModel(EntityData data) { + protected TimeSeriesMetaInformation buildModel(EntityData data) throws SourceException { if (LoadProfileMetaInformation.class.isAssignableFrom(data.getTargetClass())) { String profile = data.getField(LOAD_PROFILE); return new LoadProfileMetaInformation(profile); diff --git a/src/main/java/edu/ie3/datamodel/io/factory/typeinput/AssetTypeInputEntityFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/typeinput/AssetTypeInputEntityFactory.java deleted file mode 100644 index c3d4dd495..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/typeinput/AssetTypeInputEntityFactory.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.typeinput; - -import edu.ie3.datamodel.io.factory.EntityData; -import edu.ie3.datamodel.io.factory.UniqueEntityFactory; -import edu.ie3.datamodel.models.input.AssetTypeInput; - -/** - * Internal API for building {@link AssetTypeInput}s. This additional abstraction layer is necessary - * to create generic reader for {@link AssetTypeInput}s only and furthermore removes code - * duplicates. - * - * @version 0.1 - * @since 11.02.20 - */ -abstract class AssetTypeInputEntityFactory - extends UniqueEntityFactory { - - @SafeVarargs - protected AssetTypeInputEntityFactory(Class... allowedClasses) { - super(allowedClasses); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/typeinput/LineTypeInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/typeinput/LineTypeInputFactory.java deleted file mode 100644 index 244a61839..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/typeinput/LineTypeInputFactory.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.typeinput; - -import edu.ie3.datamodel.io.factory.EntityData; -import edu.ie3.datamodel.models.StandardUnits; -import edu.ie3.datamodel.models.input.connector.type.LineTypeInput; -import edu.ie3.util.quantities.interfaces.SpecificConductance; -import edu.ie3.util.quantities.interfaces.SpecificResistance; -import java.util.Collections; -import java.util.List; -import java.util.Set; -import java.util.UUID; -import javax.measure.quantity.ElectricCurrent; -import javax.measure.quantity.ElectricPotential; -import tech.units.indriya.ComparableQuantity; - -public class LineTypeInputFactory extends AssetTypeInputEntityFactory { - private static final String B = "b"; - private static final String G = "g"; - private static final String R = "r"; - private static final String X = "x"; - private static final String I_MAX = "iMax"; - private static final String V_RATED = "vRated"; - - public LineTypeInputFactory() { - super(LineTypeInput.class); - } - - @Override - protected List> getFields(Class entityClass) { - Set constructorParams = newSet(UUID, ID, B, G, R, X, I_MAX, V_RATED); - - return Collections.singletonList(constructorParams); - } - - @Override - protected LineTypeInput buildModel(EntityData data) { - UUID uuid = data.getUUID(UUID); - String id = data.getField(ID); - ComparableQuantity b = - data.getQuantity(B, StandardUnits.SUSCEPTANCE_PER_LENGTH); - ComparableQuantity g = - data.getQuantity(G, StandardUnits.CONDUCTANCE_PER_LENGTH); - ComparableQuantity r = - data.getQuantity(R, StandardUnits.RESISTANCE_PER_LENGTH); - ComparableQuantity x = - data.getQuantity(X, StandardUnits.REACTANCE_PER_LENGTH); - ComparableQuantity iMax = - data.getQuantity(I_MAX, StandardUnits.ELECTRIC_CURRENT_MAGNITUDE); - ComparableQuantity vRated = - data.getQuantity(V_RATED, StandardUnits.RATED_VOLTAGE_MAGNITUDE); - - return new LineTypeInput(uuid, id, b, g, r, x, iMax, vRated); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/typeinput/SystemParticipantTypeInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/typeinput/SystemParticipantTypeInputFactory.java deleted file mode 100644 index 29a9e15e3..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/typeinput/SystemParticipantTypeInputFactory.java +++ /dev/null @@ -1,238 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.typeinput; - -import edu.ie3.datamodel.exceptions.FactoryException; -import edu.ie3.datamodel.exceptions.ParsingException; -import edu.ie3.datamodel.io.factory.EntityData; -import edu.ie3.datamodel.models.StandardUnits; -import edu.ie3.datamodel.models.input.system.characteristic.WecCharacteristicInput; -import edu.ie3.datamodel.models.input.system.type.*; -import edu.ie3.util.quantities.interfaces.Currency; -import edu.ie3.util.quantities.interfaces.DimensionlessRate; -import edu.ie3.util.quantities.interfaces.EnergyPrice; -import edu.ie3.util.quantities.interfaces.SpecificEnergy; -import java.util.Collections; -import java.util.List; -import java.util.Set; -import java.util.UUID; -import javax.measure.quantity.*; -import tech.units.indriya.ComparableQuantity; - -public class SystemParticipantTypeInputFactory - extends AssetTypeInputEntityFactory { - // SystemParticipantTypeInput parameters - private static final String CAP_EX = "capex"; - private static final String OP_EX = "opex"; - private static final String S_RATED = "sRated"; - private static final String COS_PHI_RATED = "cosPhiRated"; - - // required in multiple types - private static final String ETA_CONV = "etaConv"; - private static final String P_THERMAL = "pThermal"; - private static final String E_STORAGE = "eStorage"; - - // EvTypeInput - private static final String E_CONS = "eCons"; - private static final String S_RATED_DC = "sRatedDC"; - // BmTypeInput - private static final String ACTIVE_POWER_GRADIENT = "activePowerGradient"; - - // WecTypeInput - private static final String ROTOR_AREA = "rotorArea"; - private static final String HUB_HEIGHT = "hubHeight"; - - // ChpTypeInput - private static final String ETA_EL = "etaEl"; - private static final String ETA_THERMAL = "etaThermal"; - private static final String P_OWN = "pOwn"; - - // StorageTypeInput - private static final String P_MAX = "pMax"; - private static final String ETA = "eta"; - - // WecTypeInput - private static final String CP_CHARACTERISTIC = "cpCharacteristic"; - - public SystemParticipantTypeInputFactory() { - super( - EvTypeInput.class, - HpTypeInput.class, - BmTypeInput.class, - WecTypeInput.class, - ChpTypeInput.class, - StorageTypeInput.class); - } - - @Override - protected List> getFields(Class entityClass) { - Set standardConstructorParams = newSet(UUID, ID, CAP_EX, OP_EX, S_RATED, COS_PHI_RATED); - - Set constructorParameters = null; - if (entityClass.equals(EvTypeInput.class)) { - constructorParameters = expandSet(standardConstructorParams, E_STORAGE, E_CONS, S_RATED_DC); - } else if (entityClass.equals(HpTypeInput.class)) { - constructorParameters = expandSet(standardConstructorParams, P_THERMAL); - } else if (entityClass.equals(BmTypeInput.class)) { - constructorParameters = expandSet(standardConstructorParams, ACTIVE_POWER_GRADIENT, ETA_CONV); - } else if (entityClass.equals(WecTypeInput.class)) { - constructorParameters = - expandSet(standardConstructorParams, CP_CHARACTERISTIC, ETA_CONV, ROTOR_AREA, HUB_HEIGHT); - } else if (entityClass.equals(ChpTypeInput.class)) { // into new file - constructorParameters = - expandSet(standardConstructorParams, ETA_EL, ETA_THERMAL, P_THERMAL, P_OWN); - } else if (entityClass.equals(StorageTypeInput.class)) { - constructorParameters = - expandSet(standardConstructorParams, E_STORAGE, P_MAX, ACTIVE_POWER_GRADIENT, ETA); - } - - return Collections.singletonList(constructorParameters); - } - - @Override - protected SystemParticipantTypeInput buildModel(EntityData data) { - UUID uuid = data.getUUID(UUID); - String id = data.getField(ID); - ComparableQuantity capEx = data.getQuantity(CAP_EX, StandardUnits.CAPEX); - ComparableQuantity opEx = data.getQuantity(OP_EX, StandardUnits.ENERGY_PRICE); - ComparableQuantity sRated = data.getQuantity(S_RATED, StandardUnits.S_RATED); - double cosPhi = data.getDouble(COS_PHI_RATED); - - if (data.getTargetClass().equals(EvTypeInput.class)) - return buildEvTypeInput(data, uuid, id, capEx, opEx, sRated, cosPhi); - else if (data.getTargetClass().equals(HpTypeInput.class)) - return buildHpTypeInput(data, uuid, id, capEx, opEx, sRated, cosPhi); - else if (data.getTargetClass().equals(BmTypeInput.class)) - return buildBmTypeInput(data, uuid, id, capEx, opEx, sRated, cosPhi); - else if (data.getTargetClass().equals(WecTypeInput.class)) - return buildWecTypeInput(data, uuid, id, capEx, opEx, sRated, cosPhi); - else if (data.getTargetClass().equals(ChpTypeInput.class)) - return buildChpTypeInput(data, uuid, id, capEx, opEx, sRated, cosPhi); - else if (data.getTargetClass().equals(StorageTypeInput.class)) - return buildStorageTypeInput(data, uuid, id, capEx, opEx, sRated, cosPhi); - else - throw new FactoryException( - "SystemParticipantTypeInputFactory does not know how to build a " - + data.getTargetClass().getName()); - } - - private SystemParticipantTypeInput buildEvTypeInput( - EntityData data, - UUID uuid, - String id, - ComparableQuantity capEx, - ComparableQuantity opEx, - ComparableQuantity sRated, - double cosPhi) { - ComparableQuantity eStorage = data.getQuantity(E_STORAGE, StandardUnits.ENERGY_IN); - - ComparableQuantity eCons = - data.getQuantity(E_CONS, StandardUnits.ENERGY_PER_DISTANCE); - - ComparableQuantity sRatedDC = - data.getQuantity(S_RATED_DC, StandardUnits.ACTIVE_POWER_IN); - - return new EvTypeInput(uuid, id, capEx, opEx, eStorage, eCons, sRated, cosPhi, sRatedDC); - } - - private SystemParticipantTypeInput buildHpTypeInput( - EntityData data, - UUID uuid, - String id, - ComparableQuantity capEx, - ComparableQuantity opEx, - ComparableQuantity sRated, - double cosPhi) { - ComparableQuantity pThermal = data.getQuantity(P_THERMAL, StandardUnits.ACTIVE_POWER_IN); - - return new HpTypeInput(uuid, id, capEx, opEx, sRated, cosPhi, pThermal); - } - - private SystemParticipantTypeInput buildBmTypeInput( - EntityData data, - UUID uuid, - String id, - ComparableQuantity capEx, - ComparableQuantity opEx, - ComparableQuantity sRated, - double cosPhi) { - ComparableQuantity loadGradient = - data.getQuantity(ACTIVE_POWER_GRADIENT, StandardUnits.ACTIVE_POWER_GRADIENT); - ComparableQuantity etaConv = - data.getQuantity(ETA_CONV, StandardUnits.EFFICIENCY); - - return new BmTypeInput(uuid, id, capEx, opEx, loadGradient, sRated, cosPhi, etaConv); - } - - private SystemParticipantTypeInput buildWecTypeInput( - EntityData data, - UUID uuid, - String id, - ComparableQuantity capEx, - ComparableQuantity opEx, - ComparableQuantity sRated, - double cosPhi) { - ComparableQuantity etaConv = - data.getQuantity(ETA_CONV, StandardUnits.EFFICIENCY); - - ComparableQuantity rotorArea = data.getQuantity(ROTOR_AREA, StandardUnits.ROTOR_AREA); - - ComparableQuantity hubHeight = data.getQuantity(HUB_HEIGHT, StandardUnits.HUB_HEIGHT); - - WecCharacteristicInput cpCharacteristic; - try { - cpCharacteristic = new WecCharacteristicInput(data.getField(CP_CHARACTERISTIC)); - } catch (ParsingException e) { - throw new FactoryException( - "Cannot parse the following Betz characteristic: '" - + data.getField(CP_CHARACTERISTIC) - + "'", - e); - } - - return new WecTypeInput( - uuid, id, capEx, opEx, sRated, cosPhi, cpCharacteristic, etaConv, rotorArea, hubHeight); - } - - private SystemParticipantTypeInput buildChpTypeInput( - EntityData data, - UUID uuid, - String id, - ComparableQuantity capEx, - ComparableQuantity opEx, - ComparableQuantity sRated, - double cosPhi) { - ComparableQuantity etaEl = data.getQuantity(ETA_EL, StandardUnits.EFFICIENCY); - - ComparableQuantity etaThermal = - data.getQuantity(ETA_THERMAL, StandardUnits.EFFICIENCY); - - ComparableQuantity pThermal = data.getQuantity(P_THERMAL, StandardUnits.ACTIVE_POWER_IN); - - ComparableQuantity pOwn = data.getQuantity(P_OWN, StandardUnits.ACTIVE_POWER_IN); - - return new ChpTypeInput( - uuid, id, capEx, opEx, etaEl, etaThermal, sRated, cosPhi, pThermal, pOwn); - } - - private SystemParticipantTypeInput buildStorageTypeInput( - EntityData data, - UUID uuid, - String id, - ComparableQuantity capEx, - ComparableQuantity opEx, - ComparableQuantity sRated, - double cosPhi) { - ComparableQuantity eStorage = data.getQuantity(E_STORAGE, StandardUnits.ENERGY_IN); - ComparableQuantity pMax = data.getQuantity(P_MAX, StandardUnits.ACTIVE_POWER_IN); - ComparableQuantity activePowerGradient = - data.getQuantity(ACTIVE_POWER_GRADIENT, StandardUnits.ACTIVE_POWER_GRADIENT); - ComparableQuantity eta = data.getQuantity(ETA, StandardUnits.EFFICIENCY); - - return new StorageTypeInput( - uuid, id, capEx, opEx, eStorage, sRated, cosPhi, pMax, activePowerGradient, eta); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/typeinput/Transformer2WTypeInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/typeinput/Transformer2WTypeInputFactory.java deleted file mode 100644 index 6c3df5c0c..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/typeinput/Transformer2WTypeInputFactory.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.typeinput; - -import edu.ie3.datamodel.io.factory.EntityData; -import edu.ie3.datamodel.models.StandardUnits; -import edu.ie3.datamodel.models.input.connector.type.Transformer2WTypeInput; -import java.util.Collections; -import java.util.List; -import java.util.Set; -import java.util.UUID; -import javax.measure.quantity.*; -import tech.units.indriya.ComparableQuantity; - -public class Transformer2WTypeInputFactory - extends AssetTypeInputEntityFactory { - private static final String R_SC = "rSc"; - private static final String X_SC = "xSc"; - private static final String S_RATED = "sRated"; - private static final String V_RATED_A = "vRatedA"; - private static final String V_RATED_B = "vRatedB"; - private static final String G_M = "gM"; - private static final String B_M = "bM"; - private static final String D_V = "dV"; - private static final String D_PHI = "dPhi"; - private static final String TAP_SIDE = "tapSide"; - private static final String TAP_NEUTR = "tapNeutr"; - private static final String TAP_MIN = "tapMin"; - private static final String TAP_MAX = "tapMax"; - - public Transformer2WTypeInputFactory() { - super(Transformer2WTypeInput.class); - } - - @Override - protected List> getFields(Class entityClass) { - Set constructorParams = - newSet( - UUID, ID, R_SC, X_SC, S_RATED, V_RATED_A, V_RATED_B, G_M, B_M, D_V, D_PHI, TAP_SIDE, - TAP_NEUTR, TAP_MIN, TAP_MAX); - - return Collections.singletonList(constructorParams); - } - - @Override - protected Transformer2WTypeInput buildModel(EntityData data) { - UUID uuid = data.getUUID(UUID); - String id = data.getField(ID); - ComparableQuantity rSc = data.getQuantity(R_SC, StandardUnits.RESISTANCE); - ComparableQuantity xSc = data.getQuantity(X_SC, StandardUnits.REACTANCE); - ComparableQuantity sRated = data.getQuantity(S_RATED, StandardUnits.S_RATED); - ComparableQuantity vRatedA = - data.getQuantity(V_RATED_A, StandardUnits.RATED_VOLTAGE_MAGNITUDE); - ComparableQuantity vRatedB = - data.getQuantity(V_RATED_B, StandardUnits.RATED_VOLTAGE_MAGNITUDE); - ComparableQuantity gM = data.getQuantity(G_M, StandardUnits.CONDUCTANCE); - ComparableQuantity bM = data.getQuantity(B_M, StandardUnits.SUSCEPTANCE); - ComparableQuantity dV = data.getQuantity(D_V, StandardUnits.DV_TAP); - ComparableQuantity dPhi = data.getQuantity(D_PHI, StandardUnits.DPHI_TAP); - boolean tapSide = data.getBoolean(TAP_SIDE); - int tapNeutr = data.getInt(TAP_NEUTR); - int tapMin = data.getInt(TAP_MIN); - int tapMax = data.getInt(TAP_MAX); - - return new Transformer2WTypeInput( - uuid, id, rSc, xSc, sRated, vRatedA, vRatedB, gM, bM, dV, dPhi, tapSide, tapNeutr, tapMin, - tapMax); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/typeinput/Transformer3WTypeInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/typeinput/Transformer3WTypeInputFactory.java deleted file mode 100644 index 196eaf472..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/typeinput/Transformer3WTypeInputFactory.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.typeinput; - -import edu.ie3.datamodel.io.factory.EntityData; -import edu.ie3.datamodel.models.StandardUnits; -import edu.ie3.datamodel.models.input.connector.type.Transformer3WTypeInput; -import java.util.Collections; -import java.util.List; -import java.util.Set; -import java.util.UUID; -import javax.measure.quantity.*; -import tech.units.indriya.ComparableQuantity; - -public class Transformer3WTypeInputFactory - extends AssetTypeInputEntityFactory { - private static final String S_RATED_A = "sRatedA"; - private static final String S_RATED_B = "sRatedB"; - private static final String S_RATED_C = "sRatedC"; - private static final String V_RATED_A = "vRatedA"; - private static final String V_RATED_B = "vRatedB"; - private static final String V_RATED_C = "vRatedC"; - private static final String R_SC_A = "rScA"; - private static final String R_SC_B = "rScB"; - private static final String R_SC_C = "rScC"; - private static final String X_SC_A = "xScA"; - private static final String X_SC_B = "xScB"; - private static final String X_SC_C = "xScC"; - private static final String G_M = "gM"; - private static final String B_M = "bM"; - private static final String D_V = "dV"; - private static final String D_PHI = "dPhi"; - private static final String TAP_NEUTR = "tapNeutr"; - private static final String TAP_MIN = "tapMin"; - private static final String TAP_MAX = "tapMax"; - - public Transformer3WTypeInputFactory() { - super(Transformer3WTypeInput.class); - } - - @Override - protected List> getFields(Class entityClass) { - Set constructorParams = - newSet( - UUID, ID, S_RATED_A, S_RATED_B, S_RATED_C, V_RATED_A, V_RATED_B, V_RATED_C, R_SC_A, - R_SC_B, R_SC_C, X_SC_A, X_SC_B, X_SC_C, G_M, B_M, D_V, D_PHI, TAP_NEUTR, TAP_MIN, - TAP_MAX); - - return Collections.singletonList(constructorParams); - } - - @Override - protected Transformer3WTypeInput buildModel(EntityData data) { - UUID uuid = data.getUUID(UUID); - String id = data.getField(ID); - ComparableQuantity sRatedA = data.getQuantity(S_RATED_A, StandardUnits.S_RATED); - ComparableQuantity sRatedB = data.getQuantity(S_RATED_B, StandardUnits.S_RATED); - ComparableQuantity sRatedC = data.getQuantity(S_RATED_C, StandardUnits.S_RATED); - ComparableQuantity vRatedA = - data.getQuantity(V_RATED_A, StandardUnits.RATED_VOLTAGE_MAGNITUDE); - ComparableQuantity vRatedB = - data.getQuantity(V_RATED_B, StandardUnits.RATED_VOLTAGE_MAGNITUDE); - ComparableQuantity vRatedC = - data.getQuantity(V_RATED_C, StandardUnits.RATED_VOLTAGE_MAGNITUDE); - ComparableQuantity rScA = - data.getQuantity(R_SC_A, StandardUnits.RESISTANCE); - ComparableQuantity rScB = - data.getQuantity(R_SC_B, StandardUnits.RESISTANCE); - ComparableQuantity rScC = - data.getQuantity(R_SC_C, StandardUnits.RESISTANCE); - ComparableQuantity xScA = data.getQuantity(X_SC_A, StandardUnits.REACTANCE); - ComparableQuantity xScB = data.getQuantity(X_SC_B, StandardUnits.REACTANCE); - ComparableQuantity xScC = data.getQuantity(X_SC_C, StandardUnits.REACTANCE); - ComparableQuantity gM = data.getQuantity(G_M, StandardUnits.CONDUCTANCE); - ComparableQuantity bM = data.getQuantity(B_M, StandardUnits.SUSCEPTANCE); - ComparableQuantity dV = data.getQuantity(D_V, StandardUnits.DV_TAP); - ComparableQuantity dPhi = data.getQuantity(D_PHI, StandardUnits.DPHI_TAP); - int tapNeutr = data.getInt(TAP_NEUTR); - int tapMin = data.getInt(TAP_MIN); - int tapMax = data.getInt(TAP_MAX); - - return new Transformer3WTypeInput( - uuid, id, sRatedA, sRatedB, sRatedC, vRatedA, vRatedB, vRatedC, rScA, rScB, rScC, xScA, - xScB, xScC, gM, bM, dV, dPhi, tapNeutr, tapMin, tapMax); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/naming/EntityFieldNames.java b/src/main/java/edu/ie3/datamodel/io/naming/EntityFieldNames.java new file mode 100644 index 000000000..ab99e7037 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/naming/EntityFieldNames.java @@ -0,0 +1,334 @@ +/* + * © 2025. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.naming; + +import edu.ie3.datamodel.models.input.connector.ConnectorInput; + +/** Final class that contains all entity field names. */ +public final class EntityFieldNames { + + // general fields + + /** UUID field. */ + public static final String UUID_FIELD_NAME = "uuid"; + + /** ID field. */ + public static final String ID = "id"; + + /** Operator field */ + public static final String OPERATOR = "operator"; + + /** Operation start time field. */ + public static final String OPERATES_FROM = "operatesFrom"; + + /** Operation end time field. */ + public static final String OPERATES_UNTIL = "operatesUntil"; + + /** Controlling em field. */ + public static final String CONTROLLING_EM = "controllingEm"; + + /** Connecting node field. */ + public static final String NODE = "node"; + + /** Type field. */ + public static final String TYPE = "type"; + + /** Geo position field. */ + public static final String GEO_POSITION = "geoPosition"; + + // connector fields + + /** Connecting node on port A. field */ + public static final String NODE_A = "nodeA"; + + /** Connecting node on port B field. */ + public static final String NODE_B = "nodeB"; + + /** Connecting node on port C field. */ + public static final String NODE_C = "nodeC"; + + /** Transformer tap position field. */ + public static final String TAP_POS = "tapPos"; + + /** Transformer auto tap field. */ + public static final String AUTO_TAP = "autoTap"; + + /** + * Parallel devices field. + * + *

Attribute that _can_, but does not _have to_ be present for the creation of {@link + * ConnectorInput}s. + */ + public static final String PARALLEL_DEVICES = "parallelDevices"; + + /** Switch closed field. */ + public static final String CLOSED = "closed"; + + /** Line susceptance field. */ + public static final String B = "b"; + + /** Line conductance field. */ + public static final String G = "g"; + + /** Line resistance field. */ + public static final String R = "r"; + + /** Line reactance field. */ + public static final String X = "x"; + + /** Maximal current field. */ + public static final String I_MAX = "iMax"; + + /** Length field. */ + public static final String LENGTH = "length"; + + /** Phase-to-ground conductance field. */ + public static final String G_M = "gM"; + + /** Phase-to-ground susceptance field. */ + public static final String B_M = "bM"; + + /** Voltage magnitude on tap change field. */ + public static final String D_V = "dV"; + + /** Voltage angle on tap change field. */ + public static final String D_PHI = "dPhi"; + + /** Neutral tap position field. */ + public static final String TAP_NEUTR = "tapNeutr"; + + public static final String TAP_MIN = "tapMin"; + + public static final String TAP_MAX = "tapMax"; + + public static final String R_SC = "rSc"; + + public static final String X_SC = "xSc"; + + public static final String TAP_SIDE = "tapSide"; + + public static final String R_SC_A = "rScA"; + + public static final String R_SC_B = "rScB"; + + public static final String R_SC_C = "rScC"; + + public static final String X_SC_A = "xScA"; + + public static final String X_SC_B = "xScB"; + + public static final String X_SC_C = "xScC"; + + public static final String IAMAG = "iAMag"; + + public static final String IAANG = "iAAng"; + + public static final String IBMAG = "iBMag"; + + public static final String IBANG = "iBAng"; + + public static final String ICMAG = "iCMag"; + + public static final String ICANG = "iCAng"; + + public static final String TAPPOS = "tapPos"; + + // power fields + + /** Active power field. */ + public static final String POWER = "p"; + + public static final String P_REF = "pRef"; + + public static final String P_MIN = "pMin"; + + public static final String P_MAX = "pMax"; + + /** Active power gradient field. */ + public static final String ACTIVE_POWER_GRADIENT = "activePowerGradient"; + + /** Thermal power field. */ + public static final String P_THERMAL = "pThermal"; + + /** Internal power consumption field. */ + public static final String P_OWN = "pOwn"; + + /** Reactive power field. */ + public static final String REACTIVE_POWER = "q"; + + public static final String S_RATED = "sRated"; + + public static final String S_RATED_DC = "sRatedDC"; + + public static final String S_RATED_A = "sRatedA"; + + public static final String S_RATED_B = "sRatedB"; + + public static final String S_RATED_C = "sRatedC"; + + // voltage fields + + /** Voltage level field. */ + public static final String VOLT_LVL = "voltLvl"; + + /** Voltage target field. */ + public static final String V_TARGET = "vTarget"; + + /** Rated voltage field. */ + public static final String V_RATED = "vRated"; + + /** Voltage magnitude field. */ + public static final String V_MAG = "vMag"; + + /** Voltage angle field. */ + public static final String V_ANG = "vAng"; + + /** Rated voltage at port A field. */ + public static final String V_RATED_A = "vRatedA"; + + /** Rated voltage at port B field. */ + public static final String V_RATED_B = "vRatedB"; + + /** Rated voltage at port C field. */ + public static final String V_RATED_C = "vRatedC"; + + // participant fields + + /** Olm characteristic field. */ + public static final String OLM_CHARACTERISTIC = "olmCharacteristic"; + + /** Eta conv field. */ + public static final String ETA_CONV = "etaConv"; + + /** Eta electrical field. */ + public static final String ETA_EL = "etaEl"; + + /** Eta thermal field. */ + public static final String ETA_THERMAL = "etaThermal"; + + public static final String E_STORAGE = "eStorage"; + + public static final String E_CONS = "eCons"; + + public static final String ETA = "eta"; + + public static final String CAP_EX = "capex"; + + public static final String OP_EX = "opex"; + + public static final String COS_PHI_RATED = "cosPhiRated"; + + public static final String CP_CHARACTERISTIC = "cpCharacteristic"; + + public static final String ROTOR_AREA = "rotorArea"; + + public static final String HUB_HEIGHT = "hubHeight"; + + public static final String MARKET_REACTION = "marketReaction"; + + public static final String COST_CONTROLLED = "costControlled"; + + public static final String FEED_IN_TARIFF = "feedInTariff"; + + public static final String THERMAL_BUS = "thermalBus"; + + public static final String THERMAL_STORAGE = "thermalStorage"; + + public static final String CHARGING_POINTS = "chargingPoints"; + + public static final String LOCATION_TYPE = "locationType"; + + public static final String V2G_SUPPORT = "v2gSupport"; + + public static final String LOAD_PROFILE = "loadProfile"; + + public static final String E_CONS_ANNUAL = "eConsAnnual"; + + public static final String ALBEDO = "albedo"; + + public static final String AZIMUTH = "azimuth"; + + public static final String ELEVATION_ANGLE = "elevationAngle"; + + public static final String KG = "kG"; + + public static final String KT = "kT"; + + public static final String Q_CHARACTERISTICS = "qCharacteristics"; + + public static final String SOC = "soc"; + + public static final String ENERGY = "energy"; + + // thermal fields + + public static final String STORAGE_VOLUME_LVL = "storageVolumeLvl"; + + public static final String INLET_TEMP = "inletTemp"; + + public static final String RETURN_TEMP = "returnTemp"; + + public static final String C = "c"; + + public static final String P_THERMAL_MAX = "pThermalMax"; + + public static final String ETH_LOSSES = "ethLosses"; + + public static final String ETH_CAPA = "ethCapa"; + + public static final String TARGET_TEMPERATURE = "targetTemperature"; + + public static final String UPPER_TEMPERATURE_LIMIT = "upperTemperatureLimit"; + + public static final String LOWER_TEMPERATURE_LIMIT = "lowerTemperatureLimit"; + + public static final String Q_DOT = "qDot"; + + public static final String FILL_LEVEL = "fillLevel"; + + public static final String INDOOR_TEMPERATURE = "indoorTemperature"; + + // other fields + + /** Control strategy field. */ + public static final String CONTROL_STRATEGY = "controlStrategy"; + + /** Slack node field. */ + public static final String SLACK = "slack"; + + /** Subgrid field. */ + public static final String SUBNET = "subnet"; + + public static final String SUBGRID = "subgrid"; + + public static final String HOUSING_TYPE = "housingType"; + + public static final String NUMBER_INHABITANTS = "numberInhabitants"; + + public static final String VALUE = "value"; + + public static final String MIN = "min"; + + public static final String MAX = "max"; + + public static final String TIME = "time"; + + public static final String INPUT_MODEL = "inputModel"; + + // graphic fields + + /** Graphic layer field. */ + public static final String GRAPHIC_LAYER = "graphicLayer"; + + /** Path field. */ + public static final String PATH_LINE_STRING = "path"; + + /** Line field. */ + public static final String LINE = "line"; + + /** Point field. */ + public static final String POINT = "point"; +} diff --git a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java index d232dbf27..8e70772ac 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java @@ -5,8 +5,10 @@ */ package edu.ie3.datamodel.io.processor; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.UUID_FIELD_NAME; + import edu.ie3.datamodel.exceptions.EntityProcessorException; -import edu.ie3.datamodel.io.factory.input.NodeInputFactory; +import edu.ie3.datamodel.io.naming.EntityFieldNames; import edu.ie3.datamodel.io.processor.result.ResultEntityProcessor; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.StandardUnits; @@ -66,8 +68,8 @@ public abstract class Processor { private static final String OPERATES_UNTIL = "operatesUntil"; private static final String VOLT_LVL_FIELD_NAME = "voltLvl"; - private static final String VOLT_LVL = NodeInputFactory.VOLT_LVL; - private static final String V_RATED = NodeInputFactory.V_RATED; + private static final String VOLT_LVL = EntityFieldNames.VOLT_LVL; + private static final String V_RATED = EntityFieldNames.V_RATED; private static final String PARALLEL_DEVICES = "parallelDevices"; @@ -98,8 +100,8 @@ protected Processor(Class foreSeenClass) throws EntityProcessorExce private static class UuidFirstComparator implements Comparator { @Override public int compare(String a, String b) { - if (a.equalsIgnoreCase(UniqueEntity.UUID_FIELD_NAME)) return -1; - else if (b.equalsIgnoreCase(UniqueEntity.UUID_FIELD_NAME)) return 1; + if (a.equalsIgnoreCase(UUID_FIELD_NAME)) return -1; + else if (b.equalsIgnoreCase(UUID_FIELD_NAME)) return 1; else return a.compareTo(b); } } diff --git a/src/main/java/edu/ie3/datamodel/io/processor/result/ResultEntityProcessor.java b/src/main/java/edu/ie3/datamodel/io/processor/result/ResultEntityProcessor.java index 224b75850..bf8359b13 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/result/ResultEntityProcessor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/result/ResultEntityProcessor.java @@ -6,7 +6,6 @@ package edu.ie3.datamodel.io.processor.result; import edu.ie3.datamodel.exceptions.EntityProcessorException; -import edu.ie3.datamodel.io.factory.result.SystemParticipantResultFactory; import edu.ie3.datamodel.io.processor.EntityProcessor; import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.result.CongestionResult; @@ -21,9 +20,10 @@ import edu.ie3.datamodel.models.result.thermal.DomesticHotWaterStorageResult; import edu.ie3.datamodel.models.result.thermal.ThermalHouseResult; import edu.ie3.datamodel.utils.Try; -import edu.ie3.datamodel.utils.Try.*; +import edu.ie3.datamodel.utils.Try.Failure; +import edu.ie3.datamodel.utils.Try.Success; import edu.ie3.util.exceptions.QuantityException; -import java.util.*; +import java.util.List; import javax.measure.Quantity; import javax.measure.quantity.Energy; import javax.measure.quantity.Power; @@ -31,7 +31,7 @@ /** * 'Serializer' for {@link ResultEntity}s into a fieldName to value representation to allow for an * easy processing into a database or file sink e.g. .csv It is important that the units used in - * this class are equal to the units used {@link SystemParticipantResultFactory} to prevent invalid + * this class are equal to the units used while building the models to prevent invalid * interpretation of unit prefixes! * * @version 0.1 diff --git a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java index eb007b99c..8d7c20c60 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java @@ -253,10 +253,14 @@ private , V extends Value, R extends Value> void pe if (timeSeries instanceof LoadProfileTimeSeries lpts) { timeSeriesIdentifier = lpts.getLoadProfile().getKey(); - queryBuilder = this::basicInsertQueryValuesLPTS; + queryBuilder = + (schemaName1, tableName, headerElements1) -> + basicInsertQueryValuesLPTS(schemaName1, tableName, headerElements1); } else { timeSeriesIdentifier = timeSeries.getUuid().toString(); - queryBuilder = this::basicInsertQueryValuesITS; + queryBuilder = + (schemaName1, tableName, headerElements1) -> + basicInsertQueryValuesITS(schemaName1, tableName, headerElements1); } String query = diff --git a/src/main/java/edu/ie3/datamodel/io/source/AssetEntitySource.java b/src/main/java/edu/ie3/datamodel/io/source/AssetEntitySource.java index 1757fdacd..7b42637f3 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/AssetEntitySource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/AssetEntitySource.java @@ -5,19 +5,21 @@ */ package edu.ie3.datamodel.io.source; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.*; import static edu.ie3.datamodel.models.input.OperatorInput.NO_OPERATOR_ASSIGNED; import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.io.factory.EntityData; -import edu.ie3.datamodel.io.factory.input.*; -import edu.ie3.datamodel.models.input.AssetTypeInput; +import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.input.AssetInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.connector.ConnectorInput; +import edu.ie3.datamodel.utils.Try; +import java.time.ZonedDateTime; import java.util.Map; import java.util.UUID; -import java.util.function.BiFunction; -import java.util.stream.Stream; +import java.util.function.Function; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -28,84 +30,65 @@ public abstract class AssetEntitySource extends EntitySource { protected final DataSource dataSource; - // field names - protected static final String OPERATOR = "operator"; - protected static final String NODE = "node"; - protected static final String NODE_A = "nodeA"; - protected static final String NODE_B = "nodeB"; - protected static final String TYPE = "type"; + protected AssetEntitySource(DataSource dataSource) { + this.dataSource = dataSource; + } - // enriching functions - protected static final EnrichFunction - assetEnricher = - (data, operators) -> - enrichWithDefault( - OPERATOR, operators, NO_OPERATOR_ASSIGNED, AssetInputEntityData::new) - .apply(data); + // build functions + protected static BuildFunction assetBuilder(Map operators) { + return entityData -> + entityData + .zip(uniqueEntityBuilder) + .map( + pair -> { + EntityData data = pair.getLeft(); + OperatorInput operatorInput = + extractWithDefault(data, OPERATOR, operators, NO_OPERATOR_ASSIGNED); - protected static final BiEnrichFunction< - EntityData, OperatorInput, NodeInput, NodeAssetInputEntityData> - nodeAssetEnricher = - (data, operators, nodes) -> - assetEnricher - .andThen(enrich(NODE, nodes, NodeAssetInputEntityData::new)) - .apply(data, operators); + String from = data.getFieldOptional(OPERATES_FROM).orElse(null); + String until = data.getFieldOptional(OPERATES_UNTIL).orElse(null); - protected static final BiEnrichFunction< - EntityData, OperatorInput, NodeInput, ConnectorInputEntityData> - connectorEnricher = - (data, operators, nodes) -> - assetEnricher - .andThen(biEnrich(NODE_A, nodes, NODE_B, nodes, ConnectorInputEntityData::new)) - .apply(data, operators); + OperationTime.OperationTimeBuilder builder = + new OperationTime.OperationTimeBuilder(); + if (from != null && !from.trim().isEmpty()) + builder.withStart(ZonedDateTime.parse(from)); + if (until != null && !until.trim().isEmpty()) + builder.withEnd(ZonedDateTime.parse(until)); - protected AssetEntitySource(DataSource dataSource) { - this.dataSource = dataSource; + OperationTime time = builder.build(); + + return new AssetInput(pair.getRight(), data.getField(ID), operatorInput, time) { + @Override + public AssetInputCopyBuilder copy() { + return null; + } + }; + }, + SourceException.class); } - // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + protected static BuildFunction connectorBuilder( + Map operators, Map nodes) { + return entityData -> + entityData + .zip(assetBuilder(operators)) + .map( + pair -> { + EntityData data = pair.getLeft(); + NodeInput nodeA = extractFunction(data, NODE_A, nodes); + NodeInput nodeB = extractFunction(data, NODE_B, nodes); - /** - * Method to build typed connector entities. - * - * @param entityClass class of the entity - * @param dataSource source for the data - * @param factory to build the entity - * @param operators map: uuid to {@link OperatorInput} - * @param nodes map: uuid to {@link NodeInput} - * @param types map: uuid to {@link AssetTypeInput} - * @return a stream of {@link ConnectorInput}s - * @param type of connector input - * @param type of asset types - * @throws SourceException if an error happens during reading - */ - protected static - Stream getTypedConnectorEntities( - Class entityClass, - DataSource dataSource, - ConnectorInputEntityFactory> factory, - Map operators, - Map nodes, - Map types) - throws SourceException { - return getEntities( - entityClass, - dataSource, - factory, - data -> connectorEnricher.andThen(enrichConnector(types)).apply(data, operators, nodes)); - } + int parallelDevices = + Try.of(() -> data.getInt(PARALLEL_DEVICES), SourceException.class) + .convert(Function.identity(), f -> 1); - /** - * Builds a function for enriching {@link ConnectorInputEntityData} with types. - * - * @param types all known types - * @return a typed entity data - * @param type of types - */ - private static - WrappedFunction> enrichConnector(Map types) { - BiFunction> typeEnricher = - TypedConnectorInputEntityData::new; - return entityData -> enrich(TYPE, types, typeEnricher).apply(entityData); + return new ConnectorInput(pair.getRight(), nodeA, nodeB, parallelDevices) { + @Override + public ConnectorInputCopyBuilder copy() { + return null; + } + }; + }, + SourceException.class); } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java b/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java index 5cea8a531..f3236c357 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java @@ -5,13 +5,14 @@ */ package edu.ie3.datamodel.io.source; -import static edu.ie3.datamodel.io.factory.input.EmInputFactory.CONTROLLING_EM; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.CONTROLLING_EM; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.CONTROL_STRATEGY; import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.exceptions.ValidationException; -import edu.ie3.datamodel.io.factory.input.AssetInputEntityData; -import edu.ie3.datamodel.io.factory.input.EmAssetInputEntityData; -import edu.ie3.datamodel.io.factory.input.EmInputFactory; +import edu.ie3.datamodel.io.factory.EntityData; +import edu.ie3.datamodel.io.naming.EntityFieldNames; +import edu.ie3.datamodel.models.input.AssetInput; import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.utils.Try; @@ -20,13 +21,12 @@ import java.util.UUID; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.apache.commons.lang3.tuple.Pair; public class EnergyManagementSource extends AssetEntitySource { private final TypeSource typeSource; - private static final EmInputFactory emInputFactory = new EmInputFactory(); - public EnergyManagementSource(TypeSource typeSource, DataSource dataSource) { super(dataSource); this.typeSource = typeSource; @@ -34,7 +34,7 @@ public EnergyManagementSource(TypeSource typeSource, DataSource dataSource) { @Override public void validate() throws ValidationException { - validate(EmInput.class, dataSource, emInputFactory).getOrThrow(); + validate(EmInput.class, dataSource, new SourceValidator<>(EmInput.getFields())).getOrThrow(); } /** @@ -69,39 +69,39 @@ public Map getEmUnits() throws SourceException { */ public Map getEmUnits(Map operators) throws SourceException { return createEmInputs( - buildEntityData(EmInput.class, dataSource, data -> assetEnricher.apply(data, operators))); + buildEntity(EmInput.class, dataSource).map(e -> e.zip(assetBuilder(operators)))); } /** * Since each EM can itself be controlled by another EM, it does not suffice to link {@link - * EmInput}s via {@link EntitySource#enrichFunction} as we do for system participants in {@link - * SystemParticipantSource}. Instead, we use a recursive approach, starting with EMs at root level - * (which are not EM-controlled themselves). + * EmInput}s as we do for system participants in {@link SystemParticipantSource}. Instead, we use + * a recursive approach, starting with EMs at root level (which are not EM-controlled themselves). * - * @param assetEntityDataStream the data stream of {@link AssetInputEntityData} {@link Try} - * objects + * @param assetStream the data stream of {@link AssetInput} {@link Try} objects * @return a map of UUID to {@link EmInput} entities */ private static Map createEmInputs( - Stream> assetEntityDataStream) + Stream, SourceException>> assetStream) throws SourceException { // Split stream by failures and EMs that are themselves EM-controlled on one side, and EMs at // root position (that have not failed so far) on the other side, which do not have parents per // definition. - Map>> split = - assetEntityDataStream.collect( + Map, SourceException>>> split = + assetStream.collect( Collectors.partitioningBy( dataTry -> dataTry .map( data -> - data.containsKey(CONTROLLING_EM) - && !data.getField(CONTROLLING_EM).isBlank()) + !data.getLeft() + .getFieldOptional(CONTROLLING_EM) + .orElse("") + .isBlank()) .getOrElse(() -> true))); - List> rootEmsEntityData = split.get(false); - List> others = split.get(true); + List, SourceException>> rootEmsEntityData = split.get(false); + List, SourceException>> others = split.get(true); // at the start, this is only root ems Map allEms = @@ -111,8 +111,10 @@ private static Map createEmInputs( .map( entityDataTry -> entityDataTry.map( - entityData -> new EmAssetInputEntityData(entityData, null))) - .map(emInputFactory::get), + pair -> + new EmInput( + pair.getRight(), pair.getLeft().getField(CONTROL_STRATEGY)), + SourceException.class)), EmInput.class) .collect(toMap()); @@ -126,28 +128,21 @@ private static Map createEmInputs( others.stream() .map( dataTry -> - dataTry.flatMap( - data -> { + dataTry.map( + pair -> { + EntityData data = pair.getLeft(); + // we already filtered out those entities that do not have a parent, // so the field should exist - String uuidString = data.getField(CONTROLLING_EM); - return Try.of( - () -> UUID.fromString(uuidString), - IllegalArgumentException.class) - .transformF( - iae -> - new SourceException( - String.format( - "Exception while trying to parse UUID of field \"%s\" with value \"%s\"", - CONTROLLING_EM, uuidString), - iae)) - // failed UUID parses are filtered out at this point. We save - // the parsed UUID with the asset data - .map( - parentUuid -> - new AssetDataAndValidParentUuid(data, parentUuid)); - })), - AssetDataAndValidParentUuid.class); + UUID parentUuid = data.getUUID(CONTROLLING_EM); + + // failed UUID parses are filtered out at this point. We save + // the parsed UUID with the asset data + return new AssetDataAndValidParentUuid( + pair.getRight(), data.getField(CONTROL_STRATEGY), parentUuid); + }, + SourceException.class)), + "EmInput"); allEms.putAll(createHierarchicalEmInputs(othersWithParentUuid, allEms)); } @@ -178,16 +173,13 @@ private static Map createHierarchicalEmInputs( } else { // New EMs can be built at this level Map newEms = - unpack( - toBeBuiltAtThisLevel.stream() - .map( - data -> { - // exists because we checked above - EmInput parentEm = lastLevelEms.get(data.parentEm); - return emInputFactory.get( - new EmAssetInputEntityData(data.entityData, parentEm)); - }), - EmInput.class) + toBeBuiltAtThisLevel.stream() + .map( + data -> { + // exists because we checked above + EmInput parentEm = lastLevelEms.get(data.parentEm); + return new EmInput(data.assetInput, data.controlStrategy, parentEm); + }) .collect(toMap()); if (!toBeBuiltAtNextLevel.isEmpty()) { @@ -199,8 +191,9 @@ private static Map createHierarchicalEmInputs( } /** - * Helper data record that holds an {@link AssetInputEntityData} and the UUID successfully parsed - * from {@link EmInputFactory#CONTROLLING_EM} field + * Helper data record that holds an {@link AssetInput}, a control strategy and the UUID + * successfully parsed from {@link EntityFieldNames#CONTROLLING_EM} field */ - private record AssetDataAndValidParentUuid(AssetInputEntityData entityData, UUID parentEm) {} + private record AssetDataAndValidParentUuid( + AssetInput assetInput, String controlStrategy, UUID parentEm) {} } diff --git a/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java b/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java index 149ec52ac..c298908fd 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java @@ -5,21 +5,20 @@ */ package edu.ie3.datamodel.io.source; -import edu.ie3.datamodel.exceptions.FactoryException; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.UUID_FIELD_NAME; + import edu.ie3.datamodel.exceptions.FailedValidationException; import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.exceptions.ValidationException; import edu.ie3.datamodel.io.connectors.CsvFileConnector; import edu.ie3.datamodel.io.factory.EntityData; -import edu.ie3.datamodel.io.factory.EntityFactory; import edu.ie3.datamodel.io.naming.FileNamingStrategy; import edu.ie3.datamodel.io.source.csv.CsvDataSource; import edu.ie3.datamodel.models.Entity; import edu.ie3.datamodel.models.UniqueEntity; -import edu.ie3.datamodel.utils.QuadFunction; -import edu.ie3.datamodel.utils.TriFunction; +import edu.ie3.datamodel.models.input.UniqueInputEntity; import edu.ie3.datamodel.utils.Try; -import edu.ie3.datamodel.utils.Try.Failure; +import edu.ie3.datamodel.utils.Try.Success; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; @@ -28,7 +27,6 @@ import java.nio.file.FileSystems; import java.nio.file.Path; import java.util.*; -import java.util.function.BiFunction; import java.util.function.Function; import java.util.stream.Collector; import java.util.stream.Collectors; @@ -66,6 +64,17 @@ protected EntitySource() {} */ public abstract void validate() throws ValidationException; + @SafeVarargs + protected static void validate( + DataSource dataSource, Class... entityClasses) throws FailedValidationException { + Try.scanStream( + Stream.of(entityClasses) + .map(clazz -> validate(clazz, dataSource, new SourceValidator<>())), + "Validation", + FailedValidationException::new) + .getOrThrow(); + } + /** * Method for validating a single source. * @@ -104,7 +113,7 @@ protected static Try validate( fieldsOpt -> fieldsOpt .map(fields -> validator.validate(fields, entityClass)) - .orElse(Try.Success.empty())); + .orElse(Success.empty())); } /** @@ -148,201 +157,72 @@ protected static CsvDataSource getBuildInSource(Class clazz, String subdirect } } - /** - * Universal method to get a map: uuid to {@link UniqueEntity}. - * - * @param entityClass subclass of {@link UniqueEntity} - * @param dataSource source for the data - * @param factory to build the entity - * @return a map: uuid to {@link UniqueEntity} - * @param type of entity - * @throws SourceException - if an error happen during reading - */ - @SuppressWarnings("unchecked") - protected static Map getEntities( - Class entityClass, - DataSource dataSource, - EntityFactory factory) - throws SourceException { - return unpack( - buildEntityData(entityClass, dataSource) - .map(data -> (Try) factory.get(data)), - entityClass) - .collect(toMap()); - } - /** * Universal method to get a {@link Entity} stream. * * @param entityClass class of the entity * @param dataSource source for the entity - * @param factory to build the entity - * @param enrichFunction function to enrich the given entity data + * @param buildFunction function to build the given entity data * @return a set of {@link Entity}s * @param type of entity - * @param type of entity data * @throws SourceException - if an error happen during reading */ - protected static Stream getEntities( - Class entityClass, - DataSource dataSource, - EntityFactory factory, - WrappedFunction enrichFunction) + protected static Stream getEntities( + Class entityClass, DataSource dataSource, BuildFunction buildFunction) throws SourceException { - return unpack( - buildEntityData(entityClass, dataSource, enrichFunction).map(factory::get), entityClass); + return unpack(buildEntity(entityClass, dataSource, buildFunction), entityClass); } // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= /** * Returns a stream of {@link EntityData} that can be used to build instances of several subtypes - * of {@link Entity} by a corresponding {@link EntityFactory} that consumes this data. + * of {@link Entity} by a corresponding that consumes this data. * * @param entityClass the entity class that should be build * @param dataSource source for the data * @return a stream of the entity data wrapped in a {@link Try} */ - protected static Stream> buildEntityData( + protected static Stream> buildEntity( Class entityClass, DataSource dataSource) throws SourceException { return dataSource .getSourceData(entityClass) - .map( - fieldsToAttributes -> - new Try.Success<>(new EntityData(fieldsToAttributes, entityClass))); + .map(fieldsToAttributes -> new Success<>(new EntityData(fieldsToAttributes, entityClass))); } - /** - * Returns a stream of {@link EntityData} that can be used to build instances of several subtypes - * of {@link Entity} by a corresponding {@link EntityFactory} that consumes this data. - * - * @param entityClass class of the entity - * @param dataSource source for the data - * @param converter to convert {@link EntityData} to {@link E} - * @return an entity data - * @param type of entity data - */ - protected static Stream> buildEntityData( - Class entityClass, - DataSource dataSource, - WrappedFunction converter) - throws SourceException { - return buildEntityData(entityClass, dataSource).map(converter); + protected static Stream> buildEntity( + Class entityClass, DataSource dataSource, BuildFunction fcn) throws SourceException { + return buildEntity(entityClass, dataSource).map(fcn); } // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - /** - * Method to build an enrich function. - * - * @param fieldName name of the field - * @param entities map: uuid to {@link Entity} - * @param defaultEntity entity that should be used if no other entity was extracted - * @param buildingFcn to build the returned {@link EntityData} - * @return an enrich function - * @param type of entity data - * @param type of entity - * @param type of returned entity data - */ - protected static - WrappedFunction enrichWithDefault( - String fieldName, - Map entities, - T defaultEntity, - BiFunction buildingFcn) { - return entityData -> - entityData - .zip( - extractFunction(entityData, fieldName, entities) - .orElse(() -> Try.Success.of(defaultEntity))) - .map(enrichFunction(List.of(fieldName), buildingFcn)); - } + protected static BuildFunction uniqueEntityBuilder = + entityData -> + entityData + .flatMap(data -> Try.of(() -> data.getUUID(UUID_FIELD_NAME), SourceException.class)) + .map(uuid -> (UniqueEntity) new UniqueInputEntity(uuid) {}) + .transformF( + exception -> + new SourceException("Could not build UniqueEntity due to: ", exception)); - /** - * Method to build an enrich function. - * - * @param fieldName name of the field - * @param entities map: uuid to {@link Entity} - * @param buildingFcn to build the returned {@link EntityData} - * @return an enrich function - * @param type of entity data - * @param type of entity - * @param type of returned entity data - */ - protected static WrappedFunction enrich( - String fieldName, Map entities, BiFunction buildingFcn) { - return entityData -> - entityData - .zip(extractFunction(entityData, fieldName, entities)) - .map(enrichFunction(List.of(fieldName), buildingFcn)); - } - - /** - * Method to build an enrich function. - * - * @param fieldName1 name of the first field - * @param entities1 map: uuid to {@link Entity} - * @param fieldName2 name of the second field - * @param entities2 map: uuid to {@link Entity} - * @param buildingFcn to build the returned {@link EntityData} - * @return an enrich function - * @param type of entity data - * @param type of the first entity - * @param type of the second entity - * @param type of returned entity data - */ - protected static < - E extends EntityData, T1 extends Entity, T2 extends Entity, R extends EntityData> - WrappedFunction biEnrich( - String fieldName1, - Map entities1, - String fieldName2, - Map entities2, - TriFunction buildingFcn) { - // adapting the provided function - BiFunction, R> adaptedBuildingFcn = - (data, pair) -> buildingFcn.apply(data, pair.getKey(), pair.getValue()); - - // extractor to get the needed entities - WrappedFunction> pairExtractor = - data -> - extractFunction(data, fieldName1, entities1) - .zip(extractFunction(data, fieldName2, entities2)); - - return entityData -> - entityData - .zip(pairExtractor) - .map(enrichFunction(List.of(fieldName1, fieldName2), adaptedBuildingFcn)); - } + // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= /** - * Method to build a function to create an {@link EntityData}. + * Method to unpack a stream of tries. * - * @param fieldNames list with field names - * @param buildingFcn to build the returned {@link EntityData} - * @return an entity data - * @param type of given entity data - * @param type of entities - * @param type of returned entity data + * @param inputStream given stream + * @param className name of the class of the entity + * @return a stream of entities + * @param type of entity + * @param type of exception + * @throws SourceException - if an error occurred during reading */ - protected static - Function, R> enrichFunction( - List fieldNames, BiFunction buildingFcn) { - return pair -> { - E data = pair.getKey(); - T entities = pair.getValue(); - - Map fieldsToAttributes = data.getFieldsToValues(); - - // remove fields that are passed as objects to constructor - fieldNames.forEach(fieldsToAttributes.keySet()::remove); - - return buildingFcn.apply(data, entities); - }; + protected static Stream unpack( + Stream> inputStream, String className) throws SourceException { + return Try.scanStream(inputStream, className, SourceException::new).getOrThrow(); } - // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - /** * Method to unpack a stream of tries. * @@ -358,29 +238,35 @@ protected static Stream unpack( return Try.scanStream(inputStream, clazz.getSimpleName(), SourceException::new).getOrThrow(); } + protected static T extractWithDefault( + EntityData data, String fieldName, Map entities, T defaultEntity) { + return extractEntity(data, fieldName, entities).getOrElse(() -> defaultEntity); + } + + protected static T extractFunction(EntityData data, String fieldName, Map entities) + throws SourceException { + return extractEntity(data, fieldName, entities).getOrThrow(); + } + /** * Method to extract an entity. * - * @param entityData data containing complex entities * @param fieldName name of the field * @param entities map: uuid to {@link Entity} * @return an enrichment - * @param type of entity data * @param type of entity */ - protected static Try extractFunction( - Try entityData, String fieldName, Map entities) { - return entityData.flatMap( - data -> - Try.of(() -> data.getUUID(fieldName), FactoryException.class) - .flatMap(entityUuid -> extractFunction(entityUuid, entities)) - .transformF( - exception -> - new SourceException( - "Extracting UUID for field '" - + fieldName - + "' failed. Caused by: " - + exception.getMessage()))); + protected static Try extractEntity( + EntityData data, String fieldName, Map entities) { + return Try.of(() -> data.getUUID(fieldName), SourceException.class) + .flatMap(entityUuid -> extractEntity(entityUuid, entities)) + .transformF( + exception -> + new SourceException( + "Extracting UUID for field '" + + fieldName + + "' failed. Caused by: " + + exception.getMessage())); } /** @@ -391,74 +277,26 @@ protected static Try extractFuncti * @return a try of the {@link Entity} * @param type of entity */ - protected static Try extractFunction(UUID uuid, Map entityMap) { - return Optional.ofNullable(entityMap.get(uuid)) - // We either find a matching entity for given UUID, thus return a success - .map(entity -> Try.of(() -> entity, FactoryException.class)) - // ... or find no matching entity, returning a failure. - .orElse( - new Failure<>(new FactoryException("Entity with uuid " + uuid + " was not provided."))); + protected static Try extractEntity(UUID uuid, Map entityMap) { + // We either find a matching entity for given UUID, thus return a success + // ... or find no matching entity, returning a failure. + return Try.from( + Optional.ofNullable(entityMap.get(uuid)), + () -> new SourceException("Entity with uuid " + uuid + " was not provided.")); } // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // functional interfaces - /** - * Wraps the function arguments with a try. - * - * @param type of first argument - * @param type of second argument - */ - @FunctionalInterface - protected interface WrappedFunction - extends Function, Try> {} - - /** - * Function for enriching an {@link EntityData} with an {@link Entity}. - * - * @param type of entity data - * @param type of entity - * @param type of returned entity data - */ @FunctionalInterface - protected interface EnrichFunction - extends BiFunction, Map, Try> {} + protected interface BuildFunction + extends Function, Try> { - /** - * Function for enriching an {@link EntityData} with two {@link Entity}. - * - * @param type of entity data - * @param type of first entity - * @param type of second entity - * @param type of returned entity data - */ - @FunctionalInterface - protected interface BiEnrichFunction< - E extends EntityData, T1 extends Entity, T2 extends Entity, R extends EntityData> - extends TriFunction< - Try, Map, Map, Try> {} - - /** - * Function for enriching an {@link EntityData} with three {@link Entity}. - * - * @param type of entity data - * @param type of first entity - * @param type of second entity - * @param type of third entity - * @param type of returned entity data - */ - @FunctionalInterface - protected interface TriEnrichFunction< - E extends EntityData, - T1 extends Entity, - T2 extends Entity, - T3 extends Entity, - R extends EntityData> - extends QuadFunction< - Try, - Map, - Map, - Map, - Try> {} + default BuildFunction with( + Try.TryFunction, U, SourceException> function) { + return (Try t) -> + t.zip(apply(t)).map(function, SourceException.class); + } + } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/GraphicSource.java b/src/main/java/edu/ie3/datamodel/io/source/GraphicSource.java index 904e0a42d..6341b424a 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/GraphicSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/GraphicSource.java @@ -5,14 +5,12 @@ */ package edu.ie3.datamodel.io.source; -import edu.ie3.datamodel.exceptions.FailedValidationException; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.*; + import edu.ie3.datamodel.exceptions.GraphicSourceException; import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.exceptions.ValidationException; -import edu.ie3.datamodel.io.factory.input.graphics.LineGraphicInputEntityData; -import edu.ie3.datamodel.io.factory.input.graphics.LineGraphicInputFactory; -import edu.ie3.datamodel.io.factory.input.graphics.NodeGraphicInputEntityData; -import edu.ie3.datamodel.io.factory.input.graphics.NodeGraphicInputFactory; +import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.connector.LineInput; @@ -22,11 +20,12 @@ import edu.ie3.datamodel.models.input.graphics.LineGraphicInput; import edu.ie3.datamodel.models.input.graphics.NodeGraphicInput; import edu.ie3.datamodel.utils.Try; +import edu.ie3.util.geo.GeoUtils; import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; -import java.util.stream.Stream; +import org.locationtech.jts.geom.LineString; /** * Implementation that provides the capability to build entities of type {@link GraphicInput} from @@ -40,28 +39,15 @@ public class GraphicSource extends AssetEntitySource { private final TypeSource typeSource; private final RawGridSource rawGridSource; - // factories - private final LineGraphicInputFactory lineGraphicInputFactory; - private final NodeGraphicInputFactory nodeGraphicInputFactory; - public GraphicSource(TypeSource typeSource, RawGridSource rawGridSource, DataSource dataSource) { super(dataSource); this.typeSource = typeSource; this.rawGridSource = rawGridSource; - - this.lineGraphicInputFactory = new LineGraphicInputFactory(); - this.nodeGraphicInputFactory = new NodeGraphicInputFactory(); } @Override public void validate() throws ValidationException { - Try.scanStream( - Stream.of( - validate(NodeGraphicInput.class, dataSource, nodeGraphicInputFactory), - validate(LineGraphicInput.class, dataSource, lineGraphicInputFactory)), - "Validation", - FailedValidationException::new) - .getOrThrow(); + validate(dataSource, NodeGraphicInput.class, LineGraphicInput.class); } /** Returns the graphic elements of the grid or throws a {@link SourceException} */ @@ -122,11 +108,7 @@ public Set getNodeGraphicInput() throws SourceException { public Set getNodeGraphicInput(Map nodes) throws SourceException { - return getEntities( - NodeGraphicInput.class, - dataSource, - nodeGraphicInputFactory, - enrich(NODE, nodes, NodeGraphicInputEntityData::new)) + return getEntities(NodeGraphicInput.class, dataSource, nodeGraphicBuildFunction(nodes)) .collect(toSet()); } @@ -144,11 +126,58 @@ public Set getLineGraphicInput() throws SourceException { public Set getLineGraphicInput(Map lines) throws SourceException { - return getEntities( - LineGraphicInput.class, - dataSource, - lineGraphicInputFactory, - enrich("line", lines, LineGraphicInputEntityData::new)) + return getEntities(LineGraphicInput.class, dataSource, lineGraphicBuildFunction(lines)) .collect(toSet()); } + + // building functions + protected static BuildFunction graphicBuilder() { + return entityData -> + entityData + .zip(uniqueEntityBuilder) + .map( + pair -> { + EntityData data = pair.getLeft(); + + String graphicLayer = data.getField(GRAPHIC_LAYER); + + LineString path = + data.getLineString(PATH_LINE_STRING) + .orElse( + GeoUtils.buildSafeLineStringBetweenCoords( + NodeInput.DEFAULT_GEO_POSITION.getCoordinate(), + NodeInput.DEFAULT_GEO_POSITION.getCoordinate())); + + return new GraphicInput(pair.getRight(), graphicLayer, path) { + @Override + public GraphicInputCopyBuilder> copy() { + return null; + } + }; + }, + SourceException.class); + } + + protected static BuildFunction nodeGraphicBuildFunction( + Map nodes) { + return graphicBuilder() + .with( + pair -> { + EntityData data = pair.getLeft(); + + return new NodeGraphicInput( + pair.getRight(), + extractFunction(data, NODE, nodes), + data.getPoint(POINT).orElse(NodeInput.DEFAULT_GEO_POSITION)); + }); + } + + protected static BuildFunction lineGraphicBuildFunction( + Map lines) { + return graphicBuilder() + .with( + pair -> + new LineGraphicInput( + pair.getRight(), extractFunction(pair.getLeft(), LINE, lines))); + } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java b/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java index 0fde7ede6..0d8646e8b 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java @@ -5,26 +5,23 @@ */ package edu.ie3.datamodel.io.source; -import edu.ie3.datamodel.exceptions.FailedValidationException; -import edu.ie3.datamodel.exceptions.RawGridException; -import edu.ie3.datamodel.exceptions.SourceException; -import edu.ie3.datamodel.exceptions.ValidationException; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.*; + +import edu.ie3.datamodel.exceptions.*; import edu.ie3.datamodel.io.factory.EntityData; -import edu.ie3.datamodel.io.factory.input.*; +import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.input.MeasurementUnitInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.connector.LineInput; -import edu.ie3.datamodel.models.input.connector.SwitchInput; -import edu.ie3.datamodel.models.input.connector.Transformer2WInput; -import edu.ie3.datamodel.models.input.connector.Transformer3WInput; +import edu.ie3.datamodel.models.input.connector.*; import edu.ie3.datamodel.models.input.connector.type.LineTypeInput; import edu.ie3.datamodel.models.input.connector.type.Transformer2WTypeInput; import edu.ie3.datamodel.models.input.connector.type.Transformer3WTypeInput; import edu.ie3.datamodel.models.input.container.RawGridElements; +import edu.ie3.datamodel.models.input.system.characteristic.OlmCharacteristicInput; +import edu.ie3.datamodel.utils.GridAndGeoUtils; import edu.ie3.datamodel.utils.Try; import java.util.*; -import java.util.stream.Stream; /** * Implementation that provides the capability to build entities held by {@link RawGridElements} as @@ -39,40 +36,21 @@ public class RawGridSource extends AssetEntitySource { // general fields private final TypeSource typeSource; - // factories - private final NodeInputFactory nodeInputFactory; - private final LineInputFactory lineInputFactory; - private final Transformer2WInputFactory transformer2WInputFactory; - private final Transformer3WInputFactory transformer3WInputFactory; - private final SwitchInputFactory switchInputFactory; - private final MeasurementUnitInputFactory measurementUnitInputFactory; - public RawGridSource(TypeSource typeSource, DataSource dataSource) { super(dataSource); this.typeSource = typeSource; - - // init factories - this.nodeInputFactory = new NodeInputFactory(); - this.lineInputFactory = new LineInputFactory(); - this.transformer2WInputFactory = new Transformer2WInputFactory(); - this.transformer3WInputFactory = new Transformer3WInputFactory(); - this.switchInputFactory = new SwitchInputFactory(); - this.measurementUnitInputFactory = new MeasurementUnitInputFactory(); } @Override public void validate() throws ValidationException { - Try.scanStream( - Stream.of( - validate(NodeInput.class, dataSource, nodeInputFactory), - validate(LineInput.class, dataSource, lineInputFactory), - validate(Transformer2WInput.class, dataSource, transformer2WInputFactory), - validate(Transformer3WInput.class, dataSource, transformer3WInputFactory), - validate(SwitchInput.class, dataSource, switchInputFactory), - validate(MeasurementUnitInput.class, dataSource, measurementUnitInputFactory)), - "Validation", - FailedValidationException::new) - .getOrThrow(); + validate( + dataSource, + NodeInput.class, + LineInput.class, + Transformer2WInput.class, + Transformer3WInput.class, + SwitchInput.class, + MeasurementUnitInput.class); } /** @@ -208,12 +186,7 @@ public Map getNodes() throws SourceException { * @return a map of UUID to object- and uuid-unique {@link NodeInput} entities */ public Map getNodes(Map operators) throws SourceException { - return getEntities( - NodeInput.class, - dataSource, - nodeInputFactory, - data -> assetEnricher.apply(data, operators)) - .collect(toMap()); + return getEntities(NodeInput.class, dataSource, nodeBuildFunction(operators)).collect(toMap()); } /** @@ -255,8 +228,8 @@ public Map getLines( Map nodes, Map lineTypeInputs) throws SourceException { - return getTypedConnectorEntities( - LineInput.class, dataSource, lineInputFactory, operators, nodes, lineTypeInputs) + return getEntities( + LineInput.class, dataSource, lineBuildFunction(operators, nodes, lineTypeInputs)) .collect(toMap()); } @@ -301,13 +274,10 @@ public Set get2WTransformers( Map nodes, Map transformer2WTypes) throws SourceException { - return getTypedConnectorEntities( + return getEntities( Transformer2WInput.class, dataSource, - transformer2WInputFactory, - operators, - nodes, - transformer2WTypes) + transformer2WBuildFunction(operators, nodes, transformer2WTypes)) .collect(toSet()); } @@ -352,19 +322,10 @@ public Set get3WTransformers( Map nodes, Map transformer3WTypes) throws SourceException { - WrappedFunction builder = - data -> - connectorEnricher - .andThen( - biEnrich( - "nodeC", - nodes, - TYPE, - transformer3WTypes, - Transformer3WInputEntityData::new)) - .apply(data, operators, nodes); - - return getEntities(Transformer3WInput.class, dataSource, transformer3WInputFactory, builder) + return getEntities( + Transformer3WInput.class, + dataSource, + transformer3WBuildFunction(operators, nodes, transformer3WTypes)) .collect(toSet()); } @@ -403,11 +364,7 @@ public Set getSwitches() throws SourceException { */ public Set getSwitches( Map operators, Map nodes) throws SourceException { - return getEntities( - SwitchInput.class, - dataSource, - switchInputFactory, - data -> connectorEnricher.apply(data, operators, nodes)) + return getEntities(SwitchInput.class, dataSource, switchBuildFunction(operators, nodes)) .collect(toSet()); } @@ -448,10 +405,142 @@ public Set getMeasurementUnits() throws SourceException { public Set getMeasurementUnits( Map operators, Map nodes) throws SourceException { return getEntities( - MeasurementUnitInput.class, - dataSource, - measurementUnitInputFactory, - data -> nodeAssetEnricher.apply(data, operators, nodes)) + MeasurementUnitInput.class, dataSource, measurementBuildFunction(operators, nodes)) .collect(toSet()); } + + // build functions + protected static BuildFunction transformerBuilder( + Map operators, Map nodes) { + return entityData -> + entityData + .zip(connectorBuilder(operators, nodes)) + .map( + pair -> { + EntityData data = pair.getLeft(); + + return new TransformerInput( + pair.getRight(), data.getInt(TAP_POS), data.getBoolean(AUTO_TAP)) { + @Override + public TransformerInputCopyBuilder> + copy() { + return null; + } + }; + }, + SourceException.class); + } + + protected static BuildFunction nodeBuildFunction(Map operators) { + return assetBuilder(operators) + .with( + pair -> { + EntityData data = pair.getLeft(); + + return new NodeInput( + pair.getRight(), + data.getQuantity(V_TARGET, StandardUnits.TARGET_VOLTAGE_MAGNITUDE), + data.getBoolean(SLACK), + data.getPoint(GEO_POSITION).orElse(NodeInput.DEFAULT_GEO_POSITION), + data.getVoltageLvl(VOLT_LVL.toLowerCase(), V_RATED.toLowerCase()), + data.getInt(SUBNET)); + }); + } + + protected static BuildFunction lineBuildFunction( + Map operators, + Map nodes, + Map types) { + return connectorBuilder(operators, nodes) + .with( + pair -> { + EntityData data = pair.getLeft(); + ConnectorInput connectorInput = pair.getRight(); + + String olmString = data.getField(OLM_CHARACTERISTIC); + OlmCharacteristicInput olmCharacteristic; + + try { + olmCharacteristic = + !olmString.isEmpty() + ? new OlmCharacteristicInput(olmString) + : OlmCharacteristicInput.CONSTANT_CHARACTERISTIC; + } catch (ParsingException e) { + throw new FactoryException( + "Cannot parse the following overhead line monitoring characteristic: '" + + olmString + + "'", + e); + } + + return new LineInput( + connectorInput, + extractFunction(data, TYPE, types), + data.getQuantity(LENGTH, StandardUnits.LINE_LENGTH), + data.getLineString(GEO_POSITION) + .orElse( + GridAndGeoUtils.buildSafeLineStringBetweenNodes( + connectorInput.getNodeA(), connectorInput.getNodeB())), + olmCharacteristic); + }); + } + + protected static BuildFunction transformer2WBuildFunction( + Map operators, + Map nodes, + Map types) { + return transformerBuilder(operators, nodes) + .with( + pair -> { + try { + return new Transformer2WInput( + pair.getRight(), extractFunction(pair.getLeft(), TYPE, types)); + } catch (IllegalArgumentException e) { + throw new SourceException(e); + } + }); + } + + protected static BuildFunction transformer3WBuildFunction( + Map operators, + Map nodes, + Map types) { + return transformerBuilder(operators, nodes) + .with( + pair -> { + EntityData data = pair.getLeft(); + + try { + return new Transformer3WInput( + pair.getRight(), + extractFunction(data, NODE_C, nodes), + extractFunction(data, TYPE, types)); + } catch (IllegalArgumentException e) { + throw new SourceException(e); + } + }); + } + + protected static BuildFunction switchBuildFunction( + Map operators, Map nodes) { + return connectorBuilder(operators, nodes) + .with(pair -> new SwitchInput(pair.getRight(), pair.getLeft().getBoolean(CLOSED))); + } + + protected static BuildFunction measurementBuildFunction( + Map operators, Map nodes) { + return assetBuilder(operators) + .with( + pair -> { + EntityData data = pair.getLeft(); + + return new MeasurementUnitInput( + pair.getRight(), + extractFunction(data, NODE, nodes), + data.getBoolean(V_MAG), + data.getBoolean(V_ANG), + data.getBoolean(POWER), + data.getBoolean(REACTIVE_POWER)); + }); + } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/ResultEntitySource.java b/src/main/java/edu/ie3/datamodel/io/source/ResultEntitySource.java index 1e555cc56..3ffe20a22 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/ResultEntitySource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/ResultEntitySource.java @@ -5,28 +5,30 @@ */ package edu.ie3.datamodel.io.source; -import edu.ie3.datamodel.exceptions.FailedValidationException; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.*; +import static tech.units.indriya.unit.Units.PERCENT; + +import edu.ie3.datamodel.exceptions.ParsingException; import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.exceptions.ValidationException; -import edu.ie3.datamodel.io.factory.result.*; +import edu.ie3.datamodel.io.factory.EntityData; +import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.result.CongestionResult; import edu.ie3.datamodel.models.result.NodeResult; import edu.ie3.datamodel.models.result.ResultEntity; -import edu.ie3.datamodel.models.result.connector.LineResult; -import edu.ie3.datamodel.models.result.connector.SwitchResult; -import edu.ie3.datamodel.models.result.connector.Transformer2WResult; -import edu.ie3.datamodel.models.result.connector.Transformer3WResult; +import edu.ie3.datamodel.models.result.connector.*; import edu.ie3.datamodel.models.result.system.*; -import edu.ie3.datamodel.models.result.thermal.CylindricalStorageResult; -import edu.ie3.datamodel.models.result.thermal.DomesticHotWaterStorageResult; -import edu.ie3.datamodel.models.result.thermal.ThermalHouseResult; +import edu.ie3.datamodel.models.result.thermal.*; import edu.ie3.datamodel.utils.Try; +import edu.ie3.util.TimeUtil; +import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.List; import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; +import java.util.UUID; +import javax.measure.quantity.Dimensionless; +import javax.measure.quantity.Energy; +import javax.measure.quantity.Power; +import tech.units.indriya.ComparableQuantity; /** * Interface that provides the capability to build entities of type {@link ResultEntity} container @@ -37,75 +39,48 @@ */ public class ResultEntitySource extends EntitySource { - private final SystemParticipantResultFactory systemParticipantResultFactory; - private final ThermalResultFactory thermalResultFactory; - private final SwitchResultFactory switchResultFactory; - private final NodeResultFactory nodeResultFactory; - private final ConnectorResultFactory connectorResultFactory; - private final CongestionResultFactory congestionResultFactory; - private final FlexOptionsResultFactory flexOptionsResultFactory; - private final DataSource dataSource; + protected final TimeUtil timeUtil; public ResultEntitySource(DataSource dataSource) { - this.dataSource = dataSource; + this(dataSource, TimeUtil.withDefaults); + } - // init factories - this.systemParticipantResultFactory = new SystemParticipantResultFactory(); - this.thermalResultFactory = new ThermalResultFactory(); - this.switchResultFactory = new SwitchResultFactory(); - this.nodeResultFactory = new NodeResultFactory(); - this.connectorResultFactory = new ConnectorResultFactory(); - this.congestionResultFactory = new CongestionResultFactory(); - this.flexOptionsResultFactory = new FlexOptionsResultFactory(); + public ResultEntitySource(DataSource dataSource, TimeUtil timeUtil) { + this.dataSource = dataSource; + this.timeUtil = timeUtil; } public ResultEntitySource(DataSource dataSource, DateTimeFormatter dateTimeFormatter) { this.dataSource = dataSource; - - // init factories - this.systemParticipantResultFactory = new SystemParticipantResultFactory(dateTimeFormatter); - this.thermalResultFactory = new ThermalResultFactory(); - this.switchResultFactory = new SwitchResultFactory(); - this.nodeResultFactory = new NodeResultFactory(); - this.connectorResultFactory = new ConnectorResultFactory(); - this.congestionResultFactory = new CongestionResultFactory(); - this.flexOptionsResultFactory = new FlexOptionsResultFactory(); + this.timeUtil = new TimeUtil(dateTimeFormatter); } @Override public void validate() throws ValidationException { - List> participantResults = - new ArrayList<>( - Stream.of( - LoadResult.class, - FixedFeedInResult.class, - BmResult.class, - PvResult.class, - ChpResult.class, - WecResult.class, - StorageResult.class, - EvcsResult.class, - EvResult.class, - HpResult.class, - EmResult.class) - .map(c -> validate(c, dataSource, systemParticipantResultFactory)) - .toList()); - - participantResults.addAll( - List.of( - validate(ThermalHouseResult.class, dataSource, thermalResultFactory), - validate(CylindricalStorageResult.class, dataSource, thermalResultFactory), - validate(DomesticHotWaterStorageResult.class, dataSource, thermalResultFactory), - validate(SwitchResult.class, dataSource, switchResultFactory), - validate(NodeResult.class, dataSource, nodeResultFactory), - validate(LineResult.class, dataSource, connectorResultFactory), - validate(Transformer2WResult.class, dataSource, connectorResultFactory), - validate(Transformer3WResult.class, dataSource, connectorResultFactory), - validate(FlexOptionsResult.class, dataSource, flexOptionsResultFactory), - validate(CongestionResult.class, dataSource, congestionResultFactory))); - - Try.scanCollection(participantResults, Void.class, FailedValidationException::new).getOrThrow(); + validate( + dataSource, + LoadResult.class, + FixedFeedInResult.class, + BmResult.class, + PvResult.class, + WecResult.class, + EvcsResult.class, + EmResult.class, + ChpResult.class, + HpResult.class, + StorageResult.class, + EvResult.class, + CylindricalStorageResult.class, + DomesticHotWaterStorageResult.class, + ThermalHouseResult.class, + NodeResult.class, + SwitchResult.class, + LineResult.class, + Transformer2WResult.class, + Transformer3WResult.class, + FlexOptionsResult.class, + CongestionResult.class); } /** @@ -118,7 +93,7 @@ public void validate() throws ValidationException { * @return a set of object and uuid unique {@link NodeResult} entities */ public Set getNodeResults() throws SourceException { - return getResultEntities(NodeResult.class, nodeResultFactory); + return getResultEntities(NodeResult.class, nodeResultBuildFunction(timeUtil)); } /** @@ -132,7 +107,7 @@ public Set getNodeResults() throws SourceException { * @return a set of object and uuid unique {@link SwitchResult} entities */ public Set getSwitchResults() throws SourceException { - return getResultEntities(SwitchResult.class, switchResultFactory); + return getResultEntities(SwitchResult.class, switchResultBuildFunction(timeUtil)); } /** @@ -145,7 +120,7 @@ public Set getSwitchResults() throws SourceException { * @return a set of object and uuid unique {@link LineResult} entities */ public Set getLineResults() throws SourceException { - return getResultEntities(LineResult.class, connectorResultFactory); + return getResultEntities(LineResult.class, lineResultBuildFunction(timeUtil)); } /** @@ -159,7 +134,7 @@ public Set getLineResults() throws SourceException { * @return a set of object and uuid unique {@link Transformer2WResult} entities */ public Set getTransformer2WResultResults() throws SourceException { - return getResultEntities(Transformer2WResult.class, connectorResultFactory); + return getResultEntities(Transformer2WResult.class, transformer2WResultBuilder(timeUtil)); } /** @@ -173,7 +148,7 @@ public Set getTransformer2WResultResults() throws SourceExc * @return a set of object and uuid unique {@link Transformer3WResult} entities */ public Set getTransformer3WResultResults() throws SourceException { - return getResultEntities(Transformer3WResult.class, connectorResultFactory); + return getResultEntities(Transformer3WResult.class, transformer3WResultBuilder(timeUtil)); } /** @@ -187,7 +162,7 @@ public Set getTransformer3WResultResults() throws SourceExc * @return a set of object and uuid unique {@link FlexOptionsResult} entities */ public Set getFlexOptionsResults() throws SourceException { - return getResultEntities(FlexOptionsResult.class, flexOptionsResultFactory); + return getResultEntities(FlexOptionsResult.class, flexOptionsResultBuildFunction(timeUtil)); } /** @@ -200,7 +175,7 @@ public Set getFlexOptionsResults() throws SourceException { * @return a set of object and uuid unique {@link LoadResult} entities */ public Set getLoadResults() throws SourceException { - return getResultEntities(LoadResult.class, systemParticipantResultFactory); + return getResultEntities(LoadResult.class, loadResultBuildFunction(timeUtil)); } /** @@ -213,7 +188,7 @@ public Set getLoadResults() throws SourceException { * @return a set of object and uuid unique {@link PvResult} entities */ public Set getPvResults() throws SourceException { - return getResultEntities(PvResult.class, systemParticipantResultFactory); + return getResultEntities(PvResult.class, pvResultBuildFunction(timeUtil)); } /** @@ -227,7 +202,7 @@ public Set getPvResults() throws SourceException { * @return a set of object and uuid unique {@link FixedFeedInResult} entities */ public Set getFixedFeedInResults() throws SourceException { - return getResultEntities(FixedFeedInResult.class, systemParticipantResultFactory); + return getResultEntities(FixedFeedInResult.class, fixedFeedInResultBuildFunction(timeUtil)); } /** @@ -240,7 +215,7 @@ public Set getFixedFeedInResults() throws SourceException { * @return a set of object and uuid unique {@link BmResult} entities */ public Set getBmResults() throws SourceException { - return getResultEntities(BmResult.class, systemParticipantResultFactory); + return getResultEntities(BmResult.class, bmResultBuildFunction(timeUtil)); } /** @@ -253,7 +228,7 @@ public Set getBmResults() throws SourceException { * @return a set of object and uuid unique {@link ChpResult} entities */ public Set getChpResults() throws SourceException { - return getResultEntities(ChpResult.class, systemParticipantResultFactory); + return getResultEntities(ChpResult.class, chpResultBuildFunction(timeUtil)); } /** @@ -266,7 +241,7 @@ public Set getChpResults() throws SourceException { * @return a set of object and uuid unique {@link WecResult} entities */ public Set getWecResults() throws SourceException { - return getResultEntities(WecResult.class, systemParticipantResultFactory); + return getResultEntities(WecResult.class, wecResultBuildFunction(timeUtil)); } /** @@ -280,7 +255,7 @@ public Set getWecResults() throws SourceException { * @return a set of object and uuid unique {@link StorageResult} entities */ public Set getStorageResults() throws SourceException { - return getResultEntities(StorageResult.class, systemParticipantResultFactory); + return getResultEntities(StorageResult.class, storageResultBuildFunction(timeUtil)); } /** @@ -293,7 +268,7 @@ public Set getStorageResults() throws SourceException { * @return a set of object and uuid unique {@link EvcsResult} entities */ public Set getEvcsResults() throws SourceException { - return getResultEntities(EvcsResult.class, systemParticipantResultFactory); + return getResultEntities(EvcsResult.class, evcsResultBuildFunction(timeUtil)); } /** @@ -306,7 +281,7 @@ public Set getEvcsResults() throws SourceException { * @return a set of object and uuid unique {@link EvResult} entities */ public Set getEvResults() throws SourceException { - return getResultEntities(EvResult.class, systemParticipantResultFactory); + return getResultEntities(EvResult.class, evResultBuildFunction(timeUtil)); } /** @@ -319,7 +294,7 @@ public Set getEvResults() throws SourceException { * @return a set of object and uuid unique {@link HpResult} entities */ public Set getHpResults() throws SourceException { - return getResultEntities(HpResult.class, systemParticipantResultFactory); + return getResultEntities(HpResult.class, hpResultBuildFunction(timeUtil)); } /** @@ -333,7 +308,8 @@ public Set getHpResults() throws SourceException { * @return a set of object and uuid unique {@link CylindricalStorageResult} entities */ public Set getCylindricalStorageResult() throws SourceException { - return getResultEntities(CylindricalStorageResult.class, thermalResultFactory); + return getResultEntities( + CylindricalStorageResult.class, cylindricalStorageResultBuilder(timeUtil)); } /** @@ -348,7 +324,7 @@ public Set getCylindricalStorageResult() throws Source */ public Set getDomesticHotWaterStorageResult() throws SourceException { - return getResultEntities(DomesticHotWaterStorageResult.class, thermalResultFactory); + return getResultEntities(DomesticHotWaterStorageResult.class, dhwsResultBuilder(timeUtil)); } /** @@ -362,7 +338,7 @@ public Set getDomesticHotWaterStorageResult() * @return a set of object and uuid unique {@link ThermalHouseResult} entities */ public Set getThermalHouseResults() throws SourceException { - return getResultEntities(ThermalHouseResult.class, thermalResultFactory); + return getResultEntities(ThermalHouseResult.class, thermalHouseResultBuildFunction(timeUtil)); } /** @@ -375,7 +351,7 @@ public Set getThermalHouseResults() throws SourceException { * @return a set of object and uuid unique {@link EmResult} entities */ public Set getEmResults() throws SourceException { - return getResultEntities(EmResult.class, systemParticipantResultFactory); + return getResultEntities(EmResult.class, emResultBuildFunction(timeUtil)); } /** @@ -384,7 +360,7 @@ public Set getEmResults() throws SourceException { * @return a set of object and subgrid unique {@link CongestionResult} entities */ public Set getCongestionResults() throws SourceException { - return getResultEntities(CongestionResult.class, congestionResultFactory); + return getResultEntities(CongestionResult.class, congestionResultBuildFunction(timeUtil)); } // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- @@ -394,15 +370,319 @@ public Set getCongestionResults() throws SourceException { * some general type. * * @param entityClass that should be build - * @param factory for building the entity * @return a set of entities * @param type of entity */ - @SuppressWarnings("unchecked") private Set getResultEntities( - Class entityClass, ResultEntityFactory factory) - throws SourceException { - return getEntities(entityClass, dataSource, (ResultEntityFactory) factory, t -> t) - .collect(Collectors.toSet()); + Class entityClass, BuildFunction buildFunction) throws SourceException { + return getEntities(entityClass, dataSource, buildFunction).collect(toSet()); + } + + // build functions + protected static BuildFunction buildResult(TimeUtil timeUtil) { + return entityData -> + entityData.flatMap( + data -> { + try { + ZonedDateTime time = timeUtil.toZonedDateTime(data.getField(TIME)); + UUID inputModel = data.getUUID(INPUT_MODEL); + + return Try.Success.of(new ResultEntity(time, inputModel) {}); + } catch (Exception e) { + return Try.Failure.of( + new SourceException("Could not build result model due to: ", e)); + } + }); + } + + protected static BuildFunction nodeResultBuildFunction(TimeUtil timeUtil) { + return buildResult(timeUtil) + .with( + pair -> { + EntityData data = pair.getLeft(); + + return new NodeResult( + pair.getRight(), + data.getQuantity(V_MAG, StandardUnits.VOLTAGE_MAGNITUDE), + data.getQuantity(V_ANG, StandardUnits.VOLTAGE_ANGLE)); + }); + } + + protected static BuildFunction flexOptionsResultBuildFunction( + TimeUtil timeUtil) { + return buildResult(timeUtil) + .with( + pair -> { + EntityData data = pair.getLeft(); + + return new FlexOptionsResult( + pair.getRight(), + data.getQuantity(P_REF, StandardUnits.ACTIVE_POWER_RESULT), + data.getQuantity(P_MIN, StandardUnits.ACTIVE_POWER_RESULT), + data.getQuantity(P_MAX, StandardUnits.ACTIVE_POWER_RESULT)); + }); + } + + protected static BuildFunction switchResultBuildFunction(TimeUtil timeUtil) { + return buildResult(timeUtil) + .with(pair -> new SwitchResult(pair.getRight(), pair.getLeft().getBoolean(CLOSED))); + } + + protected static BuildFunction congestionResultBuildFunction( + TimeUtil timeUtil) { + return buildResult(timeUtil) + .with( + pair -> { + EntityData data = pair.getLeft(); + + String typeString = data.getField(TYPE); + + CongestionResult.InputModelType type = + Try.of( + () -> CongestionResult.InputModelType.parse(typeString), + ParsingException.class) + .transformF(SourceException::new) + .getOrThrow(); + + return new CongestionResult( + pair.getRight(), + type, + data.getInt(SUBGRID), + data.getQuantity(VALUE, PERCENT), + data.getQuantity(MIN, PERCENT), + data.getQuantity(MAX, PERCENT)); + }); + } + + protected static BuildFunction connectorResultBuilder(TimeUtil timeUtil) { + return entityData -> + entityData + .zip(buildResult(timeUtil)) + .map( + pair -> { + EntityData data = pair.getLeft(); + + return new ConnectorResult( + pair.getRight(), + data.getQuantity(IAMAG, StandardUnits.ELECTRIC_CURRENT_MAGNITUDE), + data.getQuantity(IAANG, StandardUnits.ELECTRIC_CURRENT_ANGLE), + data.getQuantity(IBMAG, StandardUnits.ELECTRIC_CURRENT_MAGNITUDE), + data.getQuantity(IBANG, StandardUnits.ELECTRIC_CURRENT_ANGLE)) {}; + }, + SourceException.class); + } + + protected static BuildFunction lineResultBuildFunction(TimeUtil timeUtil) { + return connectorResultBuilder(timeUtil).with(pair -> new LineResult(pair.getRight())); + } + + protected static BuildFunction transformerResultBuilder(TimeUtil timeUtil) { + return entityData -> + entityData + .zip(connectorResultBuilder(timeUtil)) + .map( + pair -> new TransformerResult(pair.getRight(), pair.getLeft().getInt(TAPPOS)) {}, + SourceException.class); + } + + protected static BuildFunction transformer2WResultBuilder( + TimeUtil timeUtil) { + return transformerResultBuilder(timeUtil) + .with(pair -> new Transformer2WResult(pair.getRight())); + } + + protected static BuildFunction transformer3WResultBuilder( + TimeUtil timeUtil) { + return transformerResultBuilder(timeUtil) + .with( + pair -> { + EntityData data = pair.getLeft(); + + return new Transformer3WResult( + pair.getRight(), + data.getQuantity(ICMAG, StandardUnits.ELECTRIC_CURRENT_MAGNITUDE), + data.getQuantity(ICANG, StandardUnits.ELECTRIC_CURRENT_ANGLE)); + }); + } + + protected static BuildFunction participantResultBuilder( + TimeUtil timeUtil) { + return entityData -> + entityData + .zip(buildResult(timeUtil)) + .map( + pair -> { + EntityData data = pair.getLeft(); + + return new SystemParticipantResult( + pair.getRight(), + data.getQuantity(POWER, StandardUnits.ACTIVE_POWER_RESULT), + data.getQuantity(REACTIVE_POWER, StandardUnits.REACTIVE_POWER_RESULT)) {}; + }, + SourceException.class); + } + + protected static BuildFunction loadResultBuildFunction(TimeUtil timeUtil) { + return participantResultBuilder(timeUtil).with(pair -> new LoadResult(pair.getRight())); + } + + protected static BuildFunction pvResultBuildFunction(TimeUtil timeUtil) { + return participantResultBuilder(timeUtil).with(pair -> new PvResult(pair.getRight())); + } + + protected static BuildFunction fixedFeedInResultBuildFunction( + TimeUtil timeUtil) { + return participantResultBuilder(timeUtil).with(pair -> new FixedFeedInResult(pair.getRight())); + } + + protected static BuildFunction bmResultBuildFunction(TimeUtil timeUtil) { + return participantResultBuilder(timeUtil).with(pair -> new BmResult(pair.getRight())); + } + + protected static BuildFunction wecResultBuildFunction(TimeUtil timeUtil) { + return participantResultBuilder(timeUtil).with(pair -> new WecResult(pair.getRight())); + } + + protected static BuildFunction evcsResultBuildFunction(TimeUtil timeUtil) { + return participantResultBuilder(timeUtil).with(pair -> new EvcsResult(pair.getRight())); + } + + protected static BuildFunction emResultBuildFunction(TimeUtil timeUtil) { + return participantResultBuilder(timeUtil).with(pair -> new EmResult(pair.getRight())); + } + + protected static BuildFunction participantWithHeatResultBuilder( + TimeUtil timeUtil) { + return entityData -> + entityData + .zip(participantResultBuilder(timeUtil)) + .map( + pair -> { + EntityData data = pair.getLeft(); + + return new SystemParticipantWithHeatResult( + pair.getRight(), data.getQuantity(Q_DOT, StandardUnits.Q_DOT_RESULT)) {}; + }, + SourceException.class); + } + + protected static BuildFunction chpResultBuildFunction(TimeUtil timeUtil) { + return participantWithHeatResultBuilder(timeUtil).with(pair -> new ChpResult(pair.getRight())); + } + + protected static BuildFunction hpResultBuildFunction(TimeUtil timeUtil) { + return participantWithHeatResultBuilder(timeUtil).with(pair -> new HpResult(pair.getRight())); + } + + protected static BuildFunction + electricalEnergyStorageResultBuilder(TimeUtil timeUtil) { + return entityData -> + entityData + .zip(participantResultBuilder(timeUtil)) + .map( + pair -> + new ElectricalEnergyStorageResult( + pair.getRight(), pair.getLeft().getQuantity(SOC, StandardUnits.SOC)) { + @Override + public ComparableQuantity getSoc() { + return super.getSoc(); + } + }, + SourceException.class); + } + + protected static BuildFunction storageResultBuildFunction(TimeUtil timeUtil) { + return electricalEnergyStorageResultBuilder(timeUtil) + .with(pair -> new StorageResult(pair.getRight())); + } + + protected static BuildFunction evResultBuildFunction(TimeUtil timeUtil) { + return electricalEnergyStorageResultBuilder(timeUtil) + .with(pair -> new EvResult(pair.getRight())); + } + + protected static BuildFunction thermalUnitResultBuilder(TimeUtil timeUtil) { + return entityData -> + entityData + .zip(buildResult(timeUtil)) + .map( + pair -> + new ThermalUnitResult( + pair.getRight(), + pair.getLeft().getQuantity(Q_DOT, StandardUnits.HEAT_DEMAND)) { + @Override + public ComparableQuantity getqDot() { + return super.getqDot(); + } + }, + SourceException.class); + } + + protected static BuildFunction thermalSinkResultBuilder(TimeUtil timeUtil) { + return entityData -> + entityData + .zip(thermalUnitResultBuilder(timeUtil)) + .map( + pair -> + new ThermalSinkResult(pair.getRight()) { + @Override + public ComparableQuantity getqDot() { + return super.getqDot(); + } + }, + SourceException.class); + } + + protected static BuildFunction thermalHouseResultBuildFunction( + TimeUtil timeUtil) { + return thermalSinkResultBuilder(timeUtil) + .with( + pair -> + new ThermalHouseResult( + pair.getRight(), + pair.getLeft().getQuantity(INDOOR_TEMPERATURE, StandardUnits.TEMPERATURE))); + } + + protected static BuildFunction thermalStorageResultBuilder( + TimeUtil timeUtil) { + return entityData -> + entityData + .zip(thermalUnitResultBuilder(timeUtil)) + .map( + pair -> + new ThermalStorageResult( + pair.getRight(), + pair.getLeft().getQuantity(ENERGY, StandardUnits.ENERGY_RESULT)) { + @Override + public ComparableQuantity getEnergy() { + return super.getEnergy(); + } + }, + SourceException.class); + } + + protected static BuildFunction abstractThermalStorageResultBuilder( + TimeUtil timeUtil) { + return entityData -> + entityData + .zip(thermalStorageResultBuilder(timeUtil)) + .map( + pair -> + new AbstractThermalStorageResult( + pair.getRight(), + pair.getLeft().getQuantity(FILL_LEVEL, StandardUnits.FILL_LEVEL)) {}, + SourceException.class); + } + + protected static BuildFunction cylindricalStorageResultBuilder( + TimeUtil timeUtil) { + return abstractThermalStorageResultBuilder(timeUtil) + .with(pair -> new CylindricalStorageResult(pair.getRight())); + } + + protected static BuildFunction dhwsResultBuilder( + TimeUtil timeUtil) { + return abstractThermalStorageResultBuilder(timeUtil) + .with(pair -> new DomesticHotWaterStorageResult(pair.getRight())); } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/SourceValidator.java b/src/main/java/edu/ie3/datamodel/io/source/SourceValidator.java index e1c43c89f..c30614343 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/SourceValidator.java +++ b/src/main/java/edu/ie3/datamodel/io/source/SourceValidator.java @@ -5,12 +5,29 @@ */ package edu.ie3.datamodel.io.source; +import edu.ie3.datamodel.exceptions.FailedValidationException; import edu.ie3.datamodel.exceptions.ValidationException; import edu.ie3.datamodel.utils.Try; import edu.ie3.datamodel.utils.Try.Failure; -import java.util.Set; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.util.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -public interface SourceValidator { +public class SourceValidator { + public static final Logger log = LoggerFactory.getLogger(SourceValidator.class); + + private final List> fields; + + public SourceValidator() { + fields = new ArrayList<>(); + } + + public SourceValidator(Fields fields) { + this.fields = fields.fields; + } /** * Method for validating a data source. @@ -19,5 +36,188 @@ public interface SourceValidator { * @param entityClass that should be buildable from the source data * @return either an exception wrapped by a {@link Failure} or an empty success */ - Try validate(Set actualFields, Class entityClass); + public Try validate( + Set actualFields, Class entityClass) { + List> fieldSets = getFields(entityClass); + Set harmonizedActualFields = toCamelCase(actualFields); + + // comparing the actual fields to a list of possible fields (allows additional fields) + // if not all fields were found in a set, this set is filtered out + // all other fields are saved as a list + // allows snake, camel and mixed cases + List> validFieldSets = + fieldSets.stream().filter(harmonizedActualFields::containsAll).toList(); + + if (validFieldSets.isEmpty()) { + // build the exception string with extensive debug information + String providedKeysString = "[" + String.join(", ", actualFields) + "]"; + + String possibleOptions = getFieldsString(fieldSets).toString(); + + return Failure.of( + new FailedValidationException( + "The provided fields " + + providedKeysString + + " are invalid for instance of '" + + entityClass.getSimpleName() + + "'. \nThe following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of '" + + entityClass.getSimpleName() + + "' are possible (NOT case-sensitive!):\n" + + possibleOptions)); + } else { + // find all unused fields + Set unused = getUnusedFields(harmonizedActualFields, validFieldSets); + + if (!unused.isEmpty()) { + log.info( + "The following additional fields were found for entity class of '{}': {}", + entityClass.getSimpleName(), + unused); + } + + return Try.Success.empty(); + } + } + + /** + * Returns list of sets of attribute names that the entity requires to be built. At least one of + * these sets needs to be delivered for entity creation to be successful. + * + * @param entityClass class that can be used to specify the fields that are returned + * @return list of possible attribute sets + */ + protected List> getFields(Class entityClass) { + if (fields.isEmpty()) { + MethodType type = MethodType.methodType(Fields.class); + + try { + MethodHandle handle = MethodHandles.lookup().findStatic(entityClass, "getFields", type); + Fields fields = (Fields) handle.invoke(); + return fields.fields; + } catch (Throwable e) { + throw new RuntimeException(e); + } + } else { + return fields; + } + } + + /** + * Method to find and return additional fields that were found in a source and are not used by the + * data model. This method will return the minimal unused fields among all field sets, meaning + * that the set of actual fields is compared to the field set with the least unused fields. + * + * @param actualFields found in the source + * @param validFieldSets that contains at least all fields found in the source + * @return a set of unused fields + */ + protected Set getUnusedFields( + Set actualFields, List> validFieldSets) { + // checking for additional fields + // and returning the set with the least additional fields + return validFieldSets.stream() + .map( + s -> { + Set set = new HashSet<>(actualFields); + set.removeAll(s); + return set; + }) + .min(Comparator.comparing(Collection::size)) + .orElse(Collections.emptySet()); + } + + protected static StringBuilder getFieldsString(List> fieldSets) { + StringBuilder possibleOptions = new StringBuilder(); + for (int i = 0; i < fieldSets.size(); i++) { + Set fieldSet = fieldSets.get(i); + String option = + i + + ": [" + + String.join(", ", fieldSet) + + "] or [" + + String.join(", ", toSnakeCase(fieldSet)) + + "]\n"; + possibleOptions.append(option); + } + return possibleOptions; + } + + public record Fields(List> fields) { + + @SafeVarargs + public Fields(Set... sets) { + this(Arrays.asList(sets)); + } + + public Fields(String... fields) { + this(List.of(newSet(fields))); + } + + public Fields add(String... fields) { + List> expandedSets = new ArrayList<>(); + + for (Set set : this.fields) { + expandedSets.add(expandSet(set, fields)); + } + + return new Fields(expandedSets); + } + + public Fields addOptional(String field) { + List> expandedSets = new ArrayList<>(fields); + + for (Set set : fields) { + expandedSets.add(expandSet(set, field)); + } + + return new Fields(expandedSets); + } + } + + /** + * Creates a new set of attribute names from given list of attributes. This method should always + * be used when returning attribute sets. + * + * @param attributes attribute names + * @return new set exactly containing attribute names + */ + public static TreeSet newSet(String... attributes) { + TreeSet set = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); + set.addAll(Arrays.asList(attributes)); + return set; + } + + /** + * Expands a set of attributes with further attributes. This method should always be used when + * returning attribute sets, i.e. through getting the needed fields. The set maintains a + * lexicographic order, that is case-insensitive. + * + * @param attributeSet set of attributes to expand + * @param more attribute names to expand given set with + * @return new set exactly containing given attribute set plus additional attributes + */ + public static TreeSet expandSet(Set attributeSet, String... more) { + TreeSet newSet = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); + newSet.addAll(attributeSet); + newSet.addAll(Arrays.asList(more)); + return newSet; + } + + public static Set toSnakeCase(Set set) { + TreeSet newSet = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); + newSet.addAll(set.stream().map(edu.ie3.util.StringUtils::camelCaseToSnakeCase).toList()); + return newSet; + } + + public static Set toCamelCase(Set set) { + TreeSet newSet = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); + newSet.addAll(set.stream().map(edu.ie3.util.StringUtils::snakeCaseToCamelCase).toList()); + return newSet; + } + + public static Set toLowerCase(Set set) { + TreeSet newSet = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); + newSet.addAll(set.stream().map(String::toLowerCase).toList()); + return newSet; + } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java b/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java index fd4c0f2cc..e5d4f5d6f 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java @@ -5,28 +5,33 @@ */ package edu.ie3.datamodel.io.source; -import edu.ie3.datamodel.exceptions.FailedValidationException; -import edu.ie3.datamodel.exceptions.SourceException; -import edu.ie3.datamodel.exceptions.SystemParticipantsException; -import edu.ie3.datamodel.exceptions.ValidationException; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.*; + +import edu.ie3.datamodel.exceptions.*; import edu.ie3.datamodel.io.factory.EntityData; -import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData; -import edu.ie3.datamodel.io.factory.input.participant.*; +import edu.ie3.datamodel.io.naming.EntityFieldNames; +import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.container.SystemParticipants; import edu.ie3.datamodel.models.input.system.*; +import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; import edu.ie3.datamodel.models.input.system.type.*; +import edu.ie3.datamodel.models.input.system.type.chargingpoint.ChargingPointType; +import edu.ie3.datamodel.models.input.system.type.chargingpoint.ChargingPointTypeUtils; +import edu.ie3.datamodel.models.input.system.type.evcslocation.EvcsLocationType; +import edu.ie3.datamodel.models.input.system.type.evcslocation.EvcsLocationTypeUtils; import edu.ie3.datamodel.models.input.thermal.ThermalBusInput; import edu.ie3.datamodel.models.input.thermal.ThermalStorageInput; +import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.utils.Try; import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; -import java.util.function.BiFunction; -import java.util.stream.Stream; +import javax.measure.quantity.Power; +import tech.units.indriya.ComparableQuantity; /** * Implementation that provides the capability to build entities of type {@link @@ -34,42 +39,12 @@ */ public class SystemParticipantSource extends AssetEntitySource { - private static final String THERMAL_STORAGE = "thermalstorage"; - private static final String THERMAL_BUS = "thermalbus"; - // general fields private final TypeSource typeSource; private final RawGridSource rawGridSource; private final ThermalSource thermalSource; private final EnergyManagementSource energyManagementSource; - // factories - private final BmInputFactory bmInputFactory; - private final ChpInputFactory chpInputFactory; - private final EvInputFactory evInputFactory; - private final FixedFeedInInputFactory fixedFeedInInputFactory; - private final HpInputFactory hpInputFactory; - private final LoadInputFactory loadInputFactory; - private final PvInputFactory pvInputFactory; - private final StorageInputFactory storageInputFactory; - private final WecInputFactory wecInputFactory; - private final EvcsInputFactory evcsInputFactory; - - // enriching function - protected static final TriEnrichFunction< - EntityData, OperatorInput, NodeInput, EmInput, SystemParticipantEntityData> - participantEnricher = - (data, operators, nodes, emUnits) -> - assetEnricher - .andThen(enrich(NODE, nodes, NodeAssetInputEntityData::new)) - .andThen( - enrichWithDefault( - SystemParticipantInputEntityFactory.CONTROLLING_EM, - emUnits, - null, - SystemParticipantEntityData::new)) - .apply(data, operators); - public SystemParticipantSource( TypeSource typeSource, ThermalSource thermalSource, @@ -82,37 +57,22 @@ public SystemParticipantSource( this.rawGridSource = rawGridSource; this.thermalSource = thermalSource; this.energyManagementSource = energyManagementSource; - - // init factories - this.bmInputFactory = new BmInputFactory(); - this.chpInputFactory = new ChpInputFactory(); - this.evInputFactory = new EvInputFactory(); - this.fixedFeedInInputFactory = new FixedFeedInInputFactory(); - this.hpInputFactory = new HpInputFactory(); - this.loadInputFactory = new LoadInputFactory(); - this.pvInputFactory = new PvInputFactory(); - this.storageInputFactory = new StorageInputFactory(); - this.wecInputFactory = new WecInputFactory(); - this.evcsInputFactory = new EvcsInputFactory(); } @Override public void validate() throws ValidationException { - Try.scanStream( - Stream.of( - validate(BmInput.class, dataSource, bmInputFactory), - validate(ChpInput.class, dataSource, chpInputFactory), - validate(EvInput.class, dataSource, evInputFactory), - validate(FixedFeedInInput.class, dataSource, fixedFeedInInputFactory), - validate(HpInput.class, dataSource, hpInputFactory), - validate(LoadInput.class, dataSource, loadInputFactory), - validate(PvInput.class, dataSource, pvInputFactory), - validate(StorageInput.class, dataSource, storageInputFactory), - validate(WecInput.class, dataSource, wecInputFactory), - validate(EvcsInput.class, dataSource, evcsInputFactory)), - "Validation", - FailedValidationException::new) - .getOrThrow(); + validate( + dataSource, + BmInput.class, + ChpInput.class, + EvInput.class, + FixedFeedInInput.class, + HpInput.class, + LoadInput.class, + PvInput.class, + StorageInput.class, + WecInput.class, + EvcsInput.class); } /** @@ -286,10 +246,7 @@ public Set getFixedFeedIns( Map operators, Map nodes, Map emUnits) throws SourceException { return getEntities( - FixedFeedInInput.class, - dataSource, - fixedFeedInInputFactory, - data -> participantEnricher.apply(data, operators, nodes, emUnits)) + FixedFeedInInput.class, dataSource, fixedFeedInBuildFunction(operators, nodes, emUnits)) .collect(toSet()); } @@ -330,11 +287,7 @@ public Set getPvPlants() throws SourceException { public Set getPvPlants( Map operators, Map nodes, Map emUnits) throws SourceException { - return getEntities( - PvInput.class, - dataSource, - pvInputFactory, - data -> participantEnricher.apply(data, operators, nodes, emUnits)) + return getEntities(PvInput.class, dataSource, pvBuildFunction(operators, nodes, emUnits)) .collect(toSet()); } @@ -375,11 +328,7 @@ public Set getLoads() throws SourceException { public Set getLoads( Map operators, Map nodes, Map emUnits) throws SourceException { - return getEntities( - LoadInput.class, - dataSource, - loadInputFactory, - data -> participantEnricher.apply(data, operators, nodes, emUnits)) + return getEntities(LoadInput.class, dataSource, loadBuildFunction(operators, nodes, emUnits)) .collect(toSet()); } @@ -420,11 +369,7 @@ public Set getEvcs() throws SourceException { public Set getEvcs( Map operators, Map nodes, Map emUnits) throws SourceException { - return getEntities( - EvcsInput.class, - dataSource, - evcsInputFactory, - data -> participantEnricher.apply(data, operators, nodes, emUnits)) + return getEntities(EvcsInput.class, dataSource, evcsBuildFunction(operators, nodes, emUnits)) .collect(toSet()); } @@ -470,14 +415,7 @@ public Set getBmPlants( Map emUnits, Map types) throws SourceException { - return getEntities( - BmInput.class, - dataSource, - bmInputFactory, - data -> - participantEnricher - .andThen(enrichTypes(types)) - .apply(data, operators, nodes, emUnits)) + return getEntities(BmInput.class, dataSource, bmBuildFunction(operators, nodes, emUnits, types)) .collect(toSet()); } @@ -526,13 +464,7 @@ public Set getStorages( Map types) throws SourceException { return getEntities( - StorageInput.class, - dataSource, - storageInputFactory, - data -> - participantEnricher - .andThen(enrichTypes(types)) - .apply(data, operators, nodes, emUnits)) + StorageInput.class, dataSource, storageBuildFunction(operators, nodes, emUnits, types)) .collect(toSet()); } @@ -579,13 +511,7 @@ public Set getWecPlants( Map types) throws SourceException { return getEntities( - WecInput.class, - dataSource, - wecInputFactory, - data -> - participantEnricher - .andThen(enrichTypes(types)) - .apply(data, operators, nodes, emUnits)) + WecInput.class, dataSource, wecBuildFunction(operators, nodes, emUnits, types)) .collect(toSet()); } @@ -630,14 +556,7 @@ public Set getEvs( Map emUnits, Map types) throws SourceException { - return getEntities( - EvInput.class, - dataSource, - evInputFactory, - data -> - participantEnricher - .andThen(enrichTypes(types)) - .apply(data, operators, nodes, emUnits)) + return getEntities(EvInput.class, dataSource, evBuildFunction(operators, nodes, emUnits, types)) .collect(toSet()); } @@ -681,21 +600,11 @@ public Set getChpPlants( Map thermalBuses, Map thermalStorages) throws SourceException { - - WrappedFunction builder = - data -> - participantEnricher - .andThen(enrichTypes(types)) - .andThen( - biEnrich( - THERMAL_BUS, - thermalBuses, - THERMAL_STORAGE, - thermalStorages, - ChpInputEntityData::new)) - .apply(data, operators, nodes, emUnits); - - return getEntities(ChpInput.class, dataSource, chpInputFactory, builder).collect(toSet()); + return getEntities( + ChpInput.class, + dataSource, + chpBuildFunction(operators, nodes, emUnits, types, thermalBuses, thermalStorages)) + .collect(toSet()); } public Set getHeatPumps() throws SourceException { @@ -733,29 +642,247 @@ public Set getHeatPumps( Map types, Map thermalBuses) throws SourceException { + return getEntities( + HpInput.class, + dataSource, + hpBuildFunction(operators, nodes, emUnits, types, thermalBuses)) + .collect(toSet()); + } - WrappedFunction builder = - data -> - participantEnricher - .andThen(enrichTypes(types)) - .andThen(enrich(THERMAL_BUS, thermalBuses, HpInputEntityData::new)) - .apply(data, operators, nodes, emUnits); - return getEntities(HpInput.class, dataSource, hpInputFactory, builder).collect(toSet()); + // build function + protected static BuildFunction getParticipantBuilder( + Map operators, Map nodes, Map emUnits) { + return entityData -> + entityData + .zip(assetBuilder(operators)) + .map( + pair -> { + EntityData data = pair.getLeft(); + + ReactivePowerCharacteristic qCharacteristics; + try { + qCharacteristics = + ReactivePowerCharacteristic.parse(data.getField(Q_CHARACTERISTICS)); + } catch (ParsingException e) { + throw new SourceException( + "Cannot parse the following reactive power characteristic: '" + + data.getField(Q_CHARACTERISTICS) + + "'", + e); + } + + return new SystemParticipantInput( + pair.getRight(), + extractFunction(data, NODE, nodes), + qCharacteristics, + extractWithDefault(data, CONTROLLING_EM, emUnits, null)) { + @Override + public ComparableQuantity sRated() { + return null; + } + + @Override + public SystemParticipantInputCopyBuilder copy() { + return null; + } + }; + }, + SourceException.class); } - // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + protected static BuildFunction bmBuildFunction( + Map operators, + Map nodes, + Map emUnits, + Map types) { + return getParticipantBuilder(operators, nodes, emUnits) + .with( + pair -> { + EntityData data = pair.getLeft(); + + return new BmInput( + pair.getRight(), + extractFunction(data, TYPE, types), + data.getBoolean(MARKET_REACTION), + data.getBoolean(COST_CONTROLLED), + data.getQuantity(FEED_IN_TARIFF, StandardUnits.ENERGY_PRICE)); + }); + } - /** - * Builds a function for enriching {@link SystemParticipantEntityData} with types. - * - * @param types all known types - * @return a typed entity data - * @param type of types - */ - private static - WrappedFunction> enrichTypes(Map types) { - BiFunction> typeEnricher = - SystemParticipantTypedEntityData::new; - return entityData -> enrich(TYPE, types, typeEnricher).apply(entityData); + protected static BuildFunction chpBuildFunction( + Map operators, + Map nodes, + Map emUnits, + Map types, + Map thermalBuses, + Map thermalStorages) { + return getParticipantBuilder(operators, nodes, emUnits) + .with( + pair -> { + EntityData data = pair.getLeft(); + + return new ChpInput( + pair.getRight(), + extractFunction(data, TYPE, types), + extractFunction(data, THERMAL_BUS, thermalBuses), + extractFunction(data, THERMAL_STORAGE, thermalStorages), + data.getBoolean(MARKET_REACTION)); + }); + } + + protected static BuildFunction evcsBuildFunction( + Map operators, Map nodes, Map emUnits) { + return getParticipantBuilder(operators, nodes, emUnits) + .with( + pair -> { + EntityData data = pair.getLeft(); + ChargingPointType type; + + try { + type = ChargingPointTypeUtils.parse(data.getField(TYPE)); + } catch (ChargingPointTypeException e) { + throw new SourceException( + String.format( + "Exception while trying to parse field \"%s\" with supposed int value \"%s\"", + TYPE, data.getField(TYPE)), + e); + } + + EvcsLocationType locationType; + + try { + locationType = EvcsLocationTypeUtils.parse(data.getField(LOCATION_TYPE)); + } catch (ParsingException e) { + throw new SourceException( + String.format( + "Exception while trying to parse field \"%s\" with supposed int value \"%s\"", + LOCATION_TYPE, data.getField(LOCATION_TYPE)), + e); + } + + return new EvcsInput( + pair.getRight(), + type, + data.getInt(CHARGING_POINTS), + data.getDouble(COS_PHI_RATED), + locationType, + data.getBoolean(V2G_SUPPORT)); + }); + } + + protected static BuildFunction evBuildFunction( + Map operators, + Map nodes, + Map emUnits, + Map types) { + return getParticipantBuilder(operators, nodes, emUnits) + .with(pair -> new EvInput(pair.getRight(), extractFunction(pair.getLeft(), TYPE, types))); + } + + protected static BuildFunction fixedFeedInBuildFunction( + Map operators, Map nodes, Map emUnits) { + return getParticipantBuilder(operators, nodes, emUnits) + .with( + pair -> { + EntityData data = pair.getLeft(); + return new FixedFeedInInput( + pair.getRight(), + data.getQuantity(S_RATED, StandardUnits.S_RATED), + data.getDouble(COS_PHI_RATED)); + }); + } + + protected static BuildFunction hpBuildFunction( + Map operators, + Map nodes, + Map emUnits, + Map types, + Map thermalBuses) { + return getParticipantBuilder(operators, nodes, emUnits) + .with( + pair -> { + EntityData data = pair.getLeft(); + + return new HpInput( + pair.getRight(), + extractFunction(data, TYPE, types), + extractFunction(data, THERMAL_BUS, thermalBuses)); + }); + } + + protected static BuildFunction loadBuildFunction( + Map operators, Map nodes, Map emUnits) { + return getParticipantBuilder(operators, nodes, emUnits) + .with( + pair -> { + EntityData data = pair.getLeft(); + SystemParticipantInput p = pair.getRight(); + + LoadProfile loadProfile; + try { + loadProfile = LoadProfile.parse(data.getField(LOAD_PROFILE)); + } catch (ParsingException e) { + log.warn( + "Cannot parse the standard load profile \"{}\" of load \"{}\". Assign no load profile instead.", + data.getField(LOAD_PROFILE), + p.getId()); + loadProfile = LoadProfile.DefaultLoadProfiles.NO_LOAD_PROFILE; + } + + return new LoadInput( + p, + loadProfile, + data.getQuantity(E_CONS_ANNUAL, StandardUnits.ENERGY_IN), + data.getQuantity(S_RATED, StandardUnits.S_RATED), + data.getDouble(EntityFieldNames.COS_PHI_RATED)); + }); + } + + protected static BuildFunction pvBuildFunction( + Map operators, Map nodes, Map emUnits) { + return getParticipantBuilder(operators, nodes, emUnits) + .with( + pair -> { + EntityData data = pair.getLeft(); + return new PvInput( + pair.getRight(), + data.getDouble(ALBEDO), + data.getQuantity(AZIMUTH, StandardUnits.AZIMUTH), + data.getQuantity(ETA_CONV, StandardUnits.EFFICIENCY), + data.getQuantity(ELEVATION_ANGLE, StandardUnits.SOLAR_ELEVATION_ANGLE), + data.getDouble(KG), + data.getDouble(KT), + data.getBoolean(MARKET_REACTION), + data.getQuantity(S_RATED, StandardUnits.S_RATED), + data.getDouble(COS_PHI_RATED)); + }); + } + + protected static BuildFunction storageBuildFunction( + Map operators, + Map nodes, + Map emUnits, + Map types) { + return getParticipantBuilder(operators, nodes, emUnits) + .with( + pair -> + new StorageInput(pair.getRight(), extractFunction(pair.getLeft(), TYPE, types))); + } + + protected static BuildFunction wecBuildFunction( + Map operators, + Map nodes, + Map emUnits, + Map types) { + return getParticipantBuilder(operators, nodes, emUnits) + .with( + pair -> { + EntityData data = pair.getLeft(); + + return new WecInput( + pair.getRight(), + extractFunction(data, TYPE, types), + data.getBoolean(MARKET_REACTION)); + }); } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java b/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java index bc955ff82..d7eeab1ab 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java @@ -5,12 +5,14 @@ */ package edu.ie3.datamodel.io.source; -import edu.ie3.datamodel.exceptions.*; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.*; + +import edu.ie3.datamodel.exceptions.SourceException; +import edu.ie3.datamodel.exceptions.ValidationException; import edu.ie3.datamodel.io.factory.EntityData; -import edu.ie3.datamodel.io.factory.input.*; +import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.thermal.*; -import edu.ie3.datamodel.utils.Try; import java.util.Collection; import java.util.Map; import java.util.Set; @@ -29,45 +31,19 @@ public class ThermalSource extends AssetEntitySource { // general fields private final TypeSource typeSource; - // factories - private final ThermalBusInputFactory thermalBusInputFactory; - private final CylindricalStorageInputFactory cylindricalStorageInputFactory; - private final DomesticHotWaterStorageInputFactory domesticHotWaterStorageInputFactory; - private final ThermalHouseInputFactory thermalHouseInputFactory; - - // enriching function - protected static BiEnrichFunction< - EntityData, OperatorInput, ThermalBusInput, ThermalUnitInputEntityData> - thermalUnitEnricher = - (data, operators, buses) -> - assetEnricher - .andThen(enrich("thermalbus", buses, ThermalUnitInputEntityData::new)) - .apply(data, operators); - public ThermalSource(TypeSource typeSource, DataSource dataSource) { super(dataSource); this.typeSource = typeSource; - - this.thermalBusInputFactory = new ThermalBusInputFactory(); - this.cylindricalStorageInputFactory = new CylindricalStorageInputFactory(); - this.domesticHotWaterStorageInputFactory = new DomesticHotWaterStorageInputFactory(); - this.thermalHouseInputFactory = new ThermalHouseInputFactory(); } @Override public void validate() throws ValidationException { - Try.scanStream( - Stream.of( - validate(ThermalBusInput.class, dataSource, thermalBusInputFactory), - validate(CylindricalStorageInput.class, dataSource, cylindricalStorageInputFactory), - validate( - DomesticHotWaterStorageInput.class, - dataSource, - domesticHotWaterStorageInputFactory), - validate(ThermalHouseInput.class, dataSource, thermalHouseInputFactory)), - "Validation", - FailedValidationException::new) - .getOrThrow(); + validate( + dataSource, + ThermalBusInput.class, + CylindricalStorageInput.class, + DomesticHotWaterStorageInput.class, + ThermalHouseInput.class); } /** @@ -105,11 +81,7 @@ public Map getThermalBuses() throws SourceException { */ public Map getThermalBuses(Map operators) throws SourceException { - return getEntities( - ThermalBusInput.class, - dataSource, - thermalBusInputFactory, - data -> assetEnricher.apply(data, operators)) + return getEntities(ThermalBusInput.class, dataSource, thermalBusBuilder(operators)) .collect(toMap()); } @@ -200,10 +172,7 @@ public Map getThermalHouses( Map operators, Map thermalBuses) throws SourceException { return getEntities( - ThermalHouseInput.class, - dataSource, - thermalHouseInputFactory, - data -> thermalUnitEnricher.apply(data, operators, thermalBuses)) + ThermalHouseInput.class, dataSource, thermalHouseBuildFunction(operators, thermalBuses)) .collect(toMap()); } @@ -267,8 +236,7 @@ public Set getCylindricalStorages( return getEntities( CylindricalStorageInput.class, dataSource, - cylindricalStorageInputFactory, - data -> thermalUnitEnricher.apply(data, operators, thermalBuses)) + cylindricalStorageBuildFunction(operators, thermalBuses)) .collect(toSet()); } @@ -298,8 +266,100 @@ public Set getDomesticHotWaterStorages( return getEntities( DomesticHotWaterStorageInput.class, dataSource, - domesticHotWaterStorageInputFactory, - data -> thermalUnitEnricher.apply(data, operators, thermalBuses)) + dhwsBuildFunction(operators, thermalBuses)) .collect(toSet()); } + + // build function + protected static BuildFunction thermalBuilder(Map operators) { + return entityData -> + entityData + .zip(assetBuilder(operators)) + .map( + pair -> + new ThermalInput(pair.getRight()) { + @Override + public AssetInputCopyBuilder copy() { + return null; + } + }, + SourceException.class); + } + + protected static BuildFunction thermalBusBuilder( + Map operators) { + return thermalBuilder(operators).with(pair -> new ThermalBusInput(pair.getRight())); + } + + protected static BuildFunction thermalUnitBuilder( + Map operators, Map thermalBuses) { + return entityData -> + entityData + .zip(thermalBuilder(operators)) + .map( + pair -> + new ThermalUnitInput( + pair.getRight(), + extractFunction(pair.getLeft(), THERMAL_BUS, thermalBuses)) { + @Override + public ThermalUnitInputCopyBuilder copy() { + return null; + } + }, + SourceException.class); + } + + protected static BuildFunction thermalHouseBuildFunction( + Map operators, Map thermalBuses) { + return thermalUnitBuilder(operators, thermalBuses) + .with( + pair -> { + EntityData data = pair.getLeft(); + return new ThermalHouseInput( + pair.getRight(), + data.getQuantity(ETH_LOSSES, StandardUnits.THERMAL_TRANSMISSION), + data.getQuantity(ETH_CAPA, StandardUnits.HEAT_CAPACITY), + data.getQuantity(TARGET_TEMPERATURE, StandardUnits.TEMPERATURE), + data.getQuantity(UPPER_TEMPERATURE_LIMIT, StandardUnits.TEMPERATURE), + data.getQuantity(LOWER_TEMPERATURE_LIMIT, StandardUnits.TEMPERATURE), + data.getField(HOUSING_TYPE), + data.getDouble(NUMBER_INHABITANTS)); + }); + } + + protected static BuildFunction thermalStorageBuilder( + Map operators, Map thermalBuses) { + return entityData -> + entityData + .zip(thermalUnitBuilder(operators, thermalBuses)) + .map( + pair -> { + EntityData data = pair.getLeft(); + return new AbstractStorageInput( + pair.getRight(), + data.getQuantity(STORAGE_VOLUME_LVL, StandardUnits.VOLUME), + data.getQuantity(INLET_TEMP, StandardUnits.TEMPERATURE), + data.getQuantity(RETURN_TEMP, StandardUnits.TEMPERATURE), + data.getQuantity(C, StandardUnits.SPECIFIC_HEAT_CAPACITY), + data.getQuantity(P_THERMAL_MAX, StandardUnits.ACTIVE_POWER_IN)) { + @Override + public ThermalStorageInputCopyBuilder copy() { + return null; + } + }; + }, + SourceException.class); + } + + protected static BuildFunction cylindricalStorageBuildFunction( + Map operators, Map thermalBuses) { + return thermalStorageBuilder(operators, thermalBuses) + .with(pair -> new CylindricalStorageInput(pair.getRight())); + } + + protected static BuildFunction dhwsBuildFunction( + Map operators, Map thermalBuses) { + return thermalStorageBuilder(operators, thermalBuses) + .with(pair -> new DomesticHotWaterStorageInput(pair.getRight())); + } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/TypeSource.java b/src/main/java/edu/ie3/datamodel/io/source/TypeSource.java index 67f3ecd0b..4944b3cb7 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/TypeSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/TypeSource.java @@ -5,25 +5,24 @@ */ package edu.ie3.datamodel.io.source; -import edu.ie3.datamodel.exceptions.FailedValidationException; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.*; + +import edu.ie3.datamodel.exceptions.FactoryException; +import edu.ie3.datamodel.exceptions.ParsingException; import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.exceptions.ValidationException; -import edu.ie3.datamodel.io.factory.input.OperatorInputFactory; -import edu.ie3.datamodel.io.factory.typeinput.LineTypeInputFactory; -import edu.ie3.datamodel.io.factory.typeinput.SystemParticipantTypeInputFactory; -import edu.ie3.datamodel.io.factory.typeinput.Transformer2WTypeInputFactory; -import edu.ie3.datamodel.io.factory.typeinput.Transformer3WTypeInputFactory; +import edu.ie3.datamodel.io.factory.EntityData; +import edu.ie3.datamodel.models.StandardUnits; +import edu.ie3.datamodel.models.input.AssetTypeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.connector.type.LineTypeInput; import edu.ie3.datamodel.models.input.connector.type.Transformer2WTypeInput; import edu.ie3.datamodel.models.input.connector.type.Transformer3WTypeInput; +import edu.ie3.datamodel.models.input.connector.type.TransformerTypeInput; +import edu.ie3.datamodel.models.input.system.characteristic.WecCharacteristicInput; import edu.ie3.datamodel.models.input.system.type.*; -import edu.ie3.datamodel.utils.Try; -import java.util.ArrayList; -import java.util.List; import java.util.Map; import java.util.UUID; -import java.util.stream.Stream; /** * Interface that provides the capability to build entities of type {@link @@ -34,47 +33,26 @@ * @since 08.04.20 */ public class TypeSource extends EntitySource { - // factories - private final OperatorInputFactory operatorInputFactory; - private final Transformer2WTypeInputFactory transformer2WTypeInputFactory; - private final LineTypeInputFactory lineTypeInputFactory; - private final Transformer3WTypeInputFactory transformer3WTypeInputFactory; - private final SystemParticipantTypeInputFactory systemParticipantTypeInputFactory; - - private final DataSource dataSource; + protected final DataSource dataSource; public TypeSource(DataSource dataSource) { this.dataSource = dataSource; - - this.operatorInputFactory = new OperatorInputFactory(); - this.transformer2WTypeInputFactory = new Transformer2WTypeInputFactory(); - this.lineTypeInputFactory = new LineTypeInputFactory(); - this.transformer3WTypeInputFactory = new Transformer3WTypeInputFactory(); - this.systemParticipantTypeInputFactory = new SystemParticipantTypeInputFactory(); } @Override public void validate() throws ValidationException { - List> participantResults = - new ArrayList<>( - Stream.of( - EvTypeInput.class, - HpTypeInput.class, - BmTypeInput.class, - WecTypeInput.class, - ChpTypeInput.class, - StorageTypeInput.class) - .map(c -> validate(c, dataSource, systemParticipantTypeInputFactory)) - .toList()); - - participantResults.addAll( - List.of( - validate(OperatorInput.class, dataSource, operatorInputFactory), - validate(LineTypeInput.class, dataSource, lineTypeInputFactory), - validate(Transformer2WTypeInput.class, dataSource, transformer2WTypeInputFactory), - validate(Transformer3WTypeInput.class, dataSource, transformer3WTypeInputFactory))); - - Try.scanCollection(participantResults, Void.class, FailedValidationException::new).getOrThrow(); + validate( + dataSource, + EvTypeInput.class, + HpTypeInput.class, + BmTypeInput.class, + WecTypeInput.class, + ChpTypeInput.class, + StorageTypeInput.class, + OperatorInput.class, + LineTypeInput.class, + Transformer2WTypeInput.class, + Transformer3WTypeInput.class); } /** @@ -88,7 +66,8 @@ public void validate() throws ValidationException { * @return a map of UUID to object- and uuid-unique {@link Transformer2WTypeInput} entities */ public Map getTransformer2WTypes() throws SourceException { - return getEntities(Transformer2WTypeInput.class, dataSource, transformer2WTypeInputFactory); + return getEntities(Transformer2WTypeInput.class, dataSource, transformer2WTypeBuildFunction) + .collect(toMap()); } /** @@ -101,7 +80,7 @@ public Map getTransformer2WTypes() throws SourceEx * @return a map of UUID to object- and uuid-unique {@link OperatorInput} entities */ public Map getOperators() throws SourceException { - return getEntities(OperatorInput.class, dataSource, operatorInputFactory); + return getEntities(OperatorInput.class, dataSource, operatorBuildFunction).collect(toMap()); } /** @@ -114,7 +93,7 @@ public Map getOperators() throws SourceException { * @return a map of UUID to object- and uuid-unique {@link LineTypeInput} entities */ public Map getLineTypes() throws SourceException { - return getEntities(LineTypeInput.class, dataSource, lineTypeInputFactory); + return getEntities(LineTypeInput.class, dataSource, lineTypeBuildFunction).collect(toMap()); } /** @@ -128,7 +107,8 @@ public Map getLineTypes() throws SourceException { * @return a map of UUID to object- and uuid-unique {@link Transformer3WTypeInput} entities */ public Map getTransformer3WTypes() throws SourceException { - return getEntities(Transformer3WTypeInput.class, dataSource, transformer3WTypeInputFactory); + return getEntities(Transformer3WTypeInput.class, dataSource, transformer3WTypeBuildFunction) + .collect(toMap()); } /** @@ -141,7 +121,7 @@ public Map getTransformer3WTypes() throws SourceEx * @return a map of UUID to object- and uuid-unique {@link BmTypeInput} entities */ public Map getBmTypes() throws SourceException { - return getEntities(BmTypeInput.class, dataSource, systemParticipantTypeInputFactory); + return getEntities(BmTypeInput.class, dataSource, bmTypeBuildFunction).collect(toMap()); } /** @@ -154,7 +134,7 @@ public Map getBmTypes() throws SourceException { * @return a map of UUID to object- and uuid-unique {@link ChpTypeInput} entities */ public Map getChpTypes() throws SourceException { - return getEntities(ChpTypeInput.class, dataSource, systemParticipantTypeInputFactory); + return getEntities(ChpTypeInput.class, dataSource, chpTypeBuildFunction).collect(toMap()); } /** @@ -167,7 +147,7 @@ public Map getChpTypes() throws SourceException { * @return a map of UUID to object- and uuid-unique {@link HpTypeInput} entities */ public Map getHpTypes() throws SourceException { - return getEntities(HpTypeInput.class, dataSource, systemParticipantTypeInputFactory); + return getEntities(HpTypeInput.class, dataSource, hpTypeBuildFunction).collect(toMap()); } /** @@ -181,7 +161,7 @@ public Map getHpTypes() throws SourceException { * @return a map of UUID to object- and uuid-unique {@link StorageTypeInput} entities */ public Map getStorageTypes() throws SourceException { - return getEntities(StorageTypeInput.class, dataSource, systemParticipantTypeInputFactory); + return getEntities(StorageTypeInput.class, dataSource, storageBuildFunction).collect(toMap()); } /** @@ -194,7 +174,7 @@ public Map getStorageTypes() throws SourceException { * @return a map of UUID to object- and uuid-unique {@link WecTypeInput} entities */ public Map getWecTypes() throws SourceException { - return getEntities(WecTypeInput.class, dataSource, systemParticipantTypeInputFactory); + return getEntities(WecTypeInput.class, dataSource, wecTypeBuildFunction).collect(toMap()); } /** @@ -207,6 +187,200 @@ public Map getWecTypes() throws SourceException { * @return a map of UUID to object- and uuid-unique {@link EvTypeInput} entities */ public Map getEvTypes() throws SourceException { - return getEntities(EvTypeInput.class, dataSource, systemParticipantTypeInputFactory); + return getEntities(EvTypeInput.class, dataSource, evTypeBuildFunction).collect(toMap()); } + + // build functions + protected static final BuildFunction assetTypeBuilder = + entityData -> + entityData + .zip(uniqueEntityBuilder) + .map( + pair -> + new AssetTypeInput(pair.getRight(), pair.getLeft().getField(ID)) { + @Override + public AssetTypeInputCopyBuilder copy() { + return null; + } + }, + SourceException.class); + + protected static BuildFunction operatorBuildFunction = + uniqueEntityBuilder.with( + pair -> new OperatorInput(pair.getRight(), pair.getLeft().getField(ID))); + + protected static BuildFunction lineTypeBuildFunction = + uniqueEntityBuilder.with( + pair -> { + EntityData data = pair.getLeft(); + + return new LineTypeInput( + pair.getRight().getUuid(), + data.getField(ID), + data.getQuantity(B, StandardUnits.SUSCEPTANCE_PER_LENGTH), + data.getQuantity(G, StandardUnits.CONDUCTANCE_PER_LENGTH), + data.getQuantity(R, StandardUnits.RESISTANCE_PER_LENGTH), + data.getQuantity(X, StandardUnits.REACTANCE_PER_LENGTH), + data.getQuantity(I_MAX, StandardUnits.ELECTRIC_CURRENT_MAGNITUDE), + data.getQuantity(V_RATED, StandardUnits.RATED_VOLTAGE_MAGNITUDE)); + }); + + protected static BuildFunction transformerTypeBuilder = + entityData -> + entityData + .zip(assetTypeBuilder) + .map( + pair -> { + EntityData data = pair.getLeft(); + return new TransformerTypeInput( + pair.getRight(), + data.getQuantity(G_M, StandardUnits.CONDUCTANCE), + data.getQuantity(B_M, StandardUnits.SUSCEPTANCE), + data.getQuantity(D_V, StandardUnits.DV_TAP), + data.getQuantity(D_PHI, StandardUnits.DPHI_TAP), + data.getQuantity(V_RATED_A, StandardUnits.RATED_VOLTAGE_MAGNITUDE), + data.getQuantity(V_RATED_B, StandardUnits.RATED_VOLTAGE_MAGNITUDE), + data.getInt(TAP_NEUTR), + data.getInt(TAP_MIN), + data.getInt(TAP_MAX)) { + @Override + public AssetTypeInputCopyBuilder copy() { + return null; + } + }; + }, + SourceException.class); + + protected static BuildFunction transformer2WTypeBuildFunction = + transformerTypeBuilder.with( + pair -> { + EntityData data = pair.getLeft(); + + return new Transformer2WTypeInput( + pair.getRight(), + data.getQuantity(R_SC, StandardUnits.RESISTANCE), + data.getQuantity(X_SC, StandardUnits.RESISTANCE), + data.getQuantity(S_RATED, StandardUnits.S_RATED), + data.getBoolean(TAP_SIDE)); + }); + + protected static BuildFunction transformer3WTypeBuildFunction = + transformerTypeBuilder.with( + pair -> { + EntityData data = pair.getLeft(); + + return new Transformer3WTypeInput( + pair.getRight(), + data.getQuantity(S_RATED_A, StandardUnits.S_RATED), + data.getQuantity(S_RATED_B, StandardUnits.S_RATED), + data.getQuantity(S_RATED_C, StandardUnits.S_RATED), + data.getQuantity(V_RATED_C, StandardUnits.RATED_VOLTAGE_MAGNITUDE), + data.getQuantity(R_SC_A, StandardUnits.RESISTANCE), + data.getQuantity(R_SC_B, StandardUnits.RESISTANCE), + data.getQuantity(R_SC_C, StandardUnits.RESISTANCE), + data.getQuantity(X_SC_A, StandardUnits.RESISTANCE), + data.getQuantity(X_SC_B, StandardUnits.RESISTANCE), + data.getQuantity(X_SC_C, StandardUnits.RESISTANCE)); + }); + + protected static BuildFunction systemParticipantTypeBuilder = + entityData -> + entityData + .zip(assetTypeBuilder) + .map( + pair -> { + EntityData data = pair.getLeft(); + return new SystemParticipantTypeInput( + pair.getRight(), + data.getQuantity(CAP_EX, StandardUnits.CAPEX), + data.getQuantity(OP_EX, StandardUnits.ENERGY_PRICE), + data.getQuantity(S_RATED, StandardUnits.S_RATED), + data.getDouble(COS_PHI_RATED)) { + @Override + public SystemParticipantTypeInputCopyBuilder copy() { + return null; + } + }; + }, + SourceException.class); + + protected static BuildFunction bmTypeBuildFunction = + systemParticipantTypeBuilder.with( + pair -> { + EntityData data = pair.getLeft(); + + return new BmTypeInput( + pair.getRight(), + data.getQuantity(ACTIVE_POWER_GRADIENT, StandardUnits.ACTIVE_POWER_GRADIENT), + data.getQuantity(ETA_CONV, StandardUnits.EFFICIENCY)); + }); + + protected static BuildFunction chpTypeBuildFunction = + systemParticipantTypeBuilder.with( + pair -> { + EntityData data = pair.getLeft(); + + return new ChpTypeInput( + pair.getRight(), + data.getQuantity(ETA_EL, StandardUnits.EFFICIENCY), + data.getQuantity(ETA_THERMAL, StandardUnits.EFFICIENCY), + data.getQuantity(P_THERMAL, StandardUnits.ACTIVE_POWER_IN), + data.getQuantity(P_OWN, StandardUnits.ACTIVE_POWER_IN)); + }); + + protected static BuildFunction hpTypeBuildFunction = + systemParticipantTypeBuilder.with( + pair -> + new HpTypeInput( + pair.getRight(), + pair.getLeft().getQuantity(P_THERMAL, StandardUnits.ACTIVE_POWER_IN))); + + protected static BuildFunction storageBuildFunction = + systemParticipantTypeBuilder.with( + pair -> { + EntityData data = pair.getLeft(); + + return new StorageTypeInput( + pair.getRight(), + data.getQuantity(E_STORAGE, StandardUnits.ENERGY_IN), + data.getQuantity(P_MAX, StandardUnits.ACTIVE_POWER_IN), + data.getQuantity(ACTIVE_POWER_GRADIENT, StandardUnits.ACTIVE_POWER_GRADIENT), + data.getQuantity(ETA, StandardUnits.EFFICIENCY)); + }); + + protected static BuildFunction wecTypeBuildFunction = + systemParticipantTypeBuilder.with( + pair -> { + EntityData data = pair.getLeft(); + + WecCharacteristicInput cpCharacteristic; + + try { + cpCharacteristic = new WecCharacteristicInput(data.getField(CP_CHARACTERISTIC)); + } catch (ParsingException ex) { + throw new FactoryException( + "Cannot parse the following Betz characteristic: '" + + data.getField(CP_CHARACTERISTIC) + + "'", + ex); + } + + return new WecTypeInput( + pair.getRight(), + cpCharacteristic, + data.getQuantity(ETA_CONV, StandardUnits.EFFICIENCY), + data.getQuantity(ROTOR_AREA, StandardUnits.ROTOR_AREA), + data.getQuantity(HUB_HEIGHT, StandardUnits.HUB_HEIGHT)); + }); + + protected static BuildFunction evTypeBuildFunction = + systemParticipantTypeBuilder.with( + pair -> { + EntityData data = pair.getLeft(); + return new EvTypeInput( + pair.getRight(), + data.getQuantity(E_STORAGE, StandardUnits.ENERGY_IN), + data.getQuantity(E_CONS, StandardUnits.ENERGY_PER_DISTANCE), + data.getQuantity(S_RATED_DC, StandardUnits.ACTIVE_POWER_IN)); + }); } diff --git a/src/main/java/edu/ie3/datamodel/models/UniqueEntity.java b/src/main/java/edu/ie3/datamodel/models/UniqueEntity.java index 8a6fcb1c6..1e14eefb3 100644 --- a/src/main/java/edu/ie3/datamodel/models/UniqueEntity.java +++ b/src/main/java/edu/ie3/datamodel/models/UniqueEntity.java @@ -5,14 +5,15 @@ */ package edu.ie3.datamodel.models; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.UUID_FIELD_NAME; +import static edu.ie3.datamodel.io.source.SourceValidator.*; + import java.io.Serializable; import java.util.Objects; import java.util.UUID; /** Supplies every subclass with a generated UUID, making it unique */ public abstract class UniqueEntity implements Entity, Uniqueness, Serializable { - /** Field name of {@link UniqueEntity} uuid */ - public static final String UUID_FIELD_NAME = "uuid"; private final UUID uuid; @@ -29,6 +30,10 @@ public UUID getUuid() { return uuid; } + protected static Fields uniqueEntityFields() { + return new Fields(UUID_FIELD_NAME); + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/edu/ie3/datamodel/models/input/AssetInput.java b/src/main/java/edu/ie3/datamodel/models/input/AssetInput.java index 3904c31f4..6955eedbd 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/AssetInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/AssetInput.java @@ -5,13 +5,17 @@ */ package edu.ie3.datamodel.models.input; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.*; + +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.Operable; import edu.ie3.datamodel.models.OperationTime; -import java.util.Objects; -import java.util.UUID; +import edu.ie3.datamodel.models.UniqueEntity; +import java.util.*; /** Describes a grid asset under the assumption that every asset could be operable */ public abstract class AssetInput extends UniqueInputEntity implements Operable { + /** Time for which the entity is operated */ private final OperationTime operationTime; @@ -46,6 +50,18 @@ protected AssetInput(UUID uuid, String id) { this(uuid, id, OperatorInput.NO_OPERATOR_ASSIGNED, OperationTime.notLimited()); } + protected AssetInput(AssetInput assetInput) { + super(assetInput.getUuid()); + this.operationTime = assetInput.getOperationTime(); + this.operator = assetInput.getOperator(); + this.id = assetInput.getId(); + } + + protected AssetInput( + UniqueEntity entity, String id, OperatorInput operator, OperationTime operationTime) { + this(entity.getUuid(), id, operator, operationTime); + } + @Override public OperationTime getOperationTime() { return operationTime; @@ -60,6 +76,14 @@ public String getId() { return id; } + protected static SourceValidator.Fields assetFields() { + return uniqueEntityFields() + .add(ID) + .addOptional(OPERATOR) + .addOptional(OPERATES_FROM) + .addOptional(OPERATES_UNTIL); + } + public abstract AssetInputCopyBuilder copy(); @Override diff --git a/src/main/java/edu/ie3/datamodel/models/input/AssetTypeInput.java b/src/main/java/edu/ie3/datamodel/models/input/AssetTypeInput.java index 57ef4258d..77b96ebff 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/AssetTypeInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/AssetTypeInput.java @@ -5,11 +5,16 @@ */ package edu.ie3.datamodel.models.input; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.ID; + +import edu.ie3.datamodel.io.source.SourceValidator; +import edu.ie3.datamodel.models.UniqueEntity; import java.util.Objects; import java.util.UUID; /** Describes the type of an {@link edu.ie3.datamodel.models.input.AssetInput} */ public abstract class AssetTypeInput extends UniqueInputEntity { + /** Name or ID of the asset */ private final String id; @@ -22,6 +27,20 @@ protected AssetTypeInput(UUID uuid, String id) { this.id = id; } + protected AssetTypeInput(UniqueEntity entity, String id) { + super(entity.getUuid()); + this.id = id; + } + + protected AssetTypeInput(AssetTypeInput assetTypeInput) { + super(assetTypeInput.getUuid()); + this.id = assetTypeInput.getId(); + } + + protected static SourceValidator.Fields assetTypeFields() { + return uniqueEntityFields().add(ID); + } + public String getId() { return id; } diff --git a/src/main/java/edu/ie3/datamodel/models/input/EmInput.java b/src/main/java/edu/ie3/datamodel/models/input/EmInput.java index e75a5e716..561ea1a20 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/EmInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/EmInput.java @@ -5,7 +5,11 @@ */ package edu.ie3.datamodel.models.input; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.CONTROLLING_EM; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.CONTROL_STRATEGY; + import edu.ie3.datamodel.io.extractor.HasEm; +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.UniqueEntity; import java.util.Objects; @@ -45,6 +49,16 @@ public EmInput( this.controllingEm = controllingEm; } + public EmInput(AssetInput assetInput, String emControlStrategy) { + this(assetInput, emControlStrategy, null); + } + + public EmInput(AssetInput assetInput, String emControlStrategy, EmInput controllingEm) { + super(assetInput); + this.controlStrategy = emControlStrategy; + this.controllingEm = controllingEm; + } + /** * Constructor for an operated energy management system * @@ -59,6 +73,10 @@ public EmInput(UUID uuid, String id, String emControlStrategy, EmInput controlli this.controllingEm = controllingEm; } + public static SourceValidator.Fields getFields() { + return assetFields().add(CONTROL_STRATEGY, CONTROLLING_EM); + } + public String getControlStrategy() { return controlStrategy; } diff --git a/src/main/java/edu/ie3/datamodel/models/input/MeasurementUnitInput.java b/src/main/java/edu/ie3/datamodel/models/input/MeasurementUnitInput.java index 663c8d5c5..4299b9f05 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/MeasurementUnitInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/MeasurementUnitInput.java @@ -5,12 +5,16 @@ */ package edu.ie3.datamodel.models.input; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.*; + import edu.ie3.datamodel.io.extractor.HasNodes; +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.OperationTime; import java.util.*; /** Model of a measuring unit attached to a certain {@link NodeInput}. */ public class MeasurementUnitInput extends AssetInput implements HasNodes { + /** Grid node, the asset is attached to */ private final NodeInput node; @@ -78,6 +82,20 @@ public MeasurementUnitInput( this.q = q; } + public MeasurementUnitInput( + AssetInput assetInput, NodeInput node, boolean vMag, boolean vAng, boolean p, boolean q) { + super(assetInput); + this.node = node; + this.vMag = vMag; + this.vAng = vAng; + this.p = p; + this.q = q; + } + + public static SourceValidator.Fields getFields() { + return assetFields().add(NODE, V_MAG, V_ANG, POWER, REACTIVE_POWER); + } + public NodeInput getNode() { return node; } diff --git a/src/main/java/edu/ie3/datamodel/models/input/NodeInput.java b/src/main/java/edu/ie3/datamodel/models/input/NodeInput.java index b4bc55aec..104ab1528 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/NodeInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/NodeInput.java @@ -5,18 +5,21 @@ */ package edu.ie3.datamodel.models.input; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.*; + +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.voltagelevels.VoltageLevel; import edu.ie3.util.geo.GeoUtils; -import java.util.Objects; -import java.util.UUID; +import java.util.*; import javax.measure.quantity.Dimensionless; import org.locationtech.jts.geom.Point; import tech.units.indriya.ComparableQuantity; /** Describes an electrical grid node, that other assets can connect to */ public class NodeInput extends AssetInput { + /** Target voltage magnitude of the node with regard to its rated voltage (typically in p.u.) */ private final ComparableQuantity vTarget; @@ -98,6 +101,25 @@ public NodeInput( this.subnet = subnet; } + public NodeInput( + AssetInput assetInput, + ComparableQuantity vTarget, + boolean slack, + Point geoPosition, + VoltageLevel voltLvl, + int subnet) { + this( + assetInput.getUuid(), + assetInput.getId(), + assetInput.getOperator(), + assetInput.getOperationTime(), + vTarget, + slack, + geoPosition, + voltLvl, + subnet); + } + public ComparableQuantity getvTarget() { return vTarget; } @@ -118,6 +140,10 @@ public int getSubnet() { return subnet; } + public static SourceValidator.Fields getFields() { + return assetFields().add(V_TARGET, V_RATED, SLACK, GEO_POSITION, VOLT_LVL, SUBNET); + } + @Override public NodeInputCopyBuilder copy() { return new NodeInputCopyBuilder(this); diff --git a/src/main/java/edu/ie3/datamodel/models/input/OperatorInput.java b/src/main/java/edu/ie3/datamodel/models/input/OperatorInput.java index 1886ec918..a88f1725a 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/OperatorInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/OperatorInput.java @@ -5,6 +5,10 @@ */ package edu.ie3.datamodel.models.input; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.ID; + +import edu.ie3.datamodel.io.source.SourceValidator; +import edu.ie3.datamodel.models.UniqueEntity; import java.util.Objects; import java.util.UUID; @@ -28,6 +32,15 @@ public OperatorInput(UUID uuid, String id) { this.id = id; } + public OperatorInput(UniqueEntity entity, String id) { + super(entity.getUuid()); + this.id = id; + } + + public static SourceValidator.Fields getFields() { + return UniqueEntity.uniqueEntityFields().add(ID); + } + public String getId() { return id; } diff --git a/src/main/java/edu/ie3/datamodel/models/input/connector/ConnectorInput.java b/src/main/java/edu/ie3/datamodel/models/input/connector/ConnectorInput.java index 576c7ed3b..9df7ee46b 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/connector/ConnectorInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/connector/ConnectorInput.java @@ -5,15 +5,21 @@ */ package edu.ie3.datamodel.models.input.connector; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.*; + import edu.ie3.datamodel.io.extractor.HasNodes; +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.input.AssetInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; -import java.util.*; +import java.util.List; +import java.util.Objects; +import java.util.UUID; /** Describes an asset that connects two {@link NodeInput}s */ public abstract class ConnectorInput extends AssetInput implements HasNodes { + /** Grid node at one side of the connector */ private final NodeInput nodeA; @@ -67,6 +73,30 @@ protected ConnectorInput( this.parallelDevices = parallelDevices; } + protected ConnectorInput(ConnectorInput input) { + super(input); + this.nodeA = input.getNodeA(); + this.nodeB = input.getNodeB(); + this.parallelDevices = input.getParallelDevices(); + } + + public ConnectorInput( + AssetInput assetInput, NodeInput nodeA, NodeInput nodeB, int parallelDevices) { + super(assetInput); + this.nodeA = nodeA; + this.nodeB = nodeB; + this.parallelDevices = parallelDevices; + } + + protected static SourceValidator.Fields connectorFields(boolean includeParallelDevices) { + if (includeParallelDevices) { + return assetFields().add(NODE_A, NODE_B, PARALLEL_DEVICES); + } else { + // parallel devices is not included, since switched don't have this field + return assetFields().add(NODE_A, NODE_B); + } + } + public NodeInput getNodeA() { return nodeA; } diff --git a/src/main/java/edu/ie3/datamodel/models/input/connector/LineInput.java b/src/main/java/edu/ie3/datamodel/models/input/connector/LineInput.java index a4c1ce924..5d71ab398 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/connector/LineInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/connector/LineInput.java @@ -5,7 +5,10 @@ */ package edu.ie3.datamodel.models.input.connector; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.*; + import edu.ie3.datamodel.io.extractor.HasType; +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.input.NodeInput; @@ -103,6 +106,23 @@ public LineInput( this.olmCharacteristic = olmCharacteristic; } + public LineInput( + ConnectorInput connectorInput, + LineTypeInput type, + ComparableQuantity length, + LineString geoPosition, + OlmCharacteristicInput olmCharacteristic) { + super(connectorInput); + this.type = type; + this.length = length.to(StandardUnits.LINE_LENGTH); + this.geoPosition = GeoUtils.buildSafeLineString(geoPosition); + this.olmCharacteristic = olmCharacteristic; + } + + public static SourceValidator.Fields getFields() { + return connectorFields(true).add(TYPE, GEO_POSITION, OLM_CHARACTERISTIC, LENGTH); + } + @Override public LineTypeInput getType() { return type; diff --git a/src/main/java/edu/ie3/datamodel/models/input/connector/SwitchInput.java b/src/main/java/edu/ie3/datamodel/models/input/connector/SwitchInput.java index 6ca1f9b6b..4b4038cc3 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/connector/SwitchInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/connector/SwitchInput.java @@ -5,6 +5,9 @@ */ package edu.ie3.datamodel.models.input.connector; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.CLOSED; + +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; @@ -13,6 +16,7 @@ /** Describes an electrical grid switch between two {@link NodeInput}s */ public class SwitchInput extends ConnectorInput { + /** Is the switching state 'closed'? */ private final boolean closed; @@ -53,6 +57,15 @@ public SwitchInput(UUID uuid, String id, NodeInput nodeA, NodeInput nodeB, boole this.closed = closed; } + public SwitchInput(ConnectorInput connectorInput, boolean closed) { + super(connectorInput); + this.closed = closed; + } + + public static SourceValidator.Fields getFields() { + return connectorFields(false).add(CLOSED); + } + public boolean isClosed() { return closed; } diff --git a/src/main/java/edu/ie3/datamodel/models/input/connector/Transformer2WInput.java b/src/main/java/edu/ie3/datamodel/models/input/connector/Transformer2WInput.java index 85a49abe5..500f950eb 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/connector/Transformer2WInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/connector/Transformer2WInput.java @@ -8,6 +8,7 @@ import static edu.ie3.datamodel.utils.validation.ConnectorValidationUtils.connectsNodesToCorrectVoltageSides; import edu.ie3.datamodel.io.extractor.HasType; +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; @@ -20,6 +21,7 @@ * edu.ie3.datamodel.models.input.NodeInput}s */ public class Transformer2WInput extends TransformerInput implements HasType { + /** Type of this 2W transformer, containing default values for transformers of this kind */ private final Transformer2WTypeInput type; @@ -81,6 +83,16 @@ public Transformer2WInput( this.type = type; } + public Transformer2WInput(TransformerInput transformerInput, Transformer2WTypeInput type) { + super(transformerInput, transformerInput.getTapPos(), transformerInput.isAutoTap()); + connectsNodesToCorrectVoltageSides(getNodeA(), getNodeB()); + this.type = type; + } + + public static SourceValidator.Fields getFields() { + return transformerFields(); + } + @Override public Transformer2WInputCopyBuilder copy() { return new Transformer2WInputCopyBuilder(this); diff --git a/src/main/java/edu/ie3/datamodel/models/input/connector/Transformer3WInput.java b/src/main/java/edu/ie3/datamodel/models/input/connector/Transformer3WInput.java index a0fcf54cd..1d89b5ebd 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/connector/Transformer3WInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/connector/Transformer3WInput.java @@ -5,10 +5,12 @@ */ package edu.ie3.datamodel.models.input.connector; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.NODE_C; import static edu.ie3.datamodel.utils.validation.ConnectorValidationUtils.connectsNodesToCorrectVoltageSides; import static edu.ie3.util.quantities.PowerSystemUnits.PU; import edu.ie3.datamodel.io.extractor.HasType; +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; @@ -21,6 +23,7 @@ * edu.ie3.datamodel.models.input.NodeInput}s */ public class Transformer3WInput extends TransformerInput implements HasType { + /** Type of this 3W transformer, containing default values for transformers of this kind */ private final Transformer3WTypeInput type; @@ -176,6 +179,26 @@ public Transformer3WInput( nodeA.getSubnet()); } + public Transformer3WInput( + TransformerInput transformerInput, NodeInput nodeC, Transformer3WTypeInput type) { + this( + transformerInput.getUuid(), + transformerInput.getId(), + transformerInput.getOperator(), + transformerInput.getOperationTime(), + transformerInput.getNodeA(), + transformerInput.getNodeB(), + nodeC, + transformerInput.getParallelDevices(), + type, + transformerInput.getTapPos(), + transformerInput.isAutoTap()); + } + + public static SourceValidator.Fields getFields() { + return transformerFields().add(NODE_C); + } + /** * Private constructor to be used for create copies using {@link Transformer3WInputCopyBuilder} * diff --git a/src/main/java/edu/ie3/datamodel/models/input/connector/TransformerInput.java b/src/main/java/edu/ie3/datamodel/models/input/connector/TransformerInput.java index 2acd38143..0593e99f7 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/connector/TransformerInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/connector/TransformerInput.java @@ -5,6 +5,9 @@ */ package edu.ie3.datamodel.models.input.connector; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.*; + +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; @@ -13,6 +16,7 @@ /** Describes an electrical grid transformer, is "located" in the inferior subnet */ public abstract class TransformerInput extends ConnectorInput { + /** Tap position of this transformer */ private final int tapPos; @@ -73,6 +77,16 @@ protected TransformerInput( this.autoTap = autoTap; } + protected TransformerInput(ConnectorInput connectorInput, int tapPos, boolean autoTap) { + super(connectorInput); + this.tapPos = tapPos; + this.autoTap = autoTap; + } + + protected static SourceValidator.Fields transformerFields() { + return connectorFields(true).add(TAP_POS, AUTO_TAP, TYPE); + } + public boolean isAutoTap() { return autoTap; } diff --git a/src/main/java/edu/ie3/datamodel/models/input/connector/type/LineTypeInput.java b/src/main/java/edu/ie3/datamodel/models/input/connector/type/LineTypeInput.java index 18c7374cf..26dd4e9e3 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/connector/type/LineTypeInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/connector/type/LineTypeInput.java @@ -5,6 +5,9 @@ */ package edu.ie3.datamodel.models.input.connector.type; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.*; + +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.input.AssetTypeInput; import edu.ie3.util.quantities.interfaces.SpecificConductance; @@ -17,6 +20,7 @@ /** Describes the type of a {@link edu.ie3.datamodel.models.input.connector.LineInput} */ public class LineTypeInput extends AssetTypeInput { + /** Specific phase-to-ground susceptance for this type of line (typically in µS/km) */ private final ComparableQuantity b; @@ -63,6 +67,10 @@ public LineTypeInput( this.vRated = vRated.to(StandardUnits.RATED_VOLTAGE_MAGNITUDE); } + public static SourceValidator.Fields getFields() { + return assetTypeFields().add(R, X, B, G, I_MAX, V_RATED); + } + public ComparableQuantity getB() { return b; } @@ -146,7 +154,7 @@ public static final class LineTypeInputCopyBuilder private ComparableQuantity iMax; private ComparableQuantity vRated; - protected LineTypeInputCopyBuilder(LineTypeInput entity) { + public LineTypeInputCopyBuilder(LineTypeInput entity) { super(entity); this.b = entity.b; this.g = entity.g; diff --git a/src/main/java/edu/ie3/datamodel/models/input/connector/type/Transformer2WTypeInput.java b/src/main/java/edu/ie3/datamodel/models/input/connector/type/Transformer2WTypeInput.java index 072d5fb85..c33a23ed3 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/connector/type/Transformer2WTypeInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/connector/type/Transformer2WTypeInput.java @@ -5,15 +5,18 @@ */ package edu.ie3.datamodel.models.input.connector.type; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.*; + +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.StandardUnits; -import edu.ie3.datamodel.models.input.AssetTypeInput; import java.util.Objects; import java.util.UUID; import javax.measure.quantity.*; import tech.units.indriya.ComparableQuantity; /** Describes the type of a {@link edu.ie3.datamodel.models.input.connector.Transformer2WInput} */ -public class Transformer2WTypeInput extends AssetTypeInput { +public class Transformer2WTypeInput extends TransformerTypeInput { + /** Short circuit resistance (typically in Ohm) */ private final ComparableQuantity rSc; @@ -23,36 +26,9 @@ public class Transformer2WTypeInput extends AssetTypeInput { /** Rated apparent power (typically in kVA) */ private final ComparableQuantity sRated; - /** Rated voltage of the high voltage winding (typically in kV) */ - private final ComparableQuantity vRatedA; - - /** Rated voltage of the low voltage winding (typically in kV) */ - private final ComparableQuantity vRatedB; - - /** Phase-to-ground conductance (typically in nS) */ - private final ComparableQuantity gM; - - /** Phase-to-ground susceptance (typically in nS) */ - private final ComparableQuantity bM; - - /** Voltage magnitude deviation per tap position (typically in %) */ - private final ComparableQuantity dV; - - /** Voltage angle deviation per tap position (typically in °) */ - private final ComparableQuantity dPhi; - /** Selection of winding, where the tap changer is installed. Low voltage, if true */ private final boolean tapSide; - /** Neutral tap position */ - private final int tapNeutr; - - /** Minimum available tap position */ - private final int tapMin; - - /** Maximum available tap position */ - private final int tapMax; - /** * @param uuid of the input entity * @param id of the type @@ -86,20 +62,28 @@ public Transformer2WTypeInput( int tapNeutr, int tapMin, int tapMax) { - super(uuid, id); + super(uuid, id, gM, bM, dV, dPhi, vRatedA, vRatedB, tapNeutr, tapMin, tapMax); + this.rSc = rSc.to(StandardUnits.RESISTANCE); + this.xSc = xSc.to(StandardUnits.REACTANCE); + this.sRated = sRated.to(StandardUnits.S_RATED); + this.tapSide = tapSide; + } + + public Transformer2WTypeInput( + TransformerTypeInput transformerTypeInput, + ComparableQuantity rSc, + ComparableQuantity xSc, + ComparableQuantity sRated, + boolean tapSide) { + super(transformerTypeInput); this.rSc = rSc.to(StandardUnits.RESISTANCE); this.xSc = xSc.to(StandardUnits.REACTANCE); this.sRated = sRated.to(StandardUnits.S_RATED); - this.vRatedA = vRatedA.to(StandardUnits.RATED_VOLTAGE_MAGNITUDE); - this.vRatedB = vRatedB.to(StandardUnits.RATED_VOLTAGE_MAGNITUDE); - this.gM = gM.to(StandardUnits.CONDUCTANCE); - this.bM = bM.to(StandardUnits.SUSCEPTANCE); - this.dV = dV.to(StandardUnits.DV_TAP); - this.dPhi = dPhi.to(StandardUnits.DPHI_TAP); this.tapSide = tapSide; - this.tapNeutr = tapNeutr; - this.tapMin = tapMin; - this.tapMax = tapMax; + } + + public static SourceValidator.Fields getFields() { + return transformerTypeFields().add(R_SC, X_SC, S_RATED, TAP_SIDE); } public ComparableQuantity getrSc() { @@ -114,46 +98,10 @@ public ComparableQuantity getsRated() { return sRated; } - public ComparableQuantity getvRatedA() { - return vRatedA; - } - - public ComparableQuantity getvRatedB() { - return vRatedB; - } - - public ComparableQuantity getgM() { - return gM; - } - - public ComparableQuantity getbM() { - return bM; - } - - public ComparableQuantity getdV() { - return dV; - } - - public ComparableQuantity getdPhi() { - return dPhi; - } - public boolean isTapSide() { return tapSide; } - public int getTapNeutr() { - return tapNeutr; - } - - public int getTapMin() { - return tapMin; - } - - public int getTapMax() { - return tapMax; - } - @Override public Transformer2WTypeInputCopyBuilder copy() { return new Transformer2WTypeInputCopyBuilder(this); @@ -165,37 +113,14 @@ public boolean equals(Object o) { if (!(o instanceof Transformer2WTypeInput that)) return false; if (!super.equals(o)) return false; return tapSide == that.tapSide - && tapNeutr == that.tapNeutr - && tapMin == that.tapMin - && tapMax == that.tapMax && rSc.equals(that.rSc) && xSc.equals(that.xSc) - && sRated.equals(that.sRated) - && vRatedA.equals(that.vRatedA) - && vRatedB.equals(that.vRatedB) - && gM.equals(that.gM) - && bM.equals(that.bM) - && dV.equals(that.dV) - && dPhi.equals(that.dPhi); + && sRated.equals(that.sRated); } @Override public int hashCode() { - return Objects.hash( - super.hashCode(), - rSc, - xSc, - sRated, - vRatedA, - vRatedB, - gM, - bM, - dV, - dPhi, - tapSide, - tapNeutr, - tapMin, - tapMax); + return Objects.hash(super.hashCode(), rSc, xSc, sRated, tapSide); } @Override @@ -212,25 +137,25 @@ public String toString() { + ", sRated=" + sRated + ", vRatedA=" - + vRatedA + + getvRatedA() + ", vRatedB=" - + vRatedB + + getvRatedB() + ", gM=" - + gM + + getbM() + ", bM=" - + bM + + getbM() + ", dV=" - + dV + + getdV() + ", dPhi=" - + dPhi + + getdPhi() + ", tapSide=" + tapSide + ", tapNeutr=" - + tapNeutr + + getTapNeutr() + ", tapMin=" - + tapMin + + getTapMin() + ", tapMax=" - + tapMax + + getTapMax() + '}'; } @@ -239,37 +164,18 @@ public String toString() { * Transformer2WTypeInput} */ public static final class Transformer2WTypeInputCopyBuilder - extends AssetTypeInput.AssetTypeInputCopyBuilder { + extends TransformerTypeInputCopyBuilder { private ComparableQuantity rSc; private ComparableQuantity xSc; private ComparableQuantity sRated; - private ComparableQuantity vRatedA; - private ComparableQuantity vRatedB; - private ComparableQuantity gM; - private ComparableQuantity bM; - private ComparableQuantity dV; - private ComparableQuantity dPhi; private boolean tapSide; - private int tapNeutr; - private int tapMin; - private int tapMax; private Transformer2WTypeInputCopyBuilder(Transformer2WTypeInput entity) { super(entity); this.rSc = entity.rSc; this.xSc = entity.xSc; this.sRated = entity.sRated; - this.vRatedA = entity.vRatedA; - this.vRatedB = entity.vRatedB; - this.gM = entity.gM; - this.bM = entity.bM; - this.dV = entity.dV; - this.dPhi = entity.dPhi; - this.tapSide = entity.tapSide; - this.tapNeutr = entity.tapNeutr; - this.tapMin = entity.tapMin; - this.tapMax = entity.tapMax; } /** Setter */ @@ -288,63 +194,29 @@ public Transformer2WTypeInputCopyBuilder sRated(ComparableQuantity sRated return thisInstance(); } - public Transformer2WTypeInputCopyBuilder vRatedA( - ComparableQuantity vRatedA) { - this.vRatedA = vRatedA; - return thisInstance(); - } - - public Transformer2WTypeInputCopyBuilder vRatedB( - ComparableQuantity vRatedB) { - this.vRatedB = vRatedB; - return thisInstance(); - } - - public Transformer2WTypeInputCopyBuilder gM(ComparableQuantity gM) { - this.gM = gM; - return thisInstance(); - } - - public Transformer2WTypeInputCopyBuilder bM(ComparableQuantity bM) { - this.bM = bM; - return thisInstance(); - } - - public Transformer2WTypeInputCopyBuilder dV(ComparableQuantity dV) { - this.dV = dV; - return thisInstance(); - } - - public Transformer2WTypeInputCopyBuilder dPhi(ComparableQuantity dPhi) { - this.dPhi = dPhi; - return thisInstance(); - } - public Transformer2WTypeInputCopyBuilder tapSide(boolean tapSide) { this.tapSide = tapSide; return thisInstance(); } - public Transformer2WTypeInputCopyBuilder tapNeutr(int tapNeutr) { - this.tapNeutr = tapNeutr; - return thisInstance(); - } - - public Transformer2WTypeInputCopyBuilder tapMin(int tapMin) { - this.tapMin = tapMin; - return thisInstance(); - } - - public Transformer2WTypeInputCopyBuilder tapMax(int tapMax) { - this.tapMax = tapMax; - return thisInstance(); - } - @Override public Transformer2WTypeInput build() { return new Transformer2WTypeInput( - getUuid(), getId(), rSc, xSc, sRated, vRatedA, vRatedB, gM, bM, dV, dPhi, tapSide, - tapNeutr, tapMin, tapMax); + getUuid(), + getId(), + rSc, + xSc, + sRated, + getVRatedA(), + getVRatedB(), + getGM(), + getBM(), + getDV(), + getDPhi(), + tapSide, + getTapNeutr(), + getTapMin(), + getTapMax()); } @Override diff --git a/src/main/java/edu/ie3/datamodel/models/input/connector/type/Transformer3WTypeInput.java b/src/main/java/edu/ie3/datamodel/models/input/connector/type/Transformer3WTypeInput.java index f08daf255..5c5e545fa 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/connector/type/Transformer3WTypeInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/connector/type/Transformer3WTypeInput.java @@ -5,15 +5,18 @@ */ package edu.ie3.datamodel.models.input.connector.type; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.*; + +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.StandardUnits; -import edu.ie3.datamodel.models.input.AssetTypeInput; import java.util.Objects; import java.util.UUID; import javax.measure.quantity.*; import tech.units.indriya.ComparableQuantity; /** Describes the type of a {@link edu.ie3.datamodel.models.input.connector.Transformer3WInput} */ -public class Transformer3WTypeInput extends AssetTypeInput { +public class Transformer3WTypeInput extends TransformerTypeInput { + /** Rated apparent power of the high voltage winding (typically in kVA) */ private final ComparableQuantity sRatedA; // Hv @@ -23,12 +26,6 @@ public class Transformer3WTypeInput extends AssetTypeInput { /** Rated apparent power of the low voltage windings (typically in kVA) */ private final ComparableQuantity sRatedC; // Lv - /** Rated voltage magnitude of the high voltage winding (typically in kV) */ - private final ComparableQuantity vRatedA; // Hv - - /** Rated voltage magnitude of the medium voltage winding (typically in kV) */ - private final ComparableQuantity vRatedB; // Mv - /** Rated voltage magnitude of the low voltage winding (typically in kV) */ private final ComparableQuantity vRatedC; // Lv @@ -50,27 +47,6 @@ public class Transformer3WTypeInput extends AssetTypeInput { /** Short-circuit reactance of the low voltage winding (typically in Ohm) */ private final ComparableQuantity xScC; // Lv - /** Phase-to-ground conductance (typically in nS) */ - private final ComparableQuantity gM; - - /** Phase-to-ground susceptance (typically in nS) */ - private final ComparableQuantity bM; - - /** Voltage magnitude deviation per tap position (typically in %) */ - private final ComparableQuantity dV; - - /** Voltage angle deviation per tap position (typically in °) */ - private final ComparableQuantity dPhi; - - /** Neutral tap position */ - private final int tapNeutr; - - /** Minimum available tap position */ - private final int tapMin; - - /** Maximum available tap position */ - private final int tapMax; - /** * @param uuid of the input entity * @param id of this type @@ -116,12 +92,35 @@ public Transformer3WTypeInput( int tapNeutr, int tapMin, int tapMax) { - super(uuid, id); + super(uuid, id, gM, bM, dV, dPhi, vRatedA, vRatedB, tapNeutr, tapMin, tapMax); + this.sRatedA = sRatedA.to(StandardUnits.S_RATED); + this.sRatedB = sRatedB.to(StandardUnits.S_RATED); + this.sRatedC = sRatedC.to(StandardUnits.S_RATED); + this.vRatedC = vRatedC.to(StandardUnits.RATED_VOLTAGE_MAGNITUDE); + this.rScA = rScA.to(StandardUnits.RESISTANCE); + this.rScB = rScB.to(StandardUnits.RESISTANCE); + this.rScC = rScC.to(StandardUnits.RESISTANCE); + this.xScA = xScA.to(StandardUnits.REACTANCE); + this.xScB = xScB.to(StandardUnits.REACTANCE); + this.xScC = xScC.to(StandardUnits.REACTANCE); + } + + public Transformer3WTypeInput( + TransformerTypeInput transformerTypeInput, + ComparableQuantity sRatedA, + ComparableQuantity sRatedB, + ComparableQuantity sRatedC, + ComparableQuantity vRatedC, + ComparableQuantity rScA, + ComparableQuantity rScB, + ComparableQuantity rScC, + ComparableQuantity xScA, + ComparableQuantity xScB, + ComparableQuantity xScC) { + super(transformerTypeInput); this.sRatedA = sRatedA.to(StandardUnits.S_RATED); this.sRatedB = sRatedB.to(StandardUnits.S_RATED); this.sRatedC = sRatedC.to(StandardUnits.S_RATED); - this.vRatedA = vRatedA.to(StandardUnits.RATED_VOLTAGE_MAGNITUDE); - this.vRatedB = vRatedB.to(StandardUnits.RATED_VOLTAGE_MAGNITUDE); this.vRatedC = vRatedC.to(StandardUnits.RATED_VOLTAGE_MAGNITUDE); this.rScA = rScA.to(StandardUnits.RESISTANCE); this.rScB = rScB.to(StandardUnits.RESISTANCE); @@ -129,13 +128,13 @@ public Transformer3WTypeInput( this.xScA = xScA.to(StandardUnits.REACTANCE); this.xScB = xScB.to(StandardUnits.REACTANCE); this.xScC = xScC.to(StandardUnits.REACTANCE); - this.gM = gM.to(StandardUnits.CONDUCTANCE); - this.bM = bM.to(StandardUnits.SUSCEPTANCE); - this.dV = dV.to(StandardUnits.DV_TAP); - this.dPhi = dPhi.to(StandardUnits.DPHI_TAP); - this.tapNeutr = tapNeutr; - this.tapMin = tapMin; - this.tapMax = tapMax; + } + + public static SourceValidator.Fields getFields() { + return transformerTypeFields() + .add( + S_RATED_A, S_RATED_B, S_RATED_C, V_RATED_C, R_SC_A, R_SC_B, R_SC_C, X_SC_A, X_SC_B, + X_SC_C); } public ComparableQuantity getsRatedA() { @@ -150,14 +149,6 @@ public ComparableQuantity getsRatedC() { return sRatedC; } - public ComparableQuantity getvRatedA() { - return vRatedA; - } - - public ComparableQuantity getvRatedB() { - return vRatedB; - } - public ComparableQuantity getvRatedC() { return vRatedC; } @@ -186,34 +177,6 @@ public ComparableQuantity getxScC() { return xScC; } - public ComparableQuantity getgM() { - return gM; - } - - public ComparableQuantity getbM() { - return bM; - } - - public ComparableQuantity getdV() { - return dV; - } - - public ComparableQuantity getdPhi() { - return dPhi; - } - - public int getTapNeutr() { - return tapNeutr; - } - - public int getTapMin() { - return tapMin; - } - - public int getTapMax() { - return tapMax; - } - @Override public Transformer3WTypeInputCopyBuilder copy() { return new Transformer3WTypeInputCopyBuilder(this); @@ -224,50 +187,22 @@ public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Transformer3WTypeInput that)) return false; if (!super.equals(o)) return false; - return tapNeutr == that.tapNeutr - && tapMin == that.tapMin - && tapMax == that.tapMax - && sRatedA.equals(that.sRatedA) + return sRatedA.equals(that.sRatedA) && sRatedB.equals(that.sRatedB) && sRatedC.equals(that.sRatedC) - && vRatedA.equals(that.vRatedA) - && vRatedB.equals(that.vRatedB) && vRatedC.equals(that.vRatedC) && rScA.equals(that.rScA) && rScB.equals(that.rScB) && rScC.equals(that.rScC) && xScA.equals(that.xScA) && xScB.equals(that.xScB) - && xScC.equals(that.xScC) - && gM.equals(that.gM) - && bM.equals(that.bM) - && dV.equals(that.dV) - && dPhi.equals(that.dPhi); + && xScC.equals(that.xScC); } @Override public int hashCode() { return Objects.hash( - super.hashCode(), - sRatedA, - sRatedB, - sRatedC, - vRatedA, - vRatedB, - vRatedC, - rScA, - rScB, - rScC, - xScA, - xScB, - xScC, - gM, - bM, - dV, - dPhi, - tapNeutr, - tapMin, - tapMax); + super.hashCode(), sRatedA, sRatedB, sRatedC, vRatedC, rScA, rScB, rScC, xScA, xScB, xScC); } @Override @@ -284,9 +219,9 @@ public String toString() { + ", sRatedC=" + sRatedC + ", vRatedA=" - + vRatedA + + getvRatedA() + ", vRatedB=" - + vRatedB + + getvRatedB() + ", vRatedC=" + vRatedC + ", rScA=" @@ -302,19 +237,19 @@ public String toString() { + ", xScC=" + xScC + ", gM=" - + gM + + getbM() + ", bM=" - + bM + + getbM() + ", dV=" - + dV + + getdV() + ", dPhi=" - + dPhi + + getdPhi() + ", tapNeutr=" - + tapNeutr + + getTapNeutr() + ", tapMin=" - + tapMin + + getTapMin() + ", tapMax=" - + tapMax + + getTapMax() + '}'; } @@ -323,13 +258,11 @@ public String toString() { * Transformer3WTypeInput} */ public static final class Transformer3WTypeInputCopyBuilder - extends AssetTypeInput.AssetTypeInputCopyBuilder { + extends TransformerTypeInputCopyBuilder { private ComparableQuantity sRatedA; private ComparableQuantity sRatedB; private ComparableQuantity sRatedC; - private ComparableQuantity vRatedA; - private ComparableQuantity vRatedB; private ComparableQuantity vRatedC; private ComparableQuantity rScA; private ComparableQuantity rScB; @@ -337,21 +270,12 @@ public static final class Transformer3WTypeInputCopyBuilder private ComparableQuantity xScA; private ComparableQuantity xScB; private ComparableQuantity xScC; - private ComparableQuantity gM; - private ComparableQuantity bM; - private ComparableQuantity dV; - private ComparableQuantity dPhi; - private int tapNeutr; - private int tapMin; - private int tapMax; private Transformer3WTypeInputCopyBuilder(Transformer3WTypeInput entity) { super(entity); this.sRatedA = entity.sRatedA; this.sRatedB = entity.sRatedB; this.sRatedC = entity.sRatedC; - this.vRatedA = entity.vRatedA; - this.vRatedB = entity.vRatedB; this.vRatedC = entity.vRatedC; this.rScA = entity.rScA; this.rScB = entity.rScB; @@ -359,13 +283,6 @@ private Transformer3WTypeInputCopyBuilder(Transformer3WTypeInput entity) { this.xScA = entity.xScA; this.xScB = entity.xScB; this.xScC = entity.xScC; - this.gM = entity.gM; - this.bM = entity.bM; - this.dV = entity.dV; - this.dPhi = entity.dPhi; - this.tapNeutr = entity.tapNeutr; - this.tapMin = entity.tapMin; - this.tapMax = entity.tapMax; } /** Setter */ @@ -384,18 +301,6 @@ public Transformer3WTypeInputCopyBuilder sRatedC(ComparableQuantity sRate return thisInstance(); } - public Transformer3WTypeInputCopyBuilder vRatedA( - ComparableQuantity vRatedA) { - this.vRatedA = vRatedA; - return thisInstance(); - } - - public Transformer3WTypeInputCopyBuilder vRatedB( - ComparableQuantity vRatedB) { - this.vRatedB = vRatedB; - return thisInstance(); - } - public Transformer3WTypeInputCopyBuilder vRatedC( ComparableQuantity vRatedC) { this.vRatedC = vRatedC; @@ -432,46 +337,30 @@ public Transformer3WTypeInputCopyBuilder xScC(ComparableQuantity gM) { - this.gM = gM; - return thisInstance(); - } - - public Transformer3WTypeInputCopyBuilder bM(ComparableQuantity bM) { - this.bM = bM; - return thisInstance(); - } - - public Transformer3WTypeInputCopyBuilder dV(ComparableQuantity dV) { - this.dV = dV; - return thisInstance(); - } - - public Transformer3WTypeInputCopyBuilder dPhi(ComparableQuantity dPhi) { - this.dPhi = dPhi; - return thisInstance(); - } - - public Transformer3WTypeInputCopyBuilder tapNeutr(int tapNeutr) { - this.tapNeutr = tapNeutr; - return thisInstance(); - } - - public Transformer3WTypeInputCopyBuilder tapMin(int tapMin) { - this.tapMin = tapMin; - return thisInstance(); - } - - public Transformer3WTypeInputCopyBuilder tapMax(int tapMax) { - this.tapMax = tapMax; - return thisInstance(); - } - @Override public Transformer3WTypeInput build() { return new Transformer3WTypeInput( - getUuid(), getId(), sRatedA, sRatedB, sRatedC, vRatedA, vRatedB, vRatedC, rScA, rScB, - rScC, xScA, xScB, xScC, gM, bM, dV, dPhi, tapNeutr, tapMin, tapMax); + getUuid(), + getId(), + sRatedA, + sRatedB, + sRatedC, + getVRatedA(), + getVRatedB(), + vRatedC, + rScA, + rScB, + rScC, + xScA, + xScB, + xScC, + getGM(), + getBM(), + getDV(), + getDPhi(), + getTapNeutr(), + getTapMin(), + getTapMax()); } @Override diff --git a/src/main/java/edu/ie3/datamodel/models/input/connector/type/TransformerTypeInput.java b/src/main/java/edu/ie3/datamodel/models/input/connector/type/TransformerTypeInput.java new file mode 100644 index 000000000..46aa25b00 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/input/connector/type/TransformerTypeInput.java @@ -0,0 +1,311 @@ +/* + * © 2025. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.input.connector.type; + +import static edu.ie3.datamodel.io.naming.EntityFieldNames.*; + +import edu.ie3.datamodel.io.source.SourceValidator; +import edu.ie3.datamodel.models.StandardUnits; +import edu.ie3.datamodel.models.input.AssetTypeInput; +import java.util.Objects; +import java.util.UUID; +import javax.measure.quantity.*; +import tech.units.indriya.ComparableQuantity; + +public abstract class TransformerTypeInput extends AssetTypeInput { + + /** Rated voltage of the high voltage winding (typically in kV) */ + private final ComparableQuantity vRatedA; + + /** Rated voltage of the low voltage winding (typically in kV) */ + private final ComparableQuantity vRatedB; + + /** Phase-to-ground conductance (typically in nS) */ + private final ComparableQuantity gM; + + /** Phase-to-ground susceptance (typically in nS) */ + private final ComparableQuantity bM; + + /** Voltage magnitude deviation per tap position (typically in %) */ + private final ComparableQuantity dV; + + /** Voltage angle deviation per tap position (typically in °) */ + private final ComparableQuantity dPhi; + + /** Neutral tap position */ + private final int tapNeutr; + + /** Minimum available tap position */ + private final int tapMin; + + /** Maximum available tap position */ + private final int tapMax; + + protected TransformerTypeInput( + UUID uuid, + String id, + ComparableQuantity gM, + ComparableQuantity bM, + ComparableQuantity dV, + ComparableQuantity dPhi, + ComparableQuantity vRatedA, + ComparableQuantity vRatedB, + int tapNeutr, + int tapMin, + int tapMax) { + super(uuid, id); + this.gM = gM; + this.bM = bM; + this.dV = dV; + this.dPhi = dPhi; + this.vRatedA = vRatedA.to(StandardUnits.RATED_VOLTAGE_MAGNITUDE); + this.vRatedB = vRatedB.to(StandardUnits.RATED_VOLTAGE_MAGNITUDE); + this.tapNeutr = tapNeutr; + this.tapMin = tapMin; + this.tapMax = tapMax; + } + + protected TransformerTypeInput( + AssetTypeInput assetTypeInput, + ComparableQuantity gM, + ComparableQuantity bM, + ComparableQuantity dV, + ComparableQuantity dPhi, + ComparableQuantity vRatedA, + ComparableQuantity vRatedB, + int tapNeutr, + int tapMin, + int tapMax) { + super(assetTypeInput); + this.gM = gM; + this.bM = bM; + this.dV = dV; + this.dPhi = dPhi; + this.vRatedA = vRatedA.to(StandardUnits.RATED_VOLTAGE_MAGNITUDE); + this.vRatedB = vRatedB.to(StandardUnits.RATED_VOLTAGE_MAGNITUDE); + this.tapNeutr = tapNeutr; + this.tapMin = tapMin; + this.tapMax = tapMax; + } + + protected TransformerTypeInput(TransformerTypeInput other) { + super(other); + this.gM = other.gM; + this.bM = other.bM; + this.dV = other.dV; + this.dPhi = other.dPhi; + this.vRatedA = other.vRatedA; + this.vRatedB = other.vRatedB; + this.tapNeutr = other.tapNeutr; + this.tapMin = other.tapMin; + this.tapMax = other.tapMax; + } + + protected static SourceValidator.Fields transformerTypeFields() { + return assetTypeFields() + .add(G_M, B_M, D_V, D_PHI, V_RATED_A, V_RATED_B, TAP_NEUTR, TAP_MIN, TAP_MAX); + } + + public ComparableQuantity getgM() { + return gM; + } + + public ComparableQuantity getbM() { + return bM; + } + + public ComparableQuantity getdV() { + return dV; + } + + public ComparableQuantity getdPhi() { + return dPhi; + } + + public ComparableQuantity getvRatedA() { + return vRatedA; + } + + public ComparableQuantity getvRatedB() { + return vRatedB; + } + + public int getTapNeutr() { + return tapNeutr; + } + + public int getTapMin() { + return tapMin; + } + + public int getTapMax() { + return tapMax; + } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + TransformerTypeInput that = (TransformerTypeInput) o; + return tapNeutr == that.tapNeutr + && tapMin == that.tapMin + && tapMax == that.tapMax + && Objects.equals(gM, that.gM) + && Objects.equals(bM, that.bM) + && Objects.equals(dV, that.dV) + && Objects.equals(dPhi, that.dPhi) + && Objects.equals(vRatedA, that.vRatedA) + && Objects.equals(vRatedB, that.vRatedB); + } + + @Override + public int hashCode() { + return Objects.hash( + super.hashCode(), gM, bM, dV, dPhi, vRatedA, vRatedB, tapNeutr, tapMin, tapMax); + } + + @Override + public String toString() { + return "TransformerTypeInput{" + + "uuid=" + + getUuid() + + ", id=" + + getId() + + "gM=" + + gM + + ", bM=" + + bM + + ", dV=" + + dV + + ", dPhi=" + + dPhi + + ", vRatedA=" + + vRatedA + + ", vRatedB=" + + vRatedB + + ", tapNeutr=" + + tapNeutr + + ", tapMin=" + + tapMin + + ", tapMax=" + + tapMax + + "}"; + } + + /** + * Abstract class for all builder that build child entities of abstract class {@link + * TransformerTypeInput} + */ + protected abstract static class TransformerTypeInputCopyBuilder< + B extends TransformerTypeInputCopyBuilder> + extends AssetTypeInputCopyBuilder { + private ComparableQuantity gM; + private ComparableQuantity bM; + private ComparableQuantity dV; + private ComparableQuantity dPhi; + private ComparableQuantity vRatedA; + private ComparableQuantity vRatedB; + private int tapNeutr; + private int tapMin; + private int tapMax; + + protected TransformerTypeInputCopyBuilder(TransformerTypeInput entity) { + super(entity); + this.gM = entity.gM; + this.bM = entity.bM; + this.dV = entity.dV; + this.dPhi = entity.dPhi; + this.vRatedA = entity.vRatedA; + this.vRatedB = entity.vRatedB; + this.tapNeutr = entity.tapNeutr; + this.tapMin = entity.tapMin; + this.tapMax = entity.tapMax; + } + + /** Setter */ + public B gM(ComparableQuantity gM) { + this.gM = gM; + return thisInstance(); + } + + public B bM(ComparableQuantity bM) { + this.bM = bM; + return thisInstance(); + } + + public B dV(ComparableQuantity dV) { + this.dV = dV; + return thisInstance(); + } + + public B dPhi(ComparableQuantity dPhi) { + this.dPhi = dPhi; + return thisInstance(); + } + + public B vRatedA(ComparableQuantity vRatedA) { + this.vRatedA = vRatedA; + return thisInstance(); + } + + public B vRatedB(ComparableQuantity vRatedB) { + this.vRatedB = vRatedB; + return thisInstance(); + } + + public B tapNeutr(int tapNeutr) { + this.tapNeutr = tapNeutr; + return thisInstance(); + } + + public B tapMin(int tapMin) { + this.tapMin = tapMin; + return thisInstance(); + } + + public B tapMax(int tapMax) { + this.tapMax = tapMax; + return thisInstance(); + } + + /** Getter */ + protected ComparableQuantity getGM() { + return gM; + } + + protected ComparableQuantity getBM() { + return bM; + } + + protected ComparableQuantity getDV() { + return dV; + } + + protected ComparableQuantity getDPhi() { + return dPhi; + } + + protected ComparableQuantity getVRatedA() { + return vRatedA; + } + + protected ComparableQuantity getVRatedB() { + return vRatedB; + } + + protected int getTapNeutr() { + return tapNeutr; + } + + protected int getTapMin() { + return tapMin; + } + + protected int getTapMax() { + return tapMax; + } + } +} diff --git a/src/main/java/edu/ie3/datamodel/models/input/graphics/GraphicInput.java b/src/main/java/edu/ie3/datamodel/models/input/graphics/GraphicInput.java index c0cc6a78c..fb5810dbc 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/graphics/GraphicInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/graphics/GraphicInput.java @@ -5,6 +5,11 @@ */ package edu.ie3.datamodel.models.input.graphics; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.GRAPHIC_LAYER; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.PATH_LINE_STRING; + +import edu.ie3.datamodel.io.source.SourceValidator; +import edu.ie3.datamodel.models.UniqueEntity; import edu.ie3.datamodel.models.input.UniqueInputEntity; import edu.ie3.util.geo.GeoUtils; import java.util.Objects; @@ -13,6 +18,7 @@ /** Describes the graphic data belonging to grid assets */ public abstract class GraphicInput extends UniqueInputEntity { + /** Description of the graphic layer, this graphic is located on */ private final String graphicLayer; @@ -33,6 +39,20 @@ protected GraphicInput(UUID uuid, String graphicLayer, LineString path) { : GeoUtils.buildSafeLineString(path); } + protected GraphicInput(UniqueEntity entity, String graphicLayer, LineString path) { + this(entity.getUuid(), graphicLayer, path); + } + + protected GraphicInput(GraphicInput graphicInput) { + super(graphicInput.getUuid()); + this.graphicLayer = graphicInput.getGraphicLayer(); + this.path = graphicInput.getPath(); + } + + protected static SourceValidator.Fields graphicFields() { + return uniqueEntityFields().add(GRAPHIC_LAYER, PATH_LINE_STRING); + } + public String getGraphicLayer() { return graphicLayer; } diff --git a/src/main/java/edu/ie3/datamodel/models/input/graphics/LineGraphicInput.java b/src/main/java/edu/ie3/datamodel/models/input/graphics/LineGraphicInput.java index c911b81b5..1b18ea8bb 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/graphics/LineGraphicInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/graphics/LineGraphicInput.java @@ -5,7 +5,10 @@ */ package edu.ie3.datamodel.models.input.graphics; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.LINE; + import edu.ie3.datamodel.io.extractor.HasLine; +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.input.connector.LineInput; import java.util.Objects; import java.util.UUID; @@ -16,6 +19,7 @@ * edu.ie3.datamodel.models.input.connector.LineInput} */ public class LineGraphicInput extends GraphicInput implements HasLine { + /** The LineInput to this graphic data */ private final LineInput line; @@ -30,6 +34,15 @@ public LineGraphicInput(UUID uuid, String graphicLayer, LineString path, LineInp this.line = line; } + public LineGraphicInput(GraphicInput graphicInput, LineInput lineInput) { + super(graphicInput); + this.line = lineInput; + } + + public static SourceValidator.Fields getFields() { + return graphicFields().add(LINE); + } + @Override public LineInput getLine() { return line; diff --git a/src/main/java/edu/ie3/datamodel/models/input/graphics/NodeGraphicInput.java b/src/main/java/edu/ie3/datamodel/models/input/graphics/NodeGraphicInput.java index ef8582b0a..a47a9f51f 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/graphics/NodeGraphicInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/graphics/NodeGraphicInput.java @@ -5,7 +5,11 @@ */ package edu.ie3.datamodel.models.input.graphics; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.NODE; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.POINT; + import edu.ie3.datamodel.io.extractor.HasNodes; +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.input.NodeInput; import java.util.*; import org.locationtech.jts.geom.LineString; @@ -13,6 +17,7 @@ /** Describes the graphic data belonging to a {@link NodeInput} */ public class NodeGraphicInput extends GraphicInput implements HasNodes { + /** The NodeInput to this graphic data */ private final NodeInput node; @@ -33,6 +38,16 @@ public NodeGraphicInput( this.point = point; } + public NodeGraphicInput(GraphicInput graphicInput, NodeInput node, Point point) { + super(graphicInput); + this.node = node; + this.point = point; + } + + public static SourceValidator.Fields getFields() { + return graphicFields().add(POINT, NODE); + } + public NodeInput getNode() { return node; } diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/BmInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/BmInput.java index d7f666a6f..24dcf2a6b 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/BmInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/BmInput.java @@ -5,7 +5,10 @@ */ package edu.ie3.datamodel.models.input.system; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.*; + import edu.ie3.datamodel.io.extractor.HasType; +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.input.EmInput; @@ -21,6 +24,7 @@ /** Describes a biomass plant */ public class BmInput extends SystemParticipantInput implements HasType { + /** Type of this BM plant, containing default values for BM plants of this kind */ private final BmTypeInput type; @@ -101,6 +105,23 @@ public BmInput( this.feedInTariff = feedInTariff.to(StandardUnits.ENERGY_PRICE); } + public BmInput( + SystemParticipantInput systemParticipantInput, + BmTypeInput type, + boolean marketReaction, + boolean costControlled, + ComparableQuantity feedInTariff) { + super(systemParticipantInput); + this.type = type; + this.marketReaction = marketReaction; + this.costControlled = costControlled; + this.feedInTariff = feedInTariff; + } + + public static SourceValidator.Fields getFields() { + return participantFields().add(TYPE, MARKET_REACTION, COST_CONTROLLED, FEED_IN_TARIFF); + } + @Override public BmTypeInput getType() { return type; diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/ChpInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/ChpInput.java index 54614f138..405338c50 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/ChpInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/ChpInput.java @@ -5,9 +5,12 @@ */ package edu.ie3.datamodel.models.input.system; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.*; + import edu.ie3.datamodel.io.extractor.HasThermalBus; import edu.ie3.datamodel.io.extractor.HasThermalStorage; import edu.ie3.datamodel.io.extractor.HasType; +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; @@ -24,6 +27,7 @@ /** Describes a combined heat and power plant */ public class ChpInput extends SystemParticipantInput implements HasType, HasThermalBus, HasThermalStorage { + /** The thermal bus, this model is connected to */ private final ThermalBusInput thermalBus; @@ -102,6 +106,23 @@ public ChpInput( this.marketReaction = marketReaction; } + public ChpInput( + SystemParticipantInput systemParticipantInput, + ChpTypeInput type, + ThermalBusInput thermalBus, + ThermalStorageInput thermalStorage, + boolean marketReaction) { + super(systemParticipantInput); + this.type = type; + this.thermalBus = thermalBus; + this.thermalStorage = thermalStorage; + this.marketReaction = marketReaction; + } + + public static SourceValidator.Fields getFields() { + return participantFields().add(TYPE, THERMAL_BUS, THERMAL_STORAGE, MARKET_REACTION); + } + @Override public ThermalBusInput getThermalBus() { return thermalBus; diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/EvInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/EvInput.java index 1c2e23df4..0264ef9de 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/EvInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/EvInput.java @@ -5,7 +5,10 @@ */ package edu.ie3.datamodel.models.input.system; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.TYPE; + import edu.ie3.datamodel.io.extractor.HasType; +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; @@ -19,6 +22,7 @@ /** Describes an electric vehicle */ public class EvInput extends SystemParticipantInput implements HasType { + /** Type of this EV, containing default values for EVs of this kind */ private final EvTypeInput type; @@ -68,6 +72,15 @@ public EvInput( this.type = type; } + public EvInput(SystemParticipantInput systemParticipantInput, EvTypeInput type) { + super(systemParticipantInput); + this.type = type; + } + + public static SourceValidator.Fields getFields() { + return participantFields().add(TYPE); + } + @Override public EvTypeInput getType() { return type; diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/EvcsInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/EvcsInput.java index 50f2a38ae..978444958 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/EvcsInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/EvcsInput.java @@ -5,6 +5,9 @@ */ package edu.ie3.datamodel.models.input.system; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.*; + +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; @@ -164,6 +167,26 @@ public EvcsInput( this(uuid, id, node, qCharacteristics, em, type, 1, cosPhiRated, locationType, v2gSupport); } + public EvcsInput( + SystemParticipantInput systemParticipantInput, + ChargingPointType type, + int chargingPoints, + double cosPhiRated, + EvcsLocationType locationType, + boolean v2gSupport) { + super(systemParticipantInput); + this.type = type; + this.chargingPoints = chargingPoints; + this.cosPhiRated = cosPhiRated; + this.locationType = locationType; + this.v2gSupport = v2gSupport; + } + + public static SourceValidator.Fields getFields() { + return participantFields() + .add(TYPE, CHARGING_POINTS, COS_PHI_RATED, LOCATION_TYPE, V2G_SUPPORT); + } + public ChargingPointType getType() { return type; } diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/FixedFeedInInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/FixedFeedInInput.java index c5534ba93..bad3ccf46 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/FixedFeedInInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/FixedFeedInInput.java @@ -5,6 +5,10 @@ */ package edu.ie3.datamodel.models.input.system; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.COS_PHI_RATED; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.S_RATED; + +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.input.EmInput; @@ -18,6 +22,7 @@ /** Dummy class to represent a constant feed in regardless of its type */ public class FixedFeedInInput extends SystemParticipantInput { + /** Rated apparent power (typically in kVA) */ private final ComparableQuantity sRated; @@ -76,6 +81,19 @@ public FixedFeedInInput( this.cosPhiRated = cosPhiRated; } + public FixedFeedInInput( + SystemParticipantInput systemParticipantInput, + ComparableQuantity sRated, + double cosPhiRated) { + super(systemParticipantInput); + this.sRated = sRated; + this.cosPhiRated = cosPhiRated; + } + + public static SourceValidator.Fields getFields() { + return participantFields().add(S_RATED, COS_PHI_RATED); + } + public ComparableQuantity getsRated() { return sRated; } diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/HpInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/HpInput.java index 81a4066bb..6153d50c7 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/HpInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/HpInput.java @@ -5,8 +5,12 @@ */ package edu.ie3.datamodel.models.input.system; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.THERMAL_BUS; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.TYPE; + import edu.ie3.datamodel.io.extractor.HasThermalBus; import edu.ie3.datamodel.io.extractor.HasType; +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; @@ -21,6 +25,7 @@ /** Describes a heat pump */ public class HpInput extends SystemParticipantInput implements HasType, HasThermalBus { + /** Type of this heat pump, containing default values for heat pump of this kind */ private final HpTypeInput type; @@ -79,6 +84,17 @@ public HpInput( this.type = type; } + public HpInput( + SystemParticipantInput systemParticipantInput, HpTypeInput type, ThermalBusInput thermalBus) { + super(systemParticipantInput); + this.type = type; + this.thermalBus = thermalBus; + } + + public static SourceValidator.Fields getFields() { + return participantFields().add(THERMAL_BUS, TYPE); + } + @Override public HpTypeInput getType() { return type; diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/LoadInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/LoadInput.java index 6beeba7d9..35428a00f 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/LoadInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/LoadInput.java @@ -5,7 +5,11 @@ */ package edu.ie3.datamodel.models.input.system; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.*; + import edu.ie3.datamodel.exceptions.ParsingException; +import edu.ie3.datamodel.io.naming.EntityFieldNames; +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.*; import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; @@ -23,6 +27,7 @@ /** Describes a load */ public class LoadInput extends SystemParticipantInput { + /** * Reference to a load profile to use for the model. If you intend to assign specific values, * create an {@link IndividualTimeSeries} or {@link RepetitiveTimeSeries} and assign it via an @@ -187,6 +192,24 @@ public LoadInput( cosPhiRated); } + public LoadInput( + SystemParticipantInput systemParticipantInput, + LoadProfile loadProfile, + ComparableQuantity eConsAnnual, + ComparableQuantity sRated, + double cosPhiRated) { + super(systemParticipantInput); + this.loadProfile = loadProfile; + this.eConsAnnual = eConsAnnual; + this.sRated = sRated; + this.cosPhiRated = cosPhiRated; + } + + public static SourceValidator.Fields getFields() { + return participantFields() + .add(LOAD_PROFILE, E_CONS_ANNUAL, S_RATED, EntityFieldNames.COS_PHI_RATED); + } + public LoadProfile getLoadProfile() { return loadProfile; } diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/PvInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/PvInput.java index 006189f43..688a0476e 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/PvInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/PvInput.java @@ -5,6 +5,9 @@ */ package edu.ie3.datamodel.models.input.system; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.*; + +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.input.EmInput; @@ -142,6 +145,43 @@ public PvInput( this.cosPhiRated = cosPhiRated; } + public PvInput( + SystemParticipantInput systemParticipantInput, + double albedo, + ComparableQuantity azimuth, + ComparableQuantity etaConv, + ComparableQuantity elevationAngle, + double kG, + double kT, + boolean marketReaction, + ComparableQuantity sRated, + double cosPhiRated) { + super(systemParticipantInput); + this.albedo = albedo; + this.azimuth = azimuth.to(StandardUnits.AZIMUTH); + this.etaConv = etaConv.to(StandardUnits.EFFICIENCY); + this.elevationAngle = elevationAngle; + this.kG = kG; + this.kT = kT; + this.marketReaction = marketReaction; + this.sRated = sRated.to(StandardUnits.S_RATED); + this.cosPhiRated = cosPhiRated; + } + + public static SourceValidator.Fields getFields() { + return participantFields() + .add( + ALBEDO, + AZIMUTH, + ETA_CONV, + ELEVATION_ANGLE, + KG, + KT, + MARKET_REACTION, + S_RATED, + COS_PHI_RATED); + } + public double getAlbedo() { return albedo; } diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/StorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/StorageInput.java index 0a1f00b7e..80f935936 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/StorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/StorageInput.java @@ -5,7 +5,10 @@ */ package edu.ie3.datamodel.models.input.system; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.TYPE; + import edu.ie3.datamodel.io.extractor.HasType; +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; @@ -19,6 +22,7 @@ /** Describes a battery storage */ public class StorageInput extends SystemParticipantInput implements HasType { + /** Type of this storage, containing default values for storages of this kind */ private final StorageTypeInput type; @@ -68,6 +72,15 @@ public StorageInput( this.type = type; } + public StorageInput(SystemParticipantInput systemParticipantInput, StorageTypeInput type) { + super(systemParticipantInput); + this.type = type; + } + + public static SourceValidator.Fields getFields() { + return participantFields().add(TYPE); + } + @Override public StorageTypeInput getType() { return type; diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/SystemParticipantInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/SystemParticipantInput.java index 2996e7a95..78d7933eb 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/SystemParticipantInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/SystemParticipantInput.java @@ -5,8 +5,11 @@ */ package edu.ie3.datamodel.models.input.system; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.*; + import edu.ie3.datamodel.io.extractor.HasEm; import edu.ie3.datamodel.io.extractor.HasNodes; +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.UniqueEntity; import edu.ie3.datamodel.models.input.AssetInput; @@ -79,6 +82,28 @@ protected SystemParticipantInput( this.controllingEm = em; } + protected SystemParticipantInput( + AssetInput assetInput, + NodeInput node, + ReactivePowerCharacteristic qCharacteristics, + EmInput em) { + super(assetInput); + this.node = node; + this.qCharacteristics = qCharacteristics; + this.controllingEm = em; + } + + protected SystemParticipantInput(SystemParticipantInput systemParticipantInput) { + super(systemParticipantInput); + this.node = systemParticipantInput.node; + this.qCharacteristics = systemParticipantInput.qCharacteristics; + this.controllingEm = systemParticipantInput.controllingEm; + } + + protected static SourceValidator.Fields participantFields() { + return assetFields().add(NODE, Q_CHARACTERISTICS, CONTROLLING_EM); + } + /** * Returns the rated apparent power of the system participant, which is either stored within the * {@link SystemParticipantInput} or linked {@link diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/WecInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/WecInput.java index d8924125f..20dbb9491 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/WecInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/WecInput.java @@ -5,7 +5,11 @@ */ package edu.ie3.datamodel.models.input.system; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.MARKET_REACTION; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.TYPE; + import edu.ie3.datamodel.io.extractor.HasType; +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; @@ -78,6 +82,17 @@ public WecInput( this.marketReaction = marketReaction; } + public WecInput( + SystemParticipantInput systemParticipantInput, WecTypeInput type, boolean marketReaction) { + super(systemParticipantInput); + this.type = type; + this.marketReaction = marketReaction; + } + + public static SourceValidator.Fields getFields() { + return participantFields().add(TYPE, MARKET_REACTION); + } + public boolean isMarketReaction() { return marketReaction; } diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/type/BmTypeInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/type/BmTypeInput.java index 2f3b5b451..1012bab2c 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/type/BmTypeInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/type/BmTypeInput.java @@ -5,6 +5,10 @@ */ package edu.ie3.datamodel.models.input.system.type; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.ACTIVE_POWER_GRADIENT; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.ETA_CONV; + +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.util.quantities.interfaces.Currency; import edu.ie3.util.quantities.interfaces.DimensionlessRate; @@ -48,6 +52,19 @@ public BmTypeInput( this.etaConv = etaConv.to(StandardUnits.EFFICIENCY); } + public BmTypeInput( + SystemParticipantTypeInput systemParticipantTypeInput, + ComparableQuantity activePowerGradient, + ComparableQuantity etaConv) { + super(systemParticipantTypeInput); + this.activePowerGradient = activePowerGradient; + this.etaConv = etaConv; + } + + public static SourceValidator.Fields getFields() { + return participantTypeFields().add(ACTIVE_POWER_GRADIENT, ETA_CONV); + } + public ComparableQuantity getActivePowerGradient() { return activePowerGradient; } diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/type/ChpTypeInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/type/ChpTypeInput.java index 7a67e08ff..fad874f04 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/type/ChpTypeInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/type/ChpTypeInput.java @@ -5,6 +5,9 @@ */ package edu.ie3.datamodel.models.input.system.type; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.*; + +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.util.quantities.interfaces.Currency; import edu.ie3.util.quantities.interfaces.EnergyPrice; @@ -16,6 +19,7 @@ /** Describes the type of a {@link edu.ie3.datamodel.models.input.system.ChpInput} */ public class ChpTypeInput extends SystemParticipantTypeInput { + /** Electrical efficiency (typically in %) */ private final ComparableQuantity etaEl; @@ -58,6 +62,23 @@ public ChpTypeInput( this.pOwn = pOwn.to(StandardUnits.ACTIVE_POWER_IN); } + public ChpTypeInput( + SystemParticipantTypeInput systemParticipantTypeInput, + ComparableQuantity etaEl, + ComparableQuantity etaThermal, + ComparableQuantity pThermal, + ComparableQuantity pOwn) { + super(systemParticipantTypeInput); + this.etaEl = etaEl.to(StandardUnits.EFFICIENCY); + this.etaThermal = etaThermal.to(StandardUnits.EFFICIENCY); + this.pThermal = pThermal.to(StandardUnits.ACTIVE_POWER_IN); + this.pOwn = pOwn.to(StandardUnits.ACTIVE_POWER_IN); + } + + public static SourceValidator.Fields getFields() { + return participantTypeFields().add(ETA_EL, ETA_THERMAL, P_THERMAL, P_OWN); + } + public ComparableQuantity getEtaEl() { return etaEl; } diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/type/EvTypeInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/type/EvTypeInput.java index 0da3e0e63..a0b16670b 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/type/EvTypeInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/type/EvTypeInput.java @@ -5,6 +5,9 @@ */ package edu.ie3.datamodel.models.input.system.type; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.*; + +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.util.quantities.interfaces.Currency; import edu.ie3.util.quantities.interfaces.EnergyPrice; @@ -17,6 +20,7 @@ /** Describes the type of a {@link edu.ie3.datamodel.models.input.system.EvInput} */ public class EvTypeInput extends SystemParticipantTypeInput { + /** Energy capacity of the storage (typically in kWh) */ private final ComparableQuantity eStorage; @@ -53,6 +57,21 @@ public EvTypeInput( this.sRatedDC = sRatedDC.to(StandardUnits.ACTIVE_POWER_IN); } + public EvTypeInput( + SystemParticipantTypeInput systemParticipantTypeInput, + ComparableQuantity eStorage, + ComparableQuantity eCons, + ComparableQuantity sRatedDC) { + super(systemParticipantTypeInput); + this.eStorage = eStorage.to(StandardUnits.ENERGY_IN); + this.eCons = eCons.to(StandardUnits.ENERGY_PER_DISTANCE); + this.sRatedDC = sRatedDC.to(StandardUnits.ACTIVE_POWER_IN); + } + + public static SourceValidator.Fields getFields() { + return participantTypeFields().add(E_STORAGE, E_CONS, S_RATED_DC); + } + public ComparableQuantity geteStorage() { return eStorage; } diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/type/HpTypeInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/type/HpTypeInput.java index 9962e9578..1370c867a 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/type/HpTypeInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/type/HpTypeInput.java @@ -5,6 +5,9 @@ */ package edu.ie3.datamodel.models.input.system.type; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.P_THERMAL; + +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.util.quantities.interfaces.Currency; import edu.ie3.util.quantities.interfaces.EnergyPrice; @@ -15,6 +18,7 @@ /** Describes the type of a {@link edu.ie3.datamodel.models.input.system.HpInput} */ public class HpTypeInput extends SystemParticipantTypeInput { + /** Thermal output of the heat pump (typically in kW), when sRated * cosphi_rated is consumed */ private final ComparableQuantity pThermal; @@ -40,6 +44,16 @@ public HpTypeInput( this.pThermal = pThermal.to(StandardUnits.ACTIVE_POWER_IN); } + public HpTypeInput( + SystemParticipantTypeInput systemParticipantTypeInput, ComparableQuantity pThermal) { + super(systemParticipantTypeInput); + this.pThermal = pThermal.to(StandardUnits.ACTIVE_POWER_IN); + } + + public static SourceValidator.Fields getFields() { + return participantTypeFields().add(P_THERMAL); + } + public ComparableQuantity getpThermal() { return pThermal; } diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/type/StorageTypeInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/type/StorageTypeInput.java index 664df15e1..a508d1dfc 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/type/StorageTypeInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/type/StorageTypeInput.java @@ -5,6 +5,9 @@ */ package edu.ie3.datamodel.models.input.system.type; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.*; + +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.util.quantities.interfaces.Currency; import edu.ie3.util.quantities.interfaces.DimensionlessRate; @@ -19,6 +22,7 @@ /** Describes the type of a {@link edu.ie3.datamodel.models.input.system.StorageInput} */ public class StorageTypeInput extends SystemParticipantTypeInput { + /** Energy capacity (typically in kWh) */ private final ComparableQuantity eStorage; @@ -61,6 +65,23 @@ public StorageTypeInput( this.eta = eta.to(StandardUnits.EFFICIENCY); } + public StorageTypeInput( + SystemParticipantTypeInput systemParticipantTypeInput, + ComparableQuantity eStorage, + ComparableQuantity pMax, + ComparableQuantity activePowerGradient, + ComparableQuantity eta) { + super(systemParticipantTypeInput); + this.eStorage = eStorage.to(StandardUnits.ENERGY_IN); + this.pMax = pMax.to(StandardUnits.ACTIVE_POWER_IN); + this.activePowerGradient = activePowerGradient.to(StandardUnits.ACTIVE_POWER_GRADIENT); + this.eta = eta.to(StandardUnits.EFFICIENCY); + } + + public static SourceValidator.Fields getFields() { + return participantTypeFields().add(E_STORAGE, P_MAX, ACTIVE_POWER_GRADIENT, ETA); + } + public ComparableQuantity getEta() { return eta; } diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/type/SystemParticipantTypeInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/type/SystemParticipantTypeInput.java index 66c3ebba5..0ef567c8a 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/type/SystemParticipantTypeInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/type/SystemParticipantTypeInput.java @@ -5,6 +5,9 @@ */ package edu.ie3.datamodel.models.input.system.type; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.*; + +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.input.AssetTypeInput; import edu.ie3.util.quantities.interfaces.Currency; import edu.ie3.util.quantities.interfaces.EnergyPrice; @@ -15,6 +18,7 @@ /** Describes the type of a {@link edu.ie3.datamodel.models.input.system.SystemParticipantInput} */ public abstract class SystemParticipantTypeInput extends AssetTypeInput { + /** Capital expense for this type of system participant (typically in €) */ private final ComparableQuantity capex; @@ -49,6 +53,31 @@ protected SystemParticipantTypeInput( this.cosPhiRated = cosPhiRated; } + protected SystemParticipantTypeInput( + AssetTypeInput assetTypeInput, + ComparableQuantity capex, + ComparableQuantity opex, + ComparableQuantity sRated, + double cosPhiRated) { + super(assetTypeInput); + this.capex = capex; + this.opex = opex; + this.sRated = sRated; + this.cosPhiRated = cosPhiRated; + } + + protected SystemParticipantTypeInput(SystemParticipantTypeInput systemParticipantTypeInput) { + super(systemParticipantTypeInput); + this.capex = systemParticipantTypeInput.capex; + this.opex = systemParticipantTypeInput.opex; + this.sRated = systemParticipantTypeInput.sRated; + this.cosPhiRated = systemParticipantTypeInput.cosPhiRated; + } + + protected static SourceValidator.Fields participantTypeFields() { + return assetTypeFields().add(CAP_EX, OP_EX, S_RATED, COS_PHI_RATED); + } + public ComparableQuantity getCapex() { return capex; } diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/type/WecTypeInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/type/WecTypeInput.java index 6758d03c9..de6021bda 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/type/WecTypeInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/type/WecTypeInput.java @@ -5,6 +5,9 @@ */ package edu.ie3.datamodel.models.input.system.type; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.*; + +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.input.system.characteristic.WecCharacteristicInput; import edu.ie3.util.quantities.interfaces.Currency; @@ -19,6 +22,7 @@ /** Describes the type of a {@link edu.ie3.datamodel.models.input.system.WecInput} */ public class WecTypeInput extends SystemParticipantTypeInput { + /** Betz curve of this type */ private final WecCharacteristicInput cpCharacteristic; @@ -61,6 +65,23 @@ public WecTypeInput( this.hubHeight = hubHeight.to(StandardUnits.HUB_HEIGHT); } + public WecTypeInput( + SystemParticipantTypeInput systemParticipantTypeInput, + WecCharacteristicInput cpCharacteristic, + ComparableQuantity etaConv, + ComparableQuantity rotorArea, + ComparableQuantity hubHeight) { + super(systemParticipantTypeInput); + this.cpCharacteristic = cpCharacteristic; + this.etaConv = etaConv.to(StandardUnits.EFFICIENCY); + this.rotorArea = rotorArea.to(StandardUnits.ROTOR_AREA); + this.hubHeight = hubHeight.to(StandardUnits.HUB_HEIGHT); + } + + public static SourceValidator.Fields getFields() { + return participantTypeFields().add(CP_CHARACTERISTIC, ETA_CONV, ROTOR_AREA, HUB_HEIGHT); + } + public WecCharacteristicInput getCpCharacteristic() { return cpCharacteristic; } diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/AbstractStorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/AbstractStorageInput.java index 9c1c1eea0..b818ab3d2 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/AbstractStorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/AbstractStorageInput.java @@ -5,6 +5,9 @@ */ package edu.ie3.datamodel.models.input.thermal; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.*; + +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.input.OperatorInput; @@ -18,6 +21,7 @@ /** Thermal storage with cylindrical shape */ public abstract class AbstractStorageInput extends ThermalStorageInput { + /** Available storage volume (typically in m³) */ private final ComparableQuantity storageVolumeLvl; @@ -91,6 +95,34 @@ public AbstractStorageInput( this.pThermalMax = pThermalMax.to(StandardUnits.ACTIVE_POWER_IN); } + public AbstractStorageInput( + ThermalUnitInput thermalUnitInput, + ComparableQuantity storageVolumeLvl, + ComparableQuantity inletTemp, + ComparableQuantity returnTemp, + ComparableQuantity c, + ComparableQuantity pThermalMax) { + super(thermalUnitInput); + this.storageVolumeLvl = storageVolumeLvl.to(StandardUnits.VOLUME); + this.inletTemp = inletTemp.to(StandardUnits.TEMPERATURE); + this.returnTemp = returnTemp.to(StandardUnits.TEMPERATURE); + this.c = c.to(StandardUnits.SPECIFIC_HEAT_CAPACITY); + this.pThermalMax = pThermalMax.to(StandardUnits.ACTIVE_POWER_IN); + } + + public AbstractStorageInput(AbstractStorageInput input) { + super(input); + this.storageVolumeLvl = input.storageVolumeLvl; + this.inletTemp = input.inletTemp; + this.returnTemp = input.returnTemp; + this.c = input.c; + this.pThermalMax = input.pThermalMax; + } + + public static SourceValidator.Fields abstractThermalStorageFields() { + return assetFields().add(STORAGE_VOLUME_LVL, INLET_TEMP, RETURN_TEMP, C, P_THERMAL_MAX); + } + public ComparableQuantity getStorageVolumeLvl() { return storageVolumeLvl; } diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java index 9e43ef04b..9dae7c85f 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java @@ -5,6 +5,7 @@ */ package edu.ie3.datamodel.models.input.thermal; +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.util.quantities.interfaces.SpecificHeatCapacity; @@ -74,6 +75,14 @@ public CylindricalStorageInput( super(uuid, id, bus, storageVolumeLvl, inletTemp, returnTemp, c, pThermalMax); } + public CylindricalStorageInput(AbstractStorageInput input) { + super(input); + } + + public static SourceValidator.Fields getFields() { + return abstractThermalStorageFields(); + } + @Override public CylindricalStorageInputCopyBuilder copy() { return new CylindricalStorageInputCopyBuilder(this); diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java index b26af2c79..003f8ec4f 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java @@ -5,6 +5,7 @@ */ package edu.ie3.datamodel.models.input.thermal; +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.util.quantities.interfaces.SpecificHeatCapacity; @@ -78,6 +79,14 @@ public DomesticHotWaterStorageInput( super(uuid, id, bus, storageVolumeLvl, inletTemp, returnTemp, c, pThermalMax); } + public DomesticHotWaterStorageInput(AbstractStorageInput input) { + super(input); + } + + public static SourceValidator.Fields getFields() { + return abstractThermalStorageFields(); + } + @Override public DomesticHotWaterStorageInputCopyBuilder copy() { return new DomesticHotWaterStorageInputCopyBuilder(this); diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalBusInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalBusInput.java index b93c261ed..666247184 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalBusInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalBusInput.java @@ -5,6 +5,7 @@ */ package edu.ie3.datamodel.models.input.thermal; +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.input.AssetInput; import edu.ie3.datamodel.models.input.OperatorInput; @@ -35,6 +36,14 @@ public ThermalBusInput(UUID uuid, String id) { super(uuid, id); } + public ThermalBusInput(ThermalInput thermalInput) { + super(thermalInput); + } + + public static SourceValidator.Fields getFields() { + return assetFields(); + } + public ThermalBusInputCopyBuilder copy() { return new ThermalBusInputCopyBuilder(this); } diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalHouseInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalHouseInput.java index d119a42c2..450d15f91 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalHouseInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalHouseInput.java @@ -5,6 +5,9 @@ */ package edu.ie3.datamodel.models.input.thermal; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.*; + +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.input.OperatorInput; @@ -17,6 +20,7 @@ /** Quite simple thermal model of a house to serve as a heat sink */ public class ThermalHouseInput extends ThermalSinkInput { + /** Thermal, transitional losses of the included thermal house model (typically in kW/K) */ private final ComparableQuantity ethLosses; @@ -108,6 +112,37 @@ public ThermalHouseInput( this.numberInhabitants = numberInhabitants; } + public ThermalHouseInput( + ThermalUnitInput thermalUnit, + ComparableQuantity ethLosses, + ComparableQuantity ethCapa, + ComparableQuantity targetTemperature, + ComparableQuantity upperTemperatureLimit, + ComparableQuantity lowerTemperatureLimit, + String housingType, + double numberInhabitants) { + super(thermalUnit); + this.ethLosses = ethLosses.to(StandardUnits.THERMAL_TRANSMISSION); + this.ethCapa = ethCapa.to(StandardUnits.HEAT_CAPACITY); + this.targetTemperature = targetTemperature.to(StandardUnits.TEMPERATURE); + this.upperTemperatureLimit = upperTemperatureLimit.to(StandardUnits.TEMPERATURE); + this.lowerTemperatureLimit = lowerTemperatureLimit.to(StandardUnits.TEMPERATURE); + this.housingType = housingType; + this.numberInhabitants = numberInhabitants; + } + + public static SourceValidator.Fields getFields() { + return assetFields() + .add( + ETH_LOSSES, + ETH_CAPA, + TARGET_TEMPERATURE, + UPPER_TEMPERATURE_LIMIT, + LOWER_TEMPERATURE_LIMIT, + HOUSING_TYPE, + NUMBER_INHABITANTS); + } + public ComparableQuantity getEthLosses() { return ethLosses; } diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalInput.java index 6e6a83443..21a1c70f4 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalInput.java @@ -35,6 +35,10 @@ protected ThermalInput(UUID uuid, String id) { super(uuid, id); } + protected ThermalInput(AssetInput assetInput) { + super(assetInput); + } + @Override public abstract AssetInputCopyBuilder copy(); } diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalSinkInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalSinkInput.java index 1b28e6b92..f458e886c 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalSinkInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalSinkInput.java @@ -36,6 +36,10 @@ public abstract class ThermalSinkInput extends ThermalUnitInput { super(uuid, id, operator, operationTime, bus); } + protected ThermalSinkInput(ThermalUnitInput thermalSinkInput) { + super(thermalSinkInput); + } + @Override public abstract ThermalSinkInputCopyBuilder copy(); diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalStorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalStorageInput.java index 0fe30d0b5..87a9c8485 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalStorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalStorageInput.java @@ -36,6 +36,10 @@ public abstract class ThermalStorageInput extends ThermalUnitInput { super(uuid, id, operator, operationTime, bus); } + protected ThermalStorageInput(ThermalUnitInput input) { + super(input); + } + @Override public abstract ThermalStorageInputCopyBuilder copy(); diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalUnitInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalUnitInput.java index c8704bcff..67512b214 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalUnitInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalUnitInput.java @@ -13,6 +13,7 @@ /** Abstract class for grouping all common properties to thermal models. */ public abstract class ThermalUnitInput extends ThermalInput implements HasThermalBus { + /** The thermal bus, a thermal unit is connected to. */ private final ThermalBusInput thermalBus; @@ -43,6 +44,16 @@ public abstract class ThermalUnitInput extends ThermalInput implements HasTherma this.thermalBus = thermalBus; } + protected ThermalUnitInput(ThermalInput thermalInput, ThermalBusInput thermalBus) { + super(thermalInput); + this.thermalBus = thermalBus; + } + + protected ThermalUnitInput(ThermalUnitInput other) { + super(other); + this.thermalBus = other.thermalBus; + } + @Override public ThermalBusInput getThermalBus() { return thermalBus; diff --git a/src/main/java/edu/ie3/datamodel/models/result/CongestionResult.java b/src/main/java/edu/ie3/datamodel/models/result/CongestionResult.java index a083ef22f..776da1448 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/CongestionResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/CongestionResult.java @@ -5,7 +5,10 @@ */ package edu.ie3.datamodel.models.result; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.*; + import edu.ie3.datamodel.exceptions.ParsingException; +import edu.ie3.datamodel.io.source.SourceValidator; import java.time.ZonedDateTime; import java.util.Objects; import java.util.UUID; @@ -13,6 +16,7 @@ import tech.units.indriya.ComparableQuantity; public class CongestionResult extends ResultEntity { + /** Values */ private final Integer subgrid; @@ -48,6 +52,25 @@ public CongestionResult( this.max = max; } + public CongestionResult( + ResultEntity resultEntity, + InputModelType type, + int subgrid, + ComparableQuantity value, + ComparableQuantity min, + ComparableQuantity max) { + super(resultEntity); + this.type = type; + this.subgrid = subgrid; + this.value = value; + this.min = min; + this.max = max; + } + + public static SourceValidator.Fields getFields() { + return resultFields().add(TYPE, SUBGRID, VALUE, MIN, MAX); + } + public InputModelType getType() { return type; } diff --git a/src/main/java/edu/ie3/datamodel/models/result/NodeResult.java b/src/main/java/edu/ie3/datamodel/models/result/NodeResult.java index 0724a8344..59231c755 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/NodeResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/NodeResult.java @@ -5,6 +5,10 @@ */ package edu.ie3.datamodel.models.result; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.V_ANG; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.V_MAG; + +import edu.ie3.datamodel.io.source.SourceValidator; import java.time.ZonedDateTime; import java.util.Objects; import java.util.UUID; @@ -39,6 +43,19 @@ public NodeResult( this.vAng = vAng; } + public NodeResult( + ResultEntity resultEntity, + ComparableQuantity vMag, + ComparableQuantity vAng) { + super(resultEntity); + this.vMag = vMag; + this.vAng = vAng; + } + + public static SourceValidator.Fields getFields() { + return resultFields().add(V_MAG, V_ANG); + } + public ComparableQuantity getvMag() { return vMag; } diff --git a/src/main/java/edu/ie3/datamodel/models/result/ResultEntity.java b/src/main/java/edu/ie3/datamodel/models/result/ResultEntity.java index f1ba351d7..eccdb943b 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/ResultEntity.java +++ b/src/main/java/edu/ie3/datamodel/models/result/ResultEntity.java @@ -5,6 +5,10 @@ */ package edu.ie3.datamodel.models.result; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.INPUT_MODEL; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.TIME; + +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.Entity; import java.time.ZonedDateTime; import java.util.Objects; @@ -30,6 +34,15 @@ protected ResultEntity(ZonedDateTime time, UUID inputModel) { this.inputModel = inputModel; } + protected ResultEntity(ResultEntity resultEntity) { + this.time = resultEntity.time; + this.inputModel = resultEntity.inputModel; + } + + protected static SourceValidator.Fields resultFields() { + return new SourceValidator.Fields(TIME, INPUT_MODEL); + } + public UUID getInputModel() { return inputModel; } diff --git a/src/main/java/edu/ie3/datamodel/models/result/connector/ConnectorResult.java b/src/main/java/edu/ie3/datamodel/models/result/connector/ConnectorResult.java index c5d9b99cd..823010d6a 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/connector/ConnectorResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/connector/ConnectorResult.java @@ -5,6 +5,9 @@ */ package edu.ie3.datamodel.models.result.connector; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.*; + +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.result.ResultEntity; import java.time.ZonedDateTime; import java.util.Objects; @@ -52,6 +55,31 @@ protected ConnectorResult( this.iBAng = iBAng; } + protected ConnectorResult( + ResultEntity resultEntity, + ComparableQuantity iAMag, + ComparableQuantity iAAng, + ComparableQuantity iBMag, + ComparableQuantity iBAng) { + super(resultEntity); + this.iAMag = iAMag; + this.iAAng = iAAng; + this.iBMag = iBMag; + this.iBAng = iBAng; + } + + protected ConnectorResult(ConnectorResult connectorResult) { + super(connectorResult); + this.iAMag = connectorResult.iAMag; + this.iAAng = connectorResult.iAAng; + this.iBMag = connectorResult.iBMag; + this.iBAng = connectorResult.iBAng; + } + + protected static SourceValidator.Fields connectorResultFields() { + return resultFields().add(IAMAG, IAANG, IBMAG, IBANG); + } + public ComparableQuantity getiAMag() { return iAMag; } diff --git a/src/main/java/edu/ie3/datamodel/models/result/connector/LineResult.java b/src/main/java/edu/ie3/datamodel/models/result/connector/LineResult.java index cf1346135..13c1ce64d 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/connector/LineResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/connector/LineResult.java @@ -5,6 +5,7 @@ */ package edu.ie3.datamodel.models.result.connector; +import edu.ie3.datamodel.io.source.SourceValidator; import java.time.ZonedDateTime; import java.util.UUID; import javax.measure.quantity.Angle; @@ -35,6 +36,14 @@ public LineResult( super(time, inputModel, iAMag, iAAng, iBMag, iBAng); } + public LineResult(ConnectorResult connectorResult) { + super(connectorResult); + } + + public static SourceValidator.Fields getFields() { + return connectorResultFields(); + } + @Override public String toString() { return "LineResult{" diff --git a/src/main/java/edu/ie3/datamodel/models/result/connector/SwitchResult.java b/src/main/java/edu/ie3/datamodel/models/result/connector/SwitchResult.java index 7b5c15c5b..db88a784b 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/connector/SwitchResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/connector/SwitchResult.java @@ -5,6 +5,9 @@ */ package edu.ie3.datamodel.models.result.connector; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.CLOSED; + +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.result.ResultEntity; import java.time.ZonedDateTime; import java.util.Objects; @@ -30,6 +33,15 @@ public SwitchResult(ZonedDateTime time, UUID inputModel, boolean closed) { this.closed = closed; } + public SwitchResult(ResultEntity resultEntity, boolean closed) { + super(resultEntity); + this.closed = closed; + } + + public static SourceValidator.Fields getFields() { + return resultFields().add(CLOSED); + } + public boolean getClosed() { return closed; } diff --git a/src/main/java/edu/ie3/datamodel/models/result/connector/Transformer2WResult.java b/src/main/java/edu/ie3/datamodel/models/result/connector/Transformer2WResult.java index 6332531a0..9e3a166de 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/connector/Transformer2WResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/connector/Transformer2WResult.java @@ -5,6 +5,7 @@ */ package edu.ie3.datamodel.models.result.connector; +import edu.ie3.datamodel.io.source.SourceValidator; import java.time.ZonedDateTime; import java.util.UUID; import javax.measure.quantity.Angle; @@ -39,6 +40,14 @@ public Transformer2WResult( super(time, inputModel, iAMag, iAAng, iBMag, iBAng, tapPos); } + public Transformer2WResult(TransformerResult transformerResult) { + super(transformerResult); + } + + public static SourceValidator.Fields getFields() { + return transformerResultFields(); + } + @Override public String toString() { return "Transformer2WResult{" diff --git a/src/main/java/edu/ie3/datamodel/models/result/connector/Transformer3WResult.java b/src/main/java/edu/ie3/datamodel/models/result/connector/Transformer3WResult.java index 0ad84c373..bdfe7d6c3 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/connector/Transformer3WResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/connector/Transformer3WResult.java @@ -5,6 +5,10 @@ */ package edu.ie3.datamodel.models.result.connector; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.ICANG; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.ICMAG; + +import edu.ie3.datamodel.io.source.SourceValidator; import java.time.ZonedDateTime; import java.util.Objects; import java.util.UUID; @@ -46,6 +50,19 @@ public Transformer3WResult( this.iCAng = iCAng; } + public Transformer3WResult( + TransformerResult transformerResult, + ComparableQuantity iCMag, + ComparableQuantity iCAng) { + super(transformerResult); + this.iCMag = iCMag; + this.iCAng = iCAng; + } + + public static SourceValidator.Fields getFields() { + return transformerResultFields().add(ICMAG, ICANG); + } + public ComparableQuantity getiCMag() { return iCMag; } diff --git a/src/main/java/edu/ie3/datamodel/models/result/connector/TransformerResult.java b/src/main/java/edu/ie3/datamodel/models/result/connector/TransformerResult.java index c3e651d4b..247549626 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/connector/TransformerResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/connector/TransformerResult.java @@ -5,6 +5,9 @@ */ package edu.ie3.datamodel.models.result.connector; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.TAPPOS; + +import edu.ie3.datamodel.io.source.SourceValidator; import java.time.ZonedDateTime; import java.util.Objects; import java.util.UUID; @@ -44,6 +47,20 @@ protected TransformerResult( this.tapPos = tapPos; } + protected TransformerResult(ConnectorResult connectorResult, int tapPos) { + super(connectorResult); + this.tapPos = tapPos; + } + + protected TransformerResult(TransformerResult transformerResult) { + super(transformerResult); + this.tapPos = transformerResult.tapPos; + } + + protected static SourceValidator.Fields transformerResultFields() { + return resultFields().add(TAPPOS); + } + public int getTapPos() { return tapPos; } diff --git a/src/main/java/edu/ie3/datamodel/models/result/system/BmResult.java b/src/main/java/edu/ie3/datamodel/models/result/system/BmResult.java index 74591030b..c969a5d0f 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/system/BmResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/system/BmResult.java @@ -29,6 +29,10 @@ public BmResult( super(time, inputModel, p, q); } + public BmResult(SystemParticipantResult systemParticipantResult) { + super(systemParticipantResult); + } + @Override public String toString() { return "BmResult{" diff --git a/src/main/java/edu/ie3/datamodel/models/result/system/ChpResult.java b/src/main/java/edu/ie3/datamodel/models/result/system/ChpResult.java index f18f8bce7..e89f0266f 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/system/ChpResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/system/ChpResult.java @@ -31,6 +31,10 @@ public ChpResult( super(time, inputModel, p, q, qDot); } + public ChpResult(SystemParticipantWithHeatResult systemParticipantWithHeatResult) { + super(systemParticipantWithHeatResult); + } + @Override public String toString() { return "ChpResult{" diff --git a/src/main/java/edu/ie3/datamodel/models/result/system/ElectricalEnergyStorageResult.java b/src/main/java/edu/ie3/datamodel/models/result/system/ElectricalEnergyStorageResult.java index cd804b36f..2167ed937 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/system/ElectricalEnergyStorageResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/system/ElectricalEnergyStorageResult.java @@ -5,6 +5,9 @@ */ package edu.ie3.datamodel.models.result.system; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.SOC; + +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.StandardUnits; import java.time.ZonedDateTime; import java.util.Objects; @@ -29,6 +32,21 @@ protected ElectricalEnergyStorageResult( this.soc = soc.to(StandardUnits.SOC); } + protected ElectricalEnergyStorageResult( + SystemParticipantResult systemParticipantResult, ComparableQuantity soc) { + super(systemParticipantResult); + this.soc = soc.to(StandardUnits.SOC); + } + + protected ElectricalEnergyStorageResult(ElectricalEnergyStorageResult result) { + super(result); + this.soc = result.soc; + } + + public static SourceValidator.Fields electricalEnergyStorageFields() { + return participantFields().add(SOC); + } + public ComparableQuantity getSoc() { return soc; } diff --git a/src/main/java/edu/ie3/datamodel/models/result/system/EmResult.java b/src/main/java/edu/ie3/datamodel/models/result/system/EmResult.java index 80e8bbc38..f1fd701eb 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/system/EmResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/system/EmResult.java @@ -30,6 +30,10 @@ public EmResult( super(time, inputModel, p, q); } + public EmResult(SystemParticipantResult systemParticipantResult) { + super(systemParticipantResult); + } + @Override public String toString() { return "EmResult{" diff --git a/src/main/java/edu/ie3/datamodel/models/result/system/EvResult.java b/src/main/java/edu/ie3/datamodel/models/result/system/EvResult.java index d8fee1799..0229777f9 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/system/EvResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/system/EvResult.java @@ -32,6 +32,10 @@ public EvResult( super(time, inputModel, p, q, soc); } + public EvResult(ElectricalEnergyStorageResult result) { + super(result); + } + @Override public String toString() { return "EvResult{" diff --git a/src/main/java/edu/ie3/datamodel/models/result/system/EvcsResult.java b/src/main/java/edu/ie3/datamodel/models/result/system/EvcsResult.java index 4a8c57f28..7b7093e47 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/system/EvcsResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/system/EvcsResult.java @@ -29,6 +29,10 @@ public EvcsResult( super(time, inputModel, p, q); } + public EvcsResult(SystemParticipantResult systemParticipantResult) { + super(systemParticipantResult); + } + @Override public String toString() { return "EvcsResult{" diff --git a/src/main/java/edu/ie3/datamodel/models/result/system/FixedFeedInResult.java b/src/main/java/edu/ie3/datamodel/models/result/system/FixedFeedInResult.java index 6b6e2b0e7..c8dc99c3f 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/system/FixedFeedInResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/system/FixedFeedInResult.java @@ -5,6 +5,7 @@ */ package edu.ie3.datamodel.models.result.system; +import edu.ie3.datamodel.io.source.SourceValidator; import java.time.ZonedDateTime; import java.util.UUID; import javax.measure.quantity.Power; @@ -32,6 +33,14 @@ public FixedFeedInResult( super(time, inputModel, p, q); } + public FixedFeedInResult(SystemParticipantResult systemParticipantResult) { + super(systemParticipantResult); + } + + public static SourceValidator.Fields getFields() { + return participantFields(); + } + @Override public String toString() { return "FixedFeedInResult{" diff --git a/src/main/java/edu/ie3/datamodel/models/result/system/FlexOptionsResult.java b/src/main/java/edu/ie3/datamodel/models/result/system/FlexOptionsResult.java index 210bc761b..3776a731c 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/system/FlexOptionsResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/system/FlexOptionsResult.java @@ -5,6 +5,9 @@ */ package edu.ie3.datamodel.models.result.system; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.*; + +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.result.ResultEntity; import java.time.ZonedDateTime; import java.util.Objects; @@ -56,6 +59,21 @@ public FlexOptionsResult( this.pMax = pMax; } + public FlexOptionsResult( + ResultEntity resultEntity, + ComparableQuantity pRef, + ComparableQuantity pMin, + ComparableQuantity pMax) { + super(resultEntity); + this.pRef = pRef; + this.pMin = pMin; + this.pMax = pMax; + } + + public static SourceValidator.Fields getFields() { + return resultFields().add(P_REF, P_MIN, P_MAX); + } + public ComparableQuantity getpRef() { return pRef; } diff --git a/src/main/java/edu/ie3/datamodel/models/result/system/HpResult.java b/src/main/java/edu/ie3/datamodel/models/result/system/HpResult.java index a5dae8d0f..d4127549c 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/system/HpResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/system/HpResult.java @@ -31,6 +31,10 @@ public HpResult( super(time, inputModel, p, q, qDot); } + public HpResult(SystemParticipantWithHeatResult systemParticipantWithHeatResult) { + super(systemParticipantWithHeatResult); + } + @Override public String toString() { return "HpResult{" diff --git a/src/main/java/edu/ie3/datamodel/models/result/system/LoadResult.java b/src/main/java/edu/ie3/datamodel/models/result/system/LoadResult.java index 3d2f5abae..6242503f7 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/system/LoadResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/system/LoadResult.java @@ -5,6 +5,7 @@ */ package edu.ie3.datamodel.models.result.system; +import edu.ie3.datamodel.io.source.SourceValidator; import java.time.ZonedDateTime; import java.util.UUID; import javax.measure.quantity.Power; @@ -29,6 +30,14 @@ public LoadResult( super(time, inputModel, p, q); } + public LoadResult(SystemParticipantResult systemParticipantResult) { + super(systemParticipantResult); + } + + public static SourceValidator.Fields getFields() { + return participantFields(); + } + @Override public String toString() { return "LoadResult{" diff --git a/src/main/java/edu/ie3/datamodel/models/result/system/PvResult.java b/src/main/java/edu/ie3/datamodel/models/result/system/PvResult.java index f41d44c27..a0a8a1c18 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/system/PvResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/system/PvResult.java @@ -29,6 +29,10 @@ public PvResult( super(time, inputModel, p, q); } + public PvResult(SystemParticipantResult systemParticipantResult) { + super(systemParticipantResult); + } + @Override public String toString() { return "PvResult{" diff --git a/src/main/java/edu/ie3/datamodel/models/result/system/StorageResult.java b/src/main/java/edu/ie3/datamodel/models/result/system/StorageResult.java index a167133c6..ec5641cb4 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/system/StorageResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/system/StorageResult.java @@ -34,6 +34,10 @@ public StorageResult( super(time, inputModel, p, q, soc); } + public StorageResult(ElectricalEnergyStorageResult result) { + super(result); + } + @Override public String toString() { return "StorageResult{" diff --git a/src/main/java/edu/ie3/datamodel/models/result/system/SystemParticipantResult.java b/src/main/java/edu/ie3/datamodel/models/result/system/SystemParticipantResult.java index 4b5067896..5f4bbb494 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/system/SystemParticipantResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/system/SystemParticipantResult.java @@ -5,6 +5,10 @@ */ package edu.ie3.datamodel.models.result.system; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.POWER; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.REACTIVE_POWER; + +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.result.ResultEntity; import java.time.ZonedDateTime; import java.util.Objects; @@ -37,6 +41,23 @@ protected SystemParticipantResult( this.q = q; } + protected SystemParticipantResult( + ResultEntity resultEntity, ComparableQuantity p, ComparableQuantity q) { + super(resultEntity); + this.p = p; + this.q = q; + } + + protected SystemParticipantResult(SystemParticipantResult systemParticipantResult) { + super(systemParticipantResult); + this.p = systemParticipantResult.p; + this.q = systemParticipantResult.q; + } + + public static SourceValidator.Fields participantFields() { + return resultFields().add(POWER, REACTIVE_POWER); + } + /** * Active power output of the decentralised energy resource asset. Convention: Generated powers * are given in negative values. diff --git a/src/main/java/edu/ie3/datamodel/models/result/system/SystemParticipantWithHeatResult.java b/src/main/java/edu/ie3/datamodel/models/result/system/SystemParticipantWithHeatResult.java index 3cd0af029..892ddeaaa 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/system/SystemParticipantWithHeatResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/system/SystemParticipantWithHeatResult.java @@ -5,6 +5,9 @@ */ package edu.ie3.datamodel.models.result.system; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.Q_DOT; + +import edu.ie3.datamodel.io.source.SourceValidator; import java.time.ZonedDateTime; import java.util.Objects; import java.util.UUID; @@ -13,6 +16,7 @@ /** Abstract class that holds values common to result entities having heat result */ public abstract class SystemParticipantWithHeatResult extends SystemParticipantResult { + /** The thermal power output normally provided in MW */ private final ComparableQuantity qDot; @@ -33,6 +37,22 @@ protected SystemParticipantWithHeatResult( this.qDot = qDot; } + protected SystemParticipantWithHeatResult( + SystemParticipantResult systemParticipantResult, ComparableQuantity qDot) { + super(systemParticipantResult); + this.qDot = qDot; + } + + protected SystemParticipantWithHeatResult( + SystemParticipantWithHeatResult systemParticipantWithHeatResult) { + super(systemParticipantWithHeatResult); + this.qDot = systemParticipantWithHeatResult.qDot; + } + + public static SourceValidator.Fields participantWithHeatFields() { + return participantFields().add(Q_DOT); + } + /** * Thermal power output of the decentralised energy resource asset. Convention: Generated powers * are given in negative values. diff --git a/src/main/java/edu/ie3/datamodel/models/result/system/WecResult.java b/src/main/java/edu/ie3/datamodel/models/result/system/WecResult.java index 760f7d216..2e8cd3060 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/system/WecResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/system/WecResult.java @@ -29,6 +29,10 @@ public WecResult( super(time, inputModel, p, q); } + public WecResult(SystemParticipantResult systemParticipantResult) { + super(systemParticipantResult); + } + @Override public String toString() { return "WecResult{" diff --git a/src/main/java/edu/ie3/datamodel/models/result/thermal/AbstractThermalStorageResult.java b/src/main/java/edu/ie3/datamodel/models/result/thermal/AbstractThermalStorageResult.java index 293ab29bf..e6dd67fe4 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/thermal/AbstractThermalStorageResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/thermal/AbstractThermalStorageResult.java @@ -5,6 +5,9 @@ */ package edu.ie3.datamodel.models.result.thermal; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.FILL_LEVEL; + +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.StandardUnits; import java.time.ZonedDateTime; import java.util.Objects; @@ -16,6 +19,7 @@ /** Abstract class representing the common results of different types of thermal storages */ public abstract class AbstractThermalStorageResult extends ThermalStorageResult { + /** Fill level of the storage */ private ComparableQuantity fillLevel; @@ -38,6 +42,22 @@ protected AbstractThermalStorageResult( this.fillLevel = fillLevel.to(StandardUnits.FILL_LEVEL); } + protected AbstractThermalStorageResult( + ThermalStorageResult thermalStorageResult, ComparableQuantity fillLevel) { + super(thermalStorageResult); + this.fillLevel = fillLevel; + } + + protected AbstractThermalStorageResult( + AbstractThermalStorageResult abstractThermalStorageResult) { + super(abstractThermalStorageResult); + this.fillLevel = abstractThermalStorageResult.getFillLevel(); + } + + public static SourceValidator.Fields abstractThermalStorageFields() { + return thermalUnitFields().add(FILL_LEVEL); + } + public ComparableQuantity getFillLevel() { return fillLevel; } diff --git a/src/main/java/edu/ie3/datamodel/models/result/thermal/CylindricalStorageResult.java b/src/main/java/edu/ie3/datamodel/models/result/thermal/CylindricalStorageResult.java index eeadc0bb8..4d6716a85 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/thermal/CylindricalStorageResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/thermal/CylindricalStorageResult.java @@ -23,4 +23,8 @@ public CylindricalStorageResult( ComparableQuantity fillLevel) { super(time, inputModel, energy, qDot, fillLevel); } + + public CylindricalStorageResult(AbstractThermalStorageResult abstractThermalStorageResult) { + super(abstractThermalStorageResult); + } } diff --git a/src/main/java/edu/ie3/datamodel/models/result/thermal/DomesticHotWaterStorageResult.java b/src/main/java/edu/ie3/datamodel/models/result/thermal/DomesticHotWaterStorageResult.java index cf604fe0e..9bede3194 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/thermal/DomesticHotWaterStorageResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/thermal/DomesticHotWaterStorageResult.java @@ -23,4 +23,8 @@ public DomesticHotWaterStorageResult( ComparableQuantity fillLevel) { super(time, inputModel, energy, qDot, fillLevel); } + + public DomesticHotWaterStorageResult(AbstractThermalStorageResult abstractThermalStorageResult) { + super(abstractThermalStorageResult); + } } diff --git a/src/main/java/edu/ie3/datamodel/models/result/thermal/ThermalHouseResult.java b/src/main/java/edu/ie3/datamodel/models/result/thermal/ThermalHouseResult.java index 05ef815f8..f28af4168 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/thermal/ThermalHouseResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/thermal/ThermalHouseResult.java @@ -5,6 +5,9 @@ */ package edu.ie3.datamodel.models.result.thermal; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.INDOOR_TEMPERATURE; + +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.StandardUnits; import java.time.ZonedDateTime; import java.util.Objects; @@ -15,6 +18,7 @@ /** Represents the results of {@link edu.ie3.datamodel.models.input.thermal.ThermalHouseInput} */ public class ThermalHouseResult extends ThermalSinkResult { + /** Indoor room temperature of the house */ private ComparableQuantity indoorTemperature; @@ -35,6 +39,16 @@ public ThermalHouseResult( this.indoorTemperature = indoorTemperature.to(StandardUnits.TEMPERATURE); } + public ThermalHouseResult( + ThermalSinkResult thermalSinkResult, ComparableQuantity indoorTemperature) { + super(thermalSinkResult); + this.indoorTemperature = indoorTemperature; + } + + public static SourceValidator.Fields getFields() { + return thermalUnitFields().add(INDOOR_TEMPERATURE); + } + public ComparableQuantity getIndoorTemperature() { return indoorTemperature; } diff --git a/src/main/java/edu/ie3/datamodel/models/result/thermal/ThermalSinkResult.java b/src/main/java/edu/ie3/datamodel/models/result/thermal/ThermalSinkResult.java index cc66acc63..3b99e5218 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/thermal/ThermalSinkResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/thermal/ThermalSinkResult.java @@ -26,4 +26,8 @@ public abstract class ThermalSinkResult extends ThermalUnitResult { protected ThermalSinkResult(ZonedDateTime time, UUID inputModel, ComparableQuantity qDot) { super(time, inputModel, qDot); } + + protected ThermalSinkResult(ThermalUnitResult result) { + super(result); + } } diff --git a/src/main/java/edu/ie3/datamodel/models/result/thermal/ThermalStorageResult.java b/src/main/java/edu/ie3/datamodel/models/result/thermal/ThermalStorageResult.java index a89e01980..eead9b9db 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/thermal/ThermalStorageResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/thermal/ThermalStorageResult.java @@ -18,6 +18,7 @@ * edu.ie3.datamodel.models.input.thermal.ThermalStorageInput} */ public abstract class ThermalStorageResult extends ThermalUnitResult { + /** Currently stored energy */ private ComparableQuantity energy; @@ -38,6 +39,17 @@ protected ThermalStorageResult( this.energy = energy.to(StandardUnits.ENERGY_RESULT); } + protected ThermalStorageResult( + ThermalUnitResult thermalUnitResult, ComparableQuantity energy) { + super(thermalUnitResult); + this.energy = energy; + } + + protected ThermalStorageResult(ThermalStorageResult thermalStorageResult) { + super(thermalStorageResult); + this.energy = thermalStorageResult.getEnergy(); + } + public ComparableQuantity getEnergy() { return energy; } diff --git a/src/main/java/edu/ie3/datamodel/models/result/thermal/ThermalUnitResult.java b/src/main/java/edu/ie3/datamodel/models/result/thermal/ThermalUnitResult.java index 07ba81913..5536e335e 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/thermal/ThermalUnitResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/thermal/ThermalUnitResult.java @@ -5,6 +5,9 @@ */ package edu.ie3.datamodel.models.result.thermal; +import static edu.ie3.datamodel.io.naming.EntityFieldNames.Q_DOT; + +import edu.ie3.datamodel.io.source.SourceValidator; import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.result.ResultEntity; import java.time.ZonedDateTime; @@ -34,6 +37,20 @@ protected ThermalUnitResult(ZonedDateTime time, UUID inputModel, ComparableQuant this.qDot = qDot; } + protected ThermalUnitResult(ResultEntity result, ComparableQuantity qDot) { + super(result); + this.qDot = qDot; + } + + protected ThermalUnitResult(ThermalUnitResult result) { + super(result); + this.qDot = result.qDot; + } + + protected static SourceValidator.Fields thermalUnitFields() { + return resultFields().add(Q_DOT); + } + public ComparableQuantity getqDot() { return qDot; } diff --git a/src/main/java/edu/ie3/datamodel/utils/Try.java b/src/main/java/edu/ie3/datamodel/utils/Try.java index c03d0ea5e..a4141c57d 100644 --- a/src/main/java/edu/ie3/datamodel/utils/Try.java +++ b/src/main/java/edu/ie3/datamodel/utils/Try.java @@ -7,6 +7,7 @@ import static java.util.stream.Collectors.partitioningBy; +import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.exceptions.TryException; import java.util.*; import java.util.function.BiFunction; @@ -247,6 +248,10 @@ public Try map(Function mapper) { return transformS(mapper); } + public Try map(TryFunction mapper, Class clazz) { + return flatMap(t -> Try.of(() -> mapper.apply(t), clazz)); + } + /** * Method to transform and flat the data. * @@ -322,6 +327,10 @@ public Try, E> zip(Function, Try> extractor) { */ public abstract Try zip(Try that, BiFunction zipper); + public Try, E> flatZip(Function> fcn) { + return zip(flatMap(fcn)); + } + /** * Method to convert a {@link Try} object to a common type. * @@ -654,7 +663,12 @@ public int hashCode() { */ @FunctionalInterface public interface TrySupplier { - T get() throws E; + T get() throws E, SourceException; + } + + @FunctionalInterface + public interface TryFunction { + R apply(T t) throws E; } /** diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/graphics/LineGraphicInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/graphics/LineGraphicInputFactoryTest.groovy deleted file mode 100644 index 047237f7b..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/graphics/LineGraphicInputFactoryTest.groovy +++ /dev/null @@ -1,85 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.factory.graphics - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.input.graphics.LineGraphicInputEntityData -import edu.ie3.datamodel.io.factory.input.graphics.LineGraphicInputFactory -import edu.ie3.datamodel.models.input.connector.LineInput -import edu.ie3.datamodel.models.input.graphics.LineGraphicInput -import edu.ie3.datamodel.utils.GridAndGeoUtils -import edu.ie3.datamodel.utils.Try -import edu.ie3.test.helper.FactoryTestHelper -import org.locationtech.jts.geom.LineString -import spock.lang.Specification - -class LineGraphicInputFactoryTest extends Specification implements FactoryTestHelper { - - def "A LineGraphicInputFactory contain exactly the expected class for parsing"() { - given: - def inputFactory = new LineGraphicInputFactory() - def expectedClasses = [LineGraphicInput] - - expect: - inputFactory.supportedClasses == Arrays.asList(expectedClasses.toArray()) - } - - def "A LineGraphicInputFactory should parse a valid LineGraphicInput correctly"() { - given: - def inputFactory = new LineGraphicInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "path": "{ \"type\": \"LineString\", \"coordinates\": [[7.411111, 51.492528], [7.414116, 51.484136]]}", - "graphiclayer" : "test_graphic_layer" - ] - - def inputClass = LineGraphicInput - def lineInput = Mock(LineInput) - - when: - Try input = inputFactory.get( - new LineGraphicInputEntityData(parameter, lineInput)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert path == getGeometry(parameter["path"]) - assert graphicLayer == parameter["graphiclayer"] - assert line == lineInput - } - } - def "A LineGraphicInputFactory should parse a valid LineGraphicInput with different geoPosition strings correctly"() { - given: - def inputFactory = new LineGraphicInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "path": geoLineString, - "graphiclayer" : "test_graphic_layer" - ] - - def inputClass = LineGraphicInput - def lineInput = Mock(LineInput) - - when: - Try input = inputFactory.get( - new LineGraphicInputEntityData(parameter, lineInput)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert path == GridAndGeoUtils.buildSafeLineString(getGeometry(parameter["path"]) as LineString) - } - - where: - geoLineString | _ - "{ \"type\": \"LineString\", \"coordinates\": [[7.411111, 51.49228],[7.411111, 51.49228]]}" | _ - "{ \"type\": \"LineString\", \"coordinates\": [[7.411111, 51.49228],[7.411111, 51.49228],[7.411111, 51.49228],[7.411111, 51.49228]]}" | _ - "{ \"type\": \"LineString\", \"coordinates\": [[7.411111, 51.49228],[7.411111, 51.49228],[7.311111, 51.49228],[7.511111, 51.49228]]}" | _ - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/graphics/NodeGraphicInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/graphics/NodeGraphicInputFactoryTest.groovy deleted file mode 100644 index b6aac3179..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/graphics/NodeGraphicInputFactoryTest.groovy +++ /dev/null @@ -1,88 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.factory.graphics - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.input.graphics.NodeGraphicInputEntityData -import edu.ie3.datamodel.io.factory.input.graphics.NodeGraphicInputFactory -import edu.ie3.datamodel.models.input.NodeInput -import edu.ie3.datamodel.models.input.graphics.NodeGraphicInput -import edu.ie3.datamodel.utils.GridAndGeoUtils -import edu.ie3.datamodel.utils.Try -import edu.ie3.test.helper.FactoryTestHelper -import org.locationtech.jts.geom.LineString -import spock.lang.Specification - -class NodeGraphicInputFactoryTest extends Specification implements FactoryTestHelper { - - def "A NodeGraphicInputFactory contain exactly the expected class for parsing"() { - given: - def inputFactory = new NodeGraphicInputFactory() - def expectedClasses = [NodeGraphicInput] - - expect: - inputFactory.supportedClasses == Arrays.asList(expectedClasses.toArray()) - } - - def "A NodeGraphicInputFactory should parse a valid NodeGraphicInput correctly"() { - given: - def inputFactory = new NodeGraphicInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "point" : "{ \"type\": \"Point\", \"coordinates\": [7.411111, 51.492528] }", - "path" : "{ \"type\": \"LineString\", \"coordinates\": [[7.411111, 51.492528], [7.414116, 51.484136]]}", - "graphiclayer": "test_graphic_layer" - ] - - def inputClass = NodeGraphicInput - def nodeInput = Mock(NodeInput) - - when: - Try input = inputFactory.get( - new NodeGraphicInputEntityData(parameter, nodeInput)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert point == getGeometry(parameter["point"]) - assert path == getGeometry(parameter["path"]) - assert graphicLayer == parameter["graphiclayer"] - assert node == nodeInput - } - } - - def "A NodeGraphicInputFactoryshould parse a valid NodeGraphicInput with different geoPosition strings correctly"() { - given: - def inputFactory = new NodeGraphicInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "point" : "{ \"type\": \"Point\", \"coordinates\": [7.411111, 51.492528] }", - "path" : geoLineString, - "graphiclayer": "test_graphic_layer" - ] - - def inputClass = NodeGraphicInput - def nodeInput = Mock(NodeInput) - - when: - Try input = inputFactory.get( - new NodeGraphicInputEntityData(parameter, nodeInput)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert path == GridAndGeoUtils.buildSafeLineString(getGeometry(parameter["path"]) as LineString) - } - where: - geoLineString | _ - "{ \"type\": \"LineString\", \"coordinates\": [[7.411111, 51.49228],[7.411111, 51.49228]]}" | _ - "{ \"type\": \"LineString\", \"coordinates\": [[7.411111, 51.49228],[7.411111, 51.49228],[7.411111, 51.49228],[7.411111, 51.49228]]}" | _ - "{ \"type\": \"LineString\", \"coordinates\": [[7.411111, 51.49228],[7.411111, 51.49228],[7.311111, 51.49228],[7.511111, 51.49228]]}" | _ - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/AssetInputEntityFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/AssetInputEntityFactoryTest.groovy deleted file mode 100644 index a468dfc4e..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/AssetInputEntityFactoryTest.groovy +++ /dev/null @@ -1,326 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.factory.input - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.exceptions.NotImplementedException -import edu.ie3.datamodel.models.OperationTime -import edu.ie3.datamodel.models.input.AssetInput -import edu.ie3.datamodel.models.input.OperatorInput -import edu.ie3.datamodel.utils.Try -import edu.ie3.test.helper.FactoryTestHelper -import spock.lang.Specification - -import java.time.ZonedDateTime - -/** - * Tests a minimal extension of {@link AssetInputEntityFactory} - */ -class AssetInputEntityFactoryTest extends Specification implements FactoryTestHelper { - - def "An AssetInputFactory should contain exactly the expected class for parsing"() { - given: - def inputFactory = new TestAssetInputFactory() - def expectedClasses = [TestAssetInput] - - expect: - inputFactory.supportedClasses == Arrays.asList(expectedClasses.toArray()) - } - - def "An AssetInputFactory should parse a valid operated AssetInput correctly (no operation time provided)"() { - given: "a system participant input type factory and model data" - def inputFactory = new TestAssetInputFactory() - Map parameter = [ - "uuid": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "id" : "TestID" - ] - def inputClass = TestAssetInput - def operatorInput = Mock(OperatorInput) - - when: - Try input = inputFactory.get(new AssetInputEntityData(parameter, inputClass, operatorInput)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert operationTime == OperationTime.notLimited() - assert operator == operatorInput - assert id == parameter["id"] - } - } - - def "An AssetInputFactory should parse a valid operated AssetInput correctly (with nulls and empty strings)"() { - given: "a system participant input type factory and model data" - def inputFactory = new TestAssetInputFactory() - Map parameter = [ - "uuid": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "operatesfrom" : operatesfrom, - "operatesuntil": operatesuntil, - "id" : "TestID" - ] - def inputClass = TestAssetInput - def operatorInput = Mock(OperatorInput) - - when: - Try input = inputFactory.get(new AssetInputEntityData(parameter, inputClass, operatorInput)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert operationTime == OperationTime.notLimited() - assert operator == operatorInput - assert id == parameter["id"] - } - - where: - operatesfrom | operatesuntil - null | null - "" | null - null | "" - "" | "" - } - - def "An AssetInputFactory should parse a valid operated AssetInput correctly (operation start time provided)"() { - given: "a system participant input type factory and model data" - def inputFactory = new TestAssetInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", - "operatesuntil": "", - "id" : "TestID" - ] - def inputClass = TestAssetInput - def operatorInput = Mock(OperatorInput) - - when: - Try input = inputFactory.get(new AssetInputEntityData(parameter, inputClass, operatorInput)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert operationTime.startDate.present - assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) - assert !operationTime.endDate.present - assert operator == operatorInput - assert id == parameter["id"] - } - } - - def "An AssetInputFactory should parse a valid operated AssetInput correctly (operation end time provided)"() { - given: "a system participant input type factory and model data" - def inputFactory = new TestAssetInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "operatesuntil": "2019-01-01T00:00:00+01:00[Europe/Berlin]", - "id" : "TestID" - ] - def inputClass = TestAssetInput - def operatorInput = Mock(OperatorInput) - - when: - Try input = inputFactory.get(new AssetInputEntityData(parameter, inputClass, operatorInput)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert !operationTime.startDate.present - assert operationTime.endDate.present - assert operationTime.endDate.get() == ZonedDateTime.parse(parameter["operatesuntil"]) - assert operator == operatorInput - assert id == parameter["id"] - } - } - - def "An AssetInputFactory should parse a valid operated AssetInput correctly (operation start and end time provided)"() { - given: "a system participant input type factory and model data" - def inputFactory = new TestAssetInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", - "operatesuntil": "2019-12-31T00:00:00+01:00[Europe/Berlin]", - "id" : "TestID" - ] - def inputClass = TestAssetInput - def operatorInput = Mock(OperatorInput) - - when: - Try input = inputFactory.get(new AssetInputEntityData(parameter, inputClass, operatorInput)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert operationTime.startDate.present - assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) - assert operationTime.endDate.present - assert operationTime.endDate.get() == ZonedDateTime.parse(parameter["operatesuntil"]) - assert operator == operatorInput - assert id == parameter["id"] - } - } - - def "An AssetInputFactory should parse a valid operated, always on AssetInput correctly (no operation time provided)"() { - given: "a system participant input type factory and model data" - def inputFactory = new TestAssetInputFactory() - Map parameter = [ - "uuid": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "id" : "TestID" - ] - def inputClass = TestAssetInput - - when: - Try input = inputFactory.get(new AssetInputEntityData(parameter, inputClass)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert operationTime == OperationTime.notLimited() - assert operator == OperatorInput.NO_OPERATOR_ASSIGNED - assert id == parameter["id"] - } - } - - def "An AssetInputFactory should parse a valid AssetInput correctly (operation start time provided)"() { - given: "a system participant input type factory and model data" - def inputFactory = new TestAssetInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "operatesfrom": "2019-01-01T00:00:00+01:00[Europe/Berlin]", - "id" : "TestID" - ] - def inputClass = TestAssetInput - - when: - Try input = inputFactory.get(new AssetInputEntityData(parameter, inputClass)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert operationTime.startDate.present - assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) - assert !operationTime.endDate.present - assert operator == OperatorInput.NO_OPERATOR_ASSIGNED - assert id == parameter["id"] - } - } - - def "An AssetInputFactory should parse a valid AssetInput correctly (operation end time provided)"() { - given: "a system participant input type factory and model data" - def inputFactory = new TestAssetInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "operatesuntil": "2019-01-01T00:00:00+01:00[Europe/Berlin]", - "id" : "TestID" - ] - def inputClass = TestAssetInput - - when: - Try input = inputFactory.get(new AssetInputEntityData(parameter, inputClass)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert !operationTime.startDate.present - assert operationTime.endDate.present - assert operationTime.endDate.get() == ZonedDateTime.parse(parameter["operatesuntil"]) - assert operator == OperatorInput.NO_OPERATOR_ASSIGNED - assert id == parameter["id"] - } - } - - def "An AssetInputFactory should parse a valid AssetInput correctly (operation start and end time provided"() { - given: "a system participant input type factory and model data" - def inputFactory = new TestAssetInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", - "operatesuntil": "2019-12-31T00:00:00+01:00[Europe/Berlin]", - "id" : "TestID" - ] - def inputClass = TestAssetInput - - when: - Try input = inputFactory.get(new AssetInputEntityData(parameter, inputClass)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert operationTime.startDate.present - assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) - assert operationTime.endDate.present - assert operationTime.endDate.get() == ZonedDateTime.parse(parameter["operatesuntil"]) - assert operator == OperatorInput.NO_OPERATOR_ASSIGNED - assert id == parameter["id"] - } - } - - def "An AssetInputFactory should throw an exception on invalid or incomplete fields"() { - given: - def inputFactory = new TestAssetInputFactory() - def actualFields = TestAssetInputFactory.newSet("uuid", "operates_from", "operates_until") - - when: - Try input = inputFactory.validate(actualFields, TestAssetInput) - - then: - input.failure - input.exception.get().message == "The provided fields [operates_from, operates_until, uuid] are invalid for instance of 'TestAssetInput'. \n" + - "The following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of 'TestAssetInput' are possible (NOT case-sensitive!):\n" + - "0: [id, uuid] or [id, uuid]\n" + - "1: [id, operatesFrom, uuid] or [id, operates_from, uuid]\n" + - "2: [id, operatesUntil, uuid] or [id, operates_until, uuid]\n" + - "3: [id, operatesFrom, operatesUntil, uuid] or [id, operates_from, operates_until, uuid]\n" + - "4: [id, operator, uuid] or [id, operator, uuid]\n" + - "5: [id, operatesFrom, operator, uuid] or [id, operates_from, operator, uuid]\n" + - "6: [id, operatesUntil, operator, uuid] or [id, operates_until, operator, uuid]\n" + - "7: [id, operatesFrom, operatesUntil, operator, uuid] or [id, operates_from, operates_until, operator, uuid]\n" - } - - private static class TestAssetInput extends AssetInput { - TestAssetInput(UUID uuid, String id, OperatorInput operator, OperationTime operationTime) { - super(uuid, id, operator, operationTime) - } - - @Override - AssetInputCopyBuilder copy() { - throw new NotImplementedException( - "Copying of " + this.getClass().simpleName + " entities is not supported yet!") - } - } - - private static class TestAssetInputFactory extends AssetInputEntityFactory { - TestAssetInputFactory() { - super(TestAssetInput) - } - - @Override - protected String[] getAdditionalFields() { - return new String[0] - } - - @Override - protected TestAssetInput buildModel(AssetInputEntityData data, UUID uuid, String id, OperatorInput operator, OperationTime operationTime) { - return new TestAssetInput(uuid, id, operator, operationTime) - } - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactoryTest.groovy deleted file mode 100644 index e8d7f8989..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactoryTest.groovy +++ /dev/null @@ -1,62 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.factory.input - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.models.OperationTime -import edu.ie3.datamodel.models.StandardUnits -import edu.ie3.datamodel.models.input.OperatorInput -import edu.ie3.datamodel.models.input.thermal.CylindricalStorageInput -import edu.ie3.datamodel.models.input.thermal.ThermalBusInput -import edu.ie3.datamodel.utils.Try -import edu.ie3.test.helper.FactoryTestHelper -import spock.lang.Specification - -class CylindricalStorageInputFactoryTest extends Specification implements FactoryTestHelper { - def "A CylindricalStorageInputFactory should contain exactly the expected class for parsing"() { - given: - def inputFactory = new CylindricalStorageInputFactory() - def expectedClasses = [CylindricalStorageInput] - - expect: - inputFactory.supportedClasses == Arrays.asList(expectedClasses.toArray()) - } - - def "A CylindricalStorageInputFactory should parse a valid CylindricalStorageInput correctly"() { - given: "a system participant input type factory and model data" - def inputFactory = new CylindricalStorageInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "id" : "TestID", - "storagevolumelvl" : "3", - "inlettemp" : "4", - "returntemp" : "5", - "c" : "6", - "pThermalMax" : "7" - ] - def inputClass = CylindricalStorageInput - def thermalBusInput = Mock(ThermalBusInput) - - when: - Try input = inputFactory.get(new ThermalUnitInputEntityData(parameter, inputClass, thermalBusInput)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert operationTime == OperationTime.notLimited() - assert operator == OperatorInput.NO_OPERATOR_ASSIGNED - assert id == parameter["id"] - assert thermalBus == thermalBusInput - assert storageVolumeLvl == getQuant(parameter["storagevolumelvl"], StandardUnits.VOLUME) - assert inletTemp == getQuant(parameter["inlettemp"], StandardUnits.TEMPERATURE) - assert returnTemp == getQuant(parameter["returntemp"], StandardUnits.TEMPERATURE) - assert c == getQuant(parameter["c"], StandardUnits.SPECIFIC_HEAT_CAPACITY) - assert pThermalMax == getQuant(parameter["pThermalMax"], StandardUnits.ACTIVE_POWER_IN) - } - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/DomesticHotWaterStorageInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/DomesticHotWaterStorageInputFactoryTest.groovy deleted file mode 100644 index 38849415d..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/DomesticHotWaterStorageInputFactoryTest.groovy +++ /dev/null @@ -1,62 +0,0 @@ -/* - * © 2024. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.factory.input - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.models.OperationTime -import edu.ie3.datamodel.models.StandardUnits -import edu.ie3.datamodel.models.input.OperatorInput -import edu.ie3.datamodel.models.input.thermal.DomesticHotWaterStorageInput -import edu.ie3.datamodel.models.input.thermal.ThermalBusInput -import edu.ie3.datamodel.utils.Try -import edu.ie3.test.helper.FactoryTestHelper -import spock.lang.Specification - -class DomesticHotWaterStorageInputFactoryTest extends Specification implements FactoryTestHelper { - def "A DomesticHotWaterStorageInputFactory should contain exactly the expected class for parsing"() { - given: - def inputFactory = new DomesticHotWaterStorageInputFactory() - def expectedClasses = [DomesticHotWaterStorageInput] - - expect: - inputFactory.supportedClasses == Arrays.asList(expectedClasses.toArray()) - } - - def "A DomesticHotWaterStorageInputFactory should parse a valid DomesticHotWaterStorageInput correctly"() { - given: "a system participant input type factory and model data" - def inputFactory = new DomesticHotWaterStorageInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "id" : "TestID", - "storagevolumelvl" : "3", - "inlettemp" : "4", - "returntemp" : "5", - "c" : "6", - "pThermalMax" : "7" - ] - def inputClass = DomesticHotWaterStorageInput - def thermalBusInput = Mock(ThermalBusInput) - - when: - Try input = inputFactory.get(new ThermalUnitInputEntityData(parameter, inputClass, thermalBusInput)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert operationTime == OperationTime.notLimited() - assert operator == OperatorInput.NO_OPERATOR_ASSIGNED - assert id == parameter["id"] - assert thermalBus == thermalBusInput - assert storageVolumeLvl == getQuant(parameter["storagevolumelvl"], StandardUnits.VOLUME) - assert inletTemp == getQuant(parameter["inlettemp"], StandardUnits.TEMPERATURE) - assert returnTemp == getQuant(parameter["returntemp"], StandardUnits.TEMPERATURE) - assert c == getQuant(parameter["c"], StandardUnits.SPECIFIC_HEAT_CAPACITY) - assert pThermalMax == getQuant(parameter["pThermalMax"], StandardUnits.ACTIVE_POWER_IN) - } - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/EmInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/EmInputFactoryTest.groovy deleted file mode 100644 index 5cc32ca9d..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/EmInputFactoryTest.groovy +++ /dev/null @@ -1,187 +0,0 @@ -/* - * © 2022. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.factory.input - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.models.input.EmInput -import edu.ie3.datamodel.models.input.OperatorInput -import edu.ie3.datamodel.utils.Try -import spock.lang.Specification - -import java.time.ZonedDateTime -import java.util.stream.Collectors - -class EmInputFactoryTest extends Specification { - - def "A EmInputFactory should contain exactly the expected class for parsing"() { - given: - def inputFactory = new EmInputFactory() - def expectedClasses = [EmInput] as List - - expect: - inputFactory.supportedClasses == expectedClasses - } - - def "An EmInputFactory should return the valid fields correctly"() { - given: - def inputFactory = new EmInputFactory() - def validCombinations = [ - [ - "uuid", - "id", - "controlStrategy", - "controllingEm" - ], - [ - "uuid", - "id", - "controlStrategy", - "controllingEm", - "operatesFrom" - ], - [ - "uuid", - "id", - "controlStrategy", - "controllingEm", - "operatesUntil" - ], - [ - "uuid", - "id", - "controlStrategy", - "controllingEm", - "operatesFrom", - "operatesUntil" - ], - [ - "uuid", - "id", - "controlStrategy", - "controllingEm", - "operator" - ], - [ - "uuid", - "id", - "controlStrategy", - "controllingEm", - "operator", - "operatesFrom" - ], - [ - "uuid", - "id", - "controlStrategy", - "controllingEm", - "operator", - "operatesUntil" - ], - [ - "uuid", - "id", - "controlStrategy", - "controllingEm", - "operator", - "operatesFrom", - "operatesUntil" - ] - ].collect { it as Set } - - when: - def fieldCombinations = inputFactory.getFields(EmInput) - - then: - fieldCombinations == validCombinations - } - - def "A EmInputFactory should parse a valid EmInput with parent EM correctly"() { - given: - def inputFactory = new EmInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", - "operatesuntil" : "2019-12-31T23:59:00+01:00[Europe/Berlin]", - "id" : "TestID", - "controlstrategy" : "no_control" - ] - def inputClass = EmInput - def operatorInput = Mock(OperatorInput) - def parentEmUnit = Mock(EmInput) - - when: - Try input = inputFactory.get( - new EmAssetInputEntityData(parameter, inputClass, operatorInput, parentEmUnit)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert operationTime.startDate.present - assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) - assert operationTime.endDate.present - assert operationTime.endDate.get() == ZonedDateTime.parse(parameter["operatesuntil"]) - assert operator == operatorInput - assert id == parameter["id"] - assert controlStrategy == parameter["controlstrategy"] - assert controllingEm == Optional.of(parentEmUnit) - } - } - - def "A EmInputFactory should parse a valid EmInput without parent EM correctly"() { - given: - def inputFactory = new EmInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", - "operatesuntil" : "2019-12-31T23:59:00+01:00[Europe/Berlin]", - "id" : "TestID", - "controlstrategy" : "no_control" - ] - def inputClass = EmInput - def operatorInput = Mock(OperatorInput) - - when: - Try input = inputFactory.get( - new EmAssetInputEntityData(parameter, inputClass, operatorInput, null)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert operationTime.startDate.present - assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) - assert operationTime.endDate.present - assert operationTime.endDate.get() == ZonedDateTime.parse(parameter["operatesuntil"]) - assert operator == operatorInput - assert id == parameter["id"] - assert controlStrategy == parameter["controlstrategy"] - assert controllingEm == Optional.empty() - } - } - - def "A EmInputFactory should fail when passing an invalid UUID"() { - given: - def inputFactory = new EmInputFactory() - Map parameter = [ - "uuid" : "- broken -", - "id" : "TestID", - "controlstrategy" : "no_control" - ] - def inputClass = EmInput - def operatorInput = Mock(OperatorInput) - - when: - Try input = inputFactory.get( - new EmAssetInputEntityData(parameter, inputClass, operatorInput, null)) - - then: - input.failure - input.exception.get().cause.message == "Exception while trying to parse UUID of field \"uuid\" with value \"- broken -\"" - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/LineInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/LineInputFactoryTest.groovy deleted file mode 100644 index 8a0ed78b6..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/LineInputFactoryTest.groovy +++ /dev/null @@ -1,178 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.factory.input - -import static edu.ie3.util.quantities.PowerSystemUnits.METRE_PER_SECOND -import static edu.ie3.util.quantities.PowerSystemUnits.PU - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.models.StandardUnits -import edu.ie3.datamodel.models.input.NodeInput -import edu.ie3.datamodel.models.input.OperatorInput -import edu.ie3.datamodel.models.input.connector.LineInput -import edu.ie3.datamodel.models.input.connector.type.LineTypeInput -import edu.ie3.datamodel.models.input.system.characteristic.CharacteristicPoint -import edu.ie3.datamodel.utils.GridAndGeoUtils -import edu.ie3.datamodel.utils.Try -import edu.ie3.test.helper.FactoryTestHelper -import org.locationtech.jts.geom.LineString -import spock.lang.Specification -import tech.units.indriya.quantity.Quantities - -import java.time.ZonedDateTime -import javax.measure.quantity.Dimensionless -import javax.measure.quantity.Speed - -class LineInputFactoryTest extends Specification implements FactoryTestHelper { - def "A LineInputFactory should contain exactly the expected class for parsing"() { - given: - def inputFactory = new LineInputFactory() - def expectedClasses = [LineInput] - - expect: - inputFactory.supportedClasses == Arrays.asList(expectedClasses.toArray()) - } - - def "A LineInputFactory should parse a valid LineInput correctly"() { - given: "a system participant input type factory and model data" - def inputFactory = new LineInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", - "operatesuntil" : "", - "id" : "TestID", - "paralleldevices" : "2", - "length" : "3", - "geoposition" : "{ \"type\": \"LineString\", \"coordinates\": [[7.411111, 51.492528], [7.414116, 51.484136]]}", - "olmcharacteristic": "olm:{(0.0,1.0)}" - ] - def inputClass = LineInput - def operatorInput = Mock(OperatorInput) - def nodeInputA = Mock(NodeInput) - nodeInputA.getGeoPosition() >> NodeInput.DEFAULT_GEO_POSITION - def nodeInputB = Mock(NodeInput) - nodeInputB.getGeoPosition() >> NodeInput.DEFAULT_GEO_POSITION - def typeInput = Mock(LineTypeInput) - - when: - Try input = inputFactory.get(new TypedConnectorInputEntityData(parameter, inputClass, operatorInput, nodeInputA, nodeInputB, typeInput)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert operationTime.startDate.present - assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) - assert !operationTime.endDate.present - assert operator == operatorInput - assert id == parameter["id"] - assert nodeA == nodeInputA - assert nodeB == nodeInputB - assert type == typeInput - assert parallelDevices == Integer.parseInt(parameter["paralleldevices"]) - assert length == getQuant(parameter["length"], StandardUnits.LINE_LENGTH) - assert geoPosition == getGeometry(parameter["geoposition"]) - olmCharacteristic.with { - assert uuid != null - assert points == Collections.unmodifiableSortedSet([ - new CharacteristicPoint( - Quantities.getQuantity(0d, METRE_PER_SECOND), - Quantities.getQuantity(1d, PU)) - ] as TreeSet) - } - } - } - - def "A LineInputFactory should parse a valid LineInput without olm characteristic correctly"() { - given: "a system participant input type factory and model data" - def inputFactory = new LineInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", - "operatesuntil" : "", - "id" : "TestID", - "paralleldevices" : "2", - "length" : "3", - "geoposition" : "{ \"type\": \"LineString\", \"coordinates\": [[7.411111, 51.492528], [7.414116, 51.484136]]}", - "olmcharacteristic": "" - ] - def inputClass = LineInput - def operatorInput = Mock(OperatorInput) - def nodeInputA = Mock(NodeInput) - nodeInputA.getGeoPosition() >> NodeInput.DEFAULT_GEO_POSITION - def nodeInputB = Mock(NodeInput) - nodeInputB.getGeoPosition() >> NodeInput.DEFAULT_GEO_POSITION - def typeInput = Mock(LineTypeInput) - - when: - Try input = inputFactory.get(new TypedConnectorInputEntityData(parameter, inputClass, operatorInput, nodeInputA, nodeInputB, typeInput)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert operationTime.startDate.present - assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) - assert !operationTime.endDate.present - assert operator == operatorInput - assert id == parameter["id"] - assert nodeA == nodeInputA - assert nodeB == nodeInputB - assert type == typeInput - assert parallelDevices == Integer.parseInt(parameter["paralleldevices"]) - assert length == getQuant(parameter["length"], StandardUnits.LINE_LENGTH) - assert geoPosition == getGeometry(parameter["geoposition"]) - olmCharacteristic.with { - assert uuid != null - assert points == Collections.unmodifiableSortedSet([ - new CharacteristicPoint( - Quantities.getQuantity(0d, METRE_PER_SECOND), - Quantities.getQuantity(1d, PU)) - ] as TreeSet) - } - } - } - - def "A LineInputFactory should parse a valid LineInput with different geoPosition strings correctly"() { - given: "a line input factory and model data" - def inputFactory = new LineInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", - "operatesuntil" : "", - "id" : "TestID", - "paralleldevices" : "2", - "length" : "3", - "geoposition" : geoLineString, - "olmcharacteristic": "olm:{(0.0,1.0)}" - ] - def inputClass = LineInput - def operatorInput = Mock(OperatorInput) - def nodeInputA = Mock(NodeInput) - nodeInputA.getGeoPosition() >> NodeInput.DEFAULT_GEO_POSITION - def nodeInputB = Mock(NodeInput) - nodeInputB.getGeoPosition() >> NodeInput.DEFAULT_GEO_POSITION - def typeInput = Mock(LineTypeInput) - - when: - Try input = inputFactory.get(new TypedConnectorInputEntityData(parameter, inputClass, operatorInput, nodeInputA, nodeInputB, typeInput)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert geoPosition == GridAndGeoUtils.buildSafeLineString(getGeometry(parameter["geoposition"]) as LineString) - } - - where: - geoLineString | _ - "{ \"type\": \"LineString\", \"coordinates\": [[7.411111, 51.49228],[7.411111, 51.49228]]}" | _ - "{ \"type\": \"LineString\", \"coordinates\": [[7.411111, 51.49228],[7.411111, 51.49228],[7.411111, 51.49228],[7.411111, 51.49228]]}" | _ - "{ \"type\": \"LineString\", \"coordinates\": [[7.411111, 51.49228],[7.411111, 51.49228],[7.311111, 51.49228],[7.511111, 51.49228]]}" | _ - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/MeasurementUnitInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/MeasurementUnitInputFactoryTest.groovy deleted file mode 100644 index d1c669d2c..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/MeasurementUnitInputFactoryTest.groovy +++ /dev/null @@ -1,59 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.factory.input - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.models.OperationTime -import edu.ie3.datamodel.models.input.MeasurementUnitInput -import edu.ie3.datamodel.models.input.NodeInput -import edu.ie3.datamodel.models.input.OperatorInput -import edu.ie3.datamodel.utils.Try -import edu.ie3.test.helper.FactoryTestHelper -import spock.lang.Specification - -class MeasurementUnitInputFactoryTest extends Specification implements FactoryTestHelper { - def "A MeasurementUnitInputFactory should contain exactly the expected class for parsing"() { - given: - def inputFactory = new MeasurementUnitInputFactory() - def expectedClasses = [MeasurementUnitInput] - - expect: - inputFactory.supportedClasses == Arrays.asList(expectedClasses.toArray()) - } - - def "A MeasurementUnitInputFactory should parse a valid MeasurementUnitInput correctly"() { - given: "a system participant input type factory and model data" - def inputFactory = new MeasurementUnitInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "id" : "TestID", - "vmag" : "true", - "vang" : "false", - "p" : "true", - "q" : "true" - ] - def inputClass = MeasurementUnitInput - def nodeInput = Mock(NodeInput) - - when: - Try input = inputFactory.get(new NodeAssetInputEntityData(parameter, inputClass, nodeInput)) - - then: - input.success - input.data.get().getClass() == inputClass - ((MeasurementUnitInput) input.data.get()).with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert operationTime == OperationTime.notLimited() - assert operator == OperatorInput.NO_OPERATOR_ASSIGNED - assert id == parameter["id"] - assert node == nodeInput - assert VMag - assert !VAng - assert p - assert q - } - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/NodeInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/NodeInputFactoryTest.groovy deleted file mode 100644 index 8fba840d1..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/NodeInputFactoryTest.groovy +++ /dev/null @@ -1,69 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.factory.input - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.models.StandardUnits -import edu.ie3.datamodel.models.input.NodeInput -import edu.ie3.datamodel.models.input.OperatorInput -import edu.ie3.datamodel.models.voltagelevels.GermanVoltageLevelUtils -import edu.ie3.datamodel.utils.Try -import edu.ie3.test.helper.FactoryTestHelper -import spock.lang.Specification -import tech.units.indriya.ComparableQuantity - -import java.time.ZonedDateTime -import javax.measure.quantity.ElectricPotential - -class NodeInputFactoryTest extends Specification implements FactoryTestHelper { - def "A NodeInputFactory should contain exactly the expected class for parsing"() { - given: - def inputFactory = new NodeInputFactory() - def expectedClasses = [NodeInput] - - expect: - inputFactory.supportedClasses == Arrays.asList(expectedClasses.toArray()) - } - - def "A NodeInputFactory should parse a valid NodeInput correctly"() { - given: "a system participant input type factory and model data" - def inputFactory = new NodeInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", - "operatesuntil": "", - "id" : "TestID", - "vtarget" : "2", - "vrated" : "3", - "slack" : "true", - "geoposition" : "{ \"type\": \"Point\", \"coordinates\": [7.411111, 51.492528] }", - "voltlvl" : "lv", - "subnet" : "7" - ] - def inputClass = NodeInput - def operatorInput = Mock(OperatorInput) - - when: - Try input = inputFactory.get(new AssetInputEntityData(parameter, inputClass, operatorInput)) - - then: - input.success - input.data.get().getClass() == inputClass - ((NodeInput) input.data.get()).with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert operationTime.startDate.present - assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) - assert !operationTime.endDate.present - assert operator == operatorInput - assert id == parameter["id"] - assert vTarget == getQuant(parameter["vtarget"], StandardUnits.TARGET_VOLTAGE_MAGNITUDE) - assert slack - assert geoPosition == getGeometry(parameter["geoposition"]) - assert voltLvl == GermanVoltageLevelUtils.parse(parameter["voltlvl"], getQuant(parameter["vrated"], StandardUnits.RATED_VOLTAGE_MAGNITUDE) as ComparableQuantity) - assert subnet == Integer.parseInt(parameter["subnet"]) - } - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/OperatorInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/OperatorInputFactoryTest.groovy deleted file mode 100644 index b4b07b8d2..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/OperatorInputFactoryTest.groovy +++ /dev/null @@ -1,46 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.factory.input - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.EntityData -import edu.ie3.datamodel.models.input.OperatorInput -import edu.ie3.datamodel.utils.Try -import spock.lang.Specification - -class OperatorInputFactoryTest extends Specification { - - def "An OperatorInputFactory should contain exactly the expected class for parsing"() { - given: - def inputFactory = new OperatorInputFactory() - def expectedClasses = [OperatorInput] - - expect: - inputFactory.supportedClasses == Arrays.asList(expectedClasses.toArray()) - } - - def "An OperatorInputFactory should parse a valid OperatorInput correctly"() { - given: "a operator input factory and model data" - def inputFactory = new OperatorInputFactory() - Map parameter = [ - "uuid": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "id" : "TestOperatorId", - ] - - def inputClass = OperatorInput - - when: - Try input = inputFactory.get(new EntityData(parameter, inputClass)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert id == parameter["id"] - } - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/SwitchInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/SwitchInputFactoryTest.groovy deleted file mode 100644 index 48d087a6a..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/SwitchInputFactoryTest.groovy +++ /dev/null @@ -1,95 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.factory.input - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.models.input.NodeInput -import edu.ie3.datamodel.models.input.OperatorInput -import edu.ie3.datamodel.models.input.connector.SwitchInput -import edu.ie3.datamodel.utils.Try -import edu.ie3.test.helper.FactoryTestHelper -import spock.lang.Specification - -import java.time.ZonedDateTime - -class SwitchInputFactoryTest extends Specification implements FactoryTestHelper { - def "A SwitchInputFactory should contain exactly the expected class for parsing"() { - given: - def inputFactory = new SwitchInputFactory() - def expectedClasses = [SwitchInput] - - expect: - inputFactory.supportedClasses == Arrays.asList(expectedClasses.toArray()) - } - - def "A SwitchInputFactory should parse a valid SwitchInput correctly"() { - given: "a system participant input type factory and model data" - def inputFactory = new SwitchInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", - "operatesuntil": "", - "id" : "TestID", - "closed" : "true" - ] - def inputClass = SwitchInput - def operatorInput = Mock(OperatorInput) - def nodeInputA = Mock(NodeInput) - def nodeInputB = Mock(NodeInput) - - when: - Try input = inputFactory.get(new ConnectorInputEntityData(parameter, inputClass, operatorInput, nodeInputA, nodeInputB)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert operationTime.startDate.present - assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) - assert !operationTime.endDate.present - assert operator == operatorInput - assert id == parameter["id"] - assert nodeA == nodeInputA - assert nodeB == nodeInputB - assert closed - } - } - - def "A SwitchInputFactory should parse a valid SwitchInput with parallelDevices parameter correctly"() { - given: "a system participant input type factory and model data" - def inputFactory = new SwitchInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", - "operatesuntil": "", - "id" : "TestID", - "closed" : "true", - "paralleldevices": "2" - ] - def inputClass = SwitchInput - def operatorInput = Mock(OperatorInput) - def nodeInputA = Mock(NodeInput) - def nodeInputB = Mock(NodeInput) - - expect: - Try input = inputFactory.get(new ConnectorInputEntityData(parameter, inputClass, operatorInput, nodeInputA, nodeInputB)) - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert operationTime.startDate.present - assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) - assert !operationTime.endDate.present - assert operator == operatorInput - assert id == parameter["id"] - assert nodeA == nodeInputA - assert nodeB == nodeInputB - assert closed - assert parallelDevices == 1 - } - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/ThermalBusInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/ThermalBusInputFactoryTest.groovy deleted file mode 100644 index 9ef17d5d4..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/ThermalBusInputFactoryTest.groovy +++ /dev/null @@ -1,54 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.factory.input - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.models.input.OperatorInput -import edu.ie3.datamodel.models.input.thermal.ThermalBusInput -import edu.ie3.datamodel.utils.Try -import edu.ie3.test.helper.FactoryTestHelper -import spock.lang.Specification - -import java.time.ZonedDateTime - -class ThermalBusInputFactoryTest extends Specification implements FactoryTestHelper { - def "A ThermalBusInputFactory should contain exactly the expected class for parsing"() { - given: - def inputFactory = new ThermalBusInputFactory() - def expectedClasses = [ThermalBusInput] - - expect: - inputFactory.supportedClasses == Arrays.asList(expectedClasses.toArray()) - } - - def "A ThermalBusInputFactory should parse a valid SwitchInput correctly"() { - given: "a system participant input type factory and model data" - def inputFactory = new ThermalBusInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", - "operatesuntil": "", - "id" : "TestID" - ] - def inputClass = ThermalBusInput - def operatorInput = Mock(OperatorInput) - - when: - Try input = inputFactory.get(new AssetInputEntityData(parameter, inputClass, operatorInput)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert operationTime.startDate.present - assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) - assert !operationTime.endDate.present - assert operator == operatorInput - assert id == parameter["id"] - } - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/ThermalHouseInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/ThermalHouseInputFactoryTest.groovy deleted file mode 100644 index b2c1055c8..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/ThermalHouseInputFactoryTest.groovy +++ /dev/null @@ -1,67 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.factory.input - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.models.OperationTime -import edu.ie3.datamodel.models.StandardUnits -import edu.ie3.datamodel.models.input.OperatorInput -import edu.ie3.datamodel.models.input.thermal.ThermalBusInput -import edu.ie3.datamodel.models.input.thermal.ThermalHouseInput -import edu.ie3.datamodel.utils.Try -import edu.ie3.test.helper.FactoryTestHelper -import spock.lang.Specification - -class ThermalHouseInputFactoryTest extends Specification implements FactoryTestHelper { - def "A ThermalHouseInputFactory should contain exactly the expected class for parsing"() { - given: - def inputFactory = new ThermalHouseInputFactory() - def expectedClasses = [ThermalHouseInput] - - expect: - inputFactory.supportedClasses == Arrays.asList(expectedClasses.toArray()) - } - - def "A ThermalHouseInputFactory should parse a valid ThermalHouseInput correctly"() { - given: "a system participant input type factory and model data" - def inputFactory = new ThermalHouseInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "id" : "TestID", - "ethlosses" : "3", - "ethcapa" : "4", - "targetTemperature" : "5", - "upperTemperatureLimit": "6", - "lowerTemperatureLimit": "7", - "housingType" : "flat", - "numberInhabitants" : "9", - - ] - def inputClass = ThermalHouseInput - def thermalBusInput = Mock(ThermalBusInput) - - when: - Try input = inputFactory.get(new ThermalUnitInputEntityData(parameter, inputClass, thermalBusInput)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert operationTime == OperationTime.notLimited() - assert operator == OperatorInput.NO_OPERATOR_ASSIGNED - assert id == parameter["id"] - assert thermalBus == thermalBusInput - assert ethLosses == getQuant(parameter["ethlosses"], StandardUnits.THERMAL_TRANSMISSION) - assert ethCapa == getQuant(parameter["ethcapa"], StandardUnits.HEAT_CAPACITY) - assert targetTemperature == getQuant(parameter["targetTemperature"], StandardUnits.TEMPERATURE) - assert upperTemperatureLimit == getQuant(parameter["upperTemperatureLimit"], StandardUnits.TEMPERATURE) - assert lowerTemperatureLimit == getQuant(parameter["lowerTemperatureLimit"], StandardUnits.TEMPERATURE) - assert housingType == parameter["housingType"] - assert numberInhabitants == parameter["numberInhabitants"].toDouble() - } - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/Transformer2WInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/Transformer2WInputFactoryTest.groovy deleted file mode 100644 index 99bd62bd3..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/Transformer2WInputFactoryTest.groovy +++ /dev/null @@ -1,95 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.factory.input - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.models.input.OperatorInput -import edu.ie3.datamodel.models.input.connector.Transformer2WInput -import edu.ie3.datamodel.models.input.connector.type.Transformer2WTypeInput -import edu.ie3.datamodel.utils.Try -import edu.ie3.test.common.GridTestData -import edu.ie3.test.helper.FactoryTestHelper -import spock.lang.Specification - -import java.time.ZonedDateTime - -class Transformer2WInputFactoryTest extends Specification implements FactoryTestHelper { - def "A Transformer2WInputFactory should contain exactly the expected class for parsing"() { - given: - def inputFactory = new Transformer2WInputFactory() - def expectedClasses = [Transformer2WInput] - - expect: - inputFactory.supportedClasses == Arrays.asList(expectedClasses.toArray()) - } - - def "A Transformer2WInputFactory should parse a valid Transformer2WInput correctly"() { - given: "a system participant input type factory and model data" - def inputFactory = new Transformer2WInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", - "operatesuntil" : "", - "id" : "TestID", - "paralleldevices": "2", - "tappos" : "3", - "autotap" : "true" - ] - def inputClass = Transformer2WInput - def operatorInput = Mock(OperatorInput) - def nodeInputA = GridTestData.nodeA - def nodeInputB = GridTestData.nodeB - def typeInput = Mock(Transformer2WTypeInput) - - when: - Try input = inputFactory.get(new TypedConnectorInputEntityData(parameter, inputClass, operatorInput, nodeInputA, nodeInputB, typeInput)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert operationTime.startDate.present - assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) - assert !operationTime.endDate.present - assert operator == operatorInput - assert id == parameter["id"] - assert nodeA == nodeInputA - assert nodeB == nodeInputB - assert type == typeInput - assert parallelDevices == Integer.parseInt(parameter["paralleldevices"]) - assert tapPos == Integer.parseInt(parameter["tappos"]) - assert autoTap - } - } - def "A Transformer2WInputFactory should throw an IllegalArgumentException if nodeA is on the lower voltage side"() { - given: "a system participant input type factory and model data" - def inputFactory = new Transformer2WInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", - "operatesuntil" : "", - "id" : "TestID", - "paralleldevices": "2", - "tappos" : "3", - "autotap" : "true" - ] - def inputClass = Transformer2WInput - def operatorInput = Mock(OperatorInput) - def nodeInputA = GridTestData.nodeB - def nodeInputB = GridTestData.nodeA - def typeInput = Mock(Transformer2WTypeInput) - - when: - Try input = inputFactory.get(new TypedConnectorInputEntityData(parameter, inputClass, operatorInput, nodeInputA, nodeInputB, typeInput)) - - then: - input.failure - def e = input.exception.get() - e.cause.class == IllegalArgumentException - e.cause.message == "nodeA must be on the higher voltage side of the transformer" - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/Transformer3WInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/Transformer3WInputFactoryTest.groovy deleted file mode 100644 index 6ea95414d..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/Transformer3WInputFactoryTest.groovy +++ /dev/null @@ -1,91 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.factory.input - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.models.OperationTime -import edu.ie3.datamodel.models.input.NodeInput -import edu.ie3.datamodel.models.input.OperatorInput -import edu.ie3.datamodel.models.input.connector.Transformer2WInput -import edu.ie3.datamodel.models.input.connector.Transformer3WInput -import edu.ie3.datamodel.models.input.connector.type.Transformer3WTypeInput -import edu.ie3.datamodel.utils.Try -import edu.ie3.test.common.GridTestData -import edu.ie3.test.helper.FactoryTestHelper -import spock.lang.Specification - -class Transformer3WInputFactoryTest extends Specification implements FactoryTestHelper { - def "A Transformer3WInputFactory should contain exactly the expected class for parsing"() { - given: - def inputFactory = new Transformer3WInputFactory() - def expectedClasses = [Transformer3WInput] - - expect: - inputFactory.supportedClasses == Arrays.asList(expectedClasses.toArray()) - } - - def "A Transformer3WInputFactory should parse a valid Transformer3WInput correctly"() { - given: "a system participant input type factory and model data" - def inputFactory = new Transformer3WInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "id" : "TestID", - "paralleldevices": "2", - "tappos" : "3", - "autotap" : "true" - ] - def inputClass = Transformer3WInput - def nodeInputA = GridTestData.nodeA - def nodeInputB = GridTestData.nodeB - def nodeInputC = GridTestData.nodeC - def typeInput = Mock(Transformer3WTypeInput) - - when: - Try input = inputFactory.get(new Transformer3WInputEntityData(parameter, inputClass, nodeInputA, nodeInputB, nodeInputC, typeInput)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert operationTime == OperationTime.notLimited() - assert operator == OperatorInput.NO_OPERATOR_ASSIGNED - assert id == parameter["id"] - assert nodeA == nodeInputA - assert nodeB == nodeInputB - assert nodeC == nodeInputC - assert type == typeInput - assert parallelDevices == Integer.parseInt(parameter["paralleldevices"]) - assert tapPos == Integer.parseInt(parameter["tappos"]) - assert autoTap - } - } - def "A Transformer3WInputFactory should throw an IllegalArgumentException if nodeB is greater than nodeA or nodeC is greater than nodeB"() { - given: "a system participant input type factory and model data" - def inputFactory = new Transformer3WInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "id" : "TestID", - "paralleldevices": "2", - "tappos" : "3", - "autotap" : "true" - ] - def inputClass = Transformer3WInput - def nodeInputA = GridTestData.nodeC - def nodeInputB = GridTestData.nodeB - def nodeInputC = GridTestData.nodeA - def typeInput = Mock(Transformer3WTypeInput) - - when: - Try input = inputFactory.get(new Transformer3WInputEntityData(parameter, inputClass, nodeInputA, nodeInputB, nodeInputC, typeInput)) - - then: - input.failure - def e = input.exception.get() - e.cause.class == IllegalArgumentException - e.cause.message == "Voltage level of node a must be greater than voltage level of node b and voltage level of node b must be greater than voltage level of node c" - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/BmInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/BmInputFactoryTest.groovy deleted file mode 100644 index bd5067787..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/BmInputFactoryTest.groovy +++ /dev/null @@ -1,84 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.factory.input.participant - -import static edu.ie3.util.quantities.PowerSystemUnits.PU - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.models.StandardUnits -import edu.ie3.datamodel.models.input.EmInput -import edu.ie3.datamodel.models.input.NodeInput -import edu.ie3.datamodel.models.input.OperatorInput -import edu.ie3.datamodel.models.input.system.BmInput -import edu.ie3.datamodel.models.input.system.characteristic.CharacteristicPoint -import edu.ie3.datamodel.models.input.system.type.BmTypeInput -import edu.ie3.datamodel.utils.Try -import edu.ie3.test.helper.FactoryTestHelper -import spock.lang.Specification -import tech.units.indriya.quantity.Quantities - -import java.time.ZonedDateTime -import javax.measure.quantity.Dimensionless - -class BmInputFactoryTest extends Specification implements FactoryTestHelper { - def "A BmInputFactory should contain exactly the expected class for parsing"() { - given: - def inputFactory = new BmInputFactory() - def expectedClasses = [BmInput] - - expect: - inputFactory.supportedClasses == Arrays.asList(expectedClasses.toArray()) - } - - def "A BmInputFactory should parse a valid BmInput correctly"() { - given: "a system participant input type factory and model data" - def inputFactory = new BmInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", - "operatesuntil" : "2019-12-31T23:59:00+01:00[Europe/Berlin]", - "id" : "TestID", - "qcharacteristics": "cosPhiFixed:{(0.0,1.0)}", - "marketreaction" : "false", - "costControlled" : "true", - "feedintariff" : "3" - ] - def inputClass = BmInput - def nodeInput = Mock(NodeInput) - def operatorInput = Mock(OperatorInput) - def emUnit = Mock(EmInput) - def typeInput = Mock(BmTypeInput) - - when: - Try input = inputFactory.get( - new SystemParticipantTypedEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit, typeInput)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert operationTime.startDate.present - assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) - assert operationTime.endDate.present - assert operationTime.endDate.get() == ZonedDateTime.parse(parameter["operatesuntil"]) - assert operator == operatorInput - assert id == parameter["id"] - assert node == nodeInput - assert qCharacteristics.with { - assert uuid != null - assert points == Collections.unmodifiableSortedSet([ - new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) - ] as TreeSet) - } - assert controllingEm == Optional.of(emUnit) - assert type == typeInput - assert !marketReaction - assert costControlled - assert feedInTariff == getQuant(parameter["feedintariff"], StandardUnits.ENERGY_PRICE) - } - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactoryTest.groovy deleted file mode 100644 index 8c646691d..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactoryTest.groovy +++ /dev/null @@ -1,83 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.factory.input.participant - -import static edu.ie3.util.quantities.PowerSystemUnits.PU - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.models.input.EmInput -import edu.ie3.datamodel.models.input.NodeInput -import edu.ie3.datamodel.models.input.OperatorInput -import edu.ie3.datamodel.models.input.system.ChpInput -import edu.ie3.datamodel.models.input.system.characteristic.CharacteristicPoint -import edu.ie3.datamodel.models.input.system.type.ChpTypeInput -import edu.ie3.datamodel.models.input.thermal.ThermalBusInput -import edu.ie3.datamodel.models.input.thermal.ThermalStorageInput -import edu.ie3.datamodel.utils.Try -import edu.ie3.test.helper.FactoryTestHelper -import spock.lang.Specification -import tech.units.indriya.quantity.Quantities - -import java.time.ZonedDateTime -import javax.measure.quantity.Dimensionless - -class ChpInputFactoryTest extends Specification implements FactoryTestHelper { - def "A ChpInputFactory should contain exactly the expected class for parsing"() { - given: - def inputFactory = new ChpInputFactory() - def expectedClasses = [ChpInput] - - expect: - inputFactory.supportedClasses == Arrays.asList(expectedClasses.toArray()) - } - - def "A ChpInputFactory should parse a valid ChpInput correctly"() { - given: "a system participant input type factory and model data" - def inputFactory = new ChpInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", - "operatesuntil" : "2019-12-31T23:59:00+01:00[Europe/Berlin]", - "id" : "TestID", - "qcharacteristics": "cosPhiFixed:{(0.0,1.0)}", - "marketreaction" : "true" - ] - def inputClass = ChpInput - def nodeInput = Mock(NodeInput) - def operatorInput = Mock(OperatorInput) - def emUnit = Mock(EmInput) - def typeInput = Mock(ChpTypeInput) - def thermalBusInput = Mock(ThermalBusInput) - def thermalStorageInput = Mock(ThermalStorageInput) - - when: - Try input = inputFactory.get( - new ChpInputEntityData(parameter, operatorInput, nodeInput, emUnit, typeInput, thermalBusInput, thermalStorageInput)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert operationTime.startDate.present - assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) - assert operationTime.endDate.present - assert operationTime.endDate.get() == ZonedDateTime.parse(parameter["operatesuntil"]) - assert operator == operatorInput - assert id == parameter["id"] - assert node == nodeInput - assert qCharacteristics.with { - assert uuid != null - assert points == Collections.unmodifiableSortedSet([ - new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) - ] as TreeSet) - } - assert controllingEm == Optional.of(emUnit) - assert type == typeInput - assert marketReaction - } - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EvInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EvInputFactoryTest.groovy deleted file mode 100644 index 3f876b533..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EvInputFactoryTest.groovy +++ /dev/null @@ -1,77 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.factory.input.participant - -import static edu.ie3.util.quantities.PowerSystemUnits.PU - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.models.input.EmInput -import edu.ie3.datamodel.models.input.NodeInput -import edu.ie3.datamodel.models.input.OperatorInput -import edu.ie3.datamodel.models.input.system.EvInput -import edu.ie3.datamodel.models.input.system.characteristic.CharacteristicPoint -import edu.ie3.datamodel.models.input.system.type.EvTypeInput -import edu.ie3.datamodel.utils.Try -import edu.ie3.test.helper.FactoryTestHelper -import spock.lang.Specification -import tech.units.indriya.quantity.Quantities - -import java.time.ZonedDateTime -import javax.measure.quantity.Dimensionless - -class EvInputFactoryTest extends Specification implements FactoryTestHelper { - def "A EvInputFactory should contain exactly the expected class for parsing"() { - given: - def inputFactory = new EvInputFactory() - def expectedClasses = [EvInput] - - expect: - inputFactory.supportedClasses == Arrays.asList(expectedClasses.toArray()) - } - - def "A EvInputFactory should parse a valid EvInput correctly"() { - given: "a system participant input type factory and model data" - def inputFactory = new EvInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", - "operatesuntil" : "2019-12-31T23:59:00+01:00[Europe/Berlin]", - "id" : "TestID", - "qcharacteristics": "cosPhiFixed:{(0.0,1.0)}" - ] - def inputClass = EvInput - def nodeInput = Mock(NodeInput) - def operatorInput = Mock(OperatorInput) - def emUnit = Mock(EmInput) - def typeInput = Mock(EvTypeInput) - - when: - Try input = inputFactory.get( - new SystemParticipantTypedEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit, typeInput)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert operationTime.startDate.present - assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) - assert operationTime.endDate.present - assert operationTime.endDate.get() == ZonedDateTime.parse(parameter["operatesuntil"]) - assert operator == operatorInput - assert id == parameter["id"] - assert node == nodeInput - assert qCharacteristics.with { - assert uuid != null - assert points == Collections.unmodifiableSortedSet([ - new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) - ] as TreeSet) - } - assert controllingEm == Optional.of(emUnit) - assert type == typeInput - } - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactoryTest.groovy deleted file mode 100644 index 9d3ccd7ed..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactoryTest.groovy +++ /dev/null @@ -1,148 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.factory.input.participant - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.models.input.EmInput -import edu.ie3.datamodel.models.input.NodeInput -import edu.ie3.datamodel.models.input.OperatorInput -import edu.ie3.datamodel.models.input.system.EvcsInput -import edu.ie3.datamodel.models.input.system.characteristic.CharacteristicPoint -import edu.ie3.datamodel.models.input.system.type.chargingpoint.ChargingPointTypeUtils -import edu.ie3.datamodel.models.input.system.type.evcslocation.EvcsLocationType -import edu.ie3.datamodel.utils.Try -import edu.ie3.test.helper.FactoryTestHelper -import edu.ie3.util.quantities.PowerSystemUnits -import spock.lang.Specification -import tech.units.indriya.quantity.Quantities - -import java.time.ZonedDateTime -import javax.measure.quantity.Dimensionless -/** - * Testing EvcsInputFactory - * - * @version 0.1* @since 26.07.20 - */ -class EvcsInputFactoryTest extends Specification implements FactoryTestHelper { - - def "A EvcsInputFactory should contain exactly the expected class for parsing"() { - given: - def inputFactory = new EvcsInputFactory() - def expectedClasses = [EvcsInput] - - expect: - inputFactory.supportedClasses == Arrays.asList(expectedClasses.toArray()) - } - - def "A EvcsInputFactory should parse a valid EvcsInput correctly"() { - given: "a system participant input type factory and model data" - def inputFactory = new EvcsInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", - "operatesuntil" : "2019-12-31T23:59:00+01:00[Europe/Berlin]", - "id" : "TestID", - "qcharacteristics": "cosPhiFixed:{(0.0,1.0)}", - "type" : "Household", - "chargingpoints" : "4", - "cosphirated" : "0.95", - "locationtype" : "CHARGING_HUB_TOWN", - "v2gsupport" : "false" - ] - def inputClass = EvcsInput - def nodeInput = Mock(NodeInput) - def operatorInput = Mock(OperatorInput) - def emUnit = Mock(EmInput) - - when: - Try input = inputFactory.get( - new SystemParticipantEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert operationTime.startDate.present - assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) - assert operationTime.endDate.present - assert operationTime.endDate.get() == ZonedDateTime.parse(parameter["operatesuntil"]) - assert operator == operatorInput - assert id == parameter["id"] - assert node == nodeInput - assert qCharacteristics.with { - assert uuid != null - assert points == Collections.unmodifiableSortedSet([ - new CharacteristicPoint(Quantities.getQuantity(0d, PowerSystemUnits.PU), Quantities.getQuantity(1d, PowerSystemUnits.PU)) - ] as TreeSet) - } - assert controllingEm == Optional.of(emUnit) - assert type == ChargingPointTypeUtils.HouseholdSocket - assert chargingPoints == Integer.parseInt(parameter["chargingpoints"]) - assert cosPhiRated == Double.parseDouble(parameter["cosphirated"]) - assert locationType == EvcsLocationType.CHARGING_HUB_TOWN - assert !v2gSupport - } - } - - def "A EvcsInputFactory should fail when passing an invalid ChargingPointType"() { - given: "a system participant input type factory and model data" - def inputFactory = new EvcsInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", - "operatesuntil" : "2019-12-31T23:59:00+01:00[Europe/Berlin]", - "id" : "TestID", - "qcharacteristics": "cosPhiFixed:{(0.0,1.0)}", - "type" : "-- invalid --", - "chargingpoints" : "4", - "cosphirated" : "0.95", - "locationtype" : "CHARGING_HUB_TOWN", - "v2gsupport" : "false" - ] - def inputClass = EvcsInput - def nodeInput = Mock(NodeInput) - def operatorInput = Mock(OperatorInput) - def emUnit = Mock(EmInput) - - when: - Try input = inputFactory.get( - new SystemParticipantEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit)) - - then: - input.failure - input.exception.get().cause.message == "Exception while trying to parse field \"type\" with supposed int value \"-- invalid --\"" - } - - def "A EvcsInputFactory should fail when passing an invalid EvcsLocationType"() { - given: "a system participant input type factory and model data" - def inputFactory = new EvcsInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", - "operatesuntil" : "2019-12-31T23:59:00+01:00[Europe/Berlin]", - "id" : "TestID", - "qcharacteristics": "cosPhiFixed:{(0.0,1.0)}", - "type" : "Household", - "chargingpoints" : "4", - "cosphirated" : "0.95", - "locationType" : "-- invalid --", - "v2gsupport" : "false" - ] - def inputClass = EvcsInput - def nodeInput = Mock(NodeInput) - def operatorInput = Mock(OperatorInput) - def emUnit = Mock(EmInput) - - when: - Try input = inputFactory.get( - new SystemParticipantEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit)) - - then: - input.failure - input.exception.get().cause.message == "Exception while trying to parse field \"locationType\" with supposed int value \"-- invalid --\"" - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactoryTest.groovy deleted file mode 100644 index 1c4c3effc..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactoryTest.groovy +++ /dev/null @@ -1,100 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.factory.input.participant - -import static edu.ie3.util.quantities.PowerSystemUnits.PU - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.exceptions.ValidationException -import edu.ie3.datamodel.models.StandardUnits -import edu.ie3.datamodel.models.input.EmInput -import edu.ie3.datamodel.models.input.NodeInput -import edu.ie3.datamodel.models.input.OperatorInput -import edu.ie3.datamodel.models.input.system.FixedFeedInInput -import edu.ie3.datamodel.models.input.system.characteristic.CharacteristicPoint -import edu.ie3.datamodel.utils.Try -import edu.ie3.test.helper.FactoryTestHelper -import spock.lang.Specification -import tech.units.indriya.quantity.Quantities - -import java.time.ZonedDateTime -import javax.measure.quantity.Dimensionless - -class FixedFeedInInputFactoryTest extends Specification implements FactoryTestHelper { - def "A FixedFeedInInputFactory should contain exactly the expected class for parsing"() { - given: - def inputFactory = new FixedFeedInInputFactory() - def expectedClasses = [FixedFeedInInput] - - expect: - inputFactory.supportedClasses == Arrays.asList(expectedClasses.toArray()) - } - - def "A FixedFeedInInputFactory should parse a valid FixedFeedInInput correctly"() { - given: "a system participant input type factory and model data" - def inputFactory = new FixedFeedInInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", - "operatesuntil" : "", - "id" : "TestID", - "qcharacteristics": "cosPhiFixed:{(0.0,1.0)}", - "srated" : "3", - "cosphirated" : "4" - ] - def inputClass = FixedFeedInInput - def nodeInput = Mock(NodeInput) - def operatorInput = Mock(OperatorInput) - def emUnit = Mock(EmInput) - - when: - Try input = inputFactory.get(new SystemParticipantEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert operationTime.startDate.present - assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) - assert !operationTime.endDate.present - assert operator == operatorInput - assert id == parameter["id"] - assert node == nodeInput - assert qCharacteristics.with { - assert uuid != null - assert points == Collections.unmodifiableSortedSet([ - new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) - ] as TreeSet) - } - assert controllingEm == Optional.of(emUnit) - assert sRated == getQuant(parameter["srated"], StandardUnits.S_RATED) - assert cosPhiRated == Double.parseDouble(parameter["cosphirated"]) - } - } - - def "A FixedFeedInInputFactory should throw an exception on invalid or incomplete data fields"() { - given: - def inputFactory = new FixedFeedInInputFactory() - def actualFields = FixedFeedInInputFactory.newSet("uuid", "id", "s_rated", "cosphi_rated") - - when: - Try input = inputFactory.validate(actualFields, FixedFeedInInput) - - then: - input.failure - input.exception.get().message == "The provided fields [cosphi_rated, id, s_rated, uuid] are invalid for instance of 'FixedFeedInInput'. \n" + - "The following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of 'FixedFeedInInput' are possible (NOT case-sensitive!):\n" + - "0: [controllingEm, cosPhiRated, id, node, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, node, q_characteristics, s_rated, uuid]\n" + - "1: [controllingEm, cosPhiRated, id, node, operatesFrom, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, node, operates_from, q_characteristics, s_rated, uuid]\n" + - "2: [controllingEm, cosPhiRated, id, node, operatesUntil, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, node, operates_until, q_characteristics, s_rated, uuid]\n" + - "3: [controllingEm, cosPhiRated, id, node, operatesFrom, operatesUntil, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, node, operates_from, operates_until, q_characteristics, s_rated, uuid]\n" + - "4: [controllingEm, cosPhiRated, id, node, operator, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, node, operator, q_characteristics, s_rated, uuid]\n" + - "5: [controllingEm, cosPhiRated, id, node, operatesFrom, operator, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, node, operates_from, operator, q_characteristics, s_rated, uuid]\n" + - "6: [controllingEm, cosPhiRated, id, node, operatesUntil, operator, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, node, operates_until, operator, q_characteristics, s_rated, uuid]\n" + - "7: [controllingEm, cosPhiRated, id, node, operatesFrom, operatesUntil, operator, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, node, operates_from, operates_until, operator, q_characteristics, s_rated, uuid]\n" - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/HpInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/HpInputFactoryTest.groovy deleted file mode 100644 index 6a81ca6fe..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/HpInputFactoryTest.groovy +++ /dev/null @@ -1,80 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.factory.input.participant - -import static edu.ie3.util.quantities.PowerSystemUnits.PU - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.models.input.EmInput -import edu.ie3.datamodel.models.input.NodeInput -import edu.ie3.datamodel.models.input.OperatorInput -import edu.ie3.datamodel.models.input.system.HpInput -import edu.ie3.datamodel.models.input.system.characteristic.CharacteristicPoint -import edu.ie3.datamodel.models.input.system.type.HpTypeInput -import edu.ie3.datamodel.models.input.thermal.ThermalBusInput -import edu.ie3.datamodel.utils.Try -import edu.ie3.test.helper.FactoryTestHelper -import spock.lang.Specification -import tech.units.indriya.quantity.Quantities - -import java.time.ZonedDateTime -import javax.measure.quantity.Dimensionless - -class HpInputFactoryTest extends Specification implements FactoryTestHelper { - def "A HpInputFactory should contain exactly the expected class for parsing"() { - given: - def inputFactory = new HpInputFactory() - def expectedClasses = [HpInput] - - expect: - inputFactory.supportedClasses == Arrays.asList(expectedClasses.toArray()) - } - - def "A HpInputFactory should parse a valid HpInput correctly"() { - given: "a system participant input type factory and model data" - def inputFactory = new HpInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", - "operatesuntil" : "2019-12-31T23:59:00+01:00[Europe/Berlin]", - "id" : "TestID", - "qcharacteristics": "cosPhiFixed:{(0.0,1.0)}" - ] - def inputClass = HpInput - def nodeInput = Mock(NodeInput) - def operatorInput = Mock(OperatorInput) - def emUnit = Mock(EmInput) - def typeInput = Mock(HpTypeInput) - def thermalBusInput = Mock(ThermalBusInput) - - when: - Try input = inputFactory.get( - new HpInputEntityData(parameter, operatorInput, nodeInput, emUnit, typeInput, thermalBusInput)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert operationTime.startDate.present - assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) - assert operationTime.endDate.present - assert operationTime.endDate.get() == ZonedDateTime.parse(parameter["operatesuntil"]) - assert operator == operatorInput - assert id == parameter["id"] - assert node == nodeInput - assert qCharacteristics.with { - assert uuid != null - assert points == Collections.unmodifiableSortedSet([ - new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) - ] as TreeSet) - } - assert controllingEm == Optional.of(emUnit) - assert type == typeInput - assert thermalBus == thermalBusInput - } - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactoryTest.groovy deleted file mode 100644 index d3eaef18a..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactoryTest.groovy +++ /dev/null @@ -1,84 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.factory.input.participant - -import static edu.ie3.util.quantities.PowerSystemUnits.PU - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.models.OperationTime -import edu.ie3.datamodel.models.StandardUnits -import edu.ie3.datamodel.models.input.EmInput -import edu.ie3.datamodel.models.input.NodeInput -import edu.ie3.datamodel.models.input.OperatorInput -import edu.ie3.datamodel.models.input.system.LoadInput -import edu.ie3.datamodel.models.input.system.characteristic.CharacteristicPoint -import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile -import edu.ie3.datamodel.models.profile.NbwTemperatureDependantLoadProfile -import edu.ie3.datamodel.utils.Try -import edu.ie3.test.helper.FactoryTestHelper -import spock.lang.Specification -import tech.units.indriya.quantity.Quantities - -import javax.measure.quantity.Dimensionless - -class LoadInputFactoryTest extends Specification implements FactoryTestHelper { - def "A LoadInputFactory should contain exactly the expected class for parsing"() { - given: - def inputFactory = new LoadInputFactory() - def expectedClasses = [LoadInput] - - expect: - inputFactory.supportedClasses == Arrays.asList(expectedClasses.toArray()) - } - - def "A LoadInputFactory should parse a valid LoadInput correctly"() { - given: "a system participant input type factory and model data" - def inputClass = LoadInput - def nodeInput = Mock(NodeInput) - def emUnit = Mock(EmInput) - - when: - def inputFactory = new LoadInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "id" : "TestID", - "qcharacteristics" : "cosPhiFixed:{(0.0,1.0)}", - "loadprofile" : profileKey, - "econsannual" : "3", - "srated" : "4", - "cosphirated" : "5" - ] - Try input = inputFactory.get( - new SystemParticipantEntityData(parameter, inputClass, nodeInput, emUnit)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert operationTime == OperationTime.notLimited() - assert operator == OperatorInput.NO_OPERATOR_ASSIGNED - assert id == parameter["id"] - assert node == nodeInput - assert qCharacteristics.with { - assert uuid != null - assert points == Collections.unmodifiableSortedSet([ - new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) - ] as TreeSet) - } - assert controllingEm == Optional.of(emUnit) - assert loadProfile == profile - assert eConsAnnual == getQuant(parameter["econsannual"], StandardUnits.ENERGY_IN) - assert sRated == getQuant(parameter["srated"], StandardUnits.S_RATED) - assert cosPhiRated == Double.parseDouble(parameter["cosphirated"]) - } - - where: - profileKey || profile - "G-4" || BdewStandardLoadProfile.G4 - "ep1" || NbwTemperatureDependantLoadProfile.EP1 - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/PvInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/PvInputFactoryTest.groovy deleted file mode 100644 index 63714fdbf..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/PvInputFactoryTest.groovy +++ /dev/null @@ -1,93 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.factory.input.participant - -import static edu.ie3.util.quantities.PowerSystemUnits.PU - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.models.StandardUnits -import edu.ie3.datamodel.models.input.EmInput -import edu.ie3.datamodel.models.input.NodeInput -import edu.ie3.datamodel.models.input.OperatorInput -import edu.ie3.datamodel.models.input.system.PvInput -import edu.ie3.datamodel.models.input.system.characteristic.CharacteristicPoint -import edu.ie3.datamodel.utils.Try -import edu.ie3.test.helper.FactoryTestHelper -import spock.lang.Specification -import tech.units.indriya.quantity.Quantities - -import java.time.ZonedDateTime -import javax.measure.quantity.Dimensionless - -class PvInputFactoryTest extends Specification implements FactoryTestHelper { - def "A PvInputFactory should contain exactly the expected class for parsing"() { - given: - def inputFactory = new PvInputFactory() - def expectedClasses = [PvInput] - - expect: - inputFactory.supportedClasses == Arrays.asList(expectedClasses.toArray()) - } - - def "A PvInputFactory should parse a valid PvInput correctly"() { - given: "a system participant input type factory and model data" - def inputFactory = new PvInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", - "operatesuntil" : "2019-12-31T23:59:00+01:00[Europe/Berlin]", - "id" : "TestID", - "qcharacteristics": "cosPhiFixed:{(0.0,1.0)}", - "albedo" : "3", - "azimuth" : "4", - "etaconv" : "5", - "elevationangle" : "6", - "kg" : "7", - "kt" : "8", - "marketreaction" : "true", - "srated" : "9", - "cosphirated" : "10", - ] - def inputClass = PvInput - def nodeInput = Mock(NodeInput) - def operatorInput = Mock(OperatorInput) - def emUnit = Mock(EmInput) - - when: - Try input = inputFactory.get( - new SystemParticipantEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert operationTime.startDate.present - assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) - assert operationTime.endDate.present - assert operationTime.endDate.get() == ZonedDateTime.parse(parameter["operatesuntil"]) - assert operator == operatorInput - assert id == parameter["id"] - assert node == nodeInput - assert qCharacteristics.with { - assert uuid != null - assert points == Collections.unmodifiableSortedSet([ - new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) - ] as TreeSet) - } - assert controllingEm == Optional.of(emUnit) - assert albedo == Double.parseDouble(parameter["albedo"]) - assert azimuth == getQuant(parameter["azimuth"], StandardUnits.AZIMUTH) - assert etaConv == getQuant(parameter["etaconv"], StandardUnits.EFFICIENCY) - assert elevationAngle == getQuant(parameter["elevationangle"], StandardUnits.SOLAR_ELEVATION_ANGLE) - assert kG == Double.parseDouble(parameter["kg"]) - assert kT == Double.parseDouble(parameter["kt"]) - assert marketReaction - assert sRated == getQuant(parameter["srated"], StandardUnits.S_RATED) - assert cosPhiRated == Double.parseDouble(parameter["cosphirated"]) - } - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactoryTest.groovy deleted file mode 100644 index bd546ec03..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactoryTest.groovy +++ /dev/null @@ -1,77 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.factory.input.participant - -import static edu.ie3.util.quantities.PowerSystemUnits.PU - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.models.input.EmInput -import edu.ie3.datamodel.models.input.NodeInput -import edu.ie3.datamodel.models.input.OperatorInput -import edu.ie3.datamodel.models.input.system.StorageInput -import edu.ie3.datamodel.models.input.system.characteristic.CharacteristicPoint -import edu.ie3.datamodel.models.input.system.type.StorageTypeInput -import edu.ie3.datamodel.utils.Try -import edu.ie3.test.helper.FactoryTestHelper -import spock.lang.Specification -import tech.units.indriya.quantity.Quantities - -import java.time.ZonedDateTime -import javax.measure.quantity.Dimensionless - -class StorageInputFactoryTest extends Specification implements FactoryTestHelper { - def "A StorageInputFactory should contain exactly the expected class for parsing"() { - given: - def inputFactory = new StorageInputFactory() - def expectedClasses = [StorageInput] - - expect: - inputFactory.supportedClasses == Arrays.asList(expectedClasses.toArray()) - } - - def "A StorageInputFactory should parse a valid StorageInput correctly"() { - given: "a system participant input type factory and model data" - def inputFactory = new StorageInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", - "operatesuntil" : "2019-12-31T23:59:00+01:00[Europe/Berlin]", - "id" : "TestID", - "qcharacteristics": "cosPhiFixed:{(0.0,1.0)}" - ] - def inputClass = StorageInput - def nodeInput = Mock(NodeInput) - def operatorInput = Mock(OperatorInput) - def emUnit = Mock(EmInput) - def typeInput = Mock(StorageTypeInput) - - when: - Try input = inputFactory.get( - new SystemParticipantTypedEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit, typeInput)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert operationTime.startDate.present - assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) - assert operationTime.endDate.present - assert operationTime.endDate.get() == ZonedDateTime.parse(parameter["operatesuntil"]) - assert operator == operatorInput - assert id == parameter["id"] - assert node == nodeInput - assert qCharacteristics.with { - assert uuid != null - assert points == Collections.unmodifiableSortedSet([ - new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) - ] as TreeSet) - } - assert controllingEm == Optional.of(emUnit) - assert type == typeInput - } - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/WecInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/WecInputFactoryTest.groovy deleted file mode 100644 index 6479fd9e4..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/WecInputFactoryTest.groovy +++ /dev/null @@ -1,78 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.factory.input.participant - -import static edu.ie3.util.quantities.PowerSystemUnits.PU - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.models.input.EmInput -import edu.ie3.datamodel.models.input.NodeInput -import edu.ie3.datamodel.models.input.OperatorInput -import edu.ie3.datamodel.models.input.system.WecInput -import edu.ie3.datamodel.models.input.system.characteristic.CharacteristicPoint -import edu.ie3.datamodel.models.input.system.type.WecTypeInput -import edu.ie3.datamodel.utils.Try -import edu.ie3.test.helper.FactoryTestHelper -import spock.lang.Specification -import tech.units.indriya.quantity.Quantities - -import java.time.ZonedDateTime -import javax.measure.quantity.Dimensionless - -class WecInputFactoryTest extends Specification implements FactoryTestHelper { - def "A WecInputFactoryTest should contain exactly the expected class for parsing"() { - given: - def inputFactory = new WecInputFactory() - def expectedClasses = [WecInput] - - expect: - inputFactory.supportedClasses == Arrays.asList(expectedClasses.toArray()) - } - - def "A WecInputFactory should parse a valid WecInput correctly"() { - given: "a system participant input type factory and model data" - def inputFactory = new WecInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "operatesfrom" : "", - "operatesuntil" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", - "id" : "TestID", - "qcharacteristics": "cosPhiFixed:{(0.0,1.0)}", - "marketreaction" : "true" - ] - def inputClass = WecInput - def nodeInput = Mock(NodeInput) - def operatorInput = Mock(OperatorInput) - def emUnit = Mock(EmInput) - def typeInput = Mock(WecTypeInput) - - when: - Try input = inputFactory.get( - new SystemParticipantTypedEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit, typeInput)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert !operationTime.startDate.present - assert operationTime.endDate.present - assert operationTime.endDate.get() == ZonedDateTime.parse(parameter["operatesuntil"]) - assert operator == operatorInput - assert id == parameter["id"] - assert node == nodeInput - assert qCharacteristics.with { - assert uuid != null - assert points == Collections.unmodifiableSortedSet([ - new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) - ] as TreeSet) - } - assert controllingEm == Optional.of(emUnit) - assert type == typeInput - assert marketReaction - } - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/result/ConnectorResultFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/result/ConnectorResultFactoryTest.groovy deleted file mode 100644 index 0b338c553..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/result/ConnectorResultFactoryTest.groovy +++ /dev/null @@ -1,88 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.factory.result - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.EntityData -import edu.ie3.datamodel.models.StandardUnits -import edu.ie3.datamodel.models.result.connector.ConnectorResult -import edu.ie3.datamodel.models.result.connector.LineResult -import edu.ie3.datamodel.models.result.connector.Transformer2WResult -import edu.ie3.datamodel.models.result.connector.Transformer3WResult -import edu.ie3.datamodel.utils.Try -import edu.ie3.test.helper.FactoryTestHelper -import spock.lang.Specification - -class ConnectorResultFactoryTest extends Specification implements FactoryTestHelper { - - def "A ConnectorResultFactory should contain all expected classes for parsing"() { - given: - def resultFactory = new ConnectorResultFactory() - def expectedClasses = [ - LineResult, - Transformer2WResult, - Transformer3WResult - ] - - expect: - resultFactory.supportedClasses == Arrays.asList(expectedClasses.toArray()) - } - - def "A ConnectorResultFactory should parse a valid result model correctly"() { - given: "a connector result factory and model data" - def resultFactory = new ConnectorResultFactory() - Map parameter = [ - "time" : "2020-01-30T17:26:44Z", - "inputModel": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "iamag" : "1.0", - "iaang" : "90", - "ibmag" : "0.98123", - "ibang" : "90" - ] - - if (modelClass == Transformer2WResult) { - parameter["tappos"] = "3" - } - if (modelClass == Transformer3WResult) { - parameter["tappos"] = "3" - parameter["icmag"] = "1.0" - parameter["icang"] = "90" - } - - when: - Try result = resultFactory.get(new EntityData(parameter, modelClass)) - - then: - result.success - result.data.get().getClass() == resultingModelClass - ((ConnectorResult) result.data.get()).with { - assert time == TIME_UTIL.toZonedDateTime(parameter["time"]) - assert inputModel == UUID.fromString(parameter["inputModel"]) - assert iAAng == getQuant(parameter["iaang"], StandardUnits.ELECTRIC_CURRENT_ANGLE) - assert iAMag == getQuant(parameter["iamag"], StandardUnits.ELECTRIC_CURRENT_MAGNITUDE) - assert iBAng == getQuant(parameter["ibang"], StandardUnits.ELECTRIC_CURRENT_ANGLE) - assert iBMag == getQuant(parameter["ibmag"], StandardUnits.ELECTRIC_CURRENT_MAGNITUDE) - } - - if (result.data.get().getClass() == Transformer2WResult) { - assert ((Transformer2WResult) result.data.get()).tapPos == Integer.parseInt(parameter["tappos"]) - } - - if (result.data.get().getClass() == Transformer3WResult) { - Transformer3WResult transformer3WResult = ((Transformer3WResult) result.data.get()) - assert transformer3WResult.tapPos == Integer.parseInt(parameter["tappos"]) - assert transformer3WResult.iCAng == getQuant(parameter["icang"], StandardUnits.ELECTRIC_CURRENT_ANGLE) - assert transformer3WResult.iCMag == getQuant(parameter["icmag"], StandardUnits.ELECTRIC_CURRENT_MAGNITUDE) - } - - - where: - modelClass || resultingModelClass - LineResult || LineResult - Transformer2WResult || Transformer2WResult - Transformer3WResult || Transformer3WResult - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/result/FlexOptionsResultFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/result/FlexOptionsResultFactoryTest.groovy deleted file mode 100644 index a10c90643..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/result/FlexOptionsResultFactoryTest.groovy +++ /dev/null @@ -1,67 +0,0 @@ -/* - * © 2022. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.factory.result - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.EntityData -import edu.ie3.datamodel.models.StandardUnits -import edu.ie3.datamodel.models.result.system.FlexOptionsResult -import edu.ie3.datamodel.utils.Try -import edu.ie3.test.helper.FactoryTestHelper -import spock.lang.Specification - -class FlexOptionsResultFactoryTest extends Specification implements FactoryTestHelper { - - def "A FlexOptionsResultFactory should contain all expected classes for parsing"() { - given: - def resultFactory = new FlexOptionsResultFactory() - def expectedClasses = [FlexOptionsResult] - - expect: - resultFactory.supportedClasses == Arrays.asList(expectedClasses.toArray()) - } - - def "A FlexOptionsResultFactory should parse a FlexOptionsResult correctly"() { - given: "a system participant factory and model data" - def resultFactory = new FlexOptionsResultFactory() - Map parameter = [ - "time" : "2020-01-30T17:26:44Z", - "inputModel": "91ec3bcf-1897-4d38-af67-0bf7c9fa73c7", - "pref" : "2", - "pmin" : "-1", - "pmax" : "10", - ] - - when: - Try result = resultFactory.get(new EntityData(parameter, FlexOptionsResult)) - - then: - result.success - result.data.get().getClass() == FlexOptionsResult - ((FlexOptionsResult) result.data.get()).with { - assert pRef == getQuant(parameter["pref"], StandardUnits.ACTIVE_POWER_RESULT) - assert pMin == getQuant(parameter["pmin"], StandardUnits.ACTIVE_POWER_RESULT) - assert pMax == getQuant(parameter["pmax"], StandardUnits.ACTIVE_POWER_RESULT) - assert time == TIME_UTIL.toZonedDateTime(parameter["time"]) - assert inputModel == UUID.fromString(parameter["inputModel"]) - } - } - - def "A FlexOptionsResultFactory should throw an exception on invalid or incomplete data"() { - given: "a system participant factory and model data" - def resultFactory = new FlexOptionsResultFactory() - def actualFields = FlexOptionsResultFactory.newSet("time", "input_model", "p_ref", "p_min") - - when: - Try input = resultFactory.validate(actualFields, FlexOptionsResult) - - then: - input.failure - input.exception.get().message == "The provided fields [input_model, p_min, p_ref, time] are invalid for instance of 'FlexOptionsResult'. \n" + - "The following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of 'FlexOptionsResult' are possible (NOT case-sensitive!):\n" + - "0: [inputModel, pMax, pMin, pRef, time] or [input_model, p_max, p_min, p_ref, time]\n" - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/result/NodeResultFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/result/NodeResultFactoryTest.groovy deleted file mode 100644 index 957aff2b2..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/result/NodeResultFactoryTest.groovy +++ /dev/null @@ -1,65 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.factory.result - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.EntityData -import edu.ie3.datamodel.models.StandardUnits -import edu.ie3.datamodel.models.result.NodeResult -import edu.ie3.datamodel.utils.Try -import edu.ie3.test.helper.FactoryTestHelper -import spock.lang.Specification - -class NodeResultFactoryTest extends Specification implements FactoryTestHelper { - - def "A NodeResultFactory should contain all expected classes for parsing"() { - given: - def resultFactory = new NodeResultFactory() - def expectedClasses = [NodeResult] - - expect: - resultFactory.supportedClasses == Arrays.asList(expectedClasses.toArray()) - } - - def "A NodeResultFactory should parse a NodeResult correctly"() { - given: "a system participant factory and model data" - def resultFactory = new NodeResultFactory() - Map parameter = [ - "time" : "2020-01-30T17:26:44Z", - "inputModel": "91ec3bcf-1897-4d38-af67-0bf7c9fa73c7", - "vmag" : "2", - "vang" : "2" - ] - - when: - Try result = resultFactory.get(new EntityData(parameter, NodeResult)) - - then: - result.success - result.data.get().getClass() == NodeResult - ((NodeResult) result.data.get()).with { - assert vMag == getQuant(parameter["vmag"], StandardUnits.VOLTAGE_MAGNITUDE) - assert vAng == getQuant(parameter["vang"], StandardUnits.VOLTAGE_ANGLE) - assert time == TIME_UTIL.toZonedDateTime(parameter["time"]) - assert inputModel == UUID.fromString(parameter["inputModel"]) - } - } - - def "A NodeResultFactory should throw an exception on invalid or incomplete data"() { - given: "a system participant factory and model data" - def resultFactory = new NodeResultFactory() - def actualFields = NodeResultFactory.newSet("time", "input_model", "v_mag") - - when: - Try input = resultFactory.validate(actualFields, NodeResult) - - then: - input.failure - input.exception.get().message == "The provided fields [input_model, time, v_mag] are invalid for instance of 'NodeResult'. \n" + - "The following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of 'NodeResult' are possible (NOT case-sensitive!):\n" + - "0: [inputModel, time, vAng, vMag] or [input_model, time, v_ang, v_mag]\n" - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/result/SwitchResultFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/result/SwitchResultFactoryTest.groovy deleted file mode 100644 index a025078a4..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/result/SwitchResultFactoryTest.groovy +++ /dev/null @@ -1,49 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.factory.result - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.EntityData -import edu.ie3.datamodel.models.result.connector.SwitchResult -import edu.ie3.datamodel.utils.Try -import edu.ie3.test.helper.FactoryTestHelper -import spock.lang.Specification - - -class SwitchResultFactoryTest extends Specification implements FactoryTestHelper { - - - def "A SwitchResultFactory should contain all expected classes for parsing"() { - given: - def resultFactory = new SwitchResultFactory() - def expectedClasses = [SwitchResult] - - expect: - resultFactory.supportedClasses == Arrays.asList(expectedClasses.toArray()) - } - - def "A SwitchResultFactory should parse a valid result model correctly"() { - given: "a switch result factory and model data" - def resultFactory = new SwitchResultFactory() - Map parameter = [ - "time" : "2020-01-30T17:26:44Z", - "inputModel": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "closed" : "true" - ] - - when: - Try result = resultFactory.get(new EntityData(parameter, SwitchResult)) - - then: - result.success - result.data.get().getClass() == SwitchResult - ((SwitchResult) result.data.get()).with { - assert time == TIME_UTIL.toZonedDateTime(parameter["time"]) - assert inputModel == UUID.fromString(parameter["inputModel"]) - assert closed == Boolean.parseBoolean(parameter["closed"]) - } - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/result/SystemParticipantResultFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/result/SystemParticipantResultFactoryTest.groovy deleted file mode 100644 index 31399a1a5..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/result/SystemParticipantResultFactoryTest.groovy +++ /dev/null @@ -1,161 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.factory.result - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.EntityData -import edu.ie3.datamodel.models.StandardUnits -import edu.ie3.datamodel.models.result.system.* -import edu.ie3.datamodel.utils.Try -import edu.ie3.test.helper.FactoryTestHelper -import spock.lang.Specification -import tech.units.indriya.unit.Units - -class SystemParticipantResultFactoryTest extends Specification implements FactoryTestHelper { - - def "A SystemParticipantResultFactory should contain all expected classes for parsing"() { - given: - def resultFactory = new SystemParticipantResultFactory() - def expectedClasses = [ - LoadResult, - FixedFeedInResult, - BmResult, - PvResult, - ChpResult, - WecResult, - StorageResult, - EvcsResult, - EvResult, - HpResult, - EmResult - ] - - expect: - resultFactory.supportedClasses == Arrays.asList(expectedClasses.toArray()) - } - - def "A SystemParticipantResultFactory should parse a valid result model correctly"() { - given: "a system participant factory and model data" - def resultFactory = new SystemParticipantResultFactory() - Map parameter = [ - "time" : "2020-01-30T17:26:44Z", - "inputModel": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "p" : "2", - "q" : "2" - ] - - if (modelClass == EvResult || modelClass == StorageResult) { - parameter["soc"] = "10" - } - - if (modelClass == HpResult || modelClass == ChpResult) { - parameter["qDot"] = "1" - } - - when: - Try result = resultFactory.get(new EntityData(parameter, modelClass)) - - then: - result.success - result.data.get().getClass() == resultingModelClass - ((SystemParticipantResult) result.data.get()).with { - assert p == getQuant(parameter["p"], StandardUnits.ACTIVE_POWER_RESULT) - assert q == getQuant(parameter["q"], StandardUnits.REACTIVE_POWER_RESULT) - assert time == TIME_UTIL.toZonedDateTime(parameter["time"]) - assert inputModel == UUID.fromString(parameter["inputModel"]) - } - - if (modelClass == EvResult) { - assert (((EvResult) result.data.get()).soc == getQuant(parameter["soc"], Units.PERCENT)) - } - - if (modelClass == StorageResult) { - assert (((StorageResult) result.data.get()).soc == getQuant(parameter["soc"], Units.PERCENT)) - } - - if (modelClass == HpResult) { - assert(((HpResult) result.data.get()).getqDot() == getQuant(parameter["qDot"], StandardUnits.Q_DOT_RESULT)) - } - - if (modelClass == ChpResult) { - assert(((ChpResult) result.data.get()).getqDot() == getQuant(parameter["qDot"], StandardUnits.Q_DOT_RESULT)) - } - - where: - modelClass || resultingModelClass - LoadResult || LoadResult - FixedFeedInResult || FixedFeedInResult - BmResult || BmResult - EvResult || EvResult - PvResult || PvResult - EvcsResult || EvcsResult - ChpResult || ChpResult - WecResult || WecResult - HpResult || HpResult - StorageResult || StorageResult - EmResult || EmResult - } - - def "A SystemParticipantResultFactory should parse a StorageResult correctly"() { - given: "a system participant factory and model data" - def resultFactory = new SystemParticipantResultFactory() - Map parameter = [ - "time" : "2020-01-30T17:26:44Z", - "inputModel": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "soc" : "20", - "p" : "2", - "q" : "2" - ] - when: - Try result = resultFactory.get(new EntityData(parameter, StorageResult)) - - then: - result.success - result.data.get().getClass() == StorageResult - ((StorageResult) result.data.get()).with { - assert p == getQuant(parameter["p"], StandardUnits.ACTIVE_POWER_RESULT) - assert q == getQuant(parameter["q"], StandardUnits.REACTIVE_POWER_RESULT) - assert soc == getQuant(parameter["soc"], Units.PERCENT) - assert time == TIME_UTIL.toZonedDateTime(parameter["time"]) - assert inputModel == UUID.fromString(parameter["inputModel"]) - } - } - - def "A SystemParticipantResultFactory should throw an exception on invalid or incomplete data"() { - given: "a system participant factory and model data" - def resultFactory = new SystemParticipantResultFactory() - def actualFields = SystemParticipantResultFactory.newSet("time", "input_model", "q") - - when: - Try result = resultFactory.validate(actualFields, WecResult) - - then: - result.failure - result.exception.get().message == "The provided fields [input_model, q, time] are invalid for instance of 'WecResult'. \n" + - "The following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of 'WecResult' are possible (NOT case-sensitive!):\n" + - "0: [inputModel, p, q, time] or [input_model, p, q, time]\n" - } - - def "A SystemParticipantResultFactory should be performant"() { - given: "a factory and dummy model data" - def resultFactory = new SystemParticipantResultFactory() - Map parameter = [ - "time" : "2020-01-30T17:26:44Z", - "inputModel": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "soc" : "20", - "p" : "2", - "q" : "2", - ] - expect: "that the factory should not need more than 3 seconds for processing 10.000 entities" - Long startTime = System.currentTimeMillis() - 10000.times { - resultFactory.get(new EntityData(parameter, StorageResult)) - } - BigDecimal elapsedTime = (System - .currentTimeMillis() - startTime) / 1000.0 - elapsedTime < 3 - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/result/ThermalResultFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/result/ThermalResultFactoryTest.groovy deleted file mode 100644 index fa95f7d6f..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/result/ThermalResultFactoryTest.groovy +++ /dev/null @@ -1,107 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.factory.result - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.EntityData -import edu.ie3.datamodel.models.StandardUnits -import edu.ie3.datamodel.models.result.thermal.CylindricalStorageResult -import edu.ie3.datamodel.models.result.thermal.DomesticHotWaterStorageResult -import edu.ie3.datamodel.models.result.thermal.ThermalHouseResult -import edu.ie3.datamodel.models.result.thermal.ThermalUnitResult -import edu.ie3.datamodel.utils.Try -import edu.ie3.test.helper.FactoryTestHelper -import spock.lang.Specification -import tech.units.indriya.quantity.Quantities - -class ThermalResultFactoryTest extends Specification implements FactoryTestHelper { - - def "A ThermalResultFactory should contain all expected classes for parsing"() { - given: - def resultFactory = new ThermalResultFactory() - def expectedClasses = [ - ThermalHouseResult, - CylindricalStorageResult, - DomesticHotWaterStorageResult - ] - - expect: - resultFactory.supportedClasses == Arrays.asList(expectedClasses.toArray()) - } - - def "A ThermalResultFactory should parse a CylindricalStorageResult correctly"() { - given: "a thermal result factory and model data" - def resultFactory = new ThermalResultFactory() - Map parameter = [ - "time" : "2020-01-30T17:26:44Z", - "inputModel": "91ec3bcf-1897-4d38-af67-0bf7c9fa73c7", - "qDot" : "2", - "energy" : "3", - "fillLevel" : "20" - ] - when: - Try result = resultFactory.get(new EntityData(parameter, CylindricalStorageResult)) - - then: - result.success - result.data.get().getClass() == CylindricalStorageResult - ((CylindricalStorageResult) result.data.get()).with { - assert time == TIME_UTIL.toZonedDateTime(parameter.get("time")) - assert inputModel == UUID.fromString(parameter.get("inputModel")) - assert qDot == Quantities.getQuantity(Double.parseDouble(parameter.get("qDot")), StandardUnits.HEAT_DEMAND) - assert energy == Quantities.getQuantity(Double.parseDouble(parameter.get("energy")), StandardUnits.ENERGY_RESULT) - assert fillLevel == Quantities.getQuantity(Double.parseDouble(parameter.get("fillLevel")), StandardUnits.FILL_LEVEL) - } - } - - def "A ThermalResultFactory should parse a DomesticHotWaterStorageResult correctly"() { - given: "a thermal result factory and model data" - def resultFactory = new ThermalResultFactory() - Map parameter = [ - "time" : "2020-01-30T17:26:44Z", - "inputModel": "91ec3bcf-1897-4d38-af67-0bf7c9fa73c7", - "qDot" : "2", - "energy" : "3", - "fillLevel" : "20" - ] - when: - Try result = resultFactory.get(new EntityData(parameter, DomesticHotWaterStorageResult)) - - then: - result.success - result.data.get().getClass() == DomesticHotWaterStorageResult - ((DomesticHotWaterStorageResult) result.data.get()).with { - assert time == TIME_UTIL.toZonedDateTime(parameter.get("time")) - assert inputModel == UUID.fromString(parameter.get("inputModel")) - assert qDot == Quantities.getQuantity(Double.parseDouble(parameter.get("qDot")), StandardUnits.HEAT_DEMAND) - assert energy == Quantities.getQuantity(Double.parseDouble(parameter.get("energy")), StandardUnits.ENERGY_RESULT) - assert fillLevel == Quantities.getQuantity(Double.parseDouble(parameter.get("fillLevel")), StandardUnits.FILL_LEVEL) - } - } - - def "A ThermalResultFactory should parse a ThermalHouseResult correctly"() { - given: "a thermal result factory and model data" - def resultFactory = new ThermalResultFactory() - HashMap parameter = [ - "time" : "2020-01-30T17:26:44Z", - "inputModel" : "91ec3bcf-1897-4d38-af67-0bf7c9fa73c7", - "qDot" : "2", - "indoorTemperature": "21" - ] - when: - Try result = resultFactory.get(new EntityData(parameter, ThermalHouseResult)) - - then: - result.success - result.data.get().getClass() == ThermalHouseResult - ((ThermalHouseResult) result.data.get()).with { - assert time == TIME_UTIL.toZonedDateTime(parameter.get("time")) - assert inputModel == UUID.fromString(parameter.get("inputModel")) - assert qDot == Quantities.getQuantity(Double.parseDouble(parameter.get("qDot")), StandardUnits.HEAT_DEMAND) - assert indoorTemperature == Quantities.getQuantity(Double.parseDouble(parameter.get("indoorTemperature")), StandardUnits.TEMPERATURE) - } - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/CosmoTimeBasedWeatherValueFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/CosmoTimeBasedWeatherValueFactoryTest.groovy index b07e8bf4e..a256ea560 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/CosmoTimeBasedWeatherValueFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/CosmoTimeBasedWeatherValueFactoryTest.groovy @@ -5,7 +5,8 @@ */ package edu.ie3.datamodel.io.factory.timeseries -import edu.ie3.datamodel.exceptions.FactoryException + +import edu.ie3.datamodel.exceptions.SourceException import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue import edu.ie3.datamodel.models.value.WeatherValue @@ -101,7 +102,7 @@ class CosmoTimeBasedWeatherValueFactoryTest extends Specification { factory.buildModel(data) then: - thrown(FactoryException) + thrown(SourceException) } def "Smoke Test: This PsdmTimeBasedWeatherValueFactory should fail since expected results doesn't match input"() { diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/typeinput/LineTypeInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/typeinput/LineTypeInputFactoryTest.groovy deleted file mode 100644 index 321576903..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/typeinput/LineTypeInputFactoryTest.groovy +++ /dev/null @@ -1,59 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.factory.typeinput - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.EntityData -import edu.ie3.datamodel.models.StandardUnits -import edu.ie3.datamodel.models.input.connector.type.LineTypeInput -import edu.ie3.datamodel.utils.Try -import edu.ie3.test.helper.FactoryTestHelper -import spock.lang.Specification - -class LineTypeInputFactoryTest extends Specification implements FactoryTestHelper { - - def "A LineTypeInputFactory should contain exactly the expected class for parsing"() { - given: - def typeInputFactory = new LineTypeInputFactory() - def expectedClasses = [LineTypeInput] - - expect: - typeInputFactory.supportedClasses == Arrays.asList(expectedClasses.toArray()) - } - - def "A LineTypeInputFactory should parse a valid LineTypeInput correctly"() { - given: "a system participant input type factory and model data" - def typeInputFactory = new LineTypeInputFactory() - Map parameter = [ - "uuid": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "id": "blablub", - "b": "3", - "g": "4", - "r": "5", - "x": "6", - "imax": "7", - "vrated": "8" - ] - def typeInputClass = LineTypeInput - - when: - Try typeInput = typeInputFactory.get(new EntityData(parameter, typeInputClass)) - - then: - typeInput.success - typeInput.data.get().getClass() == typeInputClass - typeInput.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert id == parameter["id"] - assert b == getQuant(parameter["b"], StandardUnits.SUSCEPTANCE_PER_LENGTH) - assert g == getQuant(parameter["g"], StandardUnits.CONDUCTANCE_PER_LENGTH) - assert r == getQuant(parameter["r"], StandardUnits.RESISTANCE_PER_LENGTH) - assert x == getQuant(parameter["x"], StandardUnits.REACTANCE_PER_LENGTH) - assert iMax == getQuant(parameter["imax"], StandardUnits.ELECTRIC_CURRENT_MAGNITUDE) - assert vRated == getQuant(parameter["vrated"], StandardUnits.RATED_VOLTAGE_MAGNITUDE) - } - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/typeinput/SystemParticipantTypeInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/typeinput/SystemParticipantTypeInputFactoryTest.groovy deleted file mode 100644 index 95e44f71e..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/typeinput/SystemParticipantTypeInputFactoryTest.groovy +++ /dev/null @@ -1,290 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.factory.typeinput - -import static edu.ie3.util.quantities.PowerSystemUnits.METRE_PER_SECOND -import static edu.ie3.util.quantities.PowerSystemUnits.PU - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.EntityData -import edu.ie3.datamodel.models.StandardUnits -import edu.ie3.datamodel.models.input.system.characteristic.CharacteristicPoint -import edu.ie3.datamodel.models.input.system.type.* -import edu.ie3.datamodel.utils.Try -import edu.ie3.test.helper.FactoryTestHelper -import spock.lang.Specification -import tech.units.indriya.quantity.Quantities - -import javax.measure.quantity.Dimensionless -import javax.measure.quantity.Speed - -class SystemParticipantTypeInputFactoryTest extends Specification implements FactoryTestHelper { - - def "A SystemParticipantTypeInputFactory should contain all expected classes for parsing"() { - given: - def typeInputFactory = new SystemParticipantTypeInputFactory() - def expectedClasses = [ - EvTypeInput, - HpTypeInput, - BmTypeInput, - WecTypeInput, - ChpTypeInput, - StorageTypeInput - ] - - expect: - typeInputFactory.supportedClasses == Arrays.asList(expectedClasses.toArray()) - } - - def "A SystemParticipantTypeInputFactory should parse a valid EvTypeInput correctly"() { - given: "a system participant input type factory and model data" - def typeInputFactory = new SystemParticipantTypeInputFactory() - Map parameter = [ - "uuid": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "id": "blablub", - "capex": "3", - "opex": "4", - "srated": "5", - "cosPhiRated": "6", - - "estorage": "7", - "econs": "8", - "srateddc": "9", - ] - def typeInputClass = EvTypeInput - - when: - Try typeInput = typeInputFactory.get(new EntityData(parameter, typeInputClass)) - - then: - typeInput.success - typeInput.data.get().getClass() == typeInputClass - - ((EvTypeInput) typeInput.data.get()).with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert id == parameter["id"] - assert capex == getQuant(parameter["capex"], StandardUnits.CAPEX) - assert opex == getQuant(parameter["opex"], StandardUnits.ENERGY_PRICE) - assert sRated == getQuant(parameter["srated"], StandardUnits.S_RATED) - assert cosPhiRated == Double.parseDouble(parameter["cosPhiRated"]) - - assert eStorage == getQuant(parameter["estorage"], StandardUnits.ENERGY_IN) - assert eCons == getQuant(parameter["econs"], StandardUnits.ENERGY_PER_DISTANCE) - assert sRatedDC == getQuant(parameter["srateddc"], StandardUnits.ACTIVE_POWER_IN) - } - } - - def "A SystemParticipantTypeInputFactory should parse a valid HpTypeInput correctly"() { - given: "a system participant input type factory and model data" - def typeInputFactory = new SystemParticipantTypeInputFactory() - Map parameter = [ - "uuid": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "id": "blablub", - "capex": "3", - "opex": "4", - "srated": "5", - "cosPhiRated": "6", - - "pthermal": "7", - ] - def typeInputClass = HpTypeInput - - when: - Try typeInput = typeInputFactory.get(new EntityData(parameter, typeInputClass)) - - then: - typeInput.success - typeInput.data.get().getClass() == typeInputClass - - ((HpTypeInput) typeInput.data.get()).with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert id == parameter["id"] - assert capex == getQuant(parameter["capex"], StandardUnits.CAPEX) - assert opex == getQuant(parameter["opex"], StandardUnits.ENERGY_PRICE) - assert sRated == getQuant(parameter["srated"], StandardUnits.S_RATED) - assert cosPhiRated == Double.parseDouble(parameter["cosPhiRated"]) - - assert pThermal == getQuant(parameter["pthermal"], StandardUnits.ACTIVE_POWER_IN) - } - } - - def "A SystemParticipantTypeInputFactory should parse a valid BmTypeInput correctly"() { - given: "a system participant input type factory and model data" - def typeInputFactory = new SystemParticipantTypeInputFactory() - Map parameter = [ - "uuid": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "id": "blablub", - "capex": "3", - "opex": "4", - "srated": "5", - "cosPhiRated": "6", - "activepowergradient": "7", - "etaconv": "8" - ] - def typeInputClass = BmTypeInput - - when: - Try typeInput = typeInputFactory.get(new EntityData(parameter, typeInputClass)) - - then: - typeInput.success - typeInput.data.get().getClass() == typeInputClass - - ((BmTypeInput) typeInput.data.get()).with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert id == parameter["id"] - assert capex == getQuant(parameter["capex"], StandardUnits.CAPEX) - assert opex == getQuant(parameter["opex"], StandardUnits.ENERGY_PRICE) - assert sRated == getQuant(parameter["srated"], StandardUnits.S_RATED) - assert cosPhiRated == Double.parseDouble(parameter["cosPhiRated"]) - - assert activePowerGradient == getQuant(parameter["activepowergradient"], StandardUnits.ACTIVE_POWER_GRADIENT) - assert etaConv == getQuant(parameter["etaconv"], StandardUnits.EFFICIENCY) - } - } - - def "A SystemParticipantTypeInputFactory should parse a valid WecTypeInput correctly"() { - given: "a system participant input type factory and model data" - def typeInputFactory = new SystemParticipantTypeInputFactory() - Map parameter = [ - "uuid": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "id": "blablub", - "capex": "3", - "opex": "4", - "srated": "5", - "cosPhiRated": "6", - - "cpCharacteristic": "cP:{(10.00,0.05),(15.00,0.10),(20.00,0.20)}", - "etaconv": "7", - "rotorarea": "8", - "hubheight": "9" - ] - def typeInputClass = WecTypeInput - - when: - Try typeInput = typeInputFactory.get(new EntityData(parameter, typeInputClass)) - - then: - typeInput.success - typeInput.data.get().getClass() == typeInputClass - - ((WecTypeInput) typeInput.data.get()).with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert id == parameter["id"] - assert capex == getQuant(parameter["capex"], StandardUnits.CAPEX) - assert opex == getQuant(parameter["opex"], StandardUnits.ENERGY_PRICE) - assert sRated == getQuant(parameter["srated"], StandardUnits.S_RATED) - assert cosPhiRated == Double.parseDouble(parameter["cosPhiRated"]) - - cpCharacteristic.with { - assert uuid != null - assert points == Collections.unmodifiableSortedSet([ - new CharacteristicPoint(Quantities.getQuantity(10d, METRE_PER_SECOND), Quantities.getQuantity(0.05, PU)), - new CharacteristicPoint(Quantities.getQuantity(15d, METRE_PER_SECOND), Quantities.getQuantity(0.1, PU)), - new CharacteristicPoint(Quantities.getQuantity(20d, METRE_PER_SECOND), Quantities.getQuantity(0.2, PU)) - ] as TreeSet) - } - assert etaConv == getQuant(parameter["etaconv"], StandardUnits.EFFICIENCY) - assert rotorArea == getQuant(parameter["rotorarea"], StandardUnits.ROTOR_AREA) - assert hubHeight == getQuant(parameter["hubheight"], StandardUnits.HUB_HEIGHT) - } - } - - def "A SystemParticipantTypeInputFactory should parse a valid ChpTypeInput correctly"() { - given: "a system participant input type factory and model data" - def typeInputFactory = new SystemParticipantTypeInputFactory() - Map parameter = [ - "uuid": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "id": "blablub", - "capex": "3", - "opex": "4", - "srated": "5", - "cosPhiRated": "6", - - "etael": "7", - "etathermal": "8", - "pthermal": "9", - "pown": "10" - ] - def typeInputClass = ChpTypeInput - - when: - Try typeInput = typeInputFactory.get(new EntityData(parameter, typeInputClass)) - - then: - typeInput.success - typeInput.data.get().getClass() == typeInputClass - - ((ChpTypeInput) typeInput.data.get()).with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert id == parameter["id"] - assert capex == getQuant(parameter["capex"], StandardUnits.CAPEX) - assert opex == getQuant(parameter["opex"], StandardUnits.ENERGY_PRICE) - assert sRated == getQuant(parameter["srated"], StandardUnits.S_RATED) - assert cosPhiRated == Double.parseDouble(parameter["cosPhiRated"]) - - assert etaEl == getQuant(parameter["etael"], StandardUnits.EFFICIENCY) - assert etaThermal == getQuant(parameter["etathermal"], StandardUnits.EFFICIENCY) - assert pThermal == getQuant(parameter["pthermal"], StandardUnits.ACTIVE_POWER_IN) - assert pOwn == getQuant(parameter["pown"], StandardUnits.ACTIVE_POWER_IN) - } - } - - def "A SystemParticipantTypeInputFactory should parse a valid StorageTypeInput correctly"() { - given: "a system participant input type factory and model data" - def typeInputFactory = new SystemParticipantTypeInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "id" : "blablub", - "capex" : "3", - "opex" : "4", - "srated" : "5", - "cosPhiRated" : "6", - - "estorage" : "6", - "pmax" : "8", - "activepowergradient" : "1", - "eta" : "9" - ] - def typeInputClass = StorageTypeInput - - when: - Try typeInput = typeInputFactory.get(new EntityData(parameter, typeInputClass)) - - then: - typeInput.success - typeInput.data.get().getClass() == typeInputClass - - ((StorageTypeInput) typeInput.data.get()).with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert id == parameter["id"] - assert capex == getQuant(parameter["capex"], StandardUnits.CAPEX) - assert opex == getQuant(parameter["opex"], StandardUnits.ENERGY_PRICE) - assert sRated == getQuant(parameter["srated"], StandardUnits.S_RATED) - assert cosPhiRated == Double.parseDouble(parameter["cosPhiRated"]) - - assert eStorage == getQuant(parameter["estorage"], StandardUnits.ENERGY_IN) - assert pMax == getQuant(parameter["pmax"], StandardUnits.ACTIVE_POWER_IN) - assert activePowerGradient == getQuant(parameter["activepowergradient"], StandardUnits.ACTIVE_POWER_GRADIENT) - assert eta == getQuant(parameter["eta"], StandardUnits.EFFICIENCY) - } - } - - def "A SystemParticipantTypeInputFactory should throw an exception on invalid or incomplete data"() { - given: "a system participant factory and model data" - def typeInputFactory = new SystemParticipantTypeInputFactory() - def actualFields = SystemParticipantTypeInputFactory.newSet("uuid", "id", "capex", "opex", "srated", "cosPhiRated", "estorage", "pmin", "pmax", "eta",) - - when: - def input = typeInputFactory.validate(actualFields, StorageTypeInput) - - then: - input.failure - input.exception.get().message == "The provided fields [capex, cosPhiRated, estorage, eta, id, opex, pmax, pmin, srated, uuid] are invalid for instance of 'StorageTypeInput'. \n" + - "The following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of 'StorageTypeInput' are possible (NOT case-sensitive!):\n" + - "0: [activePowerGradient, capex, cosPhiRated, eStorage, eta, id, opex, pMax, sRated, uuid] or [active_power_gradient, capex, cos_phi_rated, e_storage, eta, id, opex, p_max, s_rated, uuid]\n" - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/typeinput/Transformer2WTypeInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/typeinput/Transformer2WTypeInputFactoryTest.groovy deleted file mode 100644 index b6f094353..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/typeinput/Transformer2WTypeInputFactoryTest.groovy +++ /dev/null @@ -1,74 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.factory.typeinput - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.EntityData -import edu.ie3.datamodel.models.StandardUnits -import edu.ie3.datamodel.models.input.connector.type.Transformer2WTypeInput -import edu.ie3.datamodel.utils.Try -import edu.ie3.test.helper.FactoryTestHelper -import spock.lang.Specification - -class Transformer2WTypeInputFactoryTest extends Specification implements FactoryTestHelper { - - def "A Transformer2WTypeInputFactory should contain exactly the expected class for parsing"() { - given: - def typeInputFactory = new Transformer2WTypeInputFactory() - def expectedClasses = [Transformer2WTypeInput] - - expect: - typeInputFactory.supportedClasses == Arrays.asList(expectedClasses.toArray()) - } - - def "A Transformer2WTypeInputFactory should parse a valid Transformer2WTypeInput correctly"() { - given: "a system participant input type factory and model data" - def typeInputFactory = new Transformer2WTypeInputFactory() - Map parameter = [ - "uuid": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "id": "blablub", - "rsc": "3", - "xsc": "4", - "srated": "5", - "vrateda": "6", - "vratedb": "7", - "gm": "8", - "bm": "9", - "dv": "10", - "dphi": "11", - "tapside": "1", - "tapneutr": "12", - "tapmin": "13", - "tapmax": "14" - ] - def typeInputClass = Transformer2WTypeInput - - when: - Try typeInput = typeInputFactory.get(new EntityData(parameter, typeInputClass)) - - then: - typeInput.success - typeInput.data.get().getClass() == typeInputClass - - typeInput.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert id == parameter["id"] - assert rSc == getQuant(parameter["rsc"], StandardUnits.RESISTANCE) - assert xSc == getQuant(parameter["xsc"], StandardUnits.REACTANCE) - assert sRated == getQuant(parameter["srated"], StandardUnits.S_RATED) - assert vRatedA == getQuant(parameter["vrateda"], StandardUnits.RATED_VOLTAGE_MAGNITUDE) - assert vRatedB == getQuant(parameter["vratedb"], StandardUnits.RATED_VOLTAGE_MAGNITUDE) - assert gM == getQuant(parameter["gm"], StandardUnits.CONDUCTANCE) - assert bM == getQuant(parameter["bm"], StandardUnits.SUSCEPTANCE) - assert dV == getQuant(parameter["dv"], StandardUnits.DV_TAP) - assert dPhi == getQuant(parameter["dphi"], StandardUnits.DPHI_TAP) - assert tapSide == (parameter["tapside"].trim() == "1") || parameter["tapside"].trim() == "true" - assert tapNeutr == Integer.parseInt(parameter["tapneutr"]) - assert tapMin == Integer.parseInt(parameter["tapmin"]) - assert tapMax == Integer.parseInt(parameter["tapmax"]) - } - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/typeinput/Transformer3WTypeInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/typeinput/Transformer3WTypeInputFactoryTest.groovy deleted file mode 100644 index e040a2132..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/typeinput/Transformer3WTypeInputFactoryTest.groovy +++ /dev/null @@ -1,86 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.factory.typeinput - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.EntityData -import edu.ie3.datamodel.models.StandardUnits -import edu.ie3.datamodel.models.input.connector.type.Transformer3WTypeInput -import edu.ie3.datamodel.utils.Try -import edu.ie3.test.helper.FactoryTestHelper -import spock.lang.Specification - -class Transformer3WTypeInputFactoryTest extends Specification implements FactoryTestHelper { - - def "A Transformer3WTypeInputFactory should contain exactly the expected class for parsing"() { - given: - def typeInputFactory = new Transformer3WTypeInputFactory() - def expectedClasses = [Transformer3WTypeInput] - - expect: - typeInputFactory.supportedClasses == Arrays.asList(expectedClasses.toArray()) - } - - def "A Transformer3WTypeInputFactory should parse a valid Transformer2WTypeInput correctly"() { - given: "a system participant input type factory and model data" - def typeInputFactory = new Transformer3WTypeInputFactory() - Map parameter = [ - "uuid": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "id": "blablub", - "srateda": "3", - "sratedb": "4", - "sratedc": "5", - "vrateda": "6", - "vratedb": "7", - "vratedc": "8", - "rsca": "9", - "rscb": "10", - "rscc": "11", - "xsca": "12", - "xscb": "13", - "xscc": "14", - "gm": "15", - "bm": "16", - "dv": "17", - "dphi": "18", - "tapneutr": "19", - "tapmin": "20", - "tapmax": "21" - ] - def typeInputClass = Transformer3WTypeInput - - when: - Try typeInput = typeInputFactory.get(new EntityData(parameter, typeInputClass)) - - then: - typeInput.success - typeInput.data.get().getClass() == typeInputClass - - typeInput.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert id == parameter["id"] - assert sRatedA == getQuant(parameter["srateda"], StandardUnits.S_RATED) - assert sRatedB == getQuant(parameter["sratedb"], StandardUnits.S_RATED) - assert sRatedC == getQuant(parameter["sratedc"], StandardUnits.S_RATED) - assert vRatedA == getQuant(parameter["vrateda"], StandardUnits.RATED_VOLTAGE_MAGNITUDE) - assert vRatedB == getQuant(parameter["vratedb"], StandardUnits.RATED_VOLTAGE_MAGNITUDE) - assert vRatedC == getQuant(parameter["vratedc"], StandardUnits.RATED_VOLTAGE_MAGNITUDE) - assert rScA == getQuant(parameter["rsca"], StandardUnits.RESISTANCE) - assert rScB == getQuant(parameter["rscb"], StandardUnits.RESISTANCE) - assert rScC == getQuant(parameter["rscc"], StandardUnits.RESISTANCE) - assert xScA == getQuant(parameter["xsca"], StandardUnits.REACTANCE) - assert xScB == getQuant(parameter["xscb"], StandardUnits.REACTANCE) - assert xScC == getQuant(parameter["xscc"], StandardUnits.REACTANCE) - assert gM == getQuant(parameter["gm"], StandardUnits.CONDUCTANCE) - assert bM == getQuant(parameter["bm"], StandardUnits.SUSCEPTANCE) - assert dV == getQuant(parameter["dv"], StandardUnits.DV_TAP) - assert dPhi == getQuant(parameter["dphi"], StandardUnits.DPHI_TAP) - assert tapNeutr == Integer.parseInt(parameter["tapneutr"]) - assert tapMin == Integer.parseInt(parameter["tapmin"]) - assert tapMax == Integer.parseInt(parameter["tapmax"]) - } - } -} \ No newline at end of file diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/AssetEntitySourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/AssetEntitySourceTest.groovy deleted file mode 100644 index b92fd09a2..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/source/AssetEntitySourceTest.groovy +++ /dev/null @@ -1,112 +0,0 @@ -/* - * © 2023. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.source - -import static edu.ie3.test.helper.EntityMap.map - -import edu.ie3.datamodel.io.factory.EntityData -import edu.ie3.datamodel.io.factory.input.ConnectorInputEntityData -import edu.ie3.datamodel.io.factory.input.LineInputFactory -import edu.ie3.datamodel.models.input.OperatorInput -import edu.ie3.datamodel.models.input.connector.LineInput -import edu.ie3.datamodel.utils.Try -import edu.ie3.test.common.GridTestData -import spock.lang.Specification - -class AssetEntitySourceTest extends Specification { - - - def "An AssetEntitySource assetEnricher should work as expected"() { - given: - def entityData = new EntityData(["operator": ""], LineInput) - def operators = map([GridTestData.profBroccoli]) - - when: - def actual = AssetEntitySource.assetEnricher.apply(new Try.Success<>(entityData), operators) - - then: - actual.success - actual.data.get().operatorInput == OperatorInput.NO_OPERATOR_ASSIGNED - } - - def "An AssetEntitySource nodeAssetEnricher should work as expected"() { - given: - def entityData = new EntityData(["operator": "", "node": GridTestData.nodeA.uuid.toString()], LineInput) - def operators = map([GridTestData.profBroccoli]) - def nodes = map([GridTestData.nodeA, GridTestData.nodeB]) - - when: - def actual = AssetEntitySource.nodeAssetEnricher.apply(new Try.Success<>(entityData), operators, nodes) - - then: - actual.success - actual.data.get().node == GridTestData.nodeA - } - - def "An AssetEntitySource connectorEnricher should work as expected"() { - given: - def entityData = new EntityData(["operator": "", "nodeA": GridTestData.nodeA.uuid.toString(), "nodeB": GridTestData.nodeB.uuid.toString()], LineInput) - def operators = map([GridTestData.profBroccoli]) - def nodes = map([GridTestData.nodeA, GridTestData.nodeB]) - - when: - def actual = AssetEntitySource.connectorEnricher.apply(new Try.Success<>(entityData), operators, nodes) - - then: - actual.success - actual.data.get().nodeA == GridTestData.nodeA - actual.data.get().nodeB == GridTestData.nodeB - } - - def "An AssetEntitySource can return a stream of typed connector entities"() { - given: - def parameters = [ - "uuid": "92ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "id": "test_line_AtoB", - "operator": GridTestData.profBroccoli.uuid.toString(), - "parallelDevices": "2", - "length": "0.003", - "geoPosition": "{ \"type\": \"LineString\", \"coordinates\": [[7.411111, 51.492528], [7.414116, 51.484136]]}", - "nodeA": GridTestData.nodeA.uuid.toString(), - "nodeB": GridTestData.nodeB.uuid.toString(), - "type": GridTestData.lineTypeInputCtoD.uuid.toString() - ] - def source = DummyDataSource.of(parameters) - def operators = map([GridTestData.profBroccoli]) - def nodes = map([ - GridTestData.nodeA, - GridTestData.nodeB - ]) - def types = map([ - GridTestData.lineTypeInputCtoD - ]) - - when: - def actual = AssetEntitySource.getTypedConnectorEntities(LineInput, source, new LineInputFactory(), operators, nodes, types).toList() - - then: - actual.size() == 1 - actual.get(0).with { - // we only want to test of enriching with nodes and type worked as expected - assert it.nodeA == GridTestData.nodeA - assert it.nodeB == GridTestData.nodeB - assert it.type == GridTestData.lineTypeInputCtoD - } - } - - def "An AssetEntitySource can enrich ConnectorInputEntityData with AssetTypeInput correctly"() { - given: - def entityData = new ConnectorInputEntityData(["type": GridTestData.lineTypeInputCtoD.uuid.toString()], LineInput, GridTestData.nodeA, GridTestData.nodeB) - def types = map([GridTestData.lineTypeInputCtoD]) - - when: - def actual = AssetEntitySource.enrichConnector(types).apply(new Try.Success<>(entityData)) - - then: - actual.success - actual.data.get().type == GridTestData.lineTypeInputCtoD - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/EnergyManagementSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/EnergyManagementSourceTest.groovy index 86d5edf77..8e7197332 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/EnergyManagementSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/EnergyManagementSourceTest.groovy @@ -7,11 +7,9 @@ package edu.ie3.datamodel.io.source import static edu.ie3.test.helper.EntityMap.map -import edu.ie3.datamodel.exceptions.FactoryException import edu.ie3.datamodel.exceptions.SourceException -import edu.ie3.datamodel.io.factory.input.AssetInputEntityData +import edu.ie3.datamodel.models.Entity import edu.ie3.datamodel.models.input.EmInput -import edu.ie3.datamodel.utils.Try import spock.lang.Specification import java.util.stream.Stream @@ -20,235 +18,162 @@ class EnergyManagementSourceTest extends Specification { def "An EnergyManagementSource should construct hierarchical EmInputs with two branches as expected"() { given: - def assetEntityDataStream = Stream.of( - new AssetInputEntityData( - ["uuid": "0-0-0-0-0", - "id": "root", - "controllingem" : "", - "controlstrategy" : ""], - EmInput - ), - new AssetInputEntityData( - ["uuid": "0-0-0-0-1", - "id": "child 1", - "controllingem" : "0-0-0-0-0", - "controlstrategy" : ""], - EmInput - ), - new AssetInputEntityData( - ["uuid": "0-0-0-0-11", - "id": "child 1-1", - "controllingem" : "0-0-0-0-1", - "controlstrategy" : ""], - EmInput - ), - new AssetInputEntityData( - ["uuid": "0-0-0-0-2", - "id": "child 2", - "controllingem" : "0-0-0-0-0", - "controlstrategy" : ""], - EmInput - ), - new AssetInputEntityData( - ["uuid": "0-0-0-0-21", - "id": "child 2-1", - "controllingem" : "0-0-0-0-2", - "controlstrategy" : ""], - EmInput - ), - ).map(data -> Try.of(() -> data, SourceException)) + def dataSource = new DataSource() { + @Override + Optional> getSourceFields(Class entityClass) throws SourceException { + return null + } + + @Override + Stream> getSourceData(Class entityClass) throws SourceException { + return Stream.of( + ["uuid": "0-0-0-0-0", "id": "root", "controllingem": "", "controlstrategy": ""], + ["uuid": "0-0-0-0-1", "id": "child 1", "controllingem": "0-0-0-0-0", "controlstrategy": ""], + ["uuid": "0-0-0-0-11", "id": "child 1-1", "controllingem": "0-0-0-0-1", "controlstrategy": ""], + ["uuid": "0-0-0-0-2", "id": "child 2", "controllingem" : "0-0-0-0-0", "controlstrategy" : ""], + ["uuid": "0-0-0-0-21", "id": "child 2-1", "controllingem" : "0-0-0-0-2", "controlstrategy" : ""] + ) + } + } + + def source = new EnergyManagementSource(null, dataSource) expect: - def emUnits = EnergyManagementSource.createEmInputs(assetEntityDataStream) - - def expectedRootEm = new EmInput( - UUID.fromString("0-0-0-0-0"), - "root", - "", - null - ) - def expectedEm1 = new EmInput( - UUID.fromString("0-0-0-0-1"), - "child 1", - "", - expectedRootEm - ) - def expectedEm11 = new EmInput( - UUID.fromString("0-0-0-0-11"), - "child 1-1", - "", - expectedEm1 - ) - def expectedEm2 = new EmInput( - UUID.fromString("0-0-0-0-2"), - "child 2", - "", - expectedRootEm - ) - def expectedEm21 = new EmInput( - UUID.fromString("0-0-0-0-21"), - "child 2-1", - "", - expectedEm2 - ) - - emUnits == map([expectedRootEm, expectedEm1, expectedEm11, expectedEm2, expectedEm21]) + def emUnits = source.getEmUnits([:]) + def expectedRootEm = new EmInput(UUID.fromString("0-0-0-0-0"), "root", "", null) + def expectedEm1 = new EmInput(UUID.fromString("0-0-0-0-1"), "child 1", "", expectedRootEm) + def expectedEm11 = new EmInput(UUID.fromString("0-0-0-0-11"), "child 1-1", "", expectedEm1) + def expectedEm2 = new EmInput(UUID.fromString("0-0-0-0-2"), "child 2", "", expectedRootEm) + def expectedEm21 = new EmInput(UUID.fromString("0-0-0-0-21"), "child 2-1", "", expectedEm2) + emUnits == map([ + expectedRootEm, + expectedEm1, + expectedEm11, + expectedEm2, + expectedEm21 + ]) } + def "An EnergyManagementSource should construct flat EmInputs without hierarchy as expected"() { given: - def assetEntityDataStream = Stream.of( - new AssetInputEntityData( - ["uuid": "0-0-0-0-1", - "id": "em 1", - "controllingem" : "", - "controlstrategy" : ""], - EmInput - ), - new AssetInputEntityData( - ["uuid": "0-0-0-0-2", - "id": "em 2", - "controllingem" : "", - "controlstrategy" : "strat_b"], - EmInput - ), - new AssetInputEntityData( - ["uuid": "0-0-0-0-3", - "id": "em 3", - "controllingem" : "", - "controlstrategy" : "other"], - EmInput - ), - ).map(data -> Try.of(() -> data, SourceException)) + def dataSource = new DataSource() { + @Override + Optional> getSourceFields(Class entityClass) throws SourceException { + return null + } + + @Override + Stream> getSourceData(Class entityClass) throws SourceException { + return Stream.of( + ["uuid": "0-0-0-0-1", "id": "em 1", "controllingem" : "", "controlstrategy" : ""], + ["uuid": "0-0-0-0-2", "id": "em 2", "controllingem" : "", "controlstrategy" : "strat_b"], + ["uuid": "0-0-0-0-3", "id": "em 3", "controllingem" : "", "controlstrategy" : "other"] + ) + } + } + + def source = new EnergyManagementSource(null, dataSource) expect: - def emUnits = EnergyManagementSource.createEmInputs(assetEntityDataStream) - - def expectedEm1 = new EmInput( - UUID.fromString("0-0-0-0-1"), - "em 1", - "", - null - ) - def expectedEm2 = new EmInput( - UUID.fromString("0-0-0-0-2"), - "em 2", - "strat_b", - null - ) - def expectedEm3 = new EmInput( - UUID.fromString("0-0-0-0-3"), - "em 3", - "other", - null - ) - - emUnits == map([expectedEm1, expectedEm2, expectedEm3]) - } - - def "An EnergyManagementSource should fail if any entity data already failed before"() { - given: - def assetEntityDataStream = Stream.of( - new Try.Success(new AssetInputEntityData( - ["uuid": "0-0-0-0-1", - "id": "em 1", - "controllingem" : "", - "controlstrategy" : ""], - EmInput - )), - new Try.Success(new AssetInputEntityData( - ["uuid": "0-0-0-0-2", - "id": "em 2", - "controllingem" : "", - "controlstrategy" : ""], - EmInput - )), - new Try.Failure(new SourceException("test failure abc")) - ) - - when: - EnergyManagementSource.createEmInputs(assetEntityDataStream) - - then: - def exc = thrown(SourceException) - exc.message.contains("test failure abc") + def emUnits = source.getEmUnits([:]) + def expectedEm1 = new EmInput(UUID.fromString("0-0-0-0-1"), "em 1", "", null) + def expectedEm2 = new EmInput(UUID.fromString("0-0-0-0-2"), "em 2", "strat_b", null) + def expectedEm3 = new EmInput(UUID.fromString("0-0-0-0-3"), "em 3", "other", null) + emUnits == map([ + expectedEm1, + expectedEm2, + expectedEm3 + ]) } def "An EnergyManagementSource should fail if a parent EM UUID is malformed"() { given: - def assetEntityDataStream = Stream.of( - new AssetInputEntityData( - ["uuid": "0-0-0-0-1", - "id": "em 1", - "controllingem" : "", - "controlstrategy" : ""], - EmInput - ), - new AssetInputEntityData( - ["uuid": "0-0-0-0-2", - "id": "em 2", - "controllingem" : "not-a-uuid", - "controlstrategy" : ""], - EmInput - ), - ).map(data -> Try.of(() -> data, SourceException)) + def dataSource = new DataSource() { + @Override + Optional> getSourceFields(Class entityClass) throws SourceException { + return null + } + + @Override + Stream> getSourceData(Class entityClass) throws SourceException { + return Stream.of( + ["uuid": "0-0-0-0-1", "id": "em 1", "controllingem": "", "controlstrategy": ""], + ["uuid": "0-0-0-0-2", "id": "em 2", "controllingem": "not-a-uuid", "controlstrategy": ""] + ) + } + } + + def source = new EnergyManagementSource(null, dataSource) when: - EnergyManagementSource.createEmInputs(assetEntityDataStream) + source.getEmUnits([:]) then: def exc = thrown(SourceException) exc.message.contains("Exception while trying to parse UUID of field \"controllingEm\" with value \"not-a-uuid\"") } - def "An EnergyManagementSource should fail if the factory fails for one EM"() { + def "An EnergyManagementSource should fail if the it fails for one EM"() { given: - def assetEntityDataStream = Stream.of( - new AssetInputEntityData( - ["uuid": "0-0-0-0-1", - "id": "em 1", - "controllingem" : "", - "controlstrategy" : ""], - EmInput - ), - new AssetInputEntityData( - ["uuid": "0-0-0-0-2", // id is missing - "controllingem" : "", - "controlstrategy" : ""], - EmInput - ), - ).map(data -> Try.of(() -> data, SourceException)) + def dataSource = new DataSource() { + @Override + Optional> getSourceFields(Class entityClass) throws SourceException { + return null + } + + @Override + Stream> getSourceData(Class entityClass) throws SourceException { + return Stream.of( + ["uuid" : "0-0-0-0-1", + "id" : "em 1", + "controllingem" : "", + "controlstrategy": ""], + ["uuid" : "0-0-0-0-2", // id is missing + "controllingem" : "", + "controlstrategy": ""] + ) + } + } + + def source = new EnergyManagementSource(null, dataSource) when: - EnergyManagementSource.createEmInputs(assetEntityDataStream) + source.getEmUnits([:]) then: def exc = thrown(SourceException) exc.message == "1 exception(s) occurred within \"EmInput\" data: \n" + - " An error occurred when creating instance of EmInput.class. Caused by: Field \"id\" not found in EntityData" + " Field \"id\" not found in EntityData" } def "An EnergyManagementSource should fail if a parent em is not provided"() { given: - def assetEntityDataStream = Stream.of( - new AssetInputEntityData( - ["uuid": "0-0-0-0-1", - "id": "em 1", - "controllingem" : "", - "controlstrategy" : ""], - EmInput - ), - new AssetInputEntityData( - ["uuid": "0-0-0-0-2", - "id": "em 2", - "controllingem" : "1-2-3-4-5", // does not exist - "controlstrategy" : ""], - EmInput - ), - ).map(data -> Try.of(() -> data, SourceException)) + def dataSource = new DataSource() { + @Override + Optional> getSourceFields(Class entityClass) throws SourceException { + return null + } + + @Override + Stream> getSourceData(Class entityClass) throws SourceException { + return Stream.of( + ["uuid" : "0-0-0-0-1", + "id" : "em 1", + "controllingem" : "", + "controlstrategy": ""], + ["uuid" : "0-0-0-0-2", + "id" : "em 2", + "controllingem" : "1-2-3-4-5", // does not exist + "controlstrategy": ""] + ) + } + } + + def source = new EnergyManagementSource(null, dataSource) when: - EnergyManagementSource.createEmInputs(assetEntityDataStream) + source.getEmUnits([:]) then: def exc = thrown(SourceException) @@ -257,25 +182,31 @@ class EnergyManagementSourceTest extends Specification { def "An EnergyManagementSource should fail if no parent ems are provided"() { given: - def assetEntityDataStream = Stream.of( - new AssetInputEntityData( - ["uuid": "0-0-0-0-1", - "id": "em 1", - "controllingem" : "1-2-3-4-5", // does not exist - "controlstrategy" : ""], - EmInput - ), - new AssetInputEntityData( - ["uuid": "0-0-0-0-2", - "id": "em 2", - "controllingem" : "1-2-3-4-5", // does not exist - "controlstrategy" : ""], - EmInput - ), - ).map(data -> Try.of(() -> data, SourceException)) + def dataSource = new DataSource() { + @Override + Optional> getSourceFields(Class entityClass) throws SourceException { + return null + } + + @Override + Stream> getSourceData(Class entityClass) throws SourceException { + return Stream.of( + ["uuid" : "0-0-0-0-1", + "id" : "em 1", + "controllingem" : "1-2-3-4-5", // does not exist + "controlstrategy": ""], + ["uuid" : "0-0-0-0-2", + "id" : "em 2", + "controllingem" : "1-2-3-4-5", // does not exist + "controlstrategy": ""], + ) + } + } + + def source = new EnergyManagementSource(null, dataSource) when: - EnergyManagementSource.createEmInputs(assetEntityDataStream) + source.getEmUnits([:]) then: def exc = thrown(SourceException) diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy index 1061376f4..e679f236d 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy @@ -5,21 +5,18 @@ */ package edu.ie3.datamodel.io.source -import static edu.ie3.datamodel.io.source.EntitySource.* +import static edu.ie3.datamodel.io.source.EntitySource.extractEntity +import static edu.ie3.datamodel.io.source.EntitySource.extractFunction +import static edu.ie3.datamodel.io.source.EntitySource.getEntities +import static edu.ie3.datamodel.io.source.EntitySource.toMap import static edu.ie3.test.helper.EntityMap.map import edu.ie3.datamodel.exceptions.SourceException import edu.ie3.datamodel.io.factory.EntityData -import edu.ie3.datamodel.io.factory.input.AssetInputEntityData -import edu.ie3.datamodel.io.factory.input.ConnectorInputEntityData -import edu.ie3.datamodel.io.factory.input.OperatorInputFactory import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput -import edu.ie3.datamodel.models.input.connector.LineInput import edu.ie3.datamodel.utils.Try -import edu.ie3.datamodel.utils.validation.DummyAssetInput import edu.ie3.test.common.GridTestData -import org.apache.commons.lang3.tuple.Pair import spock.lang.Specification class EntitySourceTest extends Specification { @@ -30,7 +27,7 @@ class EntitySourceTest extends Specification { def source = DummyDataSource.of(parameter) when: - def actual = getEntities(OperatorInput, source, new OperatorInputFactory()) + def actual = getEntities(OperatorInput, source, TypeSource.operatorBuildFunction).collect(toMap()) then: actual.size() == 1 @@ -44,106 +41,12 @@ class EntitySourceTest extends Specification { def source = DummyDataSource.of(parameter) when: - getEntities(OperatorInput, source, new OperatorInputFactory()) + getEntities(OperatorInput, source, TypeSource.operatorBuildFunction) then: SourceException ex = thrown() ex.message == "1 exception(s) occurred within \"OperatorInput\" data: \n" + - " An error occurred when creating instance of OperatorInput.class. Caused by: Field \"id\" not found in EntityData" - } - - def "An EntitySource can build EntityData correctly"() { - given: - Map parameter = ["operator": GridTestData.profBroccoli.uuid.toString()] - def source = DummyDataSource.of(parameter) - - when: - def actual = buildEntityData(DummyAssetInput, source).toList() - - then: - actual.size() == 1 - actual.get(0).success - } - - def "An EntitySource can enrich and build EntityData correctly"() { - given: - Map parameter = ["operator": GridTestData.profBroccoli.uuid.toString()] - def entityMap = map([GridTestData.profBroccoli]) - def source = DummyDataSource.of(parameter) - def fcn = enrich("operator", entityMap, AssetInputEntityData::new) - - when: - def actual = buildEntityData(DummyAssetInput, source, fcn).toList() - - then: - actual.size() == 1 - actual.get(0).success - def data = actual.get(0).data.get() - - data.targetClass == DummyAssetInput - data.fieldsToValues.size() == 0 - } - - def "An EntitySource can enrich EntityData with default fallback"() { - given: - def entityMap = map([GridTestData.profBroccoli]) - def entityData1 = new EntityData(["operator": GridTestData.profBroccoli.uuid.toString()], NodeInput) - def entityData2 = new EntityData(["operator": ""], NodeInput) - def fcn = enrichWithDefault("operator", entityMap, OperatorInput.NO_OPERATOR_ASSIGNED, AssetInputEntityData::new) - - when: - def enrichedWithEntity = fcn.apply(new Try.Success<>(entityData1)) - def enrichedWithDefault = fcn.apply(new Try.Success<>(entityData2)) - - then: - enrichedWithEntity.success - enrichedWithEntity.data.get().operatorInput == GridTestData.profBroccoli - - enrichedWithDefault.success - enrichedWithDefault.data.get().operatorInput == OperatorInput.NO_OPERATOR_ASSIGNED - } - - def "An EntitySource can enrich EntityData"() { - given: - def entityMap = map([GridTestData.profBroccoli]) - def entityData = new EntityData(["operator": GridTestData.profBroccoli.uuid.toString()], NodeInput) - def fcn = enrich("operator", entityMap, AssetInputEntityData::new) - - when: - def enrichedData = fcn.apply(new Try.Success<>(entityData)) - - then: - enrichedData.success - enrichedData.data.get().operatorInput == GridTestData.profBroccoli - } - - def "An EntitySource can enrich EntityData with two entities"() { - given: - def entityMap = map([GridTestData.nodeA, GridTestData.nodeB]) - def entityData = new AssetInputEntityData(["nodeA": GridTestData.nodeA.uuid.toString(), "nodeB": GridTestData.nodeB.uuid.toString()], LineInput) - def fcn = biEnrich("nodeA", entityMap, "nodeB", entityMap, ConnectorInputEntityData::new) - - when: - def enrichedData = fcn.apply(new Try.Success<>(entityData)) - - then: - enrichedData.success - enrichedData.data.get().nodeA == GridTestData.nodeA - enrichedData.data.get().nodeB == GridTestData.nodeB - } - - def "An EntitySource's builder function should work as expected"() { - given: - def entityData = new EntityData(["operator": ""], NodeInput) - def pair = Pair.of(entityData, GridTestData.profBroccoli) - def fcn = enrichFunction(["operator"], AssetInputEntityData::new) - - when: - def result = fcn.apply(pair) - - then: - result.fieldsToValues.isEmpty() - result.operatorInput == GridTestData.profBroccoli + " Field \"id\" not found in EntityData" } def "An EntitySource can extract an Entity from a map correctly if a field name is given"() { @@ -152,11 +55,10 @@ class EntitySourceTest extends Specification { def entityMap = map([GridTestData.profBroccoli]) when: - def actual = extractFunction(new Try.Success<>(entityData), "operator", entityMap) + def actual = extractFunction(entityData, "operator", entityMap) then: - actual.success - actual.data.get() == GridTestData.profBroccoli + actual == GridTestData.profBroccoli } def "An EntitySource returns a failure if an entity can not be extracted from a given map"() { @@ -164,7 +66,7 @@ class EntitySourceTest extends Specification { def entityData = new EntityData(fieldsToAttributes, NodeInput) when: - def actual = extractFunction(new Try.Success<>(entityData), "operator", entityMap) + def actual = extractEntity(entityData, "operator", entityMap) then: actual.failure @@ -173,8 +75,12 @@ class EntitySourceTest extends Specification { where: fieldsToAttributes | entityMap | expectedMessage - ["operator": "no uuid"] | map([OperatorInput.NO_OPERATOR_ASSIGNED]) | "Extracting UUID for field 'operator' failed. Caused by: Exception while trying to parse UUID of field \"operator\" with value \"no uuid\"" - ["operator": GridTestData.profBroccoli.uuid.toString()] | map([OperatorInput.NO_OPERATOR_ASSIGNED]) | "Extracting UUID for field 'operator' failed. Caused by: Entity with uuid f15105c4-a2de-4ab8-a621-4bc98e372d92 was not provided." + ["operator": "no uuid"] | map([ + OperatorInput.NO_OPERATOR_ASSIGNED + ]) | "Extracting UUID for field 'operator' failed. Caused by: Exception while trying to parse UUID of field \"operator\" with value \"no uuid\"" + ["operator": GridTestData.profBroccoli.uuid.toString()] | map([ + OperatorInput.NO_OPERATOR_ASSIGNED + ]) | "Extracting UUID for field 'operator' failed. Caused by: Entity with uuid f15105c4-a2de-4ab8-a621-4bc98e372d92 was not provided." } def "An EntitySource returns a failure if a given map does not contain the given uuid"() { @@ -185,7 +91,7 @@ class EntitySourceTest extends Specification { ]) when: - def actual = extractFunction(uuid, entityMap) + def actual = extractEntity(uuid, entityMap) then: actual.failure diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/GraphicSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/GraphicSourceTest.groovy new file mode 100644 index 000000000..0ef9180c2 --- /dev/null +++ b/src/test/groovy/edu/ie3/datamodel/io/source/GraphicSourceTest.groovy @@ -0,0 +1,134 @@ +/* + * © 2025. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation + */ +package edu.ie3.datamodel.io.source + +import edu.ie3.datamodel.io.factory.EntityData +import edu.ie3.datamodel.models.input.NodeInput +import edu.ie3.datamodel.models.input.connector.LineInput +import edu.ie3.datamodel.utils.GridAndGeoUtils +import edu.ie3.datamodel.utils.Try +import edu.ie3.test.helper.FactoryTestHelper +import org.locationtech.jts.geom.LineString +import spock.lang.Specification + +class GraphicSourceTest extends Specification implements FactoryTestHelper{ + + def "A LineGraphicInputFactory should be build correctly"() { + given: + def lineUUID = UUID.randomUUID() + + Map parameter = [ + "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "path" : "{ \"type\": \"LineString\", \"coordinates\": [[7.411111, 51.492528], [7.414116, 51.484136]]}", + "graphiclayer" : "test_graphic_layer", + "line" : lineUUID.toString() + ] + + def lineInput = Mock(LineInput) + def lines = [(lineUUID): lineInput] + + when: + def input = GraphicSource.lineGraphicBuildFunction(lines).apply(new Try.Success<>(new EntityData(parameter))) + + then: + input.success + input.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert path == getGeometry(parameter["path"]) + assert graphicLayer == parameter["graphiclayer"] + assert line == lineInput + } + } + + def "A LineGraphicInputFactory should be build with different geoPosition strings correctly"() { + given: + def lineUUID = UUID.randomUUID() + + Map parameter = [ + "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "path" : geoLineString, + "graphiclayer" : "test_graphic_layer", + "line" : lineUUID.toString() + ] + + def lineInput = Mock(LineInput) + def lines = [(lineUUID): lineInput] + + when: + def input = GraphicSource.lineGraphicBuildFunction(lines).apply(new Try.Success<>(new EntityData(parameter))) + + then: + input.success + input.data.get().with { + assert path == GridAndGeoUtils.buildSafeLineString(getGeometry(parameter["path"]) as LineString) + } + + where: + geoLineString | _ + "{ \"type\": \"LineString\", \"coordinates\": [[7.411111, 51.49228],[7.411111, 51.49228]]}" | _ + "{ \"type\": \"LineString\", \"coordinates\": [[7.411111, 51.49228],[7.411111, 51.49228],[7.411111, 51.49228],[7.411111, 51.49228]]}" | _ + "{ \"type\": \"LineString\", \"coordinates\": [[7.411111, 51.49228],[7.411111, 51.49228],[7.311111, 51.49228],[7.511111, 51.49228]]}" | _ + } + + def "A NodeGraphicInputFactory should be build correctly"() { + given: + def nodeUUID = UUID.randomUUID() + + Map parameter = [ + "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "point" : "{ \"type\": \"Point\", \"coordinates\": [7.411111, 51.492528] }", + "path" : "{ \"type\": \"LineString\", \"coordinates\": [[7.411111, 51.492528], [7.414116, 51.484136]]}", + "graphiclayer": "test_graphic_layer", + "node" : nodeUUID.toString() + ] + + def nodeInput = Mock(NodeInput) + def nodes = [(nodeUUID): nodeInput] + + when: + def input = GraphicSource.nodeGraphicBuildFunction(nodes).apply(new Try.Success<>(new EntityData(parameter))) + + then: + input.success + input.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert point == getGeometry(parameter["point"]) + assert path == getGeometry(parameter["path"]) + assert graphicLayer == parameter["graphiclayer"] + assert node == nodeInput + } + } + + def "A NodeGraphicInput should be build with different geoPosition strings correctly"() { + given: + def nodeUUID = UUID.randomUUID() + + Map parameter = [ + "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "point" : "{ \"type\": \"Point\", \"coordinates\": [7.411111, 51.492528] }", + "path" : geoLineString, + "graphiclayer": "test_graphic_layer", + "node" : nodeUUID.toString() + ] + + def nodeInput = Mock(NodeInput) + def nodes = [(nodeUUID): nodeInput] + + when: + def input = GraphicSource.nodeGraphicBuildFunction(nodes).apply(new Try.Success<>(new EntityData(parameter))) + + then: + input.success + input.data.get().with { + assert path == GridAndGeoUtils.buildSafeLineString(getGeometry(parameter["path"]) as LineString) + } + where: + geoLineString | _ + "{ \"type\": \"LineString\", \"coordinates\": [[7.411111, 51.49228],[7.411111, 51.49228]]}" | _ + "{ \"type\": \"LineString\", \"coordinates\": [[7.411111, 51.49228],[7.411111, 51.49228],[7.411111, 51.49228],[7.411111, 51.49228]]}" | _ + "{ \"type\": \"LineString\", \"coordinates\": [[7.411111, 51.49228],[7.411111, 51.49228],[7.311111, 51.49228],[7.511111, 51.49228]]}" | _ + } +} diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/RawGridSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/RawGridSourceTest.groovy new file mode 100644 index 000000000..2b4a2616a --- /dev/null +++ b/src/test/groovy/edu/ie3/datamodel/io/source/RawGridSourceTest.groovy @@ -0,0 +1,514 @@ +/* + * © 2025. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation + */ +package edu.ie3.datamodel.io.source + +import static edu.ie3.util.quantities.PowerSystemUnits.PU +import static tech.units.indriya.unit.Units.METRE_PER_SECOND + +import edu.ie3.datamodel.io.factory.EntityData +import edu.ie3.datamodel.models.OperationTime +import edu.ie3.datamodel.models.StandardUnits +import edu.ie3.datamodel.models.input.NodeInput +import edu.ie3.datamodel.models.input.OperatorInput +import edu.ie3.datamodel.models.input.connector.LineInput +import edu.ie3.datamodel.models.input.connector.type.LineTypeInput +import edu.ie3.datamodel.models.input.connector.type.Transformer2WTypeInput +import edu.ie3.datamodel.models.input.connector.type.Transformer3WTypeInput +import edu.ie3.datamodel.models.input.system.characteristic.CharacteristicPoint +import edu.ie3.datamodel.models.voltagelevels.GermanVoltageLevelUtils +import edu.ie3.datamodel.utils.GridAndGeoUtils +import edu.ie3.datamodel.utils.Try +import edu.ie3.test.common.GridTestData +import edu.ie3.test.helper.FactoryTestHelper +import org.locationtech.jts.geom.LineString +import spock.lang.Specification +import tech.units.indriya.ComparableQuantity +import tech.units.indriya.quantity.Quantities + +import java.time.ZonedDateTime +import javax.measure.quantity.Dimensionless +import javax.measure.quantity.ElectricPotential +import javax.measure.quantity.Speed + +class RawGridSourceTest extends Specification implements FactoryTestHelper { + + def "A NodeInput can be build correctly"() { + given: + def operatorUUID = UUID.randomUUID() + + Map parameter = [ + "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "operator" : operatorUUID.toString(), + "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", + "operatesuntil": "", + "id" : "TestID", + "vtarget" : "2", + "vrated" : "3", + "slack" : "true", + "geoposition" : "{ \"type\": \"Point\", \"coordinates\": [7.411111, 51.492528] }", + "voltlvl" : "lv", + "subnet" : "7" + ] + + def operatorInput = Mock(OperatorInput) + def operators = [(operatorUUID) : operatorInput] + + when: + def input = RawGridSource.nodeBuildFunction(operators).apply(Try.Success.of(new EntityData(parameter))) + + then: + input.success + input.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert operationTime.startDate.present + assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) + assert !operationTime.endDate.present + assert operator == operatorInput + assert id == parameter["id"] + assert vTarget == getQuant(parameter["vtarget"], StandardUnits.TARGET_VOLTAGE_MAGNITUDE) + assert slack + assert geoPosition == getGeometry(parameter["geoposition"]) + assert voltLvl == GermanVoltageLevelUtils.parse(parameter["voltlvl"], getQuant(parameter["vrated"], StandardUnits.RATED_VOLTAGE_MAGNITUDE) as ComparableQuantity) + assert subnet == Integer.parseInt(parameter["subnet"]) + } + } + + def "A LineInput can be build correctly"() { + given: + def operatorUUID = UUID.randomUUID() + def nodeUuidA = UUID.randomUUID() + def nodeUuidB = UUID.randomUUID() + def typeUUID = UUID.randomUUID() + + Map parameter = [ + "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "operator" : operatorUUID.toString(), + "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", + "operatesuntil" : "", + "nodeA" : nodeUuidA.toString(), + "nodeB" : nodeUuidB.toString(), + "id" : "TestID", + "paralleldevices" : "2", + "length" : "3", + "geoposition" : "{ \"type\": \"LineString\", \"coordinates\": [[7.411111, 51.492528], [7.414116, 51.484136]]}", + "olmcharacteristic": "olm:{(0.0,1.0)}", + "type" : typeUUID.toString() + ] + + def operatorInput = Mock(OperatorInput) + def operators = [(operatorUUID) : operatorInput] + def nodeInputA = Mock(NodeInput) + nodeInputA.getGeoPosition() >> NodeInput.DEFAULT_GEO_POSITION + def nodeInputB = Mock(NodeInput) + nodeInputB.getGeoPosition() >> NodeInput.DEFAULT_GEO_POSITION + def nodes = [(nodeUuidA): nodeInputA, (nodeUuidB): nodeInputB] + def typeInput = Mock(LineTypeInput) + def types = [(typeUUID): typeInput] + + + when: + def input = RawGridSource.lineBuildFunction(operators, nodes, types).apply(Try.Success.of(new EntityData(parameter))) + + then: + input.success + input.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert operationTime.startDate.present + assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) + assert !operationTime.endDate.present + assert operator == operatorInput + assert id == parameter["id"] + assert nodeA == nodeInputA + assert nodeB == nodeInputB + assert type == typeInput + assert parallelDevices == Integer.parseInt(parameter["paralleldevices"]) + assert length == getQuant(parameter["length"], StandardUnits.LINE_LENGTH) + assert geoPosition == getGeometry(parameter["geoposition"]) + olmCharacteristic.with { + assert uuid != null + assert points == Collections.unmodifiableSortedSet([ + new CharacteristicPoint( + Quantities.getQuantity(0d, METRE_PER_SECOND), + Quantities.getQuantity(1d, PU)) + ] as TreeSet) + } + } + } + + def "A LineInput build function should parse a valid LineInput without olm characteristic correctly"() { + given: + def operatorUUID = UUID.randomUUID() + def nodeUuidA = UUID.randomUUID() + def nodeUuidB = UUID.randomUUID() + def typeUUID = UUID.randomUUID() + + Map parameter = [ + "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "operator" : operatorUUID.toString(), + "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", + "operatesuntil" : "", + "nodeA" : nodeUuidA.toString(), + "nodeB" : nodeUuidB.toString(), + "id" : "TestID", + "paralleldevices" : "2", + "length" : "3", + "geoposition" : "{ \"type\": \"LineString\", \"coordinates\": [[7.411111, 51.492528], [7.414116, 51.484136]]}", + "olmcharacteristic": "", + "type" : typeUUID.toString() + ] + + def operatorInput = Mock(OperatorInput) + def nodeInputA = Mock(NodeInput) + nodeInputA.getGeoPosition() >> NodeInput.DEFAULT_GEO_POSITION + def nodeInputB = Mock(NodeInput) + nodeInputB.getGeoPosition() >> NodeInput.DEFAULT_GEO_POSITION + def typeInput = Mock(LineTypeInput) + + def operators = [(operatorUUID) : operatorInput] + def nodes = [(nodeUuidA): nodeInputA, (nodeUuidB): nodeInputB] + def types = [(typeUUID): typeInput] + + when: + def input = RawGridSource.lineBuildFunction(operators, nodes, types).apply(Try.Success.of(new EntityData(parameter))) + + then: + input.success + input.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert operationTime.startDate.present + assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) + assert !operationTime.endDate.present + assert operator == operatorInput + assert id == parameter["id"] + assert nodeA == nodeInputA + assert nodeB == nodeInputB + assert type == typeInput + assert parallelDevices == Integer.parseInt(parameter["paralleldevices"]) + assert length == getQuant(parameter["length"], StandardUnits.LINE_LENGTH) + assert geoPosition == getGeometry(parameter["geoposition"]) + olmCharacteristic.with { + assert uuid != null + assert points == Collections.unmodifiableSortedSet([ + new CharacteristicPoint( + Quantities.getQuantity(0d, METRE_PER_SECOND), + Quantities.getQuantity(1d, PU)) + ] as TreeSet) + } + } + } + + def "A LineInput build function should parse a valid LineInput with different geoPosition strings correctly"() { + given: + def operatorUUID = UUID.randomUUID() + def nodeUuidA = UUID.randomUUID() + def nodeUuidB = UUID.randomUUID() + def typeUUID = UUID.randomUUID() + + Map parameter = [ + "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "operator" : operatorUUID.toString(), + "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", + "operatesuntil" : "", + "nodeA" : nodeUuidA.toString(), + "nodeB" : nodeUuidB.toString(), + "id" : "TestID", + "paralleldevices" : "2", + "length" : "3", + "geoposition" : geoLineString, + "olmcharacteristic": "olm:{(0.0,1.0)}", + "type" : typeUUID.toString() + ] + + def inputClass = LineInput + def operatorInput = Mock(OperatorInput) + def nodeInputA = Mock(NodeInput) + nodeInputA.getGeoPosition() >> NodeInput.DEFAULT_GEO_POSITION + def nodeInputB = Mock(NodeInput) + nodeInputB.getGeoPosition() >> NodeInput.DEFAULT_GEO_POSITION + def typeInput = Mock(LineTypeInput) + + def operators = [(operatorUUID) : operatorInput] + def nodes = [(nodeUuidA): nodeInputA, (nodeUuidB): nodeInputB] + def types = [(typeUUID): typeInput] + + when: + def input = RawGridSource.lineBuildFunction(operators, nodes, types).apply(Try.Success.of(new EntityData(parameter))) + + then: + input.success + input.data.get().getClass() == inputClass + input.data.get().with { + assert geoPosition == GridAndGeoUtils.buildSafeLineString(getGeometry(parameter["geoposition"]) as LineString) + } + + where: + geoLineString | _ + "{ \"type\": \"LineString\", \"coordinates\": [[7.411111, 51.49228],[7.411111, 51.49228]]}" | _ + "{ \"type\": \"LineString\", \"coordinates\": [[7.411111, 51.49228],[7.411111, 51.49228],[7.411111, 51.49228],[7.411111, 51.49228]]}" | _ + "{ \"type\": \"LineString\", \"coordinates\": [[7.411111, 51.49228],[7.411111, 51.49228],[7.311111, 51.49228],[7.511111, 51.49228]]}" | _ + } + + def "A Transformer2WInput can be build correctly"() { + given: + def operatorUUID = UUID.randomUUID() + def nodeUuidA = UUID.randomUUID() + def nodeUuidB = UUID.randomUUID() + def typeUUID = UUID.randomUUID() + + Map parameter = [ + "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "operator" : operatorUUID.toString(), + "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", + "operatesuntil" : "", + "nodeA" : nodeUuidA.toString(), + "nodeB" : nodeUuidB.toString(), + "id" : "TestID", + "paralleldevices" : "2", + "tappos" : "3", + "autotap" : "true", + "type" : typeUUID.toString() + ] + + def operatorInput = Mock(OperatorInput) + def operators = [(operatorUUID) : operatorInput] + def nodeInputA = GridTestData.nodeA + def nodeInputB = GridTestData.nodeB + def nodes = [(nodeUuidA): nodeInputA, (nodeUuidB): nodeInputB] + def typeInput = Mock(Transformer2WTypeInput) + def types = [(typeUUID): typeInput] + + when: + def input = RawGridSource.transformer2WBuildFunction(operators, nodes, types).apply(Try.Success.of(new EntityData(parameter))) + + then: + input.success + input.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert operationTime.startDate.present + assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) + assert !operationTime.endDate.present + assert operator == operatorInput + assert id == parameter["id"] + assert nodeA == nodeInputA + assert nodeB == nodeInputB + assert type == typeInput + assert parallelDevices == Integer.parseInt(parameter["paralleldevices"]) + assert tapPos == Integer.parseInt(parameter["tappos"]) + assert autoTap + } + } + + def "A Transformer2WInput build function should throw an IllegalArgumentException if nodeA is on the lower voltage side"() { + given: + def operatorUUID = UUID.randomUUID() + def nodeUuidA = UUID.randomUUID() + def nodeUuidB = UUID.randomUUID() + def typeUUID = UUID.randomUUID() + + Map parameter = [ + "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "operator" : operatorUUID.toString(), + "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", + "operatesuntil" : "", + "nodeA" : nodeUuidA.toString(), + "nodeB" : nodeUuidB.toString(), + "id" : "TestID", + "paralleldevices": "2", + "tappos" : "3", + "autotap" : "true", + "type" : typeUUID.toString() + ] + def operatorInput = Mock(OperatorInput) + def nodeInputA = GridTestData.nodeB + def nodeInputB = GridTestData.nodeA + def typeInput = Mock(Transformer2WTypeInput) + + def operators = [(operatorUUID) : operatorInput] + def nodes = [(nodeUuidA): nodeInputA, (nodeUuidB): nodeInputB] + def types = [(typeUUID): typeInput] + + when: + def input = RawGridSource.transformer2WBuildFunction(operators, nodes, types).apply(Try.Success.of(new EntityData(parameter))) + + then: + input.failure + def e = input.exception.get() + e.cause.class == IllegalArgumentException + e.cause.message == "nodeA must be on the higher voltage side of the transformer" + } + + def "A Transformer3WInput can be build correctly"() { + given: + def operatorUUID = UUID.randomUUID() + def nodeInputA = GridTestData.nodeA + def nodeInputB = GridTestData.nodeB + def nodeInputC = GridTestData.nodeC + def typeUUID = UUID.randomUUID() + + Map parameter = [ + "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "operator" : operatorUUID.toString(), + "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", + "operatesuntil" : "", + "nodeA" : nodeInputA.uuid.toString(), + "nodeB" : nodeInputB.uuid.toString(), + "nodeC" : nodeInputC.uuid.toString(), + "id" : "TestID", + "paralleldevices" : "2", + "tappos" : "3", + "autotap" : "true", + "type" : typeUUID.toString() + ] + + def operatorInput = Mock(OperatorInput) + def operators = [(operatorUUID) : operatorInput] + def nodes = [(nodeInputA.uuid): nodeInputA, (nodeInputB.uuid): nodeInputB, (nodeInputC.uuid): nodeInputC] + def typeInput = Mock(Transformer3WTypeInput) + def types = [(typeUUID): typeInput] + + when: + def input = RawGridSource.transformer3WBuildFunction(operators, nodes, types).apply(Try.Success.of(new EntityData(parameter))) + + then: + input.success + input.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert operationTime.startDate.present + assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) + assert !operationTime.endDate.present + assert operator == operatorInput + assert id == parameter["id"] + assert nodeA == nodeInputA + assert nodeB == nodeInputB + assert type == typeInput + assert parallelDevices == Integer.parseInt(parameter["paralleldevices"]) + assert tapPos == Integer.parseInt(parameter["tappos"]) + assert autoTap + } + } + + def "A Transformer3WInput build function should throw an IllegalArgumentException if nodeA is on the lower voltage side"() { + given: + def operatorUUID = UUID.randomUUID() + def nodeInputA = GridTestData.nodeC + def nodeInputB = GridTestData.nodeB + def nodeInputC = GridTestData.nodeA + def typeUUID = UUID.randomUUID() + + Map parameter = [ + "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "operator" : operatorUUID.toString(), + "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", + "operatesuntil" : "", + "nodeA" : nodeInputA.uuid.toString(), + "nodeB" : nodeInputB.uuid.toString(), + "nodeC" : nodeInputC.uuid.toString(), + "id" : "TestID", + "paralleldevices": "2", + "tappos" : "3", + "autotap" : "true", + "type" : typeUUID.toString() + ] + def operatorInput = Mock(OperatorInput) + def typeInput = Mock(Transformer3WTypeInput) + + def operators = [(operatorUUID) : operatorInput] + def nodes = [(nodeInputA.uuid): nodeInputA, (nodeInputB.uuid): nodeInputB, (nodeInputC.uuid): nodeInputC] + def types = [(typeUUID): typeInput] + + when: + def input = RawGridSource.transformer3WBuildFunction(operators, nodes, types).apply(Try.Success.of(new EntityData(parameter))) + + then: + input.failure + def e = input.exception.get() + e.cause.class == IllegalArgumentException + e.cause.message == "Voltage level of node a must be greater than voltage level of node b and voltage level of node b must be greater than voltage level of node c" + } + + def "A SwitchInput can be build correctly"() { + given: + def operatorUUID = UUID.randomUUID() + def nodeUuidA = UUID.randomUUID() + def nodeUuidB = UUID.randomUUID() + def typeUUID = UUID.randomUUID() + + Map parameter = [ + "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "operator" : operatorUUID.toString(), + "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", + "operatesuntil" : "", + "nodeA" : nodeUuidA.toString(), + "nodeB" : nodeUuidB.toString(), + "id" : "TestID", + "closed" : "true", + "type" : typeUUID.toString() + ] + + def operatorInput = Mock(OperatorInput) + def operators = [(operatorUUID) : operatorInput] + def nodeInputA = Mock(NodeInput) + def nodeInputB = Mock(NodeInput) + def nodes = [(nodeUuidA): nodeInputA, (nodeUuidB): nodeInputB] + + when: + def input = RawGridSource.switchBuildFunction(operators, nodes).apply(Try.Success.of(new EntityData(parameter))) + + then: + input.success + input.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert operationTime.startDate.present + assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) + assert !operationTime.endDate.present + assert operator == operatorInput + assert id == parameter["id"] + assert nodeA == nodeInputA + assert nodeB == nodeInputB + assert closed + assert parallelDevices == 1 // required, since a switch is a connector + } + } + + def "A MeasurementUnitInput can be build correctly"() { + given: + def operatorUUID = UUID.randomUUID() + def nodeUUID = UUID.randomUUID() + + Map parameter = [ + "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "id" : "TestID", + "vmag" : "true", + "vang" : "false", + "p" : "true", + "q" : "true", + "operator" : operatorUUID.toString(), + "node" : nodeUUID.toString() + ] + + def operatorInput = Mock(OperatorInput) + def operators = [(operatorUUID) : operatorInput] + def nodeInput = Mock(NodeInput) + def nodes = [(nodeUUID) : nodeInput] + + when: + def input = RawGridSource.measurementBuildFunction(operators, nodes).apply(Try.Success.of(new EntityData(parameter))) + + then: + input.success + input.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert operationTime == OperationTime.notLimited() + assert operator == operatorInput + assert id == parameter["id"] + assert node == nodeInput + assert VMag + assert !VAng + assert p + assert q + } + } +} diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/ResultEntitySourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/ResultEntitySourceTest.groovy new file mode 100644 index 000000000..5167ec477 --- /dev/null +++ b/src/test/groovy/edu/ie3/datamodel/io/source/ResultEntitySourceTest.groovy @@ -0,0 +1,522 @@ +/* + * © 2025. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation + */ +package edu.ie3.datamodel.io.source + + +import edu.ie3.datamodel.io.factory.EntityData +import edu.ie3.datamodel.models.StandardUnits +import edu.ie3.datamodel.models.result.CongestionResult +import edu.ie3.datamodel.utils.Try +import edu.ie3.test.helper.FactoryTestHelper +import edu.ie3.util.TimeUtil +import spock.lang.Shared +import spock.lang.Specification +import tech.units.indriya.quantity.Quantities +import tech.units.indriya.unit.Units + +class ResultEntitySourceTest extends Specification implements FactoryTestHelper { + @Shared + private TimeUtil timeUtil = TimeUtil.withDefaults + + def "A NodeResult should should be built correctly"() { + given: + Map parameter = [ + "time" : "2020-01-30T17:26:44Z", + "inputModel": "91ec3bcf-1897-4d38-af67-0bf7c9fa73c7", + "vmag" : "2", + "vang" : "2" + ] + + when: + def result = ResultEntitySource.nodeResultBuildFunction(timeUtil).apply(new Try.Success<>(new EntityData(parameter))) + + then: + result.success + result.data.get().with { + assert vMag == getQuant(parameter["vmag"], StandardUnits.VOLTAGE_MAGNITUDE) + assert vAng == getQuant(parameter["vang"], StandardUnits.VOLTAGE_ANGLE) + assert time == TIME_UTIL.toZonedDateTime(parameter["time"]) + assert inputModel == UUID.fromString(parameter["inputModel"]) + } + } + + def "A SwitchResult should should be built correctly"() { + given: + Map parameter = [ + "time" : "2020-01-30T17:26:44Z", + "inputModel": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "closed" : "true" + ] + + when: + def result = ResultEntitySource.switchResultBuildFunction(timeUtil).apply(new Try.Success<>(new EntityData(parameter))) + + then: + result.success + result.data.get().with { + assert time == TIME_UTIL.toZonedDateTime(parameter["time"]) + assert inputModel == UUID.fromString(parameter["inputModel"]) + assert closed == Boolean.parseBoolean(parameter["closed"]) + } + } + + def "A LineResult should should be built correctly"() { + given: + Map parameter = [ + "time" : "2020-01-30T17:26:44Z", + "inputModel": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "iamag" : "1.0", + "iaang" : "90", + "ibmag" : "0.98123", + "ibang" : "90" + ] + + when: + def result = ResultEntitySource.lineResultBuildFunction(timeUtil).apply(new Try.Success<>(new EntityData(parameter))) + + then: + result.success + result.data.get().with { + assert time == TIME_UTIL.toZonedDateTime(parameter["time"]) + assert inputModel == UUID.fromString(parameter["inputModel"]) + assert iAAng == getQuant(parameter["iaang"], StandardUnits.ELECTRIC_CURRENT_ANGLE) + assert iAMag == getQuant(parameter["iamag"], StandardUnits.ELECTRIC_CURRENT_MAGNITUDE) + assert iBAng == getQuant(parameter["ibang"], StandardUnits.ELECTRIC_CURRENT_ANGLE) + assert iBMag == getQuant(parameter["ibmag"], StandardUnits.ELECTRIC_CURRENT_MAGNITUDE) + } + } + + def "A Transformer2WResult should should be built correctly"() { + given: + Map parameter = [ + "time" : "2020-01-30T17:26:44Z", + "inputModel": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "iamag" : "1.0", + "iaang" : "90", + "ibmag" : "0.98123", + "ibang" : "90", + "tappos" : "3" + ] + + when: + def result = ResultEntitySource.transformer2WResultBuilder(timeUtil).apply(new Try.Success<>(new EntityData(parameter))) + + then: + result.success + result.data.get().with { + assert time == TIME_UTIL.toZonedDateTime(parameter["time"]) + assert inputModel == UUID.fromString(parameter["inputModel"]) + assert iAAng == getQuant(parameter["iaang"], StandardUnits.ELECTRIC_CURRENT_ANGLE) + assert iAMag == getQuant(parameter["iamag"], StandardUnits.ELECTRIC_CURRENT_MAGNITUDE) + assert iBAng == getQuant(parameter["ibang"], StandardUnits.ELECTRIC_CURRENT_ANGLE) + assert iBMag == getQuant(parameter["ibmag"], StandardUnits.ELECTRIC_CURRENT_MAGNITUDE) + } + } + + def "A Transformer3WResult should should be built correctly"() { + given: + Map parameter = [ + "time" : "2020-01-30T17:26:44Z", + "inputModel": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "iamag" : "1.0", + "iaang" : "90", + "ibmag" : "0.98123", + "ibang" : "90", + "tappos" : "3", + "icmag" : "1.0", + "icang" : "90" + ] + + when: + def result = ResultEntitySource.transformer3WResultBuilder(timeUtil).apply(new Try.Success<>(new EntityData(parameter))) + + then: + result.success + result.data.get().with { + assert time == TIME_UTIL.toZonedDateTime(parameter["time"]) + assert inputModel == UUID.fromString(parameter["inputModel"]) + assert iAAng == getQuant(parameter["iaang"], StandardUnits.ELECTRIC_CURRENT_ANGLE) + assert iAMag == getQuant(parameter["iamag"], StandardUnits.ELECTRIC_CURRENT_MAGNITUDE) + assert iBAng == getQuant(parameter["ibang"], StandardUnits.ELECTRIC_CURRENT_ANGLE) + assert iBMag == getQuant(parameter["ibmag"], StandardUnits.ELECTRIC_CURRENT_MAGNITUDE) + assert tapPos == Integer.parseInt(parameter["tappos"]) + assert iCAng == getQuant(parameter["icang"], StandardUnits.ELECTRIC_CURRENT_ANGLE) + assert iCMag == getQuant(parameter["icmag"], StandardUnits.ELECTRIC_CURRENT_MAGNITUDE) + } + } + + def "A FlexOptionsResult should be built correctly"() { + given: + Map parameter = [ + "time" : "2020-01-30T17:26:44Z", + "inputModel": "91ec3bcf-1897-4d38-af67-0bf7c9fa73c7", + "pref" : "2", + "pmin" : "-1", + "pmax" : "10", + ] + + when: + def result = ResultEntitySource.flexOptionsResultBuildFunction(timeUtil).apply(new Try.Success<>(new EntityData(parameter))) + + then: + result.success + result.data.get().with { + assert pRef == getQuant(parameter["pref"], StandardUnits.ACTIVE_POWER_RESULT) + assert pMin == getQuant(parameter["pmin"], StandardUnits.ACTIVE_POWER_RESULT) + assert pMax == getQuant(parameter["pmax"], StandardUnits.ACTIVE_POWER_RESULT) + assert time == TIME_UTIL.toZonedDateTime(parameter["time"]) + assert inputModel == UUID.fromString(parameter["inputModel"]) + } + } + + def "A CongestionResult should be built correctly"() { + given: + Map parameter = [ + "time" : "2020-01-30T17:26:44Z", + "inputModel": "91ec3bcf-1897-4d38-af67-0bf7c9fa73c7", + "type" : "line", + "subgrid" : "2", + "value" : "110.0", + "min" : "0.0", + "max" : "100.0" + ] + + when: + def result = ResultEntitySource.congestionResultBuildFunction(timeUtil).apply(new Try.Success<>(new EntityData(parameter))) + + then: + result.success + result.data.get().with { + assert type == CongestionResult.InputModelType.LINE + assert subgrid == 2 + assert value == getQuant(parameter["value"], Units.PERCENT) + assert min == getQuant(parameter["min"], Units.PERCENT) + assert max == getQuant(parameter["max"], Units.PERCENT) + assert time == TIME_UTIL.toZonedDateTime(parameter["time"]) + assert inputModel == UUID.fromString(parameter["inputModel"]) + } + } + + def "A LoadResult should be built correctly"() { + given: + Map parameter = [ + "time" : "2020-01-30T17:26:44Z", + "inputModel": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "p" : "2", + "q" : "2" + ] + + when: + def result = ResultEntitySource.loadResultBuildFunction(timeUtil).apply(new Try.Success<>(new EntityData(parameter))) + + then: + result.success + result.data.get().with { + assert p == getQuant(parameter["p"], StandardUnits.ACTIVE_POWER_RESULT) + assert q == getQuant(parameter["q"], StandardUnits.REACTIVE_POWER_RESULT) + assert time == TIME_UTIL.toZonedDateTime(parameter["time"]) + assert inputModel == UUID.fromString(parameter["inputModel"]) + } + } + + def "A PvResult should be built correctly"() { + given: + Map parameter = [ + "time" : "2020-01-30T17:26:44Z", + "inputModel": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "p" : "2", + "q" : "2" + ] + + when: + def result = ResultEntitySource.pvResultBuildFunction(timeUtil).apply(new Try.Success<>(new EntityData(parameter))) + + then: + result.success + result.data.get().with { + assert p == getQuant(parameter["p"], StandardUnits.ACTIVE_POWER_RESULT) + assert q == getQuant(parameter["q"], StandardUnits.REACTIVE_POWER_RESULT) + assert time == TIME_UTIL.toZonedDateTime(parameter["time"]) + assert inputModel == UUID.fromString(parameter["inputModel"]) + } + } + + def "A FixedFeedInResult should be built correctly"() { + given: + Map parameter = [ + "time" : "2020-01-30T17:26:44Z", + "inputModel": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "p" : "2", + "q" : "2" + ] + + when: + def result = ResultEntitySource.fixedFeedInResultBuildFunction(timeUtil).apply(new Try.Success<>(new EntityData(parameter))) + + then: + result.success + result.data.get().with { + assert p == getQuant(parameter["p"], StandardUnits.ACTIVE_POWER_RESULT) + assert q == getQuant(parameter["q"], StandardUnits.REACTIVE_POWER_RESULT) + assert time == TIME_UTIL.toZonedDateTime(parameter["time"]) + assert inputModel == UUID.fromString(parameter["inputModel"]) + } + } + + def "A BmResult should be built correctly"() { + given: + Map parameter = [ + "time" : "2020-01-30T17:26:44Z", + "inputModel": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "p" : "2", + "q" : "2" + ] + + when: + def result = ResultEntitySource.bmResultBuildFunction(timeUtil).apply(new Try.Success<>(new EntityData(parameter))) + + then: + result.success + result.data.get().with { + assert p == getQuant(parameter["p"], StandardUnits.ACTIVE_POWER_RESULT) + assert q == getQuant(parameter["q"], StandardUnits.REACTIVE_POWER_RESULT) + assert time == TIME_UTIL.toZonedDateTime(parameter["time"]) + assert inputModel == UUID.fromString(parameter["inputModel"]) + } + } + + def "A ChpResult should be built correctly"() { + given: + Map parameter = [ + "time" : "2020-01-30T17:26:44Z", + "inputModel": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "p" : "2", + "q" : "2", + "qDot" : "1" + ] + + when: + def result = ResultEntitySource.chpResultBuildFunction(timeUtil).apply(new Try.Success<>(new EntityData(parameter))) + + then: + result.success + result.data.get().with { + assert qDot == getQuant(parameter["qDot"], StandardUnits.Q_DOT_RESULT) + assert p == getQuant(parameter["p"], StandardUnits.ACTIVE_POWER_RESULT) + assert q == getQuant(parameter["q"], StandardUnits.REACTIVE_POWER_RESULT) + assert time == TIME_UTIL.toZonedDateTime(parameter["time"]) + assert inputModel == UUID.fromString(parameter["inputModel"]) + } + } + + def "A WecResult should be built correctly"() { + given: + Map parameter = [ + "time" : "2020-01-30T17:26:44Z", + "inputModel": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "p" : "2", + "q" : "2" + ] + + when: + def result = ResultEntitySource.wecResultBuildFunction(timeUtil).apply(new Try.Success<>(new EntityData(parameter))) + + then: + result.success + result.data.get().with { + assert p == getQuant(parameter["p"], StandardUnits.ACTIVE_POWER_RESULT) + assert q == getQuant(parameter["q"], StandardUnits.REACTIVE_POWER_RESULT) + assert time == TIME_UTIL.toZonedDateTime(parameter["time"]) + assert inputModel == UUID.fromString(parameter["inputModel"]) + } + } + + def "A StorageResult should be built correctly"() { + given: + Map parameter = [ + "time" : "2020-01-30T17:26:44Z", + "inputModel": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "p" : "2", + "q" : "2", + "soc" : "10" + ] + + when: + def result = ResultEntitySource.storageResultBuildFunction(timeUtil).apply(new Try.Success<>(new EntityData(parameter))) + + then: + result.success + result.data.get().with { + assert soc == getQuant(parameter["soc"], Units.PERCENT) + assert p == getQuant(parameter["p"], StandardUnits.ACTIVE_POWER_RESULT) + assert q == getQuant(parameter["q"], StandardUnits.REACTIVE_POWER_RESULT) + assert time == TIME_UTIL.toZonedDateTime(parameter["time"]) + assert inputModel == UUID.fromString(parameter["inputModel"]) + } + } + + def "A EvcsResult should be built correctly"() { + given: + Map parameter = [ + "time" : "2020-01-30T17:26:44Z", + "inputModel": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "p" : "2", + "q" : "2" + ] + + when: + def result = ResultEntitySource.evcsResultBuildFunction(timeUtil).apply(new Try.Success<>(new EntityData(parameter))) + + then: + result.success + result.data.get().with { + assert p == getQuant(parameter["p"], StandardUnits.ACTIVE_POWER_RESULT) + assert q == getQuant(parameter["q"], StandardUnits.REACTIVE_POWER_RESULT) + assert time == TIME_UTIL.toZonedDateTime(parameter["time"]) + assert inputModel == UUID.fromString(parameter["inputModel"]) + } + } + + def "A EvResult should be built correctly"() { + given: + Map parameter = [ + "time" : "2020-01-30T17:26:44Z", + "inputModel": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "p" : "2", + "q" : "2", + "soc" : "10" + ] + + when: + def result = ResultEntitySource.evResultBuildFunction(timeUtil).apply(new Try.Success<>(new EntityData(parameter))) + + then: + result.success + result.data.get().with { + assert soc == getQuant(parameter["soc"], Units.PERCENT) + assert p == getQuant(parameter["p"], StandardUnits.ACTIVE_POWER_RESULT) + assert q == getQuant(parameter["q"], StandardUnits.REACTIVE_POWER_RESULT) + assert time == TIME_UTIL.toZonedDateTime(parameter["time"]) + assert inputModel == UUID.fromString(parameter["inputModel"]) + } + } + + def "A HpResult should be built correctly"() { + given: + Map parameter = [ + "time" : "2020-01-30T17:26:44Z", + "inputModel": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "p" : "2", + "q" : "2", + "qDot" : "1" + ] + + when: + def result = ResultEntitySource.hpResultBuildFunction(timeUtil).apply(new Try.Success<>(new EntityData(parameter))) + + then: + result.success + result.data.get().with { + assert qDot == getQuant(parameter["qDot"], StandardUnits.Q_DOT_RESULT) + assert p == getQuant(parameter["p"], StandardUnits.ACTIVE_POWER_RESULT) + assert q == getQuant(parameter["q"], StandardUnits.REACTIVE_POWER_RESULT) + assert time == TIME_UTIL.toZonedDateTime(parameter["time"]) + assert inputModel == UUID.fromString(parameter["inputModel"]) + } + } + + def "A CylindricalStorageResult should be built correctly"() { + given: + Map parameter = [ + "time" : "2020-01-30T17:26:44Z", + "inputModel": "91ec3bcf-1897-4d38-af67-0bf7c9fa73c7", + "qDot" : "2", + "energy" : "3", + "fillLevel" : "20" + ] + + when: + def result = ResultEntitySource.cylindricalStorageResultBuilder(timeUtil).apply(new Try.Success<>(new EntityData(parameter))) + + then: + result.success + result.data.get().with { + assert time == TIME_UTIL.toZonedDateTime(parameter.get("time")) + assert inputModel == UUID.fromString(parameter.get("inputModel")) + assert qDot == Quantities.getQuantity(Double.parseDouble(parameter.get("qDot")), StandardUnits.HEAT_DEMAND) + assert energy == Quantities.getQuantity(Double.parseDouble(parameter.get("energy")), StandardUnits.ENERGY_RESULT) + assert fillLevel == Quantities.getQuantity(Double.parseDouble(parameter.get("fillLevel")), StandardUnits.FILL_LEVEL) + } + } + + def "A DomesticHotWaterStorageResult should be built correctly"() { + given: + Map parameter = [ + "time" : "2020-01-30T17:26:44Z", + "inputModel": "91ec3bcf-1897-4d38-af67-0bf7c9fa73c7", + "qDot" : "2", + "energy" : "3", + "fillLevel" : "20" + ] + + when: + def result = ResultEntitySource.dhwsResultBuilder(timeUtil).apply(new Try.Success<>(new EntityData(parameter))) + + then: + result.success + result.data.get().with { + assert time == TIME_UTIL.toZonedDateTime(parameter.get("time")) + assert inputModel == UUID.fromString(parameter.get("inputModel")) + assert qDot == Quantities.getQuantity(Double.parseDouble(parameter.get("qDot")), StandardUnits.HEAT_DEMAND) + assert energy == Quantities.getQuantity(Double.parseDouble(parameter.get("energy")), StandardUnits.ENERGY_RESULT) + assert fillLevel == Quantities.getQuantity(Double.parseDouble(parameter.get("fillLevel")), StandardUnits.FILL_LEVEL) + } + } + + def "A ThermalHouseResult should be built correctly"() { + given: + Map parameter = [ + "time" : "2020-01-30T17:26:44Z", + "inputModel" : "91ec3bcf-1897-4d38-af67-0bf7c9fa73c7", + "qDot" : "2", + "indoorTemperature": "21" + ] + + when: + def result = ResultEntitySource.thermalHouseResultBuildFunction(timeUtil).apply(new Try.Success<>(new EntityData(parameter))) + + then: + result.success + result.data.get().with { + assert time == TIME_UTIL.toZonedDateTime(parameter.get("time")) + assert inputModel == UUID.fromString(parameter.get("inputModel")) + assert qDot == Quantities.getQuantity(Double.parseDouble(parameter.get("qDot")), StandardUnits.HEAT_DEMAND) + assert indoorTemperature == Quantities.getQuantity(Double.parseDouble(parameter.get("indoorTemperature")), StandardUnits.TEMPERATURE) + } + } + + def "A EmResult should be built correctly"() { + given: + Map parameter = [ + "time" : "2020-01-30T17:26:44Z", + "inputModel": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "p" : "2", + "q" : "2" + ] + + when: + def result = ResultEntitySource.emResultBuildFunction(timeUtil).apply(new Try.Success<>(new EntityData(parameter))) + + then: + result.success + result.data.get().with { + assert p == getQuant(parameter["p"], StandardUnits.ACTIVE_POWER_RESULT) + assert q == getQuant(parameter["q"], StandardUnits.REACTIVE_POWER_RESULT) + assert time == TIME_UTIL.toZonedDateTime(parameter["time"]) + assert inputModel == UUID.fromString(parameter["inputModel"]) + } + } +} diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/SystemParticipantSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/SystemParticipantSourceTest.groovy index 845594901..3cf6471ad 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/SystemParticipantSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/SystemParticipantSourceTest.groovy @@ -5,47 +5,578 @@ */ package edu.ie3.datamodel.io.source -import static edu.ie3.test.helper.EntityMap.map -import edu.ie3.datamodel.io.factory.input.ConnectorInputEntityData -import edu.ie3.datamodel.io.factory.input.participant.SystemParticipantEntityData +import static edu.ie3.util.quantities.PowerSystemUnits.PU + +import edu.ie3.datamodel.io.factory.EntityData +import edu.ie3.datamodel.models.OperationTime +import edu.ie3.datamodel.models.StandardUnits +import edu.ie3.datamodel.models.input.EmInput +import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput -import edu.ie3.datamodel.models.input.connector.LineInput -import edu.ie3.datamodel.models.input.system.EvInput +import edu.ie3.datamodel.models.input.system.characteristic.CharacteristicPoint +import edu.ie3.datamodel.models.input.system.type.* +import edu.ie3.datamodel.models.input.system.type.chargingpoint.ChargingPointTypeUtils +import edu.ie3.datamodel.models.input.system.type.evcslocation.EvcsLocationType +import edu.ie3.datamodel.models.input.thermal.ThermalBusInput +import edu.ie3.datamodel.models.input.thermal.ThermalStorageInput +import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile +import edu.ie3.datamodel.models.profile.NbwTemperatureDependantLoadProfile import edu.ie3.datamodel.utils.Try -import edu.ie3.test.common.GridTestData -import edu.ie3.test.common.SystemParticipantTestData as sptd +import edu.ie3.test.helper.FactoryTestHelper +import spock.lang.Shared import spock.lang.Specification +import tech.units.indriya.quantity.Quantities + +import java.time.ZonedDateTime +import javax.measure.quantity.Dimensionless + +class SystemParticipantSourceTest extends Specification implements FactoryTestHelper { + + @Shared + private UUID operatorUUID = UUID.randomUUID() + @Shared + private UUID nodeUUID = UUID.randomUUID() + @Shared + private UUID emUUID = UUID.randomUUID() + @Shared + private UUID typeUUID = UUID.randomUUID() + @Shared + private UUID thermalBusUUID = UUID.randomUUID() + @Shared + private UUID thermalStorageUUID = UUID.randomUUID() + + @Shared + private NodeInput nodeInput = Mock(NodeInput) + @Shared + private OperatorInput operatorInput = Mock(OperatorInput) + @Shared + private EmInput emUnit = Mock(EmInput) + + @Shared + private Map operators = [(operatorUUID): operatorInput] + @Shared + private Map nodes = [(nodeUUID): nodeInput] + @Shared + private Map emUnits = [(emUUID): emUnit] + + def "A BmInput can be build correctly"() { + given: + Map parameter = [ + "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", + "operatesuntil" : "2019-12-31T23:59:00+01:00[Europe/Berlin]", + "id" : "TestID", + "qcharacteristics": "cosPhiFixed:{(0.0,1.0)}", + "marketreaction" : "false", + "costControlled" : "true", + "feedintariff" : "3", + "operator" : operatorUUID.toString(), + "node" : nodeUUID.toString(), + "controllingem" : emUUID.toString(), + "type" : typeUUID.toString() + + ] + def typeInput = Mock(BmTypeInput) + def types = [(typeUUID): typeInput] + + when: + def input = SystemParticipantSource.bmBuildFunction(operators, nodes, emUnits, types).apply(Try.Success.of(new EntityData(parameter))) + + then: + input.success + input.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert operationTime.startDate.present + assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) + assert operationTime.endDate.present + assert operationTime.endDate.get() == ZonedDateTime.parse(parameter["operatesuntil"]) + assert operator == operatorInput + assert id == parameter["id"] + assert node == nodeInput + assert qCharacteristics.with { + assert uuid != null + assert points == Collections.unmodifiableSortedSet([ + new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) + ] as TreeSet) + } + assert controllingEm == Optional.of(emUnit) + assert type == typeInput + assert !marketReaction + assert costControlled + assert feedInTariff == getQuant(parameter["feedintariff"], StandardUnits.ENERGY_PRICE) + } + } + + def "A ChpInput can be build correctly"() { + given: + Map parameter = [ + "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", + "operatesuntil" : "2019-12-31T23:59:00+01:00[Europe/Berlin]", + "id" : "TestID", + "qcharacteristics": "cosPhiFixed:{(0.0,1.0)}", + "marketreaction" : "true", + "operator" : operatorUUID.toString(), + "node" : nodeUUID.toString(), + "controllingem" : emUUID.toString(), + "type" : typeUUID.toString(), + "thermalbus" : thermalBusUUID.toString(), + "thermalstorage" : thermalStorageUUID.toString() + ] + + def typeInput = Mock(ChpTypeInput) + def thermalBus = Mock(ThermalBusInput) + def thermalStorage = Mock(ThermalStorageInput) + + def types = [(typeUUID): typeInput] + def thermalBusses = [(thermalBusUUID): thermalBus] + def thermalStorages = [(thermalStorageUUID): thermalStorage] + + when: + def input = SystemParticipantSource.chpBuildFunction(operators, nodes, emUnits, types, thermalBusses, thermalStorages).apply(Try.Success.of(new EntityData(parameter))) + + then: + input.success + input.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert operationTime.startDate.present + assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) + assert operationTime.endDate.present + assert operationTime.endDate.get() == ZonedDateTime.parse(parameter["operatesuntil"]) + assert operator == operatorInput + assert id == parameter["id"] + assert node == nodeInput + assert qCharacteristics.with { + assert uuid != null + assert points == Collections.unmodifiableSortedSet([ + new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) + ] as TreeSet) + } + assert controllingEm == Optional.of(emUnit) + assert type == typeInput + assert marketReaction + } + } + + def "A EvcsInput can be build correctly"() { + given: + Map parameter = [ + "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", + "operatesuntil" : "2019-12-31T23:59:00+01:00[Europe/Berlin]", + "id" : "TestID", + "qcharacteristics": "cosPhiFixed:{(0.0,1.0)}", + "type" : "Household", + "chargingpoints" : "4", + "cosphirated" : "0.95", + "locationtype" : "CHARGING_HUB_TOWN", + "v2gsupport" : "false", + "operator" : operatorUUID.toString(), + "node" : nodeUUID.toString(), + "controllingem" : emUUID.toString() + ] + + when: + def input = SystemParticipantSource.evcsBuildFunction(operators, nodes, emUnits).apply(Try.Success.of(new EntityData(parameter))) + + then: + input.success + input.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert operationTime.startDate.present + assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) + assert operationTime.endDate.present + assert operationTime.endDate.get() == ZonedDateTime.parse(parameter["operatesuntil"]) + assert operator == operatorInput + assert id == parameter["id"] + assert node == nodeInput + assert qCharacteristics.with { + assert uuid != null + assert points == Collections.unmodifiableSortedSet([ + new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) + ] as TreeSet) + } + assert controllingEm == Optional.of(emUnit) + assert type == ChargingPointTypeUtils.HouseholdSocket + assert chargingPoints == Integer.parseInt(parameter["chargingpoints"]) + assert cosPhiRated == Double.parseDouble(parameter["cosphirated"]) + assert locationType == EvcsLocationType.CHARGING_HUB_TOWN + assert !v2gSupport + } + } + + def "A EvcsInput should fail when passing an invalid ChargingPointType"() { + given: + Map parameter = [ + "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", + "operatesuntil" : "2019-12-31T23:59:00+01:00[Europe/Berlin]", + "id" : "TestID", + "qcharacteristics": "cosPhiFixed:{(0.0,1.0)}", + "type" : "-- invalid --", + "chargingpoints" : "4", + "cosphirated" : "0.95", + "locationtype" : "CHARGING_HUB_TOWN", + "v2gsupport" : "false", + "operator" : operatorUUID.toString(), + "node" : nodeUUID.toString(), + "controllingem" : emUUID.toString() + ] + + when: + def input = SystemParticipantSource.evcsBuildFunction(operators, nodes, emUnits).apply(Try.Success.of(new EntityData(parameter))) + + then: + input.failure + input.exception.get().cause.message == "Provided charging point type string '-- invalid --' is neither a valid custom type string nor can a common charging point type with id '-- invalid --' be found! Please either provide a valid custom string in the format '(|)' (e.g. 'FastCharger(50|DC)') or a common type id (see docs for all available common types)." + } + + def "A EvcsInput should fail when passing an invalid EvcsLocationType"() { + given: + Map parameter = [ + "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", + "operatesuntil" : "2019-12-31T23:59:00+01:00[Europe/Berlin]", + "id" : "TestID", + "qcharacteristics": "cosPhiFixed:{(0.0,1.0)}", + "type" : "Household", + "chargingpoints" : "4", + "cosphirated" : "0.95", + "locationType" : "-- invalid --", + "v2gsupport" : "false", + "operator" : operatorUUID.toString(), + "node" : nodeUUID.toString(), + "controllingem" : emUUID.toString() + ] + + when: + def input = SystemParticipantSource.evcsBuildFunction(operators, nodes, emUnits).apply(Try.Success.of(new EntityData(parameter))) + + then: + input.failure + input.exception.get().cause.message == "EvcsLocationType ' invalid ' does not exist." + } + + def "A EvInput can be build correctly"() { + given: + Map parameter = [ + "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", + "operatesuntil" : "2019-12-31T23:59:00+01:00[Europe/Berlin]", + "id" : "TestID", + "qcharacteristics": "cosPhiFixed:{(0.0,1.0)}", + "operator" : operatorUUID.toString(), + "node" : nodeUUID.toString(), + "controllingem" : emUUID.toString(), + "type" : typeUUID.toString() + ] + + def typeInput = Mock(EvTypeInput) + + def types = [(typeUUID): typeInput] + + + when: + def input = SystemParticipantSource.evBuildFunction(operators, nodes, emUnits, types).apply(Try.Success.of(new EntityData(parameter))) -class SystemParticipantSourceTest extends Specification { + then: + input.success + input.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert operationTime.startDate.present + assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) + assert operationTime.endDate.present + assert operationTime.endDate.get() == ZonedDateTime.parse(parameter["operatesuntil"]) + assert operator == operatorInput + assert id == parameter["id"] + assert node == nodeInput + assert qCharacteristics.with { + assert uuid != null + assert points == Collections.unmodifiableSortedSet([ + new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) + ] as TreeSet) + } + assert controllingEm == Optional.of(emUnit) + assert type == typeInput + } + } - def "An SystemParticipantSource participantEnricher should work as expected"() { + def "A FixedFeedInInput can be build correctly"() { given: - def entityData = new ConnectorInputEntityData(["operators": "", "node": sptd.participantNode.uuid.toString(), "controllingEm": sptd.emInput.uuid.toString()], LineInput, GridTestData.nodeA, GridTestData.nodeB) - def operators = map([OperatorInput.NO_OPERATOR_ASSIGNED]) - def nodes = map([sptd.participantNode]) - def emUnits = map([sptd.emInput]) + Map parameter = [ + "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", + "operatesuntil" : "", + "id" : "TestID", + "qcharacteristics": "cosPhiFixed:{(0.0,1.0)}", + "srated" : "3", + "cosphirated" : "4", + "operator" : operatorUUID.toString(), + "node" : nodeUUID.toString(), + "controllingem" : emUUID.toString() + ] when: - def actual = SystemParticipantSource.participantEnricher.apply(new Try.Success<>(entityData), operators, nodes, emUnits) + def input = SystemParticipantSource.fixedFeedInBuildFunction(operators, nodes, emUnits).apply(Try.Success.of(new EntityData(parameter))) then: - actual.success - actual.data.get().operatorInput == OperatorInput.NO_OPERATOR_ASSIGNED - actual.data.get().node == sptd.participantNode - actual.data.get().controllingEm == Optional.of(sptd.emInput) + input.success + input.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert operationTime.startDate.present + assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) + assert !operationTime.endDate.present + assert operator == operatorInput + assert id == parameter["id"] + assert node == nodeInput + assert qCharacteristics.with { + assert uuid != null + assert points == Collections.unmodifiableSortedSet([ + new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) + ] as TreeSet) + } + assert controllingEm == Optional.of(emUnit) + assert sRated == getQuant(parameter["srated"], StandardUnits.S_RATED) + assert cosPhiRated == Double.parseDouble(parameter["cosphirated"]) + } } - def "An SystemParticipantSource can enrich SystemParticipantEntityData with SystemParticipantTypeInput correctly"() { + def "A HpInput can be build correctly"() { given: - def entityData = new SystemParticipantEntityData(["type": sptd.evTypeInput.uuid.toString()], EvInput, sptd.evInput.node, sptd.emInput) - def types = map([sptd.evTypeInput]) + Map parameter = [ + "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", + "operatesuntil" : "2019-12-31T23:59:00+01:00[Europe/Berlin]", + "id" : "TestID", + "qcharacteristics": "cosPhiFixed:{(0.0,1.0)}", + "operator" : operatorUUID.toString(), + "node" : nodeUUID.toString(), + "controllingem" : emUUID.toString(), + "type" : typeUUID.toString(), + "thermalbus" : thermalBusUUID.toString() + ] + + def typeInput = Mock(HpTypeInput) + def thermalBusInput = Mock(ThermalBusInput) + + def types = [(typeUUID): typeInput] + def thermalBusses = [(thermalBusUUID): thermalBusInput] + + when: + def input = SystemParticipantSource.hpBuildFunction(operators, nodes, emUnits, types, thermalBusses).apply(Try.Success.of(new EntityData(parameter))) + + then: + input.success + input.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert operationTime.startDate.present + assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) + assert operationTime.endDate.present + assert operationTime.endDate.get() == ZonedDateTime.parse(parameter["operatesuntil"]) + assert operator == operatorInput + assert id == parameter["id"] + assert node == nodeInput + assert qCharacteristics.with { + assert uuid != null + assert points == Collections.unmodifiableSortedSet([ + new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) + ] as TreeSet) + } + assert controllingEm == Optional.of(emUnit) + assert type == typeInput + assert thermalBus == thermalBusInput + } + } + + def "A LoadInput can be build correctly"() { + given: + Map parameter = [ + "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "id" : "TestID", + "qcharacteristics" : "cosPhiFixed:{(0.0,1.0)}", + "loadprofile" : profileKey, + "econsannual" : "3", + "srated" : "4", + "cosphirated" : "5", + "operator" : operatorUUID.toString(), + "node" : nodeUUID.toString(), + "controllingem" : emUUID.toString() + ] + + when: + def input = SystemParticipantSource.loadBuildFunction(operators, nodes, emUnits).apply(Try.Success.of(new EntityData(parameter))) + + then: + input.success + input.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert operationTime == OperationTime.notLimited() + assert operator == operatorInput + assert id == parameter["id"] + assert node == nodeInput + assert qCharacteristics.with { + assert uuid != null + assert points == Collections.unmodifiableSortedSet([ + new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) + ] as TreeSet) + } + assert controllingEm == Optional.of(emUnit) + assert loadProfile == profile + assert eConsAnnual == getQuant(parameter["econsannual"], StandardUnits.ENERGY_IN) + assert sRated == getQuant(parameter["srated"], StandardUnits.S_RATED) + assert cosPhiRated == Double.parseDouble(parameter["cosphirated"]) + } + + where: + profileKey || profile + "G-4" || BdewStandardLoadProfile.G4 + "ep1" || NbwTemperatureDependantLoadProfile.EP1 + } + + def "A PvInput can be build correctly"() { + given: + Map parameter = [ + "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", + "operatesuntil" : "2019-12-31T23:59:00+01:00[Europe/Berlin]", + "id" : "TestID", + "qcharacteristics": "cosPhiFixed:{(0.0,1.0)}", + "albedo" : "3", + "azimuth" : "4", + "etaconv" : "5", + "elevationangle" : "6", + "kg" : "7", + "kt" : "8", + "marketreaction" : "true", + "srated" : "9", + "cosphirated" : "10", + "operator" : operatorUUID.toString(), + "node" : nodeUUID.toString(), + "controllingem" : emUUID.toString() + ] + + when: + def input = SystemParticipantSource.pvBuildFunction(operators, nodes, emUnits).apply(Try.Success.of(new EntityData(parameter))) + + then: + input.success + input.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert operationTime.startDate.present + assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) + assert operationTime.endDate.present + assert operationTime.endDate.get() == ZonedDateTime.parse(parameter["operatesuntil"]) + assert operator == operatorInput + assert id == parameter["id"] + assert node == nodeInput + assert qCharacteristics.with { + assert uuid != null + assert points == Collections.unmodifiableSortedSet([ + new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) + ] as TreeSet) + } + assert controllingEm == Optional.of(emUnit) + assert albedo == Double.parseDouble(parameter["albedo"]) + assert azimuth == getQuant(parameter["azimuth"], StandardUnits.AZIMUTH) + assert etaConv == getQuant(parameter["etaconv"], StandardUnits.EFFICIENCY) + assert elevationAngle == getQuant(parameter["elevationangle"], StandardUnits.SOLAR_ELEVATION_ANGLE) + assert kG == Double.parseDouble(parameter["kg"]) + assert kT == Double.parseDouble(parameter["kt"]) + assert marketReaction + assert sRated == getQuant(parameter["srated"], StandardUnits.S_RATED) + assert cosPhiRated == Double.parseDouble(parameter["cosphirated"]) + } + } + + def "A StorageInput can be build correctly"() { + given: + def typeUUID = UUID.randomUUID() + + Map parameter = [ + "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", + "operatesuntil" : "2019-12-31T23:59:00+01:00[Europe/Berlin]", + "id" : "TestID", + "qcharacteristics": "cosPhiFixed:{(0.0,1.0)}", + "operator" : operatorUUID.toString(), + "node" : nodeUUID.toString(), + "controllingem" : emUUID.toString(), + "type" : typeUUID.toString() + ] + + def typeInput = Mock(StorageTypeInput) + + def types = [(typeUUID): typeInput] + + when: + def input = SystemParticipantSource.storageBuildFunction(operators, nodes, emUnits, types).apply(Try.Success.of(new EntityData(parameter))) + + then: + input.success + input.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert operationTime.startDate.present + assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) + assert operationTime.endDate.present + assert operationTime.endDate.get() == ZonedDateTime.parse(parameter["operatesuntil"]) + assert operator == operatorInput + assert id == parameter["id"] + assert node == nodeInput + assert qCharacteristics.with { + assert uuid != null + assert points == Collections.unmodifiableSortedSet([ + new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) + ] as TreeSet) + } + assert controllingEm == Optional.of(emUnit) + assert type == typeInput + } + } + + def "A WecInputFactory should parse a valid WecInput correctly"() { + given: + def typeUUID = UUID.randomUUID() + + Map parameter = [ + "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "operatesfrom" : "", + "operatesuntil" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", + "id" : "TestID", + "qcharacteristics": "cosPhiFixed:{(0.0,1.0)}", + "marketreaction" : "true", + "operator" : operatorUUID.toString(), + "node" : nodeUUID.toString(), + "controllingem" : emUUID.toString(), + "type" : typeUUID.toString() + ] + + def typeInput = Mock(WecTypeInput) + + def types = [(typeUUID): typeInput] when: - def actual = SystemParticipantSource.enrichTypes(types).apply(new Try.Success<>(entityData)) + def input = SystemParticipantSource.wecBuildFunction(operators, nodes, emUnits, types).apply(Try.Success.of(new EntityData(parameter))) then: - actual.success - actual.data.get().typeInput == sptd.evTypeInput + input.success + input.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert !operationTime.startDate.present + assert operationTime.endDate.present + assert operationTime.endDate.get() == ZonedDateTime.parse(parameter["operatesuntil"]) + assert operator == operatorInput + assert id == parameter["id"] + assert node == nodeInput + assert qCharacteristics.with { + assert uuid != null + assert points == Collections.unmodifiableSortedSet([ + new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) + ] as TreeSet) + } + assert controllingEm == Optional.of(emUnit) + assert type == typeInput + assert marketReaction + } } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/ThermalSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/ThermalSourceTest.groovy index 99f771ff9..510f2edec 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/ThermalSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/ThermalSourceTest.groovy @@ -5,33 +5,159 @@ */ package edu.ie3.datamodel.io.source - -import static edu.ie3.test.helper.EntityMap.map - import edu.ie3.datamodel.io.factory.EntityData +import edu.ie3.datamodel.models.OperationTime +import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.thermal.ThermalBusInput -import edu.ie3.datamodel.models.input.thermal.ThermalHouseInput import edu.ie3.datamodel.utils.Try +import edu.ie3.test.helper.FactoryTestHelper +import spock.lang.Shared import spock.lang.Specification -class ThermalSourceTest extends Specification { +import java.time.ZonedDateTime + +class ThermalSourceTest extends Specification implements FactoryTestHelper { + + @Shared + private UUID operatorUUID = UUID.randomUUID() + @Shared + private UUID thermalBusUUID = UUID.randomUUID() + @Shared + private OperatorInput operatorInput = Mock(OperatorInput) + @Shared + private ThermalBusInput thermalBusInput = Mock(ThermalBusInput) + + @Shared + private Map operators = [(operatorUUID): operatorInput] + @Shared + private Map thermalBusses = [(thermalBusUUID): thermalBusInput] + + def "A ThermalBusInput can be built correctly"() { + given: + Map parameter = [ + "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", + "operatesuntil": "", + "id" : "TestID", + "operator" : operatorUUID.toString() + ] + + when: + def input = ThermalSource.thermalBusBuilder(operators).apply(Try.Success.of(new EntityData(parameter))) + + then: + input.success + input.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert operationTime.startDate.present + assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) + assert !operationTime.endDate.present + assert operator == operatorInput + assert id == parameter["id"] + } + } + + def "A ThermalHouseInput can be built correctly"() { + given: + Map parameter = [ + "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "id" : "TestID", + "ethlosses" : "3", + "ethcapa" : "4", + "targetTemperature" : "5", + "upperTemperatureLimit": "6", + "lowerTemperatureLimit": "7", + "housingType" : "flat", + "numberInhabitants" : "9", + "operator" : operatorUUID.toString(), + "thermalbus" : thermalBusUUID.toString() + ] + + when: + def input = ThermalSource.thermalHouseBuildFunction(operators, thermalBusses).apply(Try.Success.of(new EntityData(parameter))) + + then: + input.success + input.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert operationTime == OperationTime.notLimited() + assert operator == operatorInput + assert id == parameter["id"] + assert thermalBus == thermalBusInput + assert ethLosses == getQuant(parameter["ethlosses"], StandardUnits.THERMAL_TRANSMISSION) + assert ethCapa == getQuant(parameter["ethcapa"], StandardUnits.HEAT_CAPACITY) + assert targetTemperature == getQuant(parameter["targetTemperature"], StandardUnits.TEMPERATURE) + assert upperTemperatureLimit == getQuant(parameter["upperTemperatureLimit"], StandardUnits.TEMPERATURE) + assert lowerTemperatureLimit == getQuant(parameter["lowerTemperatureLimit"], StandardUnits.TEMPERATURE) + assert housingType == parameter["housingType"] + assert numberInhabitants == parameter["numberInhabitants"].toDouble() + } + } + + def "A CylindricalStorageInputFactory should parse a valid CylindricalStorageInput correctly"() { + given: + Map parameter = [ + "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "id" : "TestID", + "storagevolumelvl" : "3", + "inlettemp" : "4", + "returntemp" : "5", + "c" : "6", + "pThermalMax" : "7", + "operator" : operatorUUID.toString(), + "thermalbus" : thermalBusUUID.toString() + ] + + when: + def input = ThermalSource.cylindricalStorageBuildFunction(operators, thermalBusses).apply(Try.Success.of(new EntityData(parameter))) + + then: + input.success + input.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert operationTime == OperationTime.notLimited() + assert operator == operatorInput + assert id == parameter["id"] + assert thermalBus == thermalBusInput + assert storageVolumeLvl == getQuant(parameter["storagevolumelvl"], StandardUnits.VOLUME) + assert inletTemp == getQuant(parameter["inlettemp"], StandardUnits.TEMPERATURE) + assert returnTemp == getQuant(parameter["returntemp"], StandardUnits.TEMPERATURE) + assert c == getQuant(parameter["c"], StandardUnits.SPECIFIC_HEAT_CAPACITY) + assert pThermalMax == getQuant(parameter["pThermalMax"], StandardUnits.ACTIVE_POWER_IN) + } + } - def "A ThermalSource thermalUnitEnricher should work as expected"() { + def "A DomesticHotWaterStorageInputFactory should parse a valid DomesticHotWaterStorageInput correctly"() { given: - def bus = new ThermalBusInput(UUID.fromString("0d95d7f2-49fb-4d49-8636-383a5220384e"), "test_thermal_bus") - def entityData = new EntityData(["operators": "", "thermalbus": "0d95d7f2-49fb-4d49-8636-383a5220384e"], ThermalHouseInput) - def operators = map([OperatorInput.NO_OPERATOR_ASSIGNED]) - def buses = map([bus]) + Map parameter = [ + "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "id" : "TestID", + "storagevolumelvl" : "3", + "inlettemp" : "4", + "returntemp" : "5", + "c" : "6", + "pThermalMax" : "7", + "operator" : operatorUUID.toString(), + "thermalbus" : thermalBusUUID.toString() + ] when: - def actual = ThermalSource.thermalUnitEnricher.apply(new Try.Success<>(entityData), operators, buses) + def input = ThermalSource.dhwsBuildFunction(operators, thermalBusses).apply(Try.Success.of(new EntityData(parameter))) then: - actual.success - actual.data.get().with { - assert it.operatorInput == OperatorInput.NO_OPERATOR_ASSIGNED - assert it.busInput == bus + input.success + input.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert operationTime == OperationTime.notLimited() + assert operator == operatorInput + assert id == parameter["id"] + assert thermalBus == thermalBusInput + assert storageVolumeLvl == getQuant(parameter["storagevolumelvl"], StandardUnits.VOLUME) + assert inletTemp == getQuant(parameter["inlettemp"], StandardUnits.TEMPERATURE) + assert returnTemp == getQuant(parameter["returntemp"], StandardUnits.TEMPERATURE) + assert c == getQuant(parameter["c"], StandardUnits.SPECIFIC_HEAT_CAPACITY) + assert pThermalMax == getQuant(parameter["pThermalMax"], StandardUnits.ACTIVE_POWER_IN) } } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/TypeSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/TypeSourceTest.groovy new file mode 100644 index 000000000..02ccab921 --- /dev/null +++ b/src/test/groovy/edu/ie3/datamodel/io/source/TypeSourceTest.groovy @@ -0,0 +1,371 @@ +/* + * © 2025. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation + */ +package edu.ie3.datamodel.io.source + +import static edu.ie3.util.quantities.PowerSystemUnits.PU +import static tech.units.indriya.unit.Units.METRE_PER_SECOND + +import edu.ie3.datamodel.io.factory.EntityData +import edu.ie3.datamodel.models.StandardUnits +import edu.ie3.datamodel.models.input.system.characteristic.CharacteristicPoint +import edu.ie3.datamodel.utils.Try +import edu.ie3.test.helper.FactoryTestHelper +import spock.lang.Specification +import tech.units.indriya.quantity.Quantities + +import javax.measure.quantity.Dimensionless +import javax.measure.quantity.Speed + +class TypeSourceTest extends Specification implements FactoryTestHelper { + + def "A OperatorInput should be built correctly"() { + given: + Map parameter = [ + "uuid": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "id": "blablub", + ] + + when: + def typeInput = TypeSource.operatorBuildFunction.apply(new Try.Success<>(new EntityData(parameter))) + + then: + typeInput.success + typeInput.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert id == parameter["id"] + } + } + + def "A LineTypeInput should be built correctly"() { + given: + Map parameter = [ + "uuid": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "id": "blablub", + "b": "3", + "g": "4", + "r": "5", + "x": "6", + "imax": "7", + "vrated": "8" + ] + + when: + def typeInput = TypeSource.lineTypeBuildFunction.apply(new Try.Success<>(new EntityData(parameter))) + + then: + typeInput.success + typeInput.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert id == parameter["id"] + assert b == getQuant(parameter["b"], StandardUnits.SUSCEPTANCE_PER_LENGTH) + assert g == getQuant(parameter["g"], StandardUnits.CONDUCTANCE_PER_LENGTH) + assert r == getQuant(parameter["r"], StandardUnits.RESISTANCE_PER_LENGTH) + assert x == getQuant(parameter["x"], StandardUnits.REACTANCE_PER_LENGTH) + assert iMax == getQuant(parameter["imax"], StandardUnits.ELECTRIC_CURRENT_MAGNITUDE) + assert vRated == getQuant(parameter["vrated"], StandardUnits.RATED_VOLTAGE_MAGNITUDE) + } + } + + def "A Transformer2WTypeInput should be built correctly"() { + given: + Map parameter = [ + "uuid": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "id": "blablub", + "rsc": "3", + "xsc": "4", + "srated": "5", + "vrateda": "6", + "vratedb": "7", + "gm": "8", + "bm": "9", + "dv": "10", + "dphi": "11", + "tapside": "1", + "tapneutr": "12", + "tapmin": "13", + "tapmax": "14" + ] + + when: + def typeInput = TypeSource.transformer2WTypeBuildFunction.apply(new Try.Success<>(new EntityData(parameter))) + + then: + typeInput.success + typeInput.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert id == parameter["id"] + assert rSc == getQuant(parameter["rsc"], StandardUnits.RESISTANCE) + assert xSc == getQuant(parameter["xsc"], StandardUnits.REACTANCE) + assert sRated == getQuant(parameter["srated"], StandardUnits.S_RATED) + assert vRatedA == getQuant(parameter["vrateda"], StandardUnits.RATED_VOLTAGE_MAGNITUDE) + assert vRatedB == getQuant(parameter["vratedb"], StandardUnits.RATED_VOLTAGE_MAGNITUDE) + assert gM == getQuant(parameter["gm"], StandardUnits.CONDUCTANCE) + assert bM == getQuant(parameter["bm"], StandardUnits.SUSCEPTANCE) + assert dV == getQuant(parameter["dv"], StandardUnits.DV_TAP) + assert dPhi == getQuant(parameter["dphi"], StandardUnits.DPHI_TAP) + assert tapSide == (parameter["tapside"].trim() == "1") || parameter["tapside"].trim() == "true" + assert tapNeutr == Integer.parseInt(parameter["tapneutr"]) + assert tapMin == Integer.parseInt(parameter["tapmin"]) + assert tapMax == Integer.parseInt(parameter["tapmax"]) + } + } + + def "A Transformer3WTypeInput should be built correctly"() { + given: + Map parameter = [ + "uuid": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "id": "blablub", + "srateda": "3", + "sratedb": "4", + "sratedc": "5", + "vrateda": "6", + "vratedb": "7", + "vratedc": "8", + "rsca": "9", + "rscb": "10", + "rscc": "11", + "xsca": "12", + "xscb": "13", + "xscc": "14", + "gm": "15", + "bm": "16", + "dv": "17", + "dphi": "18", + "tapneutr": "19", + "tapmin": "20", + "tapmax": "21" + ] + + when: + def typeInput = TypeSource.transformer3WTypeBuildFunction.apply(new Try.Success<>(new EntityData(parameter))) + + then: + typeInput.success + typeInput.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert id == parameter["id"] + assert sRatedA == getQuant(parameter["srateda"], StandardUnits.S_RATED) + assert sRatedB == getQuant(parameter["sratedb"], StandardUnits.S_RATED) + assert sRatedC == getQuant(parameter["sratedc"], StandardUnits.S_RATED) + assert vRatedA == getQuant(parameter["vrateda"], StandardUnits.RATED_VOLTAGE_MAGNITUDE) + assert vRatedB == getQuant(parameter["vratedb"], StandardUnits.RATED_VOLTAGE_MAGNITUDE) + assert vRatedC == getQuant(parameter["vratedc"], StandardUnits.RATED_VOLTAGE_MAGNITUDE) + assert rScA == getQuant(parameter["rsca"], StandardUnits.RESISTANCE) + assert rScB == getQuant(parameter["rscb"], StandardUnits.RESISTANCE) + assert rScC == getQuant(parameter["rscc"], StandardUnits.RESISTANCE) + assert xScA == getQuant(parameter["xsca"], StandardUnits.REACTANCE) + assert xScB == getQuant(parameter["xscb"], StandardUnits.REACTANCE) + assert xScC == getQuant(parameter["xscc"], StandardUnits.REACTANCE) + assert gM == getQuant(parameter["gm"], StandardUnits.CONDUCTANCE) + assert bM == getQuant(parameter["bm"], StandardUnits.SUSCEPTANCE) + assert dV == getQuant(parameter["dv"], StandardUnits.DV_TAP) + assert dPhi == getQuant(parameter["dphi"], StandardUnits.DPHI_TAP) + assert tapNeutr == Integer.parseInt(parameter["tapneutr"]) + assert tapMin == Integer.parseInt(parameter["tapmin"]) + assert tapMax == Integer.parseInt(parameter["tapmax"]) + } + } + + def "A BmTypeInput should be built correctly"() { + given: + Map parameter = [ + "uuid": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "id": "blablub", + "capex": "3", + "opex": "4", + "srated": "5", + "cosPhiRated": "6", + "activepowergradient": "7", + "etaconv": "8" + ] + + when: + def typeInput = TypeSource.bmTypeBuildFunction.apply(new Try.Success<>(new EntityData(parameter))) + + then: + typeInput.success + typeInput.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert id == parameter["id"] + assert capex == getQuant(parameter["capex"], StandardUnits.CAPEX) + assert opex == getQuant(parameter["opex"], StandardUnits.ENERGY_PRICE) + assert sRated == getQuant(parameter["srated"], StandardUnits.S_RATED) + assert cosPhiRated == Double.parseDouble(parameter["cosPhiRated"]) + assert activePowerGradient == getQuant(parameter["activepowergradient"], StandardUnits.ACTIVE_POWER_GRADIENT) + assert etaConv == getQuant(parameter["etaconv"], StandardUnits.EFFICIENCY) + } + } + + def "A ChpTypeInput should be built correctly"() { + given: + Map parameter = [ + "uuid": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "id": "blablub", + "capex": "3", + "opex": "4", + "srated": "5", + "cosPhiRated": "6", + "etael": "7", + "etathermal": "8", + "pthermal": "9", + "pown": "10" + ] + + when: + def typeInput = TypeSource.chpTypeBuildFunction.apply(new Try.Success<>(new EntityData(parameter))) + + then: + typeInput.success + typeInput.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert id == parameter["id"] + assert capex == getQuant(parameter["capex"], StandardUnits.CAPEX) + assert opex == getQuant(parameter["opex"], StandardUnits.ENERGY_PRICE) + assert sRated == getQuant(parameter["srated"], StandardUnits.S_RATED) + assert cosPhiRated == Double.parseDouble(parameter["cosPhiRated"]) + assert etaEl == getQuant(parameter["etael"], StandardUnits.EFFICIENCY) + assert etaThermal == getQuant(parameter["etathermal"], StandardUnits.EFFICIENCY) + assert pThermal == getQuant(parameter["pthermal"], StandardUnits.ACTIVE_POWER_IN) + assert pOwn == getQuant(parameter["pown"], StandardUnits.ACTIVE_POWER_IN) + } + } + + def "A HpTypeInput should be built correctly"() { + given: + Map parameter = [ + "uuid": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "id": "blablub", + "capex": "3", + "opex": "4", + "srated": "5", + "cosPhiRated": "6", + "pthermal": "7", + ] + + when: + def typeInput = TypeSource.hpTypeBuildFunction.apply(new Try.Success<>(new EntityData(parameter))) + + then: + typeInput.success + typeInput.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert id == parameter["id"] + assert capex == getQuant(parameter["capex"], StandardUnits.CAPEX) + assert opex == getQuant(parameter["opex"], StandardUnits.ENERGY_PRICE) + assert sRated == getQuant(parameter["srated"], StandardUnits.S_RATED) + assert cosPhiRated == Double.parseDouble(parameter["cosPhiRated"]) + assert pThermal == getQuant(parameter["pthermal"], StandardUnits.ACTIVE_POWER_IN) + } + } + + def "A StorageTypeInput should be built correctly"() { + given: + Map parameter = [ + "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "id" : "blablub", + "capex" : "3", + "opex" : "4", + "srated" : "5", + "cosPhiRated" : "6", + "estorage" : "6", + "pmax" : "8", + "activepowergradient" : "1", + "eta" : "9" + ] + + when: + def typeInput = TypeSource.storageBuildFunction.apply(new Try.Success<>(new EntityData(parameter))) + + then: + typeInput.success + typeInput.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert id == parameter["id"] + assert capex == getQuant(parameter["capex"], StandardUnits.CAPEX) + assert opex == getQuant(parameter["opex"], StandardUnits.ENERGY_PRICE) + assert sRated == getQuant(parameter["srated"], StandardUnits.S_RATED) + assert cosPhiRated == Double.parseDouble(parameter["cosPhiRated"]) + assert eStorage == getQuant(parameter["estorage"], StandardUnits.ENERGY_IN) + assert pMax == getQuant(parameter["pmax"], StandardUnits.ACTIVE_POWER_IN) + assert activePowerGradient == getQuant(parameter["activepowergradient"], StandardUnits.ACTIVE_POWER_GRADIENT) + assert eta == getQuant(parameter["eta"], StandardUnits.EFFICIENCY) + } + } + + def "A WecTypeInput should be built correctly"() { + given: + Map parameter = [ + "uuid": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "id": "blablub", + "capex": "3", + "opex": "4", + "srated": "5", + "cosPhiRated": "6", + "cpCharacteristic": "cP:{(10.00,0.05),(15.00,0.10),(20.00,0.20)}", + "etaconv": "7", + "rotorarea": "8", + "hubheight": "9" + ] + + when: + def typeInput = TypeSource.wecTypeBuildFunction.apply(new Try.Success<>(new EntityData(parameter))) + + then: + typeInput.success + typeInput.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert id == parameter["id"] + assert capex == getQuant(parameter["capex"], StandardUnits.CAPEX) + assert opex == getQuant(parameter["opex"], StandardUnits.ENERGY_PRICE) + assert sRated == getQuant(parameter["srated"], StandardUnits.S_RATED) + assert cosPhiRated == Double.parseDouble(parameter["cosPhiRated"]) + cpCharacteristic.with { + assert uuid != null + assert points == Collections.unmodifiableSortedSet([ + new CharacteristicPoint(Quantities.getQuantity(10d, METRE_PER_SECOND), Quantities.getQuantity(0.05, PU)), + new CharacteristicPoint(Quantities.getQuantity(15d, METRE_PER_SECOND), Quantities.getQuantity(0.1, PU)), + new CharacteristicPoint(Quantities.getQuantity(20d, METRE_PER_SECOND), Quantities.getQuantity(0.2, PU)) + ] as TreeSet) + } + assert etaConv == getQuant(parameter["etaconv"], StandardUnits.EFFICIENCY) + assert rotorArea == getQuant(parameter["rotorarea"], StandardUnits.ROTOR_AREA) + assert hubHeight == getQuant(parameter["hubheight"], StandardUnits.HUB_HEIGHT) + } + } + + def "A EvTypeInput should be built correctly"() { + given: + Map parameter = [ + "uuid": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "id": "blablub", + "capex": "3", + "opex": "4", + "srated": "5", + "cosPhiRated": "6", + "estorage": "7", + "econs": "8", + "srateddc": "9", + ] + + when: + def typeInput = TypeSource.evTypeBuildFunction.apply(new Try.Success<>(new EntityData(parameter))) + + then: + typeInput.success + typeInput.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert id == parameter["id"] + assert capex == getQuant(parameter["capex"], StandardUnits.CAPEX) + assert opex == getQuant(parameter["opex"], StandardUnits.ENERGY_PRICE) + assert sRated == getQuant(parameter["srated"], StandardUnits.S_RATED) + assert cosPhiRated == Double.parseDouble(parameter["cosPhiRated"]) + + assert eStorage == getQuant(parameter["estorage"], StandardUnits.ENERGY_IN) + assert eCons == getQuant(parameter["econs"], StandardUnits.ENERGY_PER_DISTANCE) + assert sRatedDC == getQuant(parameter["srateddc"], StandardUnits.ACTIVE_POWER_IN) + } + } +} diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvRawGridSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvRawGridSourceTest.groovy index 6c62c4338..f1abda141 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvRawGridSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvRawGridSourceTest.groovy @@ -269,7 +269,7 @@ class CsvRawGridSourceTest extends Specification implements CsvTestDataMeta { actual == null SourceException ex = thrown() ex.message == "1 exception(s) occurred within \"NodeInput\" data: \n" + - " An error occurred when creating instance of NodeInput.class. Caused by: Exception while trying to parse UUID of field \"uuid\" with value \"bd837a25-58f3-44ac-aa90-c6b6e3 cd91b2\"" + " Could not build UniqueEntity due to: Caused by: Exception while trying to parse UUID of field \"uuid\" with value \"bd837a25-58f3-44ac-aa90-c6b6e3 cd91b2\"" } def "The CsvRawGridSource returns an empty grid, if the RawGridElements contain no single element"() { diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/EmInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/EmInputTest.groovy similarity index 85% rename from src/test/groovy/edu/ie3/datamodel/models/input/system/EmInputTest.groovy rename to src/test/groovy/edu/ie3/datamodel/models/input/EmInputTest.groovy index a3a162da1..4ff6837c1 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/EmInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/EmInputTest.groovy @@ -3,14 +3,26 @@ * Institute of Energy Systems, Energy Efficiency and Energy Economics, * Research group Distribution grid planning and operation */ -package edu.ie3.datamodel.models.input.system +package edu.ie3.datamodel.models.input -import edu.ie3.datamodel.models.input.EmInput +import edu.ie3.datamodel.io.source.SourceValidator import edu.ie3.test.common.SystemParticipantTestData import spock.lang.Specification class EmInputTest extends Specification { + def "An EmInput should return the valid fields correctly"() { + given: + def validCombinations = new SourceValidator.Fields("uuid", "id", "controlStrategy", "controllingEm").addOptional("operator").addOptional("operatesFrom").addOptional("operatesUntil") + + when: + def fieldCombinations = EmInput.getFields() + + then: + fieldCombinations == validCombinations + } + + def "The EmInput constructors work as expected"() { when: def emInput = new EmInput( diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/MeasurementUnitInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/MeasurementUnitInputTest.groovy index db8eef692..163f40e70 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/MeasurementUnitInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/MeasurementUnitInputTest.groovy @@ -5,12 +5,126 @@ */ package edu.ie3.datamodel.models.input +import edu.ie3.datamodel.exceptions.ValidationException +import edu.ie3.datamodel.io.source.SourceValidator +import edu.ie3.datamodel.utils.Try import edu.ie3.test.common.GridTestData import spock.lang.Specification - class MeasurementUnitInputTest extends Specification { + def "A MeasurementUnitInput should return valid fields correctly"() { + expect: + MeasurementUnitInput.getFields().fields() == [ + [ + "id", + "node", + "p", + "q", + "uuid", + "vAng", + "vMag" + ] as Set, + [ + "id", + "node", + "operator", + "p", + "q", + "uuid", + "vAng", + "vMag" + ] as Set, + [ + "id", + "node", + "operatesFrom", + "p", + "q", + "uuid", + "vAng", + "vMag" + ] as Set, + [ + "id", + "node", + "operatesFrom", + "operator", + "p", + "q", + "uuid", + "vAng", + "vMag" + ] as Set, + [ + "id", + "node", + "operatesUntil", + "p", + "q", + "uuid", + "vAng", + "vMag" + ] as Set, + [ + "id", + "node", + "operatesUntil", + "operator", + "p", + "q", + "uuid", + "vAng", + "vMag" + ] as Set, + [ + "id", + "node", + "operatesFrom", + "operatesUntil", + "p", + "q", + "uuid", + "vAng", + "vMag" + ] as Set, + [ + "id", + "node", + "operatesFrom", + "operatesUntil", + "operator", + "p", + "q", + "uuid", + "vAng", + "vMag" + ] as Set, + ] + } + + def "A MeasurementUnitInput should throw an exception on incorrect fields correctly"() { + given: + def actualFields = SourceValidator.newSet("uuid") + def validator = new SourceValidator() + + when: + Try input = validator.validate(actualFields, MeasurementUnitInput) + + then: + input.failure + input.exception.get().message == "The provided fields [uuid] are invalid for instance of 'MeasurementUnitInput'. \n" + + "The following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of 'MeasurementUnitInput' are possible (NOT case-sensitive!):\n" + + "0: [id, node, p, q, uuid, vAng, vMag] or [id, node, p, q, uuid, v_ang, v_mag]\n" + + "1: [id, node, operator, p, q, uuid, vAng, vMag] or [id, node, operator, p, q, uuid, v_ang, v_mag]\n" + + "2: [id, node, operatesFrom, p, q, uuid, vAng, vMag] or [id, node, operates_from, p, q, uuid, v_ang, v_mag]\n" + + "3: [id, node, operatesFrom, operator, p, q, uuid, vAng, vMag] or [id, node, operates_from, operator, p, q, uuid, v_ang, v_mag]\n" + + "4: [id, node, operatesUntil, p, q, uuid, vAng, vMag] or [id, node, operates_until, p, q, uuid, v_ang, v_mag]\n" + + "5: [id, node, operatesUntil, operator, p, q, uuid, vAng, vMag] or [id, node, operates_until, operator, p, q, uuid, v_ang, v_mag]\n" + + "6: [id, node, operatesFrom, operatesUntil, p, q, uuid, vAng, vMag] or [id, node, operates_from, operates_until, p, q, uuid, v_ang, v_mag]\n" + + "7: [id, node, operatesFrom, operatesUntil, operator, p, q, uuid, vAng, vMag] or [id, node, operates_from, operates_until, operator, p, q, uuid, v_ang, v_mag]\n" + } + def "A MeasurementUnitInput copy method should work as expected"() { given: def unit = GridTestData.measurementUnitInput diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/NodeInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/NodeInputTest.groovy index 87a6f4178..f31957869 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/NodeInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/NodeInputTest.groovy @@ -5,12 +5,37 @@ */ package edu.ie3.datamodel.models.input +import edu.ie3.datamodel.exceptions.ValidationException +import edu.ie3.datamodel.io.source.SourceValidator import edu.ie3.datamodel.models.voltagelevels.GermanVoltageLevelUtils +import edu.ie3.datamodel.utils.Try import edu.ie3.test.common.GridTestData +import edu.ie3.test.helper.FactoryTestHelper import spock.lang.Specification +class NodeInputTest extends Specification implements FactoryTestHelper { -class NodeInputTest extends Specification { + def "A NodeInput should throw an exception on incorrect fields correctly"() { + given: + def actualFields = SourceValidator.newSet("uuid") + def validator = new SourceValidator() + + when: + Try input = validator.validate(actualFields, NodeInput) + + then: + input.failure + input.exception.get().message == "The provided fields [uuid] are invalid for instance of 'NodeInput'. \n" + + "The following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of 'NodeInput' are possible (NOT case-sensitive!):\n" + + "0: [geoPosition, id, slack, subnet, uuid, voltLvl, vRated, vTarget] or [geo_position, id, slack, subnet, uuid, v_rated, v_target, volt_lvl]\n" + + "1: [geoPosition, id, operator, slack, subnet, uuid, voltLvl, vRated, vTarget] or [geo_position, id, operator, slack, subnet, uuid, v_rated, v_target, volt_lvl]\n" + + "2: [geoPosition, id, operatesFrom, slack, subnet, uuid, voltLvl, vRated, vTarget] or [geo_position, id, operates_from, slack, subnet, uuid, v_rated, v_target, volt_lvl]\n" + + "3: [geoPosition, id, operatesFrom, operator, slack, subnet, uuid, voltLvl, vRated, vTarget] or [geo_position, id, operates_from, operator, slack, subnet, uuid, v_rated, v_target, volt_lvl]\n" + + "4: [geoPosition, id, operatesUntil, slack, subnet, uuid, voltLvl, vRated, vTarget] or [geo_position, id, operates_until, slack, subnet, uuid, v_rated, v_target, volt_lvl]\n" + + "5: [geoPosition, id, operatesUntil, operator, slack, subnet, uuid, voltLvl, vRated, vTarget] or [geo_position, id, operates_until, operator, slack, subnet, uuid, v_rated, v_target, volt_lvl]\n" + + "6: [geoPosition, id, operatesFrom, operatesUntil, slack, subnet, uuid, voltLvl, vRated, vTarget] or [geo_position, id, operates_from, operates_until, slack, subnet, uuid, v_rated, v_target, volt_lvl]\n" + + "7: [geoPosition, id, operatesFrom, operatesUntil, operator, slack, subnet, uuid, voltLvl, vRated, vTarget] or [geo_position, id, operates_from, operates_until, operator, slack, subnet, uuid, v_rated, v_target, volt_lvl]\n" + } def "A NodeInput copy method should work as expected"() { given: diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/OperatorInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/OperatorInputTest.groovy index 5abe90ebd..9a5879d2b 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/OperatorInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/OperatorInputTest.groovy @@ -5,12 +5,57 @@ */ package edu.ie3.datamodel.models.input +import edu.ie3.datamodel.exceptions.ValidationException +import edu.ie3.datamodel.io.factory.EntityData +import edu.ie3.datamodel.io.source.SourceValidator +import edu.ie3.datamodel.io.source.TypeSource +import edu.ie3.datamodel.utils.Try import edu.ie3.test.common.GridTestData import spock.lang.Specification - class OperatorInputTest extends Specification { + def "An OperatorInput should return possible fields correctly"() { + when: + List> fields = OperatorInput.getFields().fields() + + then: + fields == [["uuid", "id"] as Set] + } + + def "An OperatorInput should throw an exception on incorrect fields correctly"() { + given: + def actualFields = SourceValidator.newSet("uuid") + def validator = new SourceValidator() + + when: + Try input = validator.validate(actualFields, OperatorInput) + + then: + input.failure + input.exception.get().message == "The provided fields [uuid] are invalid for instance of 'OperatorInput'. \n" + + "The following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of 'OperatorInput' are possible (NOT case-sensitive!):\n" + + "0: [id, uuid] or [id, uuid]\n" + } + + def "An OperatorInput can be build correctly"() { + given: + Map parameter = [ + "uuid": "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "id" : "TestOperatorId", + ] + + when: + def input = TypeSource.operatorBuildFunction.apply(Try.Success.of(new EntityData(parameter))) + + then: + input.success + input.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert id == parameter["id"] + } + } + def "An OperatorInput copy method should work as expected"() { given: def operator = GridTestData.profBroccoli diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/connector/LineInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/connector/LineInputTest.groovy index 1a6277d29..46b086995 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/connector/LineInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/connector/LineInputTest.groovy @@ -5,8 +5,12 @@ */ package edu.ie3.datamodel.models.input.connector +import edu.ie3.datamodel.exceptions.ValidationException +import edu.ie3.datamodel.io.source.SourceValidator import edu.ie3.datamodel.models.input.system.characteristic.OlmCharacteristicInput +import edu.ie3.datamodel.utils.Try import edu.ie3.test.common.GridTestData +import edu.ie3.test.helper.FactoryTestHelper import org.locationtech.jts.geom.LineString import org.locationtech.jts.io.geojson.GeoJsonReader import spock.lang.Shared @@ -14,11 +18,142 @@ import spock.lang.Specification import tech.units.indriya.quantity.Quantities import tech.units.indriya.unit.Units -class LineInputTest extends Specification { +class LineInputTest extends Specification implements FactoryTestHelper { @Shared private static final GeoJsonReader geoJsonReader = new GeoJsonReader() + def "A LineInput should return possible fields correctly"() { + when: + List> fields = LineInput.getFields().fields() + + then: + fields == [ + [ + "geoPosition", + "id", + "length", + "nodeA", + "nodeB", + "olmCharacteristic", + "parallelDevices", + "type", + "uuid" + ] as Set, + [ + "geoPosition", + "id", + "length", + "nodeA", + "nodeB", + "olmCharacteristic", + "operator", + "parallelDevices", + "type", + "uuid" + ] as Set, + [ + "geoPosition", + "id", + "length", + "nodeA", + "nodeB", + "olmCharacteristic", + "operatesFrom", + "parallelDevices", + "type", + "uuid" + ] as Set, + [ + "geoPosition", + "id", + "length", + "nodeA", + "nodeB", + "olmCharacteristic", + "operatesFrom", + "operator", + "parallelDevices", + "type", + "uuid" + ] as Set, + [ + "geoPosition", + "id", + "length", + "nodeA", + "nodeB", + "olmCharacteristic", + "operatesUntil", + "parallelDevices", + "type", + "uuid" + ] as Set, + [ + "geoPosition", + "id", + "length", + "nodeA", + "nodeB", + "olmCharacteristic", + "operatesUntil", + "operator", + "parallelDevices", + "type", + "uuid" + ] as Set, + [ + "geoPosition", + "id", + "length", + "nodeA", + "nodeB", + "olmCharacteristic", + "operatesFrom", + "operatesUntil", + "parallelDevices", + "type", + "uuid" + ] as Set, + [ + "geoPosition", + "id", + "length", + "nodeA", + "nodeB", + "olmCharacteristic", + "operatesFrom", + "operatesUntil", + "operator", + "parallelDevices", + "type", + "uuid" + ] as Set + ] + } + + def "A LineInput should throw an exception on incorrect fields correctly"() { + given: + def actualFields = SourceValidator.newSet("uuid") + def validator = new SourceValidator() + + when: + Try input = validator.validate(actualFields, LineInput) + + then: + input.failure + input.exception.get().message == "The provided fields [uuid] are invalid for instance of 'LineInput'. \n" + + "The following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of 'LineInput' are possible (NOT case-sensitive!):\n" + + "0: [geoPosition, id, length, nodeA, nodeB, olmCharacteristic, parallelDevices, type, uuid] or [geo_position, id, length, node_a, node_b, olm_characteristic, parallel_devices, type, uuid]\n" + + "1: [geoPosition, id, length, nodeA, nodeB, olmCharacteristic, operator, parallelDevices, type, uuid] or [geo_position, id, length, node_a, node_b, olm_characteristic, operator, parallel_devices, type, uuid]\n" + + "2: [geoPosition, id, length, nodeA, nodeB, olmCharacteristic, operatesFrom, parallelDevices, type, uuid] or [geo_position, id, length, node_a, node_b, olm_characteristic, operates_from, parallel_devices, type, uuid]\n" + + "3: [geoPosition, id, length, nodeA, nodeB, olmCharacteristic, operatesFrom, operator, parallelDevices, type, uuid] or [geo_position, id, length, node_a, node_b, olm_characteristic, operates_from, operator, parallel_devices, type, uuid]\n" + + "4: [geoPosition, id, length, nodeA, nodeB, olmCharacteristic, operatesUntil, parallelDevices, type, uuid] or [geo_position, id, length, node_a, node_b, olm_characteristic, operates_until, parallel_devices, type, uuid]\n" + + "5: [geoPosition, id, length, nodeA, nodeB, olmCharacteristic, operatesUntil, operator, parallelDevices, type, uuid] or [geo_position, id, length, node_a, node_b, olm_characteristic, operates_until, operator, parallel_devices, type, uuid]\n" + + "6: [geoPosition, id, length, nodeA, nodeB, olmCharacteristic, operatesFrom, operatesUntil, parallelDevices, type, uuid] or [geo_position, id, length, node_a, node_b, olm_characteristic, operates_from, operates_until, parallel_devices, type, uuid]\n" + + "7: [geoPosition, id, length, nodeA, nodeB, olmCharacteristic, operatesFrom, operatesUntil, operator, parallelDevices, type, uuid] or [geo_position, id, length, node_a, node_b, olm_characteristic, operates_from, operates_until, operator, parallel_devices, type, uuid]\n" + } + def "Two LineInputs should be equal if all attributes are equal"() { given: def line1 = new LineInput( diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/connector/SwitchInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/connector/SwitchInputTest.groovy index c12638fb9..e3bc79bda 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/connector/SwitchInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/connector/SwitchInputTest.groovy @@ -5,13 +5,114 @@ */ package edu.ie3.datamodel.models.input.connector +import edu.ie3.datamodel.exceptions.ValidationException +import edu.ie3.datamodel.io.source.SourceValidator import edu.ie3.datamodel.models.input.OperatorInput +import edu.ie3.datamodel.utils.Try import edu.ie3.test.common.GridTestData import spock.lang.Specification - class SwitchInputTest extends Specification { + def "An SwitchInput should return possible fields correctly"() { + when: + List> fields = SwitchInput.getFields().fields() + + then: + fields == [ + [ + "closed", + "id", + "nodeA", + "nodeB", + "uuid" + ] as Set, + [ + "closed", + "id", + "nodeA", + "nodeB", + "operator", + "uuid" + ] as Set, + [ + "closed", + "id", + "nodeA", + "nodeB", + "operatesFrom", + "uuid" + ] as Set, + [ + "closed", + "id", + "nodeA", + "nodeB", + "operatesFrom", + "operator", + "uuid" + ] as Set, + [ + "closed", + "id", + "nodeA", + "nodeB", + "operatesUntil", + "uuid" + ] as Set, + [ + "closed", + "id", + "nodeA", + "nodeB", + "operatesUntil", + "operator", + "uuid" + ] as Set, + [ + "closed", + "id", + "nodeA", + "nodeB", + "operatesFrom", + "operatesUntil", + "uuid" + ] as Set, + [ + "closed", + "id", + "nodeA", + "nodeB", + "operatesFrom", + "operatesUntil", + "operator", + "uuid" + ] as Set, + ] + } + + def "A SwitchInput should throw an exception on incorrect fields correctly"() { + given: + def actualFields = SourceValidator.newSet("uuid") + def validator = new SourceValidator() + + when: + Try input = validator.validate(actualFields, SwitchInput) + + then: + input.failure + input.exception.get().message == "The provided fields [uuid] are invalid for instance of 'SwitchInput'. \n" + + "The following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of 'SwitchInput' are possible (NOT case-sensitive!):\n" + + "0: [closed, id, nodeA, nodeB, uuid] or [closed, id, node_a, node_b, uuid]\n" + + "1: [closed, id, nodeA, nodeB, operator, uuid] or [closed, id, node_a, node_b, operator, uuid]\n" + + "2: [closed, id, nodeA, nodeB, operatesFrom, uuid] or [closed, id, node_a, node_b, operates_from, uuid]\n" + + "3: [closed, id, nodeA, nodeB, operatesFrom, operator, uuid] or [closed, id, node_a, node_b, operates_from, operator, uuid]\n" + + "4: [closed, id, nodeA, nodeB, operatesUntil, uuid] or [closed, id, node_a, node_b, operates_until, uuid]\n" + + "5: [closed, id, nodeA, nodeB, operatesUntil, operator, uuid] or [closed, id, node_a, node_b, operates_until, operator, uuid]\n" + + "6: [closed, id, nodeA, nodeB, operatesFrom, operatesUntil, uuid] or [closed, id, node_a, node_b, operates_from, operates_until, uuid]\n" + + "7: [closed, id, nodeA, nodeB, operatesFrom, operatesUntil, operator, uuid] or [closed, id, node_a, node_b, operates_from, operates_until, operator, uuid]\n" + } + def "A SwitchInput copy method should work as expected"() { given: def switchInput = GridTestData.switchAtoB diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/connector/Transformer2WInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/connector/Transformer2WInputTest.groovy index e4859d626..c23da129e 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/connector/Transformer2WInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/connector/Transformer2WInputTest.groovy @@ -5,13 +5,138 @@ */ package edu.ie3.datamodel.models.input.connector +import edu.ie3.datamodel.exceptions.ValidationException +import edu.ie3.datamodel.io.source.SourceValidator import edu.ie3.datamodel.models.input.OperatorInput +import edu.ie3.datamodel.utils.Try import edu.ie3.test.common.GridTestData import spock.lang.Specification - class Transformer2WInputTest extends Specification { + def "An Transformer2WInput should return possible fields correctly"() { + when: + List> fields = Transformer2WInput.getFields().fields() + + then: + fields == [ + [ + "autoTap", + "id", + "nodeA", + "nodeB", + "parallelDevices", + "tapPos", + "type", + "uuid" + ] as Set, + [ + "autoTap", + "id", + "nodeA", + "nodeB", + "operator", + "parallelDevices", + "tapPos", + "type", + "uuid" + ] as Set, + [ + "autoTap", + "id", + "nodeA", + "nodeB", + "operatesFrom", + "parallelDevices", + "tapPos", + "type", + "uuid" + ] as Set, + [ + "autoTap", + "id", + "nodeA", + "nodeB", + "operatesFrom", + "operator", + "parallelDevices", + "tapPos", + "type", + "uuid" + ] as Set, + [ + "autoTap", + "id", + "nodeA", + "nodeB", + "operatesUntil", + "parallelDevices", + "tapPos", + "type", + "uuid" + ] as Set, + [ + "autoTap", + "id", + "nodeA", + "nodeB", + "operatesUntil", + "operator", + "parallelDevices", + "tapPos", + "type", + "uuid" + ] as Set, + [ + "autoTap", + "id", + "nodeA", + "nodeB", + "operatesFrom", + "operatesUntil", + "parallelDevices", + "tapPos", + "type", + "uuid" + ] as Set, + [ + "autoTap", + "id", + "nodeA", + "nodeB", + "operatesFrom", + "operatesUntil", + "operator", + "parallelDevices", + "tapPos", + "type", + "uuid" + ] as Set + ] + } + + def "A Transformer2WInput should throw an exception on incorrect fields correctly"() { + given: + def actualFields = SourceValidator.newSet("uuid") + def validator = new SourceValidator() + + when: + Try input = validator.validate(actualFields, Transformer2WInput) + + then: + input.failure + input.exception.get().message == "The provided fields [uuid] are invalid for instance of 'Transformer2WInput'. \n" + + "The following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of 'Transformer2WInput' are possible (NOT case-sensitive!):\n" + + "0: [autoTap, id, nodeA, nodeB, parallelDevices, tapPos, type, uuid] or [auto_tap, id, node_a, node_b, parallel_devices, tap_pos, type, uuid]\n" + + "1: [autoTap, id, nodeA, nodeB, operator, parallelDevices, tapPos, type, uuid] or [auto_tap, id, node_a, node_b, operator, parallel_devices, tap_pos, type, uuid]\n" + + "2: [autoTap, id, nodeA, nodeB, operatesFrom, parallelDevices, tapPos, type, uuid] or [auto_tap, id, node_a, node_b, operates_from, parallel_devices, tap_pos, type, uuid]\n" + + "3: [autoTap, id, nodeA, nodeB, operatesFrom, operator, parallelDevices, tapPos, type, uuid] or [auto_tap, id, node_a, node_b, operates_from, operator, parallel_devices, tap_pos, type, uuid]\n" + + "4: [autoTap, id, nodeA, nodeB, operatesUntil, parallelDevices, tapPos, type, uuid] or [auto_tap, id, node_a, node_b, operates_until, parallel_devices, tap_pos, type, uuid]\n" + + "5: [autoTap, id, nodeA, nodeB, operatesUntil, operator, parallelDevices, tapPos, type, uuid] or [auto_tap, id, node_a, node_b, operates_until, operator, parallel_devices, tap_pos, type, uuid]\n" + + "6: [autoTap, id, nodeA, nodeB, operatesFrom, operatesUntil, parallelDevices, tapPos, type, uuid] or [auto_tap, id, node_a, node_b, operates_from, operates_until, parallel_devices, tap_pos, type, uuid]\n" + + "7: [autoTap, id, nodeA, nodeB, operatesFrom, operatesUntil, operator, parallelDevices, tapPos, type, uuid] or [auto_tap, id, node_a, node_b, operates_from, operates_until, operator, parallel_devices, tap_pos, type, uuid]\n" + } + def "A Transformer2WInput copy method should work as expected"() { given: def trafo2w = GridTestData.transformerBtoD diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/connector/Transformer3WInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/connector/Transformer3WInputTest.groovy index 7b8878b71..bbe519440 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/connector/Transformer3WInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/connector/Transformer3WInputTest.groovy @@ -5,12 +5,145 @@ */ package edu.ie3.datamodel.models.input.connector +import edu.ie3.datamodel.exceptions.ValidationException +import edu.ie3.datamodel.io.source.SourceValidator +import edu.ie3.datamodel.utils.Try import edu.ie3.test.common.GridTestData import spock.lang.Specification - class Transformer3WInputTest extends Specification { + def "An Transformer2WInput should return possible fields correctly"() { + when: + List> fields = Transformer3WInput.getFields().fields() + + then: + fields == [ + [ + "autoTap", + "id", + "nodeA", + "nodeB", + "nodeC", + "parallelDevices", + "tapPos", + "type", + "uuid" + ] as Set, + [ + "autoTap", + "id", + "nodeA", + "nodeB", + "nodeC", + "operator", + "parallelDevices", + "tapPos", + "type", + "uuid" + ] as Set, + [ + "autoTap", + "id", + "nodeA", + "nodeB", + "nodeC", + "operatesFrom", + "parallelDevices", + "tapPos", + "type", + "uuid" + ] as Set, + [ + "autoTap", + "id", + "nodeA", + "nodeB", + "nodeC", + "operatesFrom", + "operator", + "parallelDevices", + "tapPos", + "type", + "uuid" + ] as Set, + [ + "autoTap", + "id", + "nodeA", + "nodeB", + "nodeC", + "operatesUntil", + "parallelDevices", + "tapPos", + "type", + "uuid" + ] as Set, + [ + "autoTap", + "id", + "nodeA", + "nodeB", + "nodeC", + "operatesUntil", + "operator", + "parallelDevices", + "tapPos", + "type", + "uuid" + ] as Set, + [ + "autoTap", + "id", + "nodeA", + "nodeB", + "nodeC", + "operatesFrom", + "operatesUntil", + "parallelDevices", + "tapPos", + "type", + "uuid" + ] as Set, + [ + "autoTap", + "id", + "nodeA", + "nodeB", + "nodeC", + "operatesFrom", + "operatesUntil", + "operator", + "parallelDevices", + "tapPos", + "type", + "uuid" + ] as Set + ] + } + + def "A Transformer2WInput should throw an exception on incorrect fields correctly"() { + given: + def actualFields = SourceValidator.newSet("uuid") + def validator = new SourceValidator() + + when: + Try input = validator.validate(actualFields, Transformer3WInput) + + then: + input.failure + input.exception.get().message == "The provided fields [uuid] are invalid for instance of 'Transformer3WInput'. \n" + + "The following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of 'Transformer3WInput' are possible (NOT case-sensitive!):\n" + + "0: [autoTap, id, nodeA, nodeB, nodeC, parallelDevices, tapPos, type, uuid] or [auto_tap, id, node_a, node_b, node_c, parallel_devices, tap_pos, type, uuid]\n" + + "1: [autoTap, id, nodeA, nodeB, nodeC, operator, parallelDevices, tapPos, type, uuid] or [auto_tap, id, node_a, node_b, node_c, operator, parallel_devices, tap_pos, type, uuid]\n" + + "2: [autoTap, id, nodeA, nodeB, nodeC, operatesFrom, parallelDevices, tapPos, type, uuid] or [auto_tap, id, node_a, node_b, node_c, operates_from, parallel_devices, tap_pos, type, uuid]\n" + + "3: [autoTap, id, nodeA, nodeB, nodeC, operatesFrom, operator, parallelDevices, tapPos, type, uuid] or [auto_tap, id, node_a, node_b, node_c, operates_from, operator, parallel_devices, tap_pos, type, uuid]\n" + + "4: [autoTap, id, nodeA, nodeB, nodeC, operatesUntil, parallelDevices, tapPos, type, uuid] or [auto_tap, id, node_a, node_b, node_c, operates_until, parallel_devices, tap_pos, type, uuid]\n" + + "5: [autoTap, id, nodeA, nodeB, nodeC, operatesUntil, operator, parallelDevices, tapPos, type, uuid] or [auto_tap, id, node_a, node_b, node_c, operates_until, operator, parallel_devices, tap_pos, type, uuid]\n" + + "6: [autoTap, id, nodeA, nodeB, nodeC, operatesFrom, operatesUntil, parallelDevices, tapPos, type, uuid] or [auto_tap, id, node_a, node_b, node_c, operates_from, operates_until, parallel_devices, tap_pos, type, uuid]\n" + + "7: [autoTap, id, nodeA, nodeB, nodeC, operatesFrom, operatesUntil, operator, parallelDevices, tapPos, type, uuid] or [auto_tap, id, node_a, node_b, node_c, operates_from, operates_until, operator, parallel_devices, tap_pos, type, uuid]\n" + } + def "A Transformer3WInput copy method should work as expected"() { given: def trafo3w = GridTestData.transformerAtoBtoC diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/BmInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/BmInputTest.groovy index 3b5d5182e..f4c9508d6 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/BmInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/BmInputTest.groovy @@ -7,11 +7,37 @@ package edu.ie3.datamodel.models.input.system import static edu.ie3.util.quantities.PowerSystemUnits.EURO_PER_MEGAWATTHOUR +import edu.ie3.datamodel.exceptions.ValidationException +import edu.ie3.datamodel.io.source.SourceValidator +import edu.ie3.datamodel.utils.Try import edu.ie3.test.common.SystemParticipantTestData +import edu.ie3.test.helper.FactoryTestHelper import spock.lang.Specification import tech.units.indriya.quantity.Quantities -class BmInputTest extends Specification { +class BmInputTest extends Specification implements FactoryTestHelper { + + def "A BmInput should throw an exception on incorrect fields correctly"() { + given: + def actualFields = SourceValidator.newSet("uuid") + def validator = new SourceValidator() + + when: + Try input = validator.validate(actualFields, BmInput) + + then: + input.failure + input.exception.get().message == "The provided fields [uuid] are invalid for instance of 'BmInput'. \n" + + "The following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of 'BmInput' are possible (NOT case-sensitive!):\n" + + "0: [controllingEm, costControlled, feedInTariff, id, marketReaction, node, qCharacteristics, type, uuid] or [controlling_em, cost_controlled, feed_in_tariff, id, market_reaction, node, q_characteristics, type, uuid]\n" + + "1: [controllingEm, costControlled, feedInTariff, id, marketReaction, node, operator, qCharacteristics, type, uuid] or [controlling_em, cost_controlled, feed_in_tariff, id, market_reaction, node, operator, q_characteristics, type, uuid]\n" + + "2: [controllingEm, costControlled, feedInTariff, id, marketReaction, node, operatesFrom, qCharacteristics, type, uuid] or [controlling_em, cost_controlled, feed_in_tariff, id, market_reaction, node, operates_from, q_characteristics, type, uuid]\n" + + "3: [controllingEm, costControlled, feedInTariff, id, marketReaction, node, operatesFrom, operator, qCharacteristics, type, uuid] or [controlling_em, cost_controlled, feed_in_tariff, id, market_reaction, node, operates_from, operator, q_characteristics, type, uuid]\n" + + "4: [controllingEm, costControlled, feedInTariff, id, marketReaction, node, operatesUntil, qCharacteristics, type, uuid] or [controlling_em, cost_controlled, feed_in_tariff, id, market_reaction, node, operates_until, q_characteristics, type, uuid]\n" + + "5: [controllingEm, costControlled, feedInTariff, id, marketReaction, node, operatesUntil, operator, qCharacteristics, type, uuid] or [controlling_em, cost_controlled, feed_in_tariff, id, market_reaction, node, operates_until, operator, q_characteristics, type, uuid]\n" + + "6: [controllingEm, costControlled, feedInTariff, id, marketReaction, node, operatesFrom, operatesUntil, qCharacteristics, type, uuid] or [controlling_em, cost_controlled, feed_in_tariff, id, market_reaction, node, operates_from, operates_until, q_characteristics, type, uuid]\n" + + "7: [controllingEm, costControlled, feedInTariff, id, marketReaction, node, operatesFrom, operatesUntil, operator, qCharacteristics, type, uuid] or [controlling_em, cost_controlled, feed_in_tariff, id, market_reaction, node, operates_from, operates_until, operator, q_characteristics, type, uuid]\n" + } def "A BmInput copy method should work as expected"() { given: diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/ChpInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/ChpInputTest.groovy index b1f8d2cce..fab6452a3 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/ChpInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/ChpInputTest.groovy @@ -5,11 +5,36 @@ */ package edu.ie3.datamodel.models.input.system +import edu.ie3.datamodel.exceptions.ValidationException +import edu.ie3.datamodel.io.source.SourceValidator +import edu.ie3.datamodel.utils.Try import edu.ie3.test.common.SystemParticipantTestData import spock.lang.Specification class ChpInputTest extends Specification { + def "A ChpInput should throw an exception on incorrect fields correctly"() { + given: + def actualFields = SourceValidator.newSet("uuid") + def validator = new SourceValidator() + + when: + Try input = validator.validate(actualFields, ChpInput) + + then: + input.failure + input.exception.get().message == "The provided fields [uuid] are invalid for instance of 'ChpInput'. \n" + + "The following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of 'ChpInput' are possible (NOT case-sensitive!):\n" + + "0: [controllingEm, id, marketReaction, node, qCharacteristics, thermalBus, thermalStorage, type, uuid] or [controlling_em, id, market_reaction, node, q_characteristics, thermal_bus, thermal_storage, type, uuid]\n" + + "1: [controllingEm, id, marketReaction, node, operator, qCharacteristics, thermalBus, thermalStorage, type, uuid] or [controlling_em, id, market_reaction, node, operator, q_characteristics, thermal_bus, thermal_storage, type, uuid]\n" + + "2: [controllingEm, id, marketReaction, node, operatesFrom, qCharacteristics, thermalBus, thermalStorage, type, uuid] or [controlling_em, id, market_reaction, node, operates_from, q_characteristics, thermal_bus, thermal_storage, type, uuid]\n" + + "3: [controllingEm, id, marketReaction, node, operatesFrom, operator, qCharacteristics, thermalBus, thermalStorage, type, uuid] or [controlling_em, id, market_reaction, node, operates_from, operator, q_characteristics, thermal_bus, thermal_storage, type, uuid]\n" + + "4: [controllingEm, id, marketReaction, node, operatesUntil, qCharacteristics, thermalBus, thermalStorage, type, uuid] or [controlling_em, id, market_reaction, node, operates_until, q_characteristics, thermal_bus, thermal_storage, type, uuid]\n" + + "5: [controllingEm, id, marketReaction, node, operatesUntil, operator, qCharacteristics, thermalBus, thermalStorage, type, uuid] or [controlling_em, id, market_reaction, node, operates_until, operator, q_characteristics, thermal_bus, thermal_storage, type, uuid]\n" + + "6: [controllingEm, id, marketReaction, node, operatesFrom, operatesUntil, qCharacteristics, thermalBus, thermalStorage, type, uuid] or [controlling_em, id, market_reaction, node, operates_from, operates_until, q_characteristics, thermal_bus, thermal_storage, type, uuid]\n" + + "7: [controllingEm, id, marketReaction, node, operatesFrom, operatesUntil, operator, qCharacteristics, thermalBus, thermalStorage, type, uuid] or [controlling_em, id, market_reaction, node, operates_from, operates_until, operator, q_characteristics, thermal_bus, thermal_storage, type, uuid]\n" + } + def "A ChpInput copy method should work as expected"() { given: def chpInput = SystemParticipantTestData.chpInput diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/EvInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/EvInputTest.groovy index 3238caf08..5e70d0719 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/EvInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/EvInputTest.groovy @@ -5,12 +5,36 @@ */ package edu.ie3.datamodel.models.input.system +import edu.ie3.datamodel.exceptions.ValidationException +import edu.ie3.datamodel.io.source.SourceValidator +import edu.ie3.datamodel.utils.Try import edu.ie3.test.common.SystemParticipantTestData import spock.lang.Specification - class EvInputTest extends Specification { + def "An EvInput should throw an exception on incorrect fields correctly"() { + given: + def actualFields = SourceValidator.newSet("uuid") + def validator = new SourceValidator() + + when: + Try input = validator.validate(actualFields, EvInput) + + then: + input.failure + input.exception.get().message == "The provided fields [uuid] are invalid for instance of 'EvInput'. \n" + + "The following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of 'EvInput' are possible (NOT case-sensitive!):\n" + + "0: [controllingEm, id, node, qCharacteristics, type, uuid] or [controlling_em, id, node, q_characteristics, type, uuid]\n" + + "1: [controllingEm, id, node, operator, qCharacteristics, type, uuid] or [controlling_em, id, node, operator, q_characteristics, type, uuid]\n" + + "2: [controllingEm, id, node, operatesFrom, qCharacteristics, type, uuid] or [controlling_em, id, node, operates_from, q_characteristics, type, uuid]\n" + + "3: [controllingEm, id, node, operatesFrom, operator, qCharacteristics, type, uuid] or [controlling_em, id, node, operates_from, operator, q_characteristics, type, uuid]\n" + + "4: [controllingEm, id, node, operatesUntil, qCharacteristics, type, uuid] or [controlling_em, id, node, operates_until, q_characteristics, type, uuid]\n" + + "5: [controllingEm, id, node, operatesUntil, operator, qCharacteristics, type, uuid] or [controlling_em, id, node, operates_until, operator, q_characteristics, type, uuid]\n" + + "6: [controllingEm, id, node, operatesFrom, operatesUntil, qCharacteristics, type, uuid] or [controlling_em, id, node, operates_from, operates_until, q_characteristics, type, uuid]\n" + + "7: [controllingEm, id, node, operatesFrom, operatesUntil, operator, qCharacteristics, type, uuid] or [controlling_em, id, node, operates_from, operates_until, operator, q_characteristics, type, uuid]\n" + } + def "An EvInput copy method should work as expected"() { given: def ev = SystemParticipantTestData.evInput diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/EvcsInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/EvcsInputTest.groovy index 064d98f29..b45bc12aa 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/EvcsInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/EvcsInputTest.groovy @@ -5,13 +5,38 @@ */ package edu.ie3.datamodel.models.input.system +import edu.ie3.datamodel.exceptions.ValidationException +import edu.ie3.datamodel.io.source.SourceValidator import edu.ie3.datamodel.models.input.system.type.chargingpoint.ChargingPointTypeUtils import edu.ie3.datamodel.models.input.system.type.evcslocation.EvcsLocationType +import edu.ie3.datamodel.utils.Try import edu.ie3.test.common.SystemParticipantTestData import spock.lang.Specification class EvcsInputTest extends Specification { + def "An EvcsInput should throw an exception on incorrect fields correctly"() { + given: + def actualFields = SourceValidator.newSet("uuid") + def validator = new SourceValidator() + + when: + Try input = validator.validate(actualFields, EvcsInput) + + then: + input.failure + input.exception.get().message == "The provided fields [uuid] are invalid for instance of 'EvcsInput'. \n" + + "The following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of 'EvcsInput' are possible (NOT case-sensitive!):\n" + + "0: [chargingPoints, controllingEm, cosPhiRated, id, locationType, node, qCharacteristics, type, uuid, v2gSupport] or [charging_points, controlling_em, cos_phi_rated, id, location_type, node, q_characteristics, type, uuid, v_2g_support]\n" + + "1: [chargingPoints, controllingEm, cosPhiRated, id, locationType, node, operator, qCharacteristics, type, uuid, v2gSupport] or [charging_points, controlling_em, cos_phi_rated, id, location_type, node, operator, q_characteristics, type, uuid, v_2g_support]\n" + + "2: [chargingPoints, controllingEm, cosPhiRated, id, locationType, node, operatesFrom, qCharacteristics, type, uuid, v2gSupport] or [charging_points, controlling_em, cos_phi_rated, id, location_type, node, operates_from, q_characteristics, type, uuid, v_2g_support]\n" + + "3: [chargingPoints, controllingEm, cosPhiRated, id, locationType, node, operatesFrom, operator, qCharacteristics, type, uuid, v2gSupport] or [charging_points, controlling_em, cos_phi_rated, id, location_type, node, operates_from, operator, q_characteristics, type, uuid, v_2g_support]\n" + + "4: [chargingPoints, controllingEm, cosPhiRated, id, locationType, node, operatesUntil, qCharacteristics, type, uuid, v2gSupport] or [charging_points, controlling_em, cos_phi_rated, id, location_type, node, operates_until, q_characteristics, type, uuid, v_2g_support]\n" + + "5: [chargingPoints, controllingEm, cosPhiRated, id, locationType, node, operatesUntil, operator, qCharacteristics, type, uuid, v2gSupport] or [charging_points, controlling_em, cos_phi_rated, id, location_type, node, operates_until, operator, q_characteristics, type, uuid, v_2g_support]\n" + + "6: [chargingPoints, controllingEm, cosPhiRated, id, locationType, node, operatesFrom, operatesUntil, qCharacteristics, type, uuid, v2gSupport] or [charging_points, controlling_em, cos_phi_rated, id, location_type, node, operates_from, operates_until, q_characteristics, type, uuid, v_2g_support]\n" + + "7: [chargingPoints, controllingEm, cosPhiRated, id, locationType, node, operatesFrom, operatesUntil, operator, qCharacteristics, type, uuid, v2gSupport] or [charging_points, controlling_em, cos_phi_rated, id, location_type, node, operates_from, operates_until, operator, q_characteristics, type, uuid, v_2g_support]\n" + } + def "An EvcsInput copy method should work as expected"() { given: def evcsInput = SystemParticipantTestData.evcsInput diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/FixedFeedInInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/FixedFeedInInputTest.groovy index 528adeab4..2c230c3f6 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/FixedFeedInInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/FixedFeedInInputTest.groovy @@ -5,14 +5,38 @@ */ package edu.ie3.datamodel.models.input.system +import edu.ie3.datamodel.exceptions.ValidationException +import edu.ie3.datamodel.io.source.SourceValidator +import edu.ie3.datamodel.utils.Try import edu.ie3.test.common.SystemParticipantTestData import edu.ie3.util.quantities.PowerSystemUnits import spock.lang.Specification import tech.units.indriya.quantity.Quantities - class FixedFeedInInputTest extends Specification { + def "An EvInput should throw an exception on incorrect fields correctly"() { + given: + def actualFields = SourceValidator.newSet("uuid") + def validator = new SourceValidator() + + when: + Try input = validator.validate(actualFields, FixedFeedInInput) + + then: + input.failure + input.exception.get().message == "The provided fields [uuid] are invalid for instance of 'FixedFeedInInput'. \n" + + "The following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of 'FixedFeedInInput' are possible (NOT case-sensitive!):\n" + + "0: [controllingEm, cosPhiRated, id, node, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, node, q_characteristics, s_rated, uuid]\n" + + "1: [controllingEm, cosPhiRated, id, node, operator, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, node, operator, q_characteristics, s_rated, uuid]\n" + + "2: [controllingEm, cosPhiRated, id, node, operatesFrom, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, node, operates_from, q_characteristics, s_rated, uuid]\n" + + "3: [controllingEm, cosPhiRated, id, node, operatesFrom, operator, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, node, operates_from, operator, q_characteristics, s_rated, uuid]\n" + + "4: [controllingEm, cosPhiRated, id, node, operatesUntil, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, node, operates_until, q_characteristics, s_rated, uuid]\n" + + "5: [controllingEm, cosPhiRated, id, node, operatesUntil, operator, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, node, operates_until, operator, q_characteristics, s_rated, uuid]\n" + + "6: [controllingEm, cosPhiRated, id, node, operatesFrom, operatesUntil, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, node, operates_from, operates_until, q_characteristics, s_rated, uuid]\n" + + "7: [controllingEm, cosPhiRated, id, node, operatesFrom, operatesUntil, operator, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, node, operates_from, operates_until, operator, q_characteristics, s_rated, uuid]\n" + } + def "A FixedFeedInInput copy method should work as expected"() { given: def ffIn = SystemParticipantTestData.fixedFeedInInput diff --git a/src/test/groovy/edu/ie3/datamodel/models/result/FlexOptionResultTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/result/FlexOptionResultTest.groovy new file mode 100644 index 000000000..a937345d4 --- /dev/null +++ b/src/test/groovy/edu/ie3/datamodel/models/result/FlexOptionResultTest.groovy @@ -0,0 +1,29 @@ +/* + * © 2025. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation + */ +package edu.ie3.datamodel.models.result + +import edu.ie3.datamodel.exceptions.ValidationException +import edu.ie3.datamodel.io.source.SourceValidator +import edu.ie3.datamodel.models.result.system.FlexOptionsResult +import edu.ie3.datamodel.utils.Try +import spock.lang.Specification + +class FlexOptionResultTest extends Specification { + def "A FlexOptionResult should throw an exception on invalid fields"() { + given: + def actualFields = SourceValidator.newSet("uuid") + def validator = new SourceValidator() + + when: + Try input = validator.validate(actualFields, FlexOptionsResult) + + then: + input.failure + input.exception.get().message == "The provided fields [uuid] are invalid for instance of 'FlexOptionsResult'. \n" + + "The following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of 'FlexOptionsResult' are possible (NOT case-sensitive!):\n" + + "0: [inputModel, pMax, pMin, pRef, time] or [input_model, p_max, p_min, p_ref, time]\n" + } +} diff --git a/src/test/groovy/edu/ie3/datamodel/models/result/NodeResultTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/result/NodeResultTest.groovy new file mode 100644 index 000000000..17bcf1e35 --- /dev/null +++ b/src/test/groovy/edu/ie3/datamodel/models/result/NodeResultTest.groovy @@ -0,0 +1,29 @@ +/* + * © 2025. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation + */ +package edu.ie3.datamodel.models.result + +import edu.ie3.datamodel.exceptions.ValidationException +import edu.ie3.datamodel.io.source.SourceValidator +import edu.ie3.datamodel.utils.Try +import spock.lang.Specification + +class NodeResultTest extends Specification { + + def "A NodeResultInput should throw an exception on invalid fields"() { + given: + def actualFields = SourceValidator.newSet("uuid") + def validator = new SourceValidator() + + when: + Try input = validator.validate(actualFields, NodeResult) + + then: + input.failure + input.exception.get().message == "The provided fields [uuid] are invalid for instance of 'NodeResult'. \n" + + "The following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of 'NodeResult' are possible (NOT case-sensitive!):\n" + + "0: [inputModel, time, vAng, vMag] or [input_model, time, v_ang, v_mag]\n" + } +}