/**
  * Make a synchronous call to compute the status of the given lookup list. This call will return a
  * JSON status string that contains the list of plugins/features IDs that were found. It's up to
  * the caller to determine it the list contains the requested item (plugin). If it's not in the
  * list, it's not installed.
  *
  * @param lookup Expected an multi-dimensional Object array with rows that contain: plugin-id,
  *     min-version, update-site, feature-id.
  * @return A JSON status for the given plugin(s)
  */
 @ControllerAction
 public Object synchronousComputeInstalledPlugins(final Object lookup) {
   final IConfigurationProcessor processor = getProcessor();
   ConfigurationStatus status = processor.getStatus(new NullProgressMonitor(), lookup, true);
   String jsonStatus = JSON.toString(status);
   return jsonStatus;
 }
 /**
  * Returns an immediate JSON notification result regarding the installed plugins.<br>
  * The status of the result can be any of the {@link ConfigurationStatus} status constants.
  *
  * @return An immediate JSON notification result regarding the installed plugins
  */
 @ControllerAction
 public Object getInstalledPlugins() {
   IConfigurationProcessor processor = getProcessor();
   // We rely on the fact that the ConfigurationStatus implements the JSON Convertible interface
   String processorResult = JSON.toString(processor.getStatus(null, null, false));
   // Construct a response which is similar to the notification structure being fired when
   // computeInstalledGems is invoked. This makes the JS side handling easier in both case.
   return BrowserNotifier.toJSONNotification(
       IBrowserNotificationConstants.EVENT,
       IBrowserNotificationConstants.EVENT_TYPE_RESPONSE,
       processorResult);
 }