/**
   * Update the history store with the value of an an read, write or execute operation. Also, the
   * timestamp of the insertion is recorded. Also, the recorded history values are added to the
   * given json value.
   *
   * @param pJmxReq request for which an entry should be added in this history store
   * @param pJson the JSONObject to which to add the history.
   */
  public synchronized void updateAndAdd(JmxRequest pJmxReq, JSONObject pJson) {
    long timestamp = System.currentTimeMillis() / 1000;
    pJson.put(KEY_TIMESTAMP, timestamp);

    JmxRequest.Type type = pJmxReq.getType();
    if (type == EXEC || type == WRITE) {
      HistoryEntry entry = historyStore.get(new HistoryKey(pJmxReq));
      if (entry != null) {
        synchronized (entry) {
          // A history data to json object for the response
          pJson.put(KEY_HISTORY, entry.jsonifyValues());

          // Update history for next time
          if (type == EXEC) {
            entry.add(pJson.get(KEY_VALUE), timestamp);
          } else if (type == WRITE) {
            // The new value to set as string representation
            entry.add(pJmxReq.getValue(), timestamp);
          }
        }
      }
    } else if (type == READ) {
      updateReadHistory(pJmxReq, pJson, timestamp);
    }
  }
 /**
  * Set the global maximum limit for history entries
  *
  * @param pGlobalMaxEntries limit
  */
 public synchronized void setGlobalMaxEntries(int pGlobalMaxEntries) {
   globalMaxEntries = pGlobalMaxEntries;
   // Refresh all entries
   for (HistoryEntry entry : historyStore.values()) {
     entry.setMaxEntries(globalMaxEntries);
     entry.trim();
   }
 }
 private void addAttributeFromSingleValue(
     JSONObject pHistMap, String pAttrName, HistoryKey pKey, Object pValue, long pTimestamp) {
   HistoryEntry entry = getEntry(pKey, pValue, pTimestamp);
   if (entry != null) {
     synchronized (entry) {
       pHistMap.put(pAttrName, entry.jsonifyValues());
       entry.add(pValue, pTimestamp);
     }
   }
 }
 private void writeComposite(
     final Element res,
     final VirtualFile file,
     final EditorWithProviderComposite composite,
     final boolean pinned,
     final EditorWithProviderComposite selectedEditor) {
   final Element fileElement = new Element("file");
   fileElement.setAttribute("leaf-file-name", file.getName()); // TODO: all files
   final HistoryEntry entry = composite.currentStateAsHistoryEntry();
   entry.writeExternal(fileElement, getManager().getProject());
   fileElement.setAttribute("pinned", Boolean.toString(pinned));
   fileElement.setAttribute(
       "current", Boolean.toString(composite.equals(getManager().getLastSelected())));
   fileElement.setAttribute("current-in-tab", Boolean.toString(composite.equals(selectedEditor)));
   res.addContent(fileElement);
 }
 private HistoryEntry getEntry(HistoryKey pKey, Object pValue, long pTimestamp) {
   HistoryEntry entry = historyStore.get(pKey);
   if (entry != null) {
     return entry;
   }
   // Now try all known patterns and add lazily the key
   for (HistoryKey key : patterns.keySet()) {
     if (key.matches(pKey)) {
       entry = new HistoryEntry(patterns.get(key));
       entry.add(pValue, pTimestamp);
       historyStore.put(pKey, entry);
       return entry;
     }
   }
   return null;
 }
 private void logEntries(Collection<HistoryEntry> entries) {
   LocalHistory.LOG.log(Level.FINE, "LocalHistory returns {0} entries", entries.size()); // NOI18N
   if (LocalHistory.LOG.isLoggable(Level.FINEST)) {
     StringBuilder sb = new StringBuilder();
     Iterator<HistoryEntry> it = entries.iterator();
     while (it.hasNext()) {
       HistoryEntry entry = it.next();
       sb.append("["); // NOI18N
       sb.append(DateFormat.getDateTimeInstance().format(entry.getDateTime()));
       sb.append(",["); // NOI18N
       sb.append(toString(entry.getFiles()));
       sb.append("]]"); // NOI18N
       if (it.hasNext()) sb.append(","); // NOI18N
     }
     LocalHistory.LOG.finest(sb.toString());
   }
 }
  /**
   * Configure the history length for a specific entry. If the length is 0 disable history for this
   * key
   *
   * @param pKey history key
   * @param pMaxEntries number of maximal entries. If larger than globalMaxEntries, then
   *     globalMaxEntries is used instead.
   */
  public synchronized void configure(HistoryKey pKey, int pMaxEntries) {
    int maxEntries = pMaxEntries > globalMaxEntries ? globalMaxEntries : pMaxEntries;

    // Remove entries if set to 0
    if (pMaxEntries == 0) {
      removeEntries(pKey);
      return;
    }
    if (pKey.isMBeanPattern()) {
      patterns.put(pKey, maxEntries);
      // Trim all already stored keys
      for (HistoryKey key : historyStore.keySet()) {
        if (pKey.matches(key)) {
          HistoryEntry entry = historyStore.get(key);
          entry.setMaxEntries(maxEntries);
          entry.trim();
        }
      }
    } else {
      HistoryEntry entry = historyStore.get(pKey);
      if (entry != null) {
        entry.setMaxEntries(maxEntries);
        entry.trim();
      } else {
        entry = new HistoryEntry(maxEntries);
        historyStore.put(pKey, entry);
      }
    }
  }
    @Override
    protected JPanel processFiles(@NotNull List<Element> fileElements, final JPanel context) {
      final Ref<EditorWindow> windowRef = new Ref<EditorWindow>();
      UIUtil.invokeAndWaitIfNeeded(
          new Runnable() {
            @Override
            public void run() {
              windowRef.set(context == null ? createEditorWindow() : findWindowWith(context));
            }
          });
      final EditorWindow window = windowRef.get();
      LOG.assertTrue(window != null);
      VirtualFile focusedFile = null;

      for (int i = 0; i < fileElements.size(); i++) {
        final Element file = fileElements.get(i);
        if (i == 0) {
          EditorTabbedContainer tabbedPane = window.getTabbedPane();
          if (tabbedPane != null) {
            try {
              int limit =
                  Integer.parseInt(
                      file.getParentElement()
                          .getAttributeValue(
                              JBTabsImpl.SIDE_TABS_SIZE_LIMIT_KEY.toString(),
                              String.valueOf(JBTabsImpl.DEFAULT_MAX_TAB_WIDTH)));
              UIUtil.putClientProperty(
                  tabbedPane.getComponent(), JBTabsImpl.SIDE_TABS_SIZE_LIMIT_KEY, limit);
            } catch (NumberFormatException e) {
              // ignore
            }
          }
        }
        try {
          final FileEditorManagerImpl fileEditorManager = getManager();
          Element historyElement = file.getChild(HistoryEntry.TAG);
          final HistoryEntry entry =
              HistoryEntry.createLight(fileEditorManager.getProject(), historyElement);
          final VirtualFile virtualFile = entry.getFile();
          if (virtualFile == null)
            throw new InvalidDataException("No file exists: " + entry.getFilePointer().getUrl());
          Document document =
              ApplicationManager.getApplication()
                  .runReadAction(
                      new Computable<Document>() {
                        @Override
                        public Document compute() {
                          return virtualFile.isValid()
                              ? FileDocumentManager.getInstance().getDocument(virtualFile)
                              : null;
                        }
                      });
          final boolean isCurrentInTab =
              Boolean.valueOf(file.getAttributeValue(CURRENT_IN_TAB)).booleanValue();
          Boolean pin = Boolean.valueOf(file.getAttributeValue(PINNED));
          fileEditorManager.openFileImpl4(
              window, virtualFile, entry, isCurrentInTab, isCurrentInTab, pin, i);
          if (isCurrentInTab) {
            focusedFile = virtualFile;
          }
          if (document != null) {
            // This is just to make sure document reference is kept on stack till this point
            // so that document is available for folding state deserialization in HistoryEntry
            // constructor
            // and that document will be created only once during file opening
            document.putUserData(DUMMY_KEY, null);
          }
          updateProgress();
        } catch (InvalidDataException e) {
          if (ApplicationManager.getApplication().isUnitTestMode()) {
            LOG.error(e);
          }
        }
      }
      if (focusedFile != null) {
        getManager().addSelectionRecord(focusedFile, window);
      }
      return window.myPanel;
    }