Search in sources :

Example 11 with TableDefinition

use of CCDD.CcddClassesDataTable.TableDefinition in project CCDD by nasa.

the class CcddXTCEHandler method importCommandTable.

/**
 ********************************************************************************************
 * Build a command table from the specified command metadata
 *
 * @param system
 *            space system
 *
 * @param cmdMetaData
 *            reference to the command metadata from which to build the command table
 *
 * @param table
 *            name table name, including the full system path
 *
 * @throws CCDDException
 *             If an input error is detected
 ********************************************************************************************
 */
private void importCommandTable(SpaceSystemType system, CommandMetaDataType cmdMetaData, String tableName) throws CCDDException {
    // Create a table definition for this command table. If the name space also includes a
    // telemetry metadata (which creates a structure table) then ensure the two tables have
    // different names
    TableDefinition tableDefn = new TableDefinition(tableName + (system.getTelemetryMetaData() == null ? "" : "_cmd"), system.getLongDescription());
    // Check if a description exists for this command table
    if (system.getLongDescription() != null && !system.getLongDescription().isEmpty()) {
        // Store the table's description
        tableDefn.setDescription(system.getLongDescription());
    }
    // Set the new command table's table type name
    tableDefn.setTypeName(commandTypeDefn.getName());
    // Check if the description column belongs to a command argument
    if (commandArguments.size() != 0 && cmdDescriptionIndex > commandArguments.get(0).getName()) {
        // Reset the command description index to indicate no description exists
        cmdDescriptionIndex = -1;
    }
    // Get the command set information
    MetaCommandSet metaCmdSet = cmdMetaData.getMetaCommandSet();
    // Check if the command set information exists
    if (metaCmdSet != null) {
        // Get the command argument information
        ArgumentTypeSetType argTypeSetType = cmdMetaData.getArgumentTypeSet();
        List<NameDescriptionType> argTypeSet = null;
        // Check if there are any arguments for this command
        if (argTypeSetType != null) {
            // Get the list of this command's argument data types
            argTypeSet = argTypeSetType.getStringArgumentTypeOrEnumeratedArgumentTypeOrIntegerArgumentType();
        }
        // Step through each command set
        for (Object cmd : metaCmdSet.getMetaCommandOrMetaCommandRefOrBlockMetaCommand()) {
            // Check if the command represents a meta command type (all of these should)
            if (cmd instanceof MetaCommandType) {
                // Get the command type as a meta command type to shorten subsequent calls
                MetaCommandType metaCmd = (MetaCommandType) cmd;
                // Create a new row of data in the table definition to contain this command's
                // information. Initialize all columns to blanks except for the command name
                String[] newRow = new String[numCommandColumns];
                Arrays.fill(newRow, null);
                newRow[commandNameIndex] = metaCmd.getName();
                // Get the base meta-command reference
                BaseMetaCommand baseMetaCmd = metaCmd.getBaseMetaCommand();
                // Check if the base meta-command exists
                if (baseMetaCmd != null) {
                    // Step through each argument assignment
                    for (ArgumentAssignment argAssn : baseMetaCmd.getArgumentAssignmentList().getArgumentAssignment()) {
                        // column name
                        if (argAssn.getArgumentName().equals(ccsdsAppID)) {
                            boolean isExists = false;
                            // Step through the data fields already added to this table
                            for (String[] fieldInfo : tableDefn.getDataFields()) {
                                // subsequent ones are ignored to prevent duplicates
                                if (fieldInfo[FieldsColumn.FIELD_NAME.ordinal()].equals(argAssn.getArgumentName())) {
                                    // Set the flag indicating the field already exists and
                                    // stop searching
                                    isExists = true;
                                    break;
                                }
                            }
                            // Check if the application ID data field doesn't exist
                            if (!isExists) {
                                // Create a data field for the table containing the application
                                // ID and stop searching
                                tableDefn.addDataField(new String[] { tableName, argAssn.getArgumentName(), "Message ID", String.valueOf(argAssn.getArgumentValue().length()), InputDataType.MESSAGE_ID.getInputName(), String.valueOf(false), ApplicabilityType.ALL.getApplicabilityName(), argAssn.getArgumentValue() });
                            }
                        } else // argument column name
                        if (argAssn.getArgumentName().equals(ccsdsFuncCode)) {
                            // Store the command function code and stop searching
                            newRow[commandCodeIndex] = argAssn.getArgumentValue();
                            break;
                        }
                    }
                }
                // exists in the table type definition
                if (metaCmd.getLongDescription() != null && cmdDescriptionIndex != -1) {
                    // Store the command description in the row's description column
                    newRow[cmdDescriptionIndex] = metaCmd.getLongDescription();
                }
                // Check if the command has any arguments
                if (metaCmd.getArgumentList() != null && argTypeSet != null) {
                    int cmdArgIndex = 0;
                    CommandContainerType cmdContainer = metaCmd.getCommandContainer();
                    // Step through each of the command's arguments
                    for (Argument argList : metaCmd.getArgumentList().getArgument()) {
                        // Step through each command argument type
                        for (NameDescriptionType argType : argTypeSet) {
                            // between the two)
                            if (argList.getArgumentTypeRef().equals(argType.getName())) {
                                boolean isInteger = false;
                                boolean isUnsigned = false;
                                boolean isFloat = false;
                                boolean isString = false;
                                String dataType = null;
                                String arraySize = null;
                                BigInteger bitLength = null;
                                long sizeInBytes = 0;
                                String enumeration = null;
                                String description = null;
                                UnitSet unitSet = null;
                                String units = null;
                                String minimum = null;
                                String maximum = null;
                                // Check if the argument is an array data type
                                if (argType instanceof ArrayDataTypeType && metaCmd != null && cmdContainer != null) {
                                    // set
                                    for (JAXBElement<? extends SequenceEntryType> seqEntry : cmdContainer.getEntryList().getParameterRefEntryOrParameterSegmentRefEntryOrContainerRefEntry()) {
                                        // reference matches the target parameter
                                        if (seqEntry.getValue() instanceof ArrayParameterRefEntryType && argList.getName().equals(((ArrayParameterRefEntryType) seqEntry.getValue()).getParameterRef())) {
                                            arraySize = "";
                                            // Store the reference to the array parameter type
                                            ArrayDataTypeType arrayType = (ArrayDataTypeType) argType;
                                            argType = null;
                                            // the array variable
                                            for (Dimension dim : ((ArrayParameterRefEntryType) seqEntry.getValue()).getDimensionList().getDimension()) {
                                                // Build the array size string
                                                arraySize += String.valueOf(dim.getEndingIndex().getFixedValue()) + ",";
                                            }
                                            arraySize = CcddUtilities.removeTrailer(arraySize, ",");
                                            // data type entry
                                            for (NameDescriptionType type : argTypeSet) {
                                                // reference matches the data type name
                                                if (arrayType.getArrayTypeRef().equals(type.getName())) {
                                                    // Store the reference to the array
                                                    // parameter's data type and stop searching
                                                    argType = type;
                                                    break;
                                                }
                                            }
                                            break;
                                        }
                                    }
                                }
                                // individual array members)
                                if (argType != null) {
                                    // Check if the argument is an integer data type
                                    if (argType instanceof IntegerArgumentType) {
                                        IntegerArgumentType icmd = (IntegerArgumentType) argType;
                                        // Get the number of bits occupied by the argument
                                        bitLength = icmd.getSizeInBits();
                                        // Get the argument units reference
                                        unitSet = icmd.getUnitSet();
                                        // Check if integer encoding is set to 'unsigned'
                                        if (icmd.getIntegerDataEncoding().getEncoding().equalsIgnoreCase("unsigned")) {
                                            isUnsigned = true;
                                        }
                                        // Determine the smallest integer size that contains
                                        // the number of bits occupied by the argument
                                        sizeInBytes = 8;
                                        while (bitLength.longValue() > sizeInBytes) {
                                            sizeInBytes *= 2;
                                        }
                                        sizeInBytes /= 8;
                                        // Get the argument alarm
                                        IntegerArgumentType.ValidRangeSet alarmType = icmd.getValidRangeSet();
                                        // Check if the argument has an alarm
                                        if (alarmType != null) {
                                            // Get the alarm range
                                            List<IntegerRangeType> alarmRange = alarmType.getValidRange();
                                            // Check if the alarm range exists
                                            if (alarmRange != null) {
                                                // Store the minimum alarm value
                                                minimum = alarmRange.get(0).getMinInclusive();
                                                // Store the maximum alarm value
                                                maximum = alarmRange.get(0).getMaxInclusive();
                                            }
                                        }
                                        isInteger = true;
                                    } else // Check if the argument is a floating point data type
                                    if (argType instanceof FloatArgumentType) {
                                        // Get the float argument attributes
                                        FloatArgumentType fcmd = (FloatArgumentType) argType;
                                        sizeInBytes = fcmd.getSizeInBits().longValue() / 8;
                                        unitSet = fcmd.getUnitSet();
                                        // Get the argument alarm
                                        FloatArgumentType.ValidRangeSet alarmType = fcmd.getValidRangeSet();
                                        // Check if the argument has an alarm
                                        if (alarmType != null) {
                                            // Get the alarm range
                                            List<FloatRangeType> alarmRange = alarmType.getValidRange();
                                            // Check if the alarm range exists
                                            if (alarmRange != null) {
                                                // Get the minimum value
                                                Double min = alarmRange.get(0).getMinInclusive();
                                                // Check if a minimum value exists
                                                if (min != null) {
                                                    // Get the minimum alarm value
                                                    minimum = String.valueOf(min);
                                                }
                                                // Get the maximum value
                                                Double max = alarmRange.get(0).getMaxInclusive();
                                                // Check if a maximum value exists
                                                if (max != null) {
                                                    // Get the maximum alarm value
                                                    maximum = String.valueOf(max);
                                                }
                                            }
                                        }
                                        isFloat = true;
                                    } else // Check if the argument is a string data type
                                    if (argType instanceof StringDataType) {
                                        // Get the string argument attributes
                                        StringDataType scmd = (StringDataType) argType;
                                        sizeInBytes = scmd.getCharacterWidth().longValue();
                                        unitSet = scmd.getUnitSet();
                                        isString = true;
                                    } else // Check if the argument is an enumerated data type
                                    if (argType instanceof EnumeratedDataType) {
                                        EnumeratedDataType ecmd = (EnumeratedDataType) argType;
                                        EnumerationList enumList = ecmd.getEnumerationList();
                                        // Check if any enumeration parameters are defined
                                        if (enumList != null) {
                                            // Step through each enumeration parameter
                                            for (ValueEnumerationType enumType : enumList.getEnumeration()) {
                                                // Check if this is the first parameter
                                                if (enumeration == null) {
                                                    // Initialize the enumeration string
                                                    enumeration = "";
                                                } else // Not the first parameter
                                                {
                                                    // Add the separator for the
                                                    // enumerations
                                                    enumeration += ", ";
                                                }
                                                // Begin building this enumeration
                                                enumeration += enumType.getValue() + " | " + enumType.getLabel();
                                            }
                                            bitLength = ecmd.getIntegerDataEncoding().getSizeInBits();
                                            unitSet = ecmd.getUnitSet();
                                            // 'unsigned'
                                            if (ecmd.getIntegerDataEncoding().getEncoding().equalsIgnoreCase("unsigned")) {
                                                isUnsigned = true;
                                            }
                                            // Determine the smallest integer size that
                                            // contains the number of bits occupied by the
                                            // argument
                                            sizeInBytes = 8;
                                            while (bitLength.longValue() > sizeInBytes) {
                                                sizeInBytes *= 2;
                                            }
                                            sizeInBytes /= 8;
                                            isInteger = true;
                                        }
                                    }
                                    // Get the name of the data type from the data type table
                                    // that matches the base type and size of the parameter
                                    dataType = getDataType(dataTypeHandler, sizeInBytes, isInteger, isUnsigned, isFloat, isString);
                                    // Check if the description exists
                                    if (argType.getLongDescription() != null) {
                                        // Store the description
                                        description = argType.getLongDescription();
                                    }
                                    // Check if the units exists
                                    if (unitSet != null) {
                                        List<UnitType> unitType = unitSet.getUnit();
                                        // Check if the units is set
                                        if (!unitType.isEmpty()) {
                                            // Store the units
                                            units = unitType.get(0).getContent();
                                        }
                                    }
                                    // dictated by the table type definition
                                    if (cmdArgIndex < commandArguments.size()) {
                                        // Get the command argument reference
                                        AssociatedColumns acmdArg = commandArguments.get(cmdArgIndex);
                                        // Check if the command argument name is present
                                        if (acmdArg.getName() != -1) {
                                            // Store the command argument name
                                            newRow[acmdArg.getName()] = argList.getName();
                                        }
                                        // Check if the command argument data type is present
                                        if (acmdArg.getDataType() != -1 && dataType != null) {
                                            // Store the command argument data type
                                            newRow[acmdArg.getDataType()] = dataType;
                                        }
                                        // Check if the command argument array size is present
                                        if (acmdArg.getArraySize() != -1 && arraySize != null) {
                                            // Store the command argument array size
                                            newRow[acmdArg.getArraySize()] = arraySize;
                                        }
                                        // Check if the command argument bit length is present
                                        if (acmdArg.getBitLength() != -1 && bitLength != null) {
                                            // Store the command argument bit length
                                            newRow[acmdArg.getBitLength()] = bitLength.toString();
                                        }
                                        // Check if the command argument enumeration is present
                                        if (acmdArg.getEnumeration() != -1 && enumeration != null) {
                                            // Store the command argument enumeration
                                            newRow[acmdArg.getEnumeration()] = enumeration;
                                        }
                                        // Check if the command argument description is present
                                        if (acmdArg.getDescription() != -1 && description != null) {
                                            // Store the command argument description
                                            newRow[acmdArg.getDescription()] = description;
                                        }
                                        // Check if the command argument units is present
                                        if (acmdArg.getUnits() != -1 && units != null) {
                                            // Store the command argument units
                                            newRow[acmdArg.getUnits()] = units;
                                        }
                                        // Check if the command argument minimum is present
                                        if (acmdArg.getMinimum() != -1 && minimum != null) {
                                            // Store the command argument minimum
                                            newRow[acmdArg.getMinimum()] = minimum;
                                        }
                                        // Check if the command argument maximum is present
                                        if (acmdArg.getMaximum() != -1 && maximum != null) {
                                            // Store the command argument maximum
                                            newRow[acmdArg.getMaximum()] = maximum;
                                        }
                                    }
                                }
                                // Increment the argument index
                                cmdArgIndex++;
                                break;
                            }
                        }
                    }
                }
                // Add the new row to the table definition
                tableDefn.addData(newRow);
            }
        }
    }
    // Add the command table definition to the list
    tableDefinitions.add(tableDefn);
}
Also used : MetaCommandSet(org.omg.space.xtce.CommandMetaDataType.MetaCommandSet) EnumerationList(org.omg.space.xtce.EnumeratedDataType.EnumerationList) ValueEnumerationType(org.omg.space.xtce.ValueEnumerationType) ArgumentTypeSetType(org.omg.space.xtce.ArgumentTypeSetType) Argument(org.omg.space.xtce.MetaCommandType.ArgumentList.Argument) IntegerRangeType(org.omg.space.xtce.IntegerRangeType) CommandContainerType(org.omg.space.xtce.CommandContainerType) NameDescriptionType(org.omg.space.xtce.NameDescriptionType) StringDataType(org.omg.space.xtce.StringDataType) BaseMetaCommand(org.omg.space.xtce.MetaCommandType.BaseMetaCommand) UnitType(org.omg.space.xtce.UnitType) ArrayParameterRefEntryType(org.omg.space.xtce.ArrayParameterRefEntryType) TableDefinition(CCDD.CcddClassesDataTable.TableDefinition) MemberList(org.omg.space.xtce.AggregateDataType.MemberList) ArgumentList(org.omg.space.xtce.MetaCommandType.ArgumentList) ArgumentAssignmentList(org.omg.space.xtce.MetaCommandType.BaseMetaCommand.ArgumentAssignmentList) EnumerationList(org.omg.space.xtce.EnumeratedDataType.EnumerationList) List(java.util.List) DimensionList(org.omg.space.xtce.ArrayParameterRefEntryType.DimensionList) ComparisonList(org.omg.space.xtce.MatchCriteriaType.ComparisonList) ArrayList(java.util.ArrayList) EnumeratedDataType(org.omg.space.xtce.EnumeratedDataType) Dimension(org.omg.space.xtce.ArrayParameterRefEntryType.DimensionList.Dimension) ArrayDataTypeType(org.omg.space.xtce.ArrayDataTypeType) ArgumentAssignment(org.omg.space.xtce.MetaCommandType.BaseMetaCommand.ArgumentAssignmentList.ArgumentAssignment) FloatArgumentType(org.omg.space.xtce.ArgumentTypeSetType.FloatArgumentType) IntegerArgumentType(org.omg.space.xtce.ArgumentTypeSetType.IntegerArgumentType) AssociatedColumns(CCDD.CcddClassesDataTable.AssociatedColumns) BigInteger(java.math.BigInteger) UnitSet(org.omg.space.xtce.BaseDataType.UnitSet) MetaCommandType(org.omg.space.xtce.MetaCommandType)

Aggregations

TableDefinition (CCDD.CcddClassesDataTable.TableDefinition)11 CCDDException (CCDD.CcddClassesDataTable.CCDDException)5 TypeDefinition (CCDD.CcddTableTypeHandler.TypeDefinition)5 ArrayList (java.util.ArrayList)5 IOException (java.io.IOException)4 BigInteger (java.math.BigInteger)4 FileEnvVar (CCDD.CcddClassesComponent.FileEnvVar)2 AssociatedColumns (CCDD.CcddClassesDataTable.AssociatedColumns)2 TableTypeDefinition (CCDD.CcddClassesDataTable.TableTypeDefinition)2 BufferedReader (java.io.BufferedReader)2 FileReader (java.io.FileReader)2 SQLException (java.sql.SQLException)2 JAXBElement (javax.xml.bind.JAXBElement)2 JAXBException (javax.xml.bind.JAXBException)2 ArrayDataType (org.ccsds.schema.sois.seds.ArrayDataType)2 DimensionSizeType (org.ccsds.schema.sois.seds.DimensionSizeType)2 EnumeratedDataType (org.ccsds.schema.sois.seds.EnumeratedDataType)2 EnumerationListType (org.ccsds.schema.sois.seds.EnumerationListType)2 FloatDataType (org.ccsds.schema.sois.seds.FloatDataType)2 IntegerDataType (org.ccsds.schema.sois.seds.IntegerDataType)2