/**
   * get a task editor extension for a specific task attribute
   *
   * @param taskRepository
   * @param taskAttribute
   * @return the extension, or null if there is none
   * @see #getTaskEditorExtension(TaskRepository);
   * @since 3.11
   */
  public static AbstractTaskEditorExtension getTaskEditorExtension(
      TaskRepository taskRepository, TaskAttribute taskAttribute) {
    init();
    String input = taskAttribute.getMetaData().getMediaType();
    if (input != null) {
      try {
        MediaType media = MediaType.parse(input);
        Multimap<String, String> parameters = media.parameters();
        if (parameters.containsKey(MARKUP_KEY)) {
          Iterator<String> iter = parameters.get(MARKUP_KEY).iterator();
          String markup = iter.next();
          Iterator<String> baseMarkupIterator = parameters.get(BASE_MARKUP_KEY).iterator();
          String baseMarkup =
              (baseMarkupIterator.hasNext() ? baseMarkupIterator.next() : ""); // $NON-NLS-1$

          SortedSet<RegisteredTaskEditorExtension> extensions = getTaskEditorExtensions();
          for (RegisteredTaskEditorExtension extension : extensions) {
            if (markup.equals(extension.getName()) || baseMarkup.equals(extension.getName())) {
              return extension.getExtension();
            }
          }
        }
      } catch (IllegalArgumentException e) {
        StatusHandler.log(
            new Status(
                IStatus.ERROR,
                TasksUiPlugin.ID_PLUGIN,
                String.format(
                    "Unable to parse markup type for attribute %s", taskAttribute.toString()),
                e)); //$NON-NLS-1$
      }
    }
    return getTaskEditorExtension(taskRepository);
  }
 /**
  * get a task editor extension for a specific repository
  *
  * @param taskRepository
  * @return the extension, or null if there is none
  * @see #getDefaultTaskEditorExtension(TaskRepository)
  */
 public static AbstractTaskEditorExtension getTaskEditorExtension(TaskRepository taskRepository) {
   init();
   String extensionId = getTaskEditorExtensionId(taskRepository);
   if (extensionId != null) {
     RegisteredTaskEditorExtension taskEditorExtension = extensionsById.get(extensionId);
     return taskEditorExtension == null ? null : taskEditorExtension.getExtension();
   }
   return null;
 }
 /**
  * Contributes an extension to the {@link TaskEditor}.
  *
  * @param pluginId the id of the contributing plug-in, may be <code>null</code>
  * @param id the id of the extension, may not be <code>null</code>
  * @param name the name of the extension that is displayed in the settings page
  * @param extension the extension implementation
  */
 public static void addTaskEditorExtension(
     String pluginId, String id, String name, AbstractTaskEditorExtension extension) {
   Assert.isNotNull(id);
   RegisteredTaskEditorExtension descriptor =
       new RegisteredTaskEditorExtension(extension, id, name);
   descriptor.setPluginId(pluginId);
   RegisteredTaskEditorExtension previous = extensionsById.put(id, descriptor);
   if (previous != null) {
     StatusHandler.log(
         new Status(
             IStatus.ERROR,
             TasksUiPlugin.ID_PLUGIN,
             "Duplicate taskEditorExtension id=" //$NON-NLS-1$
                 + id,
             null));
   }
 }