Index: src/main/java/org/apache/jackrabbit/oak/explorer/Explorer.java =================================================================== --- src/main/java/org/apache/jackrabbit/oak/explorer/Explorer.java (revision 1645243) +++ src/main/java/org/apache/jackrabbit/oak/explorer/Explorer.java (working copy) @@ -41,7 +41,10 @@ import javax.swing.UIManager; import javax.swing.UIManager.LookAndFeelInfo; -import org.apache.jackrabbit.oak.plugins.segment.file.FileStore; +import org.apache.jackrabbit.oak.plugins.segment.file.FileStore.ReadOnlyStore; +import org.apache.jackrabbit.oak.plugins.segment.file.JournalReader; + +import com.google.common.collect.Lists; /** * NodeStore explorer @@ -64,7 +67,7 @@ } final String path = args[0]; - final FileStore store = new FileStore(new File(path), 256); + final ReadOnlyStore store = new ReadOnlyStore(new File(path)); final boolean skipSizeCheck = args.length == 2 && skip.equalsIgnoreCase(args[1]); @@ -90,8 +93,8 @@ } } - private void createAndShowGUI(final String path, final FileStore store, boolean skipSizeCheck) { - final JFrame frame = new JFrame("Explore " + path); + private void createAndShowGUI(final String path, final ReadOnlyStore store, boolean skipSizeCheck) { + final JFrame frame = new JFrame("Explore " + path + " @head"); frame.addWindowListener(new java.awt.event.WindowAdapter() { @Override public void windowClosing(java.awt.event.WindowEvent windowEvent) { @@ -123,16 +126,46 @@ JMenuBar menuBar = new JMenuBar(); menuBar.setMargin(new Insets(2, 2, 2, 2)); - JMenuItem menuCompaction = new JMenuItem("Tar Compaction"); - menuCompaction.setMnemonic(KeyEvent.VK_C); + JMenuItem menuCompaction = new JMenuItem("Time Machine"); + menuCompaction.setMnemonic(KeyEvent.VK_M); menuCompaction.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent ev) { - int run = JOptionPane.showConfirmDialog(frame, - "Run compaction on the tar files", "Tar Compaction", - JOptionPane.WARNING_MESSAGE, JOptionPane.YES_NO_OPTION); - if (run == JOptionPane.YES_OPTION) { - treePanel.compact(); + List revs = new ArrayList(); + + File journal = new File(path, "journal.log"); + if (!journal.exists()) { + return; + } + + JournalReader journalReader = null; + try { + journalReader = new JournalReader(journal); + try { + revs = Lists.newArrayList(journalReader.iterator()); + } finally { + journalReader.close(); + } + } catch (IOException e) { + e.printStackTrace(); + return; + } finally { + try { + if (journalReader != null) { + journalReader.close(); + } + } catch (IOException e) { + } + } + + String s = (String) JOptionPane.showInputDialog(frame, + "Revert to a specified revision", "Time Machine", + JOptionPane.PLAIN_MESSAGE, null, revs.toArray(), + revs.get(0)); + if (s != null) { + treePanel.revert(s); + frame.setTitle("Explore " + path + " @" + s); + return; } } }); Index: src/main/java/org/apache/jackrabbit/oak/explorer/NodeStoreTree.java =================================================================== --- src/main/java/org/apache/jackrabbit/oak/explorer/NodeStoreTree.java (revision 1645243) +++ src/main/java/org/apache/jackrabbit/oak/explorer/NodeStoreTree.java (working copy) @@ -62,12 +62,13 @@ import org.apache.jackrabbit.oak.plugins.segment.SegmentNodeStateHelper; import org.apache.jackrabbit.oak.plugins.segment.SegmentPropertyState; import org.apache.jackrabbit.oak.plugins.segment.file.FileStore; +import org.apache.jackrabbit.oak.plugins.segment.file.FileStore.ReadOnlyStore; import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry; import org.apache.jackrabbit.oak.spi.state.NodeState; public class NodeStoreTree extends JPanel implements TreeSelectionListener { - private final FileStore store; + private final ReadOnlyStore store; private DefaultTreeModel treeModel; private final JTree tree; @@ -79,7 +80,7 @@ // TODO make this configurable private final boolean cacheNodeState = false; - public NodeStoreTree(FileStore store, JTextArea log, boolean skipSizeCheck) { + public NodeStoreTree(ReadOnlyStore store, JTextArea log, boolean skipSizeCheck) { super(new GridLayout(1, 0)); this.store = store; this.log = log; @@ -577,38 +578,8 @@ log.setText(sb.toString()); } - public void compact() { - sizeCache = new HashMap(); - treeModel = null; - - StringBuilder sb = new StringBuilder(); - - long s = System.currentTimeMillis(); - store.compact(); - try { - store.flush(); - } catch (IOException e) { - sb.append("IOException " + e.getMessage()); - e.printStackTrace(); - } - s = System.currentTimeMillis() - s; - - sb.append("Compacted tar segments in " + s + " ms."); - sb.append(newline); - - sb.append("File Index"); - sb.append(newline); - - List files = newArrayList(store.getTarReaderIndex().keySet()); - Collections.sort(files); - - for (String path : files) { - sb.append(path); - sb.append(newline); - } - sb.append("----------"); - log.setText(sb.toString()); - + public void revert(String revision) { + store.setRevision(revision); refreshModel(); }