package org.oddjob.monitor.control;
import java.awt.Component;
import java.util.concurrent.atomic.AtomicReference;
import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
import javax.swing.tree.TreePath;
import junit.framework.TestCase;
import org.apache.log4j.Logger;
import org.oddjob.Oddjob;
import org.oddjob.arooa.ArooaParseException;
import org.oddjob.arooa.parsing.DragPoint;
import org.oddjob.arooa.parsing.DragTransaction;
import org.oddjob.arooa.registry.ChangeHow;
import org.oddjob.arooa.xml.XMLConfiguration;
import org.oddjob.monitor.context.ContextInitialiser;
import org.oddjob.monitor.model.DetailModel;
import org.oddjob.monitor.model.JobTreeModel;
import org.oddjob.monitor.model.JobTreeNode;
import org.oddjob.monitor.model.MockExplorerModel;
import org.oddjob.monitor.view.DetailView;
import org.oddjob.util.ThreadManager;
public class DetailControllerTest extends TestCase {
private static final Logger logger = Logger.getLogger(DetailControllerTest.class);
Component comp;
class OurExplorerModel extends MockExplorerModel {
Oddjob oddjob;
@Override
public Oddjob getOddjob() {
return oddjob;
}
@Override
public ThreadManager getThreadManager() {
return null;
}
@Override
public ContextInitialiser[] getContextInitialisers() {
return new ContextInitialiser[0];
}
}
public void testSelectionOnCut() throws Exception {
OurExplorerModel explorerModel = new OurExplorerModel();
Oddjob oddjob = new Oddjob();
String xml =
"<oddjob>" +
" <job>" +
" <bean id='x'/>" +
" </job>" +
"</oddjob>";
oddjob.setConfiguration(new XMLConfiguration("XML", xml));
oddjob.run();
explorerModel.oddjob = oddjob;
JobTreeModel model = new JobTreeModel();
JobTreeNode root = new JobTreeNode(explorerModel, model);
model.setRootTreeNode(root);
final JTree tree = new JTree(model);
tree.setShowsRootHandles(true);
DetailModel detailModel = new DetailModel();
if (Thread.currentThread().getContextClassLoader() == null) {
logger.warn("Context class loader is null - " +
"What is setting this to null!!!???");
Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
}
// Test fails sometimes with NPE. Not sure why.
// Something to do with ContextClassLoader being null.
DetailController test = new DetailController(
detailModel, new DetailView(detailModel));
tree.addTreeSelectionListener(test);
root.setVisible(true);
assertNull(detailModel.getSelectedJob());
assertEquals(false, tree.isExpanded(0));
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
tree.expandRow(0);
tree.setSelectionRow(1);
}
});
Object x = detailModel.getSelectedJob();
assertNotNull(x);
final DragPoint xDrag =
oddjob.provideConfigurationSession().dragPointFor(x);
final AtomicReference<Exception> er = new AtomicReference<Exception>();
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
DragTransaction trn = xDrag.beginChange(ChangeHow.FRESH);
xDrag.cut();
try {
trn.commit();
} catch (ArooaParseException e) {
trn.rollback();
er.set(e);
}
}
});
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
// Wait for queue to drain.
}
});
if (er.get() != null) {
throw er.get();
}
TreePath path = tree.getSelectionPath();
assertNull(path);
assertNull(detailModel.getSelectedJob());
assertEquals(false, tree.isExpanded(0));
comp = tree;
}
public static void main(String[] args) throws Exception {
DetailControllerTest test = new DetailControllerTest();
test.testSelectionOnCut();
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
frame.getContentPane().add(test.comp);
frame.pack();
frame.setVisible(true);
}
}