BIRT: how to programmatically delete a dataset parameter

I want to modify an existing * .rptdesign file and save it under a new name. The existing file contains an Data SetSQL template select statement and several DS options. I would like to use the actual SQL select statement, which uses only part of the DS options.

However, the following code throws an exception:

Exception in thread "main" `java.lang.RuntimeException`: *The structure is floating, and its handle is invalid!*
at org.eclipse.birt.report.model.api.StructureHandle.getStringProperty(StructureHandle.java:207)
at org.eclipse.birt.report.model.api.DataSetParameterHandle.getName(DataSetParameterHandle.java:143)
at org.eclipse.birt.report.model.api.DataSetHandle$DataSetParametersPropertyHandle.removeParamBindingsFor(DataSetHandle.java:851)
at org.eclipse.birt.report.model.api.DataSetHandle$DataSetParametersPropertyHandle.removeItems(DataSetHandle.java:694)

-

    OdaDataSetHandle dsMaster = (OdaDataSetHandle) report.findDataSet("Master");

    HashSet<String> bindVarsUsed = new HashSet<String>();
    ...
    // find out which DS parameters are actually used
    HashSet<String> bindVarsUsed = new HashSet<String>();
    ...
    ArrayList<OdaDataSetParameterHandle> toRemove = new ArrayList<OdaDataSetParameterHandle>();
    for (Iterator iter = dsMaster.parametersIterator(); iter.hasNext(); ) {
        OdaDataSetParameterHandle dsPara = (OdaDataSetParameterHandle)iter.next();
        String name = dsPara.getName();
        if (name.startsWith("param_")) {
            String bindVarName = name.substring(6);
            if (!bindVarsUsed.contains(bindVarName)) {
                toRemove.add(dsPara);
            }
        }
    }
    PropertyHandle paramsHandle = dsMaster.getPropertyHandle( OdaDataSetHandle.PARAMETERS_PROP );
    paramsHandle.removeItems(toRemove);

What is wrong here? Has anyone used the DE API to remove parameters from an existing dataset?

+4
source share
1 answer

I had a similar problem. He resolved it by calling "removeItem" several times, and also had to re-evaluate the Iterator parameters each time.

protected void updateDataSetParameters(OdaDataSetHandle dataSetHandle) throws SemanticException {
    int countMatches = StringUtils.countMatches(dataSetHandle.getQueryText(), "?");
    int paramIndex = 0;
    do {
        paramIndex = 0;
        PropertyHandle odaDataSetParameterProp = dataSetHandle.getPropertyHandle(OdaDataSetHandle.PARAMETERS_PROP);   
        Iterator parametersIterator = dataSetHandle.parametersIterator();
        while(parametersIterator.hasNext()) {
            Object next = parametersIterator.next();
            paramIndex++;
            if(paramIndex > countMatches) {
                odaDataSetParameterProp.removeItem(next);
                break;
            }
        }
        if(paramIndex < countMatches) {
            paramIndex++;
            OdaDataSetParameter dataSetParameter = createDataSetParameter(paramIndex);
            odaDataSetParameterProp.addItem(dataSetParameter);
        }
    } while(countMatches != paramIndex);
}

private OdaDataSetParameter createDataSetParameter(int paramIndex) {
    OdaDataSetParameter dataSetParameter = StructureFactory.createOdaDataSetParameter();
    dataSetParameter.setName("param_" + paramIndex);
    dataSetParameter.setDataType(DesignChoiceConstants.PARAM_TYPE_INTEGER);
    dataSetParameter.setNativeDataType(1);
    dataSetParameter.setPosition(paramIndex);
    dataSetParameter.setIsInput(true);
    dataSetParameter.setIsOutput(false);
    dataSetParameter.setExpressionProperty("defaultValue", new Expression("<evaluation script>", ExpressionType.JAVASCRIPT));
    return dataSetParameter;
}
+1

Source: https://habr.com/ru/post/1527893/


All Articles