protected void collectSuites(IPluginModelBase model, Set<String> visited) {
   if (!model.isEnabled()) return;
   BundleDescription description = model.getBundleDescription();
   if (!visited.add(description.getSymbolicName())) return;
   model.addModelChangedListener(this);
   listentingTo.add(model);
   for (IPluginExtension ext : model.getExtensions(true).getExtensions())
     if ("org.xpect.testSuite".equals(ext.getPoint())) {
       for (IPluginObject child : ext.getChildren()) {
         if (child instanceof IPluginElement) {
           IPluginElement pluginElement = (IPluginElement) child;
           IPluginAttribute clazz = pluginElement.getAttribute("class");
           IPluginAttribute fileExtension = pluginElement.getAttribute("fileExtension");
           if (clazz != null && fileExtension != null) {
             LazyClass<Object> lazyClass =
                 LazyClass.create(
                     Object.class, clazz.getValue(), (Function<String, Class<?>>) null);
             TestSuiteInfo info =
                 new TestSuiteInfo(lazyClass, Collections.singleton(fileExtension.getValue()));
             this.extToInfo.put(fileExtension.getValue(), info);
           }
         }
       }
     }
   for (BundleDescription desc : description.getDependents()) {
     collectSuites(PluginRegistry.findModel(desc), visited);
   }
 }
 private void processCategoryElements(IPluginExtension[] extensions) {
   // Linear search:  Process all cheat sheet extensions found
   for (int i = 0; i < extensions.length; i++) {
     if (extensions[i].getChildCount() == 0) {
       // Extension has no children, skip to the next extension
       continue;
     }
     IPluginExtension extension = extensions[i];
     IPluginObject[] pluginObjects = extension.getChildren();
     // Process all children
     for (int j = 0; j < pluginObjects.length; j++) {
       if (pluginObjects[j] instanceof IPluginElement) {
         IPluginElement element = (IPluginElement) pluginObjects[j];
         if (element.getName().equals(F_CS_ELEMENT_CATEGORY)) {
           // Category element
           // Update the category combo
           updateUICategoryComboElement(element);
         }
       }
     }
   }
 }
 private void processCheatSheetElements(IPluginExtension[] extensions) {
   // Query cheat sheet extensions for information required to update
   // the description text and category combo widgets
   // Linear search:  Process all cheat sheet extensions found
   for (int i = 0; i < extensions.length; i++) {
     if (extensions[i].getChildCount() == 0) {
       // Extension has no children, skip to the next extension
       continue;
     }
     IPluginExtension extension = extensions[i];
     IPluginObject[] pluginObjects = extension.getChildren();
     // Process all children
     for (int j = 0; j < pluginObjects.length; j++) {
       if (pluginObjects[j] instanceof IPluginElement) {
         IPluginElement element = (IPluginElement) pluginObjects[j];
         if (element.getName().equals(F_CS_ELEMENT_CHEATSHEET)) {
           // Cheat sheet element
           processCheatSheetElement(element, fDataCheatSheetID);
         }
       }
     }
   }
 }
  @Override
  protected void updateModel(IProgressMonitor monitor) throws CoreException {
    IPluginBase plugin = model.getPluginBase();
    IPluginExtension extension = createExtension(EXTENSION_POINT, true);
    IPluginModelFactory factory = model.getPluginFactory();

    IPluginElement setElement = factory.createElement(extension);
    setElement.setName("plotting_tool_page");
    setElement.setAttribute(
        "class", getStringOption(KEY_PACKAGE_NAME) + "." + getStringOption(KEY_CLASS_NAME));
    setElement.setAttribute("id", getStringOption(KEY_EXTENSION_ID));
    setElement.setAttribute("icon", "icons/default.gif");
    setElement.setAttribute("tooltip", getStringOption(KEY_TOOLTIP));
    setElement.setAttribute("label", getStringOption(KEY_EXTENSION_NAME));
    setElement.setAttribute("cheat_sheet_id", getStringOption(KEY_CHEAT_SHEET_ID));
    setElement.setAttribute("visible", "true");
    setElement.setAttribute("category", getStringOption(KEY_CATEGORY));

    extension.add(setElement);
    if (!extension.isInTheModel()) {
      plugin.add(extension);
    }
  }