/** Returns a collection of dataSetUI elements in the given extension. */
  private Hashtable getDataSetUIElements(IExtension extension) throws OdaException {
    Hashtable dataSetElements = new Hashtable();
    IConfigurationElement[] configElements =
        UIManifestExplorer.getNamedElements(extension, DATA_SET_ELEMENT_NAME);
    for (int i = 0, size = configElements.length; i < size; i++) {
      IConfigurationElement configElement = configElements[i];

      String dataSetId = configElement.getAttribute("id"); // $NON-NLS-1$

      // if duplicated data set ids exist in the extension,
      // only the last one applies
      dataSetElements.put(dataSetId, new DataSetUIElement(configElement));
    }

    if (dataSetElements.size() < 1) // expects one or more
    throw new OdaException(
          Messages.bind(Messages.manifest_dataSetUi_missingElement, DATA_SET_ELEMENT_NAME));

    return dataSetElements;
  }
  UIExtensionManifest(IExtension dataSourceExtn) throws OdaException {
    // first process the dataSourceUI element
    IConfigurationElement dataSourceElement =
        UIManifestExplorer.getNamedElement(dataSourceExtn, DATA_SOURCE_ELEMENT_NAME);
    assert (dataSourceElement != null);

    m_namespace = dataSourceExtn.getContributor().getName();

    // first cache the data source element's attributes
    m_dataSourceElementId = dataSourceElement.getAttribute("id"); // $NON-NLS-1$
    assert (m_dataSourceElementId != null && m_dataSourceElementId.length() > 0);

    // newDataSourceWizard element associated with dataSourceUI
    IConfigurationElement[] newWizardElements =
        dataSourceElement.getChildren(DATA_SOURCE_WIZARD_ELEMENT_NAME);
    if (newWizardElements.length < 1) // expects one element
    throw new OdaException(
          Messages.bind(Messages.manifest_missingAttributeValue, DATA_SOURCE_WIZARD_ELEMENT_NAME));
    m_dataSourceWizardInfo = new DataSourceWizardInfo(newWizardElements[0]);

    // data set UI definition elements in the same extension
    m_dataSetUIElements = getDataSetUIElements(dataSourceExtn);
  }