blob: 28502d59713489eace4dd5c3b67c5fc0d98122f3 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package threaddemo;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.WindowConstants;
import threaddemo.apps.index.IndexApp;
import threaddemo.apps.populate.Populate;
import threaddemo.apps.refactor.Refactor;
import threaddemo.model.Phadhail;
import threaddemo.model.PhadhailEvent;
import threaddemo.model.PhadhailListener;
import threaddemo.model.PhadhailNameEvent;
import threaddemo.model.Phadhails;
import threaddemo.views.PhadhailViews;
/**
* Demonstrate various models and views for big data sets.
* @author Jesse Glick
*/
public final class Main extends JFrame {
private static JFrame mainFrame;
public static void main(String[] args) {
File root;
if (args.length == 1) {
root = new File(args[0]);
if (!root.exists()) {
root.mkdirs();
}
} else {
root = File.listRoots()[0];
}
mainFrame = new Main(root);
mainFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
mainFrame.setLocation(0, 0);
// #35804: needs to happen in EQ, since it grabs tree lock etc.
EventQueue.invokeLater(new Runnable() {
public void run() {
mainFrame.pack();
mainFrame.setVisible(true);
}
});
}
private final File root;
private final JRadioButton synchButton, monitoredButton, lockedButton, eventHybridLockedButton, spunButton, swungButton, nodeButton, lookNodeButton, lookButton, rawButton;
private Main(File root) {
super("Thread Demo [" + root.getAbsolutePath() + "]");
this.root = root;
getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
JPanel modelPanel1 = new JPanel();
JPanel modelPanel2 = new JPanel();
ButtonGroup modelGroup = new ButtonGroup();
synchButton = new JRadioButton("Synchronous", true);
synchButton.setMnemonic('y');
monitoredButton = new JRadioButton("Monitored", false);
monitoredButton.setMnemonic('m');
lockedButton = new JRadioButton("Locked", false);
lockedButton.setMnemonic('k');
eventHybridLockedButton = new JRadioButton("Event-Hybrid-Locked", false);
eventHybridLockedButton.setMnemonic('e');
spunButton = new JRadioButton("Spun", false);
spunButton.setMnemonic('u');
swungButton = new JRadioButton("Swung", false);
swungButton.setMnemonic('w');
modelGroup.add(synchButton);
modelGroup.add(monitoredButton);
modelGroup.add(lockedButton);
modelGroup.add(eventHybridLockedButton);
modelGroup.add(spunButton);
modelGroup.add(swungButton);
modelPanel1.add(synchButton);
modelPanel1.add(monitoredButton);
modelPanel1.add(lockedButton);
modelPanel2.add(eventHybridLockedButton);
modelPanel2.add(spunButton);
modelPanel2.add(swungButton);
getContentPane().add(modelPanel1);
getContentPane().add(modelPanel2);
JPanel viewPanel = new JPanel();
ButtonGroup viewGroup = new ButtonGroup();
nodeButton = new JRadioButton("Node", false);
nodeButton.setMnemonic('n');
lookNodeButton = new JRadioButton("Look Node", true);
lookNodeButton.setMnemonic('o');
lookButton = new JRadioButton("Look", false);
lookButton.setMnemonic('l');
rawButton = new JRadioButton("Raw", false);
rawButton.setMnemonic('r');
viewGroup.add(nodeButton);
viewGroup.add(lookNodeButton);
viewGroup.add(lookButton);
viewGroup.add(rawButton);
viewPanel.add(rawButton);
viewPanel.add(nodeButton);
viewPanel.add(lookNodeButton);
viewPanel.add(lookButton);
getContentPane().add(viewPanel);
JButton showB = new JButton("Show");
showB.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
showView();
}
});
JButton popB = new JButton("Populate Test Files");
popB.setMnemonic('p');
popB.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
Populate.run(Main.this.root, Main.this);
}
});
JPanel bPanel = new JPanel();
bPanel.add(showB);
bPanel.add(popB);
getContentPane().add(bPanel);
getContentPane().add(new Monitor());
getRootPane().setDefaultButton(showB);
}
private void showView() {
// Clear caches first!
System.gc();
System.runFinalization();
System.gc();
final Phadhail model;
final String modelType;
if (synchButton.isSelected()) {
model = Phadhails.synchronous(root);
modelType = "Synchronous";
} else if (monitoredButton.isSelected()) {
model = Phadhails.monitored(root);
modelType = "Monitored";
} else if (lockedButton.isSelected()) {
model = Phadhails.locked(root);
modelType = "Locked";
} else if (eventHybridLockedButton.isSelected()) {
model = Phadhails.eventHybridLocked(root);
modelType = "Event-Hybrid-Locked";
} else if (spunButton.isSelected()) {
model = Phadhails.spun(root);
modelType = "Spun";
} else {
assert swungButton.isSelected();
model = Phadhails.swung(root);
modelType = "Swung";
}
Component view;
final String viewType;
if (nodeButton.isSelected()) {
view = PhadhailViews.nodeView(model);
viewType = "Node";
} else if (lookNodeButton.isSelected()) {
view = PhadhailViews.lookNodeView(model);
viewType = "Look Node";
} else if (lookButton.isSelected()) {
view = PhadhailViews.lookView(model);
viewType = "Look";
} else {
assert rawButton.isSelected();
view = PhadhailViews.rawView(model);
viewType = "Raw";
}
final JFrame frame = new JFrame();
// For the benefit of Swung model which will produce the root path asynch:
final PhadhailListener l = new PhadhailListener() {
public void nameChanged(PhadhailNameEvent ev) {
frame.setTitle(modelType + " " + viewType + ": " + model.getPath());
}
public void childrenChanged(PhadhailEvent ev) {}
};
l.nameChanged(null);
model.addPhadhailListener(l);
frame.getContentPane().add(view);
JButton indexB = new JButton("View Index");
indexB.setMnemonic('i');
indexB.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
viewIndex(model);
}
});
JButton refactorB = new JButton("Refactor");
refactorB.setMnemonic('r');
refactorB.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
Refactor.run(model, frame);
}
});
JPanel bPanel = new JPanel();
bPanel.add(indexB);
bPanel.add(refactorB);
frame.getContentPane().add(bPanel, BorderLayout.SOUTH);
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent ev) {
model.removePhadhailListener(l);
frame.removeWindowListener(this);
// Just to make sure the view is collected:
frame.getContentPane().removeAll();
}
});
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
frame.pack();
frame.setSize(500, 500);
frame.setLocation(mainFrame.getX() + mainFrame.getWidth(), 0);
frame.setVisible(true);
}
private void viewIndex(Phadhail model) {
new IndexApp(model).setVisible(true);
}
}