/** @throws Exception */
  public void test_regression_121857() throws Exception {
    SessionHandle session = new DesignEngine(new DesignConfig()).newSessionHandle(ULocale.ENGLISH);
    ReportDesignHandle designHandle = session.createDesign();
    ElementFactory factory = designHandle.getElementFactory();
    OdaDataSourceHandle datasource =
        factory.newOdaDataSource(
            "dsource", //$NON-NLS-1$
            "org.eclipse.birt.report.data.oda.jdbc"); //$NON-NLS-1$
    OdaDataSetHandle dataset =
        factory.newOdaDataSet(
            "dset", //$NON-NLS-1$
            "org.eclipse.birt.report.data.oda.jdbc.JdbcSelectDataSet"); //$NON-NLS-1$
    dataset.setDataSource("dsource"); // $NON-NLS-1$

    designHandle.getDataSources().add(datasource);
    designHandle.getDataSets().add(dataset);

    datasource.drop();
    assertNull(designHandle.findDataSource("dsource")); // $NON-NLS-1$
    assertNull(dataset.getDataSource());
    assertEquals("dsource", dataset.getDataSourceName()); // $NON-NLS-1$
  }
  /**
   * Updates the data set handle with specified values.
   *
   * @param setDesign the data set design
   * @param setHandle the data set handle
   * @param isSourceChanged
   * @param requestParameters
   * @param requestResultSets
   * @throws SemanticException
   */
  private void updateDataSetHandle(
      DataSetDesign setDesign,
      OdaDataSetHandle setHandle,
      boolean isSourceChanged,
      DataSetParameters requestParameters,
      ResultSets requestResultSets)
      throws SemanticException {
    if (setDesign == null || setHandle == null) return;

    DesignUtil.validateObject(setDesign);

    CommandStack stack = setHandle.getModuleHandle().getCommandStack();

    stack.startTrans(null);
    try {
      // extension id is set without undo/redo support.

      setHandle
          .getElement()
          .setProperty(OdaDataSourceHandle.EXTENSION_ID_PROP, setDesign.getOdaExtensionDataSetId());

      setHandle.setName(setDesign.getName());
      setHandle.setDisplayName(setDesign.getDisplayName());
      setHandle.setDisplayNameKey(setDesign.getDisplayNameKey());

      // set public properties.

      Properties props = setDesign.getPublicProperties();
      if (props != null) {
        EList propList = props.getProperties();
        for (int i = 0; i < propList.size(); i++) {
          Property prop = (Property) propList.get(i);
          setHandle.setProperty(prop.getName(), prop.getValue());
        }
      }

      // set private properties.

      props = setDesign.getPrivateProperties();
      if (props != null) {
        EList propList = props.getProperties();
        for (int i = 0; i < propList.size(); i++) {
          Property prop = (Property) propList.get(i);
          setHandle.setPrivateDriverProperty(prop.getName(), prop.getValue());
        }
      }

      ResultSetDefinition cachedResultDefn = null;

      if (requestResultSets != null && !requestResultSets.getResultSetDefinitions().isEmpty())
        cachedResultDefn = (ResultSetDefinition) requestResultSets.getResultSetDefinitions().get(0);

      ResultSetsAdapter tmpAdapter = new ResultSetsAdapter(setHandle, setDesign);
      updateROMResultSets(setHandle, tmpAdapter, cachedResultDefn);

      setHandle.setResultSetName(setDesign.getPrimaryResultSetName());

      setHandle.setQueryText(setDesign.getQueryText());

      // designer values must be saved after convert data set parameters
      // and result set columns.

      // Set Parameter

      // Get user-defined parameters

      DataSetParameterAdapter dataParamAdapter = new DataSetParameterAdapter(setHandle, setDesign);
      dataParamAdapter.updateUserDefinedParameter(
          SchemaConversionUtil.convertToDesignParameters(requestParameters));

      // Update parameters of dataset handle.

      updateROMDataSetParams(dataParamAdapter, requestParameters);

      DataSourceDesign sourceDesign = setDesign.getDataSourceDesign();
      if (sourceDesign != null) {
        OdaDataSourceHandle sourceHandle = (OdaDataSourceHandle) setHandle.getDataSource();

        DataSourceAdapter dataSourceAdapter = new DataSourceAdapter();

        // only the local data source can be used.

        if (isSourceChanged
            && sourceHandle != null
            && !sourceHandle.getModuleHandle().isReadOnly()) {
          setHandle.setDataSource(sourceDesign.getName());
          dataSourceAdapter.updateDataSourceHandle(sourceDesign, sourceHandle);
        }

        // if the source is not changed, and it is not in the included
        // library, then we can update it.

        if (!isSourceChanged
            && sourceHandle != null
            && !sourceHandle.getModuleHandle().isReadOnly()
            && !(dataSourceAdapter.isEqualDataSourceDesign(
                dataSourceAdapter.createDataSourceDesign(sourceHandle), sourceDesign))) {
          dataSourceAdapter.updateDataSourceHandle(sourceDesign, sourceHandle);
        }
      } else setHandle.setDataSource(defaultDataSourceName);

      updateDesignerValue(
          setDesign,
          setHandle,
          requestParameters,
          dataParamAdapter.getUserDefinedParams(),
          requestResultSets);

      updateROMMessageFile(sourceDesign, setHandle.getModuleHandle());
    } catch (SemanticException e) {
      stack.rollback();
      throw e;
    }

    stack.commit();
  }