/**
  * @param counter
  * @param queryId can be null and then the id of the query will be set to the counter name
  * @param style
  */
 public SingleCounterQueryDef(ResourceId counter, String queryId, Style style) {
   super();
   // Add a timestamp resource and the counter resource to the query
   List<ResourceDef> listResources = new LinkedList<ResourceDef>();
   ResourceId ridTimestamp =
       new ResourceId(
           counter.getHostId(),
           counter.getAgentId(),
           counter.getEntityId(),
           CounterDescriptor.TIMESTAMP_ID);
   listResources.add(new ResourceDef(ridTimestamp));
   ResourceDef resourceDef;
   if (style == null) {
     resourceDef = new ResourceDef(counter);
     resourceDef.setIName("$counter");
   } else {
     resourceDef = new ResourceDef(counter, style.getStyleDef());
     if (Utils.isEmptyString(style.getIName())) {
       resourceDef.setIName(queryId);
     }
   }
   listResources.add(resourceDef);
   String counterName = counter.getCounterId().toString();
   // set up
   if (!Utils.isEmptyString(queryId)) {
     this.id = queryId;
   } else {
     this.id = counterName;
   }
   this.resources.addAll(listResources);
 }
 /**
  * NOTE: this method will change the context of the calling thread and the caller must insure that
  * prepareThreadOnExit(String) is invoked at the end of the operation.
  *
  * @param identifier plugin instance identifier
  * @param classToLoad the class to load
  * @param jars jars with entity code and resources; path relative to application.home property
  * @param pluginData
  * @return
  * @throws AppException
  * @throws ClassNotFoundException
  * @throws MalformedURLException
  * @throws URISyntaxException
  */
 public Class<?> getClass(
     String identifier, String classToLoad, String[] jars, PluginDescriptor pluginData)
     throws AppException, ClassNotFoundException, MalformedURLException, URISyntaxException {
   Class<?> clazz = null;
   String classpath = null;
   if (pluginData != null) {
     classpath = pluginData.getClasspath();
     if (classpath != null) {
       // if cutom classpath is specified, the jars are mandatory
       if (jars == null) {
         AppException e = new AppException("Code location information is missing");
         e.setIsInternalAppError();
         throw e;
       }
     }
   }
   if (jars != null) {
     List<String> pathList = new LinkedList<String>();
     for (int i = 0; i < jars.length; i++) {
       // now complete jars information
       pathList.add(Utils.getPath(jars[i]));
     }
     if (classpath != null) {
       pathList.add(classpath);
     }
     // check class loader id
     String classLoaderId = pluginData.getClassLoaderId();
     RegexClassLoader loader;
     if (Utils.isEmptyString(classLoaderId)) {
       loader =
           new RegexClassLoader(
               pathList.toArray(new String[pathList.size()]),
               pluginData.useParentLastClassloader());
     } else {
       // check if a classloader with the same id already created
       loader = fLoadersPerId.get(classLoaderId);
       String[] path = pathList.toArray(new String[pathList.size()]);
       if (loader == null) {
         // add it to the map
         loader = new RegexClassLoader(path, pluginData.useParentLastClassloader());
         fLoadersPerId.put(classLoaderId, loader);
       } else {
         // check for consistency: the classpath must be the same
         if (!loader.isCompatibleWithClasspath(path)) {
           throw new IncompatibleClassloaderError(
               classLoaderId,
               loader.getClasspathAsString(),
               RegexClassLoader.convertClasspathToString(path));
         }
       }
     }
     fLoadersPerExternalId.put(identifier, loader);
     prepareThreadOnEnter(identifier);
     clazz = Class.forName(classToLoad, true, loader);
   }
   if (clazz == null) {
     clazz = Class.forName(classToLoad);
   }
   return clazz;
 }
 /** @see com.ixora.rms.ui.artefacts.ArtefactSelectorPanel#handleRemoveArtefact() */
 protected void handleRemoveArtefact() {
   try {
     JTable table = getJTableArtefacts();
     int[] sel = table.getSelectedRows();
     if (Utils.isEmptyArray(sel)) {
       return;
     }
     for (int idx : sel) {
       DashboardInfo gi = (DashboardInfo) table.getModel().getValueAt(idx, 1);
       DashboardMap map = fDashboardRepository.getDashboardMap(fContext);
       if (map == null) {
         logger.error("Couldn't find query gruop map for context: " + this.fContext);
         return;
       }
       // ask for confitmation
       if (!UIUtils.getBooleanOkCancelInput(
           this.fViewContainer.getAppFrame(),
           MessageRepository.get(Msg.TITLE_CONFIRM_REMOVE_DASHBOARD),
           MessageRepository.get(
               Msg.TEXT_CONFIRM_REMOVE_DASHBOARD, new String[] {gi.getTranslatedName()}))) {
         return;
       }
       // remove the dashboard only for the current fSUOVersion
       map.remove(gi.getDashboard().getName(), fSUOVersion);
       fDashboardRepository.setDashboardMap(fContext, map);
       fDashboardRepository.save();
       // update model
       fSessionData.getDashboardHelper().removeDashboard(fContext, gi.getDashboard().getName());
       // refresh table model
       refreshTableModel();
     }
   } catch (Exception ex) {
     UIExceptionMgr.userException(ex);
   }
 }
 /** Launches the external browser with the given url. */
 private void handleSeeURL(URL url) {
   try {
     Utils.launchBrowser(url);
   } catch (Throwable e) {
     UIExceptionMgr.userException(e);
   }
 }
  /**
   * Sets the flag for the given dashboard.
   *
   * @param flag
   * @param context
   * @param dbName
   * @param value
   * @param commit
   */
  public void setDashboardFlag(
      int flag, ResourceId context, String dbName, boolean value, boolean commit) {
    // get views first
    DataViewInfoData[] data = getDataViewInfoData(context, dbName);
    if (data != null) {
      ResourceId rid;
      DataViewInfoData d;
      DataViewInfo dvinfo;
      for (int i = 0; i < data.length; i++) {
        d = data[i];
        dvinfo = d.getInfo();
        rid = d.getContext();
        model
            .getDataViewHelper()
            .setDataViewFlag(flag, rid, dvinfo.getDataView().getName(), value, commit);
      }
    }

    // now work with counters
    CounterInfoData[] counters = getCounterInfoData(context, dbName);
    if (!Utils.isEmptyArray(counters)) {
      // check that all counters are present
      for (CounterInfoData cid : counters) {
        ResourceInfo cInfo = model.getCounterHelper().getCounterInfo(cid.counterId);
        if (cInfo != null) {
          switch (flag) {
            case DashboardInfo.ENABLED:
              // if enabled is false then change the flag only for
              // counters which are not committed (this is to avoid a query
              // disabling the commited counters of another one)
              // @see QueryRealizerLiveSession for an excuse
              if (value || !cInfo.getCounterInfo().isCommitted()) {
                model
                    .getCounterHelper()
                    .setCounterFlag(cid.counterId, CounterInfo.ENABLED, value, true);
              }
              break;
            case DashboardInfo.ACTIVATED:
              model
                  .getCounterHelper()
                  .setCounterFlag(cid.counterId, CounterInfo.ACTIVATED, value, true);
          }
        }
      }
    }

    ArtefactInfoContainerImpl ac = model.getArtefactContainerImplForResource(context, true);
    if (ac == null) {
      if (logger.isTraceEnabled()) {
        logger.error("Couldn't find container for dashboard " + context);
      }
      return;
    }

    // enable the dashboard
    ac.setDashboardFlag(flag, dbName, value, commit);
    // refresh context node
    model.refreshNode(context);
  }
 /**
  * Implementations should process here exceptions thrown when using this generic JMX classes.<br>
  * This gives the agent a chance to return a meaningfull error to the client.
  *
  * @param t
  * @throws
  */
 protected void processException(Throwable t) throws Throwable {
   if (t instanceof RMSException) {
     throw t;
   }
   if (Utils.getTrace(t).indexOf("Connection refused to host") >= 0) {
     throw new JMXCommunicationError(t);
   }
   throw t;
 }
 /** @see com.ixora.common.xml.XMLExternalizable#fromXML(org.w3c.dom.Node) */
 public void fromXML(Node node) throws XMLException {
   Node n = XMLUtils.findChild(node, "class");
   if (n == null) {
     throw new XMLNodeMissing("class");
   }
   this.fBoardClass = XMLUtils.getText(n);
   n = XMLUtils.findChild(node, "counterFilterClass");
   if (n != null) {
     this.fBoardCounterFilterClass = XMLUtils.getText(n);
   }
   n = XMLUtils.findChild(node, "name");
   if (n == null) {
     throw new XMLNodeMissing("name");
   }
   this.fBoardName = XMLUtils.getText(n);
   n = XMLUtils.findChild(node, "viewName");
   if (n == null) {
     throw new XMLNodeMissing("viewName");
   }
   this.fViewName = XMLUtils.getText(n);
   n = XMLUtils.findChild(node, "component");
   if (n == null) {
     throw new XMLNodeMissing("component");
   }
   this.fBoardComponenName = XMLUtils.getText(n);
   n = XMLUtils.findChild(node, "icon");
   if (n == null) {
     throw new XMLNodeMissing("icon");
   }
   this.fBoardIcon = XMLUtils.getText(n);
   n = XMLUtils.findChild(node, "allowUserToCreateView");
   if (n != null) {
     fAllowUserToCreateView = Boolean.parseBoolean(XMLUtils.getText(n));
   } else { // default
     fAllowUserToCreateView = true;
   }
   n = XMLUtils.findChild(node, "preference");
   if (n == null) {
     throw new XMLNodeMissing("preference");
   }
   this.fPreferenceIndex = Integer.parseInt(XMLUtils.getText(n));
   n = XMLUtils.findChild(node, "samples");
   if (n != null) {
     List<Node> lst = XMLUtils.findChildren(n, "sample");
     if (lst != null) {
       this.fSamples = new LinkedList<DataViewBoardSampleData>();
       for (Node n1 : lst) {
         String fileName = XMLUtils.getText(n1);
         if (!Utils.isEmptyString(fileName)) {
           fSamples.add(new DataViewBoardSampleData(fileName));
         }
       }
     }
   }
 }
 private void handleChangeInLogNameTextField(Document document) {
   if (document == fTextFieldLogOne.getDocument()) {
     String txt = fTextFieldLogOne.getText().trim();
     if (!Utils.isEmptyString(txt)) {
       fLogOne = txt;
       fActionOk.setEnabled(true);
     } else {
       fActionOk.setEnabled(false);
     }
   }
 }
  /** @param context */
  public void rollbackDashboards(ResourceId context) {
    // rollback data views
    DataViewInfoData[] data = getDataViewInfoData(context);
    if (data != null) {
      ResourceId rid;
      DataViewInfoData d;
      DataViewInfo dvinfo;
      for (int i = 0; i < data.length; i++) {
        d = data[i];
        dvinfo = d.getInfo();
        rid = d.getContext();
        if (!dvinfo.isCommitted()) {
          model.getDataViewHelper().rollbackDataView(rid, dvinfo.getDataView().getName());
        }
      }
    }

    // rollback counters
    CounterInfoData[] counters = getCounterInfoData(context);
    if (!Utils.isEmptyArray(counters)) {
      // check that all counters are present
      for (CounterInfoData cid : counters) {
        model.getCounterHelper().rollbackCounter(cid.counterId, true);
      }
    }

    ArtefactInfoContainerImpl qc = model.getArtefactContainerImplForResource(context, true);
    if (qc == null) {
      if (logger.isTraceEnabled()) {
        logger.error("Couldn't find container for: " + context);
      }
      return;
    }
    Collection<DashboardInfoImpl> dis = qc.getDashboardInfoImpl();
    if (!Utils.isEmptyCollection(dis)) {
      for (DashboardInfoImpl di : dis) {
        di.rollback();
      }
    }
  }
  /** @see com.ixora.rms.ui.artefacts.ArtefactSelectorPanel#handlePlotArtefact() */
  protected void handlePlotArtefact() {
    try {
      final JTable table = getJTableArtefacts();
      final int[] sel = table.getSelectedRows();
      if (Utils.isEmptyArray(sel)) {
        return;
      }

      this.fViewContainer
          .getAppWorker()
          .runJobSynch(
              new UIWorkerJobDefault(
                  fViewContainer.getAppFrame(),
                  Cursor.WAIT_CURSOR,
                  MessageRepository.get(Msg.TEXT_PLOTTING_DASHBOARD)) {
                public void work() throws Exception {
                  for (int idx : sel) {
                    DashboardInfo di = (DashboardInfo) table.getModel().getValueAt(idx, 1);

                    Dashboard dtls = di.getDashboard();
                    if (dtls == null) {
                      logger.error("No dashboard");
                      return;
                    }

                    DataViewId[] members = dtls.getViews();
                    ResourceId[] counters = dtls.getCounters();
                    if (Utils.isEmptyArray(members) && Utils.isEmptyArray(counters)) {
                      // TODO localize
                      throw new RMSException(
                          "Dashboard " + di.getTranslatedName() + " has no data views.");
                    }

                    if (!di.getFlag(DataViewInfo.ENABLED) && di.isCommitted()) {
                      // enable it first
                      ((DashboardTableModel) fTableModelArtefacts).enableDashboard(idx);
                      applyChangesLocally();
                    }

                    callback.plot(new DashboardId(fContext, dtls.getName()));
                  }
                }

                public void finished(Throwable ex) {
                  ; // nothing, synched job
                }
              });
    } catch (Exception ex) {
      UIExceptionMgr.userException(ex);
    }
  }
  /**
   * @see
   *     com.ixora.rms.client.model.DashboardModelHelper#isDashboardReady(com.ixora.rms.internal.ResourceId,
   *     com.ixora.rms.repository.QueryGroup)
   */
  public boolean isDashboardReady(ResourceId context, Dashboard dashboard) {
    boolean ready = true;
    ResourceId[] counters = dashboard.getCounters();
    if (!Utils.isEmptyArray(counters)) {
      // check that all counters are present
      for (ResourceId c : counters) {
        if (context != null) {
          c = c.complete(context);
        }
        CounterInfo cinfo = model.getCounterInfo(c, true);
        if (cinfo == null) {
          return false;
        }
      }
    }

    // now check that all views are ready
    DataViewId[] views = dashboard.getViews();
    if (ready && !Utils.isEmptyArray(views)) {
      // find now query info on every member query
      for (DataViewId m : views) {
        if (context != null) {
          m = m.complete(context);
        }
        DataViewInfo dvinfo = model.getDataViewInfo(m, true);
        if (dvinfo == null) {
          return false;
        }
        if (!model
            .getQueryHelper()
            .isQueryReady(m.getContext(), dvinfo.getDataView().getQueryDef())) {
          return false;
        }
      }
    }
    return ready;
  }
  /** @see com.ixora.rms.agents.impl.jmx.JMXAbstractAgent#getJMXConnectionURL() */
  protected String getJMXConnectionURL() {
    // pass credentials if present
    String username =
        fConfiguration.getAgentCustomConfiguration().getString(Configuration.USERNAME);
    if (!Utils.isEmptyString(username)) {
      String password =
          fConfiguration.getAgentCustomConfiguration().getString(Configuration.PASSWORD);
      if (password == null) {
        password = "";
      }
      String[] credentials = new String[] {username, password};
      fEnvMap.put(JMXConnector.CREDENTIALS, credentials);
    }

    return ((Configuration) this.fConfiguration.getCustom()).getString(Msg.JMX_CONNECTION_STRING);
  }
 /** @see com.ixora.rms.client.model.DashboardModelHelper#getAllCommittedDashboards(int) */
 @SuppressWarnings("unchecked")
 public Collection<DashboardId> getAllCommittedDashboards(int flag) {
   Collection<DashboardId> ret = new LinkedList<DashboardId>();
   Enumeration<SessionModelTreeNode> e = model.getSessionNode().breadthFirstEnumeration();
   while (e.hasMoreElements()) {
     SessionModelTreeNode sn = (SessionModelTreeNode) e.nextElement();
     Collection<DashboardInfo> dashboards = sn.getArtefactInfoContainer().getDashboardInfo();
     if (!Utils.isEmptyCollection(dashboards)) {
       for (DashboardInfo di : dashboards) {
         if (di.isCommitted() && di.getFlag(flag)) {
           ret.add(new DashboardId(sn.getResourceId(), di.getDashboard().getName()));
         }
       }
     }
   }
   return ret;
 }
  /** Applies only changes made to the current context. */
  private void applyChangesLocally() {
    // get all dashboards  to realize
    Collection<DashboardInfo> dashboards = getDashboardTableModel().getDashboardsToRealize();
    if (dashboards != null) {
      for (DashboardInfo dinfo : dashboards) {
        // register views with the query realizer
        DataViewId[] views = dinfo.getDashboard().getViews();
        if (!Utils.isEmptyArray(views)) {
          for (DataViewId view : views) {
            if (fContext != null) {
              view = view.complete(fContext);
            }
            // ask the locator for info on the required data view
            final SessionDataViewInfo dvInfo = this.fArtefactInfoLocator.getDataViewInfo(view);
            if (dvInfo == null) {
              if (logger.isTraceEnabled()) {
                logger.error("Couldn't find data view info for: " + view + ". Skipping...");
              }
              continue;
            }
            final DataViewId fv = view;
            // Note: this method is reading from the session model
            // and as a result it can only be used safely from
            // the event dispatching thread
            this.fViewContainer
                .getAppWorker()
                .runJobSynch(
                    new UIWorkerJobDefault(
                        fViewContainer.getAppFrame(),
                        Cursor.WAIT_CURSOR,
                        MessageRepository.get(
                            Msg.TEXT_REALIZING_DATAVIEW,
                            new String[] {dvInfo.getTranslatedName()})) {
                      public void work() throws Exception {
                        fQueryRealizer.realizeQuery(
                            fv.getContext(),
                            dvInfo.getDataView().getQueryDef(),
                            new QueryRealizer.Callback() {
                              public boolean acceptIncreaseInMonitoringLevel(
                                  List<ResourceInfo> counters) {
                                boolean ret =
                                    UIUtils.getBooleanYesNoInput(
                                        fViewContainer.getAppFrame(),
                                        MessageRepository.get(
                                            Msg.TITLE_CONFIRM_MONITORING_LEVEL_INCREASE),
                                        MessageRepository.get(
                                            Msg
                                                .TEXT_CONFIRM_MONITORING_LEVEL_INCREASE_FOR_DATA_VIEW,
                                            new String[] {dvInfo.getTranslatedName()}));
                                if (!ret) {
                                  // undo changes
                                  fSessionData
                                      .getDataViewHelper()
                                      .rollbackDataView(fv.getContext(), fv.getName());
                                }
                                return ret;
                              }
                            });
                      }

                      public void finished(Throwable ex) {}
                    });
          }
        }
        // register counters with the query realizer
        // for every counter create a query and register it
        ResourceId[] counters = dinfo.getDashboard().getCounters();
        if (!Utils.isEmptyArray(counters)) {
          for (ResourceId counter : counters) {
            if (fContext != null) {
              counter = counter.complete(fContext);
            }
            final SingleCounterQueryDef query = new SingleCounterQueryDef(counter, null, null);
            final ResourceId counterContext = counter.getSubResourceId(ResourceId.ENTITY);

            // add query to the model
            fSessionData.getQueryHelper().addQuery(counterContext, query);

            String translatedCounterName = counter.getCounterId().toString();
            // ask the locator for info on this counter
            SessionResourceInfo rInfo = this.fArtefactInfoLocator.getResourceInfo(counter);
            if (rInfo != null && rInfo.getCounterInfo() != null) {
              translatedCounterName = rInfo.getCounterInfo().getTranslatedName();
            }
            final String finalTranslatedCounterName = translatedCounterName;
            final ResourceId fc = counter;
            // Note: this method is reading from the session model
            // and as a result it can only be used safely from
            // the event dispatching thread
            this.fViewContainer
                .getAppWorker()
                .runJobSynch(
                    new UIWorkerJobDefault(
                        fViewContainer.getAppFrame(),
                        Cursor.WAIT_CURSOR,
                        MessageRepository.get(
                            Msg.TEXT_REALIZING_DATAVIEW, new String[] {translatedCounterName})) {
                      public void work() throws Exception {
                        fQueryRealizer.realizeQuery(
                            counterContext,
                            query,
                            new QueryRealizer.Callback() {
                              public boolean acceptIncreaseInMonitoringLevel(
                                  List<ResourceInfo> counters) {
                                boolean ret =
                                    UIUtils.getBooleanYesNoInput(
                                        fViewContainer.getAppFrame(),
                                        MessageRepository.get(
                                            Msg.TITLE_CONFIRM_MONITORING_LEVEL_INCREASE),
                                        MessageRepository.get(
                                            Msg.TEXT_CONFIRM_MONITORING_LEVEL_INCREASE_FOR_COUNTER,
                                            new String[] {finalTranslatedCounterName}));
                                if (!ret) {
                                  // undo changes
                                  fSessionData.getCounterHelper().rollbackCounter(fc, true);
                                }
                                return ret;
                              }
                            });
                      }

                      public void finished(Throwable ex) {
                        if (ex != null) {
                          UIExceptionMgr.userException(ex);
                        }
                      }
                    });
          }
        }
      }
    }

    // get all dashboards to unrealize
    dashboards = getDashboardTableModel().getDashboardsToUnRealize();
    if (dashboards != null) {
      for (DashboardInfo dinfo : dashboards) {
        // unregister views with the query realizer
        DataViewId[] views = dinfo.getDashboard().getViews();
        // get views
        if (!Utils.isEmptyArray(views)) {
          for (DataViewId view : views) {
            if (fContext != null) {
              view = view.complete(fContext);
            }
            // ask the locator for info on the required data view
            String viewTranslatedName = view.getName();
            final SessionDataViewInfo dvInfo = this.fArtefactInfoLocator.getDataViewInfo(view);
            if (dvInfo == null) {
              if (logger.isTraceEnabled()) {
                logger.error("Couldn't find data view info for: " + view);
              }
            } else {
              viewTranslatedName = dvInfo.getTranslatedName();
            }
            final DataViewId fv = view;
            // Note: this method is reading from the session model
            // and as a result it can only be used safely from
            // the event dispatching thread
            this.fViewContainer
                .getAppWorker()
                .runJobSynch(
                    new UIWorkerJobDefault(
                        fViewContainer.getAppFrame(),
                        Cursor.WAIT_CURSOR,
                        MessageRepository.get(
                            Msg.TEXT_REALIZING_DATAVIEW, new String[] {viewTranslatedName})) {
                      public void work() throws Exception {
                        QueryId qid = new QueryId(fv.getContext(), fv.getName());
                        fQueryRealizer.unrealizeQuery(qid, false);
                      }

                      public void finished(Throwable ex) {
                        if (ex != null) {
                          UIExceptionMgr.userException(ex);
                        }
                      }
                    });
          }

          // unregister counters with the query realizer
          ResourceId[] counters = dinfo.getDashboard().getCounters();
          if (!Utils.isEmptyArray(counters)) {
            for (ResourceId counter : counters) {
              if (fContext != null) {
                counter = counter.complete(fContext);
              }
              final ResourceId counterContext = counter.getSubResourceId(ResourceId.ENTITY);
              String translatedCounterName = counter.getCounterId().toString();
              // ask the locator for info on this counter
              SessionResourceInfo rInfo = this.fArtefactInfoLocator.getResourceInfo(counter);
              if (rInfo != null && rInfo.getCounterInfo() != null) {
                translatedCounterName = rInfo.getCounterInfo().getTranslatedName();
              }
              final ResourceId finalCounter = counter;
              // Note: this method is reading from the session model
              // and as a result it can only be used safely from
              // the event dispatching thread
              this.fViewContainer
                  .getAppWorker()
                  .runJobSynch(
                      new UIWorkerJobDefault(
                          fViewContainer.getAppFrame(),
                          Cursor.WAIT_CURSOR,
                          MessageRepository.get(
                              Msg.TEXT_REALIZING_DATAVIEW, new String[] {translatedCounterName})) {
                        public void work() throws Exception {
                          QueryId queryId =
                              new QueryId(counterContext, finalCounter.getCounterId().toString());
                          fQueryRealizer.unrealizeQuery(queryId, false);
                        }

                        public void finished(Throwable ex) {
                          if (ex != null) {
                            UIExceptionMgr.userException(ex);
                          }
                        }
                      });
            }
          }

          String dashboardName = dinfo.getDashboard().getName();
          fSessionData
              .getDashboardHelper()
              .setDashboardFlag(ArtefactInfo.ENABLED, fContext, dashboardName, false, true);
        }
      }
    }
    fSessionData.getDashboardHelper().recalculateDashboardsStatus(fContext);
    getDashboardTableModel().fireTableDataChanged();
    fActionApply.setEnabled(false);
    fActionCancel.setEnabled(false);
  }
  // the behaviour is as follows:
  // if the dashboard is not commited, the state will not be changed
  // else the state of the dasboard will be updated only if there is at least
  // one view already in the session model that belongs to this dashboard and
  // it is not enabled
  public void recalculateDashboardsStatus(ResourceId context) {
    ArtefactInfoContainerImpl acimpl = model.getArtefactContainerImplForResource(context, true);
    if (acimpl == null) {
      if (logger.isTraceEnabled()) {
        logger.error("Couldn't find container for: " + context);
      }
      return;
    }
    Collection<DashboardInfoImpl> cs = acimpl.getDashboardInfoImpl();
    if (cs == null) {
      return;
    }

    for (DashboardInfoImpl dinfo : cs) {
      if (dinfo.isCommitted()) {
        Dashboard db = dinfo.getDashboard();
        // flags to update
        boolean enabled = dinfo.getFlag(DashboardInfo.ENABLED);
        boolean plotted = dinfo.getFlag(DashboardInfo.ACTIVATED);
        boolean committed = dinfo.isCommitted();

        // check counters
        ResourceId[] counters = db.getCounters();
        if (!Utils.isEmptyArray(counters)) {
          // disable this dashboard only if one of it's counters
          // exists in the model and it's disabled
          for (ResourceId c : counters) {
            if (context != null) {
              c = c.complete(context);
            }
            CounterInfo cinfo = model.getCounterInfo(c, false);
            if (cinfo == null) {
              if (logger.isTraceEnabled()) {
                logger.error("Couldn't find counter: " + c);
              }
              break;
            }
            if (!cinfo.getFlag(CounterInfo.ENABLED)) {
              enabled = false;
            }
            if (!cinfo.getFlag(CounterInfo.ACTIVATED)) {
              plotted = false;
            }
            if (!cinfo.isCommitted()) {
              committed = false;
            }
          }
        }

        // check data views
        DataViewId[] views = db.getViews();
        if (!Utils.isEmptyArray(views)) {
          // disable this dashboard only if one of it's queries
          // exists in the model and it's disabled

          // find now info on every member
          DataViewId m;
          DataViewInfo dvinfo;
          for (int i = 0; i < views.length; i++) {
            m = views[i];
            if (context != null) {
              m = m.complete(context);
            }
            // refresh data views first
            model.getDataViewHelper().recalculateDataViewsStatus(m.getContext());
            dvinfo = model.getDataViewInfo(m, false);
            if (dvinfo == null) {
              // this query no longer exists...
              // ignore it with a warning in logs
              if (logger.isInfoEnabled()) {
                logger.error(
                    "Couldn't find view info for: "
                        + m
                        + ". Dashboard "
                        + dinfo.getTranslatedName()
                        + " will be incomplete.");
              }
              break;
            }
            // query exists and it will contribute to the state
            // of this dashboard
            if (!dvinfo.getFlag(QueryInfo.ENABLED)) {
              enabled = false;
            }
            if (!dvinfo.getFlag(QueryInfo.ACTIVATED)) {
              plotted = false;
            }
            if (!dvinfo.isCommitted()) {
              committed = false;
            }
          }
        }

        dinfo.setFlag(DashboardInfo.ENABLED, enabled);
        dinfo.setFlag(DashboardInfo.ACTIVATED, plotted);
        if (committed) {
          dinfo.commit();
        }
      } else {
        // just commit it
        dinfo.commit();
      }
    }
  }