/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.datamodel.api; import de.rcenvironment.core.datamodel.types.api.BigTableTD; import de.rcenvironment.core.datamodel.types.api.BooleanTD; import de.rcenvironment.core.datamodel.types.api.DateTimeTD; import de.rcenvironment.core.datamodel.types.api.DirectoryReferenceTD; import de.rcenvironment.core.datamodel.types.api.EmptyTD; import de.rcenvironment.core.datamodel.types.api.FileReferenceTD; import de.rcenvironment.core.datamodel.types.api.FloatTD; import de.rcenvironment.core.datamodel.types.api.IntegerTD; import de.rcenvironment.core.datamodel.types.api.InternalTD; import de.rcenvironment.core.datamodel.types.api.MatrixTD; import de.rcenvironment.core.datamodel.types.api.NotAValueTD; import de.rcenvironment.core.datamodel.types.api.ShortTextTD; import de.rcenvironment.core.datamodel.types.api.SmallTableTD; import de.rcenvironment.core.datamodel.types.api.StructuredDataTD; import de.rcenvironment.core.datamodel.types.api.VectorTD; import de.rcenvironment.core.utils.common.StringUtils; /** * Defines the data types of RCE 3.0.0 and later. * * @author Robert Mischke * @author Doreen Seider */ public enum DataType { /** * A string of limited length. The rationale for the length restriction is to avoid RAM shortage * from handling arbitrary-sized data as strings. Large string data should be handled via * {@link #FileReference} instead, using temporary files or direct data management upload if * needed. * * TODO design: define exact size limit */ ShortText("Short Text", "STxt", ShortTextTD.class), /** * A container for a boolean value. */ Boolean("Boolean", "Bool", BooleanTD.class), /** * A container for a 64 bit signed integer. */ Integer("Integer", "Int", IntegerTD.class), /** * A container for a double-precision (64 bit) float. */ Float("Float", "Flt", FloatTD.class), /** * Vector data type. Its cells use the {@link #Float} data type. */ Vector("Vector", "Vctr", VectorTD.class), /** * Matrix data type. Its cells use the {@link #Float} data type. */ Matrix("Matrix", "Mtrx", MatrixTD.class), /** * A table that is small enough that it can be held in RAM at typical heap sizes. Each cell has * its individual data type. Valid cell data types are defined by the * {@link #isAllowedAsCellType()} method. * * TODO design: define exact size limit */ SmallTable("Small Table", "SmlT", SmallTableTD.class), /** * A container for a timezone-independent timestamp. * * TODO design: add timezone metadata? */ DateTime("Date/Time", "Date", DateTimeTD.class), /** * From the user perspective, this data type represents a file and provides access to its * content, an (optional?) file name and possibly other file metadata. Technically, the file * content will typically be represented as a data management reference. */ FileReference("File", "File", FileReferenceTD.class), // TODO keep or remove "...Reference"? /** * From the user perspective, this data type represents a directory of files. The technical * representation has not been defined yet, but will typically be based on one or more data * management references. * * TODO design: internal representation? type API? */ DirectoryReference("Directory", "Dir", DirectoryReferenceTD.class), // TODO keep/remove // "...Reference"? /** * A container for an empty value. */ Empty("Empty", "Epty", EmptyTD.class), /** * A table of arbitrary size that is partially loaded into RAM on access. Each cell has its * individual data type. Valid cell data types are defined by the {@link #isAllowedAsCellType()} * method. */ BigTable("Big Table", "BigT", BigTableTD.class), /** * A complex data type with JSON-like features. * * TODO design: details & API */ StructuredData("Structured Data", "SDat", StructuredDataTD.class), /** * Sent if no output can be computed due to invalid inputs or component crash. Used in loops. */ NotAValue("Not-a-value", "Ind", NotAValueTD.class), /** * Used for workflow control purposes. */ Internal("Internal", "Intern", InternalTD.class); private String displayName; private String shortName; private Class<? extends TypedDatum> tdClass; DataType(String displayName, String shortName, Class<? extends TypedDatum> tdClass) { this.displayName = displayName; this.shortName = shortName; this.tdClass = tdClass; } public Class<? extends TypedDatum> getTDClass() { return tdClass; } public String getDisplayName() { return displayName; } public String getShortName() { return shortName; } /** * @return true if this type can be a cell type of {@link #SmallTable} or {@link #BigTable}. */ public boolean isValidCellType() { return this == DataType.Boolean || this == Integer || this == Float || this == DateTime || this == ShortText; } /** * Returns the {@link DataType} associated with the given {@link TypedDatum} Java interface. * * @param inputClass the {@link TypedDatum} class * @return the associated {@link DataType} enum value */ public static DataType byTDClass(Class<? extends TypedDatum> inputClass) { for (DataType type : values()) { if (type.tdClass == inputClass) { return type; } } throw new IllegalArgumentException("No match for class " + inputClass); } /** * Returns the {@link DataType} associated with the given name. * * @param shortName the short name of the class * @return the associated {@link DataType} enum value */ public static DataType byShortName(String shortName) { for (DataType type : values()) { if (shortName.equals(type.getShortName())) { return type; } } throw new IllegalArgumentException(StringUtils.format("No matching data type for given short name found: '%s'", shortName)); } /** * Returns the {@link DataType} associated with the given name. * * @param displayName the short name of the class * @return the associated {@link DataType} enum value */ public static DataType byDisplayName(String displayName) { for (DataType type : values()) { if (displayName.equals(type.getDisplayName())) { return type; } } throw new IllegalArgumentException("No match for classname " + displayName); } @Override public String toString() { return displayName; // preliminary; change as necessary } }