private void addExtensionNodes() {

    String databaseProductName =
        getSession().getRoot().getDatabaseProductName().toLowerCase().trim();

    IExtensionRegistry registry = Platform.getExtensionRegistry();
    IExtensionPoint point = registry.getExtensionPoint("AsteriskSafletDesigner.diagram", "node");
    IExtension[] extensions = point.getExtensions();

    for (IExtension e : extensions) {

      IConfigurationElement[] ces = e.getConfigurationElements();

      for (IConfigurationElement ce : ces) {
        try {

          // include only nodes that are attachted to the schema
          // node..
          String parent = ce.getAttribute("parent-node");
          if (parent.indexOf("catalog") == -1) {
            continue;
          }

          boolean isValidProduct = false;
          String[] validProducts = ce.getAttribute("database-product-name").split(",");

          // include only nodes valid for this database
          for (String validProduct : validProducts) {

            String product = validProduct.toLowerCase().trim();

            if (product.length() == 0) {
              continue;
            }

            if (product.equals("*")) {
              isValidProduct = true;
              break;
            }

            String regex = TextUtil.replaceChar(product, '*', ".*");
            if (databaseProductName.matches(regex)) {
              isValidProduct = true;
              break;
            }
          }

          if (!isValidProduct) {
            continue;
          }

          String imagePath = ce.getAttribute("icon");
          String id = ce.getAttribute("id");
          String type = ce.getAttribute("table-type").trim();

          AbstractNode childNode = (AbstractNode) ce.createExecutableExtension("class");
          childNode.setParent(this);
          childNode.setSession(_session);
          childNode.setType(type);

          String fragmentId = id.substring(0, id.indexOf('.', 28));
          if (imagePath != null && imagePath.trim().length() != 0) {
            childNode.setImage(ImageUtil.getFragmentImage(fragmentId, imagePath));
          }

          _childNames.add(childNode.getLabelText());
          if (!isExcludedByFilter(childNode.getLabelText())) {
            addChildNode(childNode);
          }

        } catch (Throwable ex) {
          SQLExplorerPlugin.error("Could not create child node", ex);
        }
      }
    }
  }
  /**
   * Location extenstion nodes for a given tableType
   *
   * @param tableType for which to find extension node
   * @return INode or null if no extensions found
   */
  private INode findExtensionNode(String tableType) {

    String databaseProductName =
        getSession().getRoot().getDatabaseProductName().toLowerCase().trim();

    IExtensionRegistry registry = Platform.getExtensionRegistry();
    IExtensionPoint point = registry.getExtensionPoint("AsteriskSafletDesigner.diagram", "node");
    IExtension[] extensions = point.getExtensions();

    for (IExtension e : extensions) {

      IConfigurationElement[] ces = e.getConfigurationElements();

      for (IConfigurationElement ce : ces) {
        try {

          // include only nodes that are attachted to the schema
          // node..
          String parent = ce.getAttribute("parent-node");
          if (parent.indexOf("catalog") == -1) {
            continue;
          }

          boolean isValidProduct = false;
          String[] validProducts = ce.getAttribute("database-product-name").split(",");

          // include only nodes valid for this database
          for (String validProduct : validProducts) {

            String product = validProduct.toLowerCase().trim();

            if (product.length() == 0) {
              continue;
            }

            if (product.equals("*")) {
              isValidProduct = true;
              break;
            }

            String regex = TextUtil.replaceChar(product, '*', ".*");
            if (databaseProductName.matches(regex)) {
              isValidProduct = true;
              break;
            }
          }

          if (!isValidProduct) {
            continue;
          }

          // check if it is the correct type
          String type = ce.getAttribute("table-type").trim();
          if (!type.equalsIgnoreCase(tableType)) {
            continue;
          }

          AbstractNode childNode = (AbstractNode) ce.createExecutableExtension("class");
          childNode.setParent(this);
          childNode.setSession(_session);

          return childNode;

        } catch (Throwable ex) {
          SQLExplorerPlugin.error("Could not create child node", ex);
        }
      }
    }

    return null;
  }