001 /* 002 * Created by IntelliJ IDEA. 003 * User: Wei Wang 004 * Date: 2002-8-22 005 * Time: 20:04:38 006 */ 007 package EVolve.util; 008 009 import java.awt.*; 010 import java.awt.event.*; 011 import java.util.*; 012 import javax.swing.*; 013 import javax.swing.filechooser.*; 014 import java.io.*; 015 import EVolve.*; 016 import EVolve.visualization.VisualizationFactory; 017 import EVolve.visualization.Visualization; 018 import EVolve.visualization.PredictorFactory; 019 import EVolve.visualization.XYViz.XYVisualization; 020 021 public class BatchRunner { 022 private JDialog dialog; 023 private java.awt.List fileList; 024 private java.awt.List procList; 025 private Frame owner; 026 private HashSet setFile; 027 private HashSet setProcessFiles; 028 private HashMap batches; 029 private HashMap mapConfig; 030 private JTextField txtConfName; 031 032 public BatchRunner() { 033 owner = Scene.getFrame(); 034 setFile = new HashSet(); 035 setProcessFiles = new HashSet(); 036 batches = new HashMap(); 037 mapConfig = new HashMap(); 038 } 039 040 public void showWindow() { 041 if (dialog == null) { 042 createDialog(); 043 Scene.getUIManager().showDialog(dialog, dialog.getWidth(), dialog.getHeight()); 044 } 045 else dialog.setVisible(true); 046 } 047 048 public void runBatch() { 049 int iBatchNum = batches.keySet().size(); 050 Iterator it = batches.keySet().iterator(); 051 BatchInfo batchInfo; 052 RandomAccessFile inConfigFile; 053 String dimensionDefs[] = new String[3]; 054 055 if (iBatchNum <= 0) { 056 Scene.showErrorMessage("No batch available!"); 057 return; 058 } 059 060 while (it.hasNext()) { 061 String outPath,dataFileName,batchName = (String) it.next(); 062 VizInfo vizInfo = null; 063 Iterator it2; 064 batchInfo = (BatchInfo) batches.get(batchName); 065 // read in configure file 066 try { 067 inConfigFile = new RandomAccessFile(batchInfo.getConfigureFile(), "r"); 068 String version = inConfigFile.readLine().trim(); 069 if (!version.equals(Scene.VERSION)) throw (new IOException()); 070 inConfigFile.readLine(); 071 072 it2 = batchInfo.getTraceFileList().iterator(); 073 dataFileName = (String) it2.next(); 074 Scene.setDataFilename(dataFileName); 075 Scene.autoLoadDataSource(); 076 vizInfo = new VizInfo(); 077 mapConfig.put("Factory",vizInfo.createFactory(inConfigFile.readLine().trim())); 078 mapConfig.put("Subject",vizInfo.createSubjectDefinition(inConfigFile.readLine().trim())); 079 for (int i=0;i<dimensionDefs.length;i++) { 080 dimensionDefs[i] = inConfigFile.readLine().trim(); 081 } 082 mapConfig.put("Dimension",vizInfo.createDimension(dimensionDefs)); 083 mapConfig.put("Predictor",vizInfo.createPredictor(inConfigFile.readLine().trim())); 084 mapConfig.put("Interval",vizInfo.createInterval(inConfigFile.readLine().trim())); 085 outPath = inConfigFile.readLine().trim(); 086 execCmd(outPath,dataFileName); 087 } catch (Exception e) { 088 System.out.println("Configure file error for batch "+batchName+"."); 089 continue; 090 } 091 092 while (it2.hasNext()) { 093 // load data file first 094 dataFileName = (String)it2.next(); 095 Scene.setDataFilename(dataFileName); 096 Scene.autoLoadDataSource(); 097 execCmd(outPath,dataFileName); 098 } 099 100 vizInfo.reset(); 101 mapConfig.clear(); 102 } // end of while(it) 103 batches.clear(); 104 Scene.setDataFilename(null); 105 } 106 107 private void execCmd(String path,String dataFn) { 108 Scene.getVisualizationManager().newVisualization(((VisualizationFactory)mapConfig.get("Factory")).getName()); 109 110 Scene.getVisualizationManager().autoPreVisualize(mapConfig); 111 Scene.autoVisualize(); 112 Scene.getVisualizationManager().autoSaveResult(path,dataFn); 113 114 } 115 116 private void createDialog(){ 117 dialog = new JDialog(owner,"Create Batch",true); 118 dialog.setBounds(new Rectangle(500,400)); 119 120 JPanel batchName = new JPanel(new FlowLayout()); 121 dialog.getContentPane().add(batchName,BorderLayout.NORTH); 122 123 Box boxMain = new Box(BoxLayout.Y_AXIS); 124 boxMain.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), 125 "Choose file(s) to be processed & Processing configuration")); 126 dialog.getContentPane().add(boxMain,BorderLayout.CENTER); 127 128 129 Box boxLabels = new Box(BoxLayout.X_AXIS); 130 JButton buttonGetDir = new JButton("Select Directory .."); 131 buttonGetDir.addActionListener(new ActionListener(){ 132 public void actionPerformed(ActionEvent e){ 133 fillFileList(); 134 } 135 }); 136 boxLabels.add(buttonGetDir); 137 boxLabels.add(Box.createHorizontalGlue()); 138 boxLabels.add(new JLabel("Processing List ")); 139 140 Box boxLists = new Box(BoxLayout.X_AXIS); 141 fileList = new java.awt.List(8,true); 142 143 Box boxAddRemove = new Box(BoxLayout.Y_AXIS); 144 JButton buttonAdd = new JButton(" > "); 145 buttonAdd.addActionListener(new ActionListener(){ 146 public void actionPerformed(ActionEvent e){ 147 addFiles(); 148 } 149 }); 150 JButton buttonRemove = new JButton(" < "); 151 buttonRemove.addActionListener(new ActionListener(){ 152 public void actionPerformed(ActionEvent e){ 153 removeFiles(); 154 } 155 }); 156 boxAddRemove.add(Box.createVerticalStrut(40)); 157 boxAddRemove.add(buttonAdd); 158 boxAddRemove.add(Box.createVerticalStrut(20)); 159 boxAddRemove.add(buttonRemove); 160 161 procList = new java.awt.List(8,true); 162 boxLists.add(fileList); 163 boxLists.add(Box.createHorizontalStrut(40)); 164 boxLists.add(boxAddRemove); 165 boxLists.add(procList); 166 167 boxMain.add(boxLabels); 168 boxMain.add(Box.createVerticalStrut(5)); 169 boxMain.add(boxLists); 170 171 Box boxConfig = new Box(BoxLayout.X_AXIS); 172 boxConfig.add(new JLabel("Choose configure file:")); 173 txtConfName = new JTextField(12); 174 boxConfig.add(Box.createHorizontalStrut(20)); 175 boxConfig.add(txtConfName,BorderLayout.CENTER); 176 JButton buttonConfig = new JButton("..."); 177 buttonConfig.addActionListener(new ActionListener(){ 178 public void actionPerformed(ActionEvent e){ 179 txtConfName.setText(chooseConfig()); 180 } 181 }); 182 boxConfig.add(buttonConfig,BorderLayout.EAST); 183 184 Box boxOkCancel = new Box(BoxLayout.X_AXIS); 185 JButton buttonOK = new JButton("OK"); 186 JButton buttonCancel = new JButton("Cancel"); 187 188 buttonOK.addActionListener(new ActionListener(){ 189 public void actionPerformed(ActionEvent e){ 190 onOK(); 191 } 192 }); 193 buttonCancel.addActionListener(new ActionListener(){ 194 public void actionPerformed(ActionEvent e){ 195 onCancel(); 196 } 197 }); 198 boxOkCancel.add(Box.createHorizontalStrut(30)); 199 boxOkCancel.add(buttonOK); 200 boxOkCancel.add(Box.createHorizontalStrut(20)); 201 boxOkCancel.add(buttonCancel); 202 203 Box boxBottom = Box.createVerticalBox(); 204 boxBottom.add(Box.createVerticalStrut(12)); 205 boxBottom.add(boxConfig); 206 boxBottom.add(Box.createVerticalStrut(40)); 207 boxBottom.add(boxOkCancel); 208 209 210 dialog.getContentPane().add(boxBottom,BorderLayout.SOUTH); 211 //dialog.setResizable(false); 212 } 213 214 private void clearList() { 215 fileList.removeAll(); 216 procList.removeAll(); 217 setFile.clear(); 218 setProcessFiles.clear(); 219 } 220 221 private void onOK() { 222 BatchInfo batchInfo = new BatchInfo(); 223 224 if (txtConfName.getText().trim().length() == 0) { 225 Scene.showErrorMessage("No configuration file selected!"); 226 return; 227 } 228 229 if (setProcessFiles.size() == 0) { 230 Scene.showErrorMessage("Select file(s) to be processed please!"); 231 return; 232 } 233 234 batchInfo.setConfigureFile(txtConfName.getText().trim()); 235 batchInfo.setTraceFileList(setProcessFiles); 236 batches.put("Batch "+batches.entrySet().size(),batchInfo); 237 dialog.setVisible(false); 238 clearList(); 239 } 240 241 private void onCancel() { 242 dialog.setVisible(false); 243 clearList(); 244 } 245 246 private String chooseConfig() { 247 JFileChooser fc = new JFileChooser(Scene.getUIManager().getLastConfigDir()); 248 249 if(fc.showOpenDialog(owner) == JFileChooser.APPROVE_OPTION) { 250 File f = fc.getSelectedFile(); 251 Scene.getUIManager().setLastConfigDir(f.getPath()); 252 return (f.getPath()); 253 } 254 else return ""; 255 } 256 257 private void addFiles() { 258 String[] selItems = fileList.getSelectedItems(); 259 260 for (int i=0;i<selItems.length;i++) { 261 if (setProcessFiles.contains(selItems[i])) continue; 262 263 setProcessFiles.add(selItems[i]); 264 procList.add(selItems[i]); 265 } 266 } 267 268 private void removeFiles() { 269 String[] selItems = procList.getSelectedItems(); 270 271 for (int i=0;i<selItems.length;i++) { 272 setProcessFiles.remove(selItems[i]); 273 procList.remove(selItems[i]); 274 } 275 } 276 277 private void fillFileList() { 278 JFileChooser fc = new JFileChooser(); 279 String path; 280 281 fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 282 283 if(fc.showOpenDialog(Scene.getFrame()) == JFileChooser.APPROVE_OPTION) { 284 path = fc.getSelectedFile().getAbsolutePath(); 285 File dir = new File(path); 286 FileSystemView fv = fc.getFileSystemView(); 287 File[] fl = fv.getFiles(dir,false); 288 for (int i=0;i<fl.length;i++) { 289 String fn = fl[i].getName(); 290 if (!fl[i].isFile() || !fn.endsWith(".dat") || setFile.contains(path+File.separator+fn)) 291 continue; 292 setFile.add(path+File.separator+fn); 293 fileList.add(path+File.separator+fn); 294 } 295 } 296 297 } 298 299 // how to write a Configuration file 300 301 // step 1. use factory name to get corresponding fatory which executes the visulization 302 // factory name should be as following: 303 // **************************************************************************** 304 // 1.Table 2.Amount Hot Spot 3.Coordinate Hot Spot 305 // 4.Vertical Bar Char 5.Horizontal Bar Chart 6.Correlation Graph 306 // 7.Prediction Visualization 307 // **************************************************************************** 308 309 // step 2. Choose subject, stored as elementDefinition, the name 310 // of subject should come from EVolve.DemoSource startBuildDefinition(...), 311 // there are 2 catagories: 312 // 1. Object Allocation (denoted by allocationBuilder) 313 // 2. Method Invocation (denoted by invocationBuilder) 314 315 // step 3. build up dimensions needed, these dimensions are defined in 316 // factories, depends on different factory, different dimension are defined 317 // for example, in prediction, there are 3 dimensions: 318 // x-axis, y-axis and prediction. The value of these three dimension can be 319 // found in EVolve.DemoSource, and build up in Visualization.setDefinition, stored 320 // in DataFilter 321 322 // translate subject to elementDefinition 323 324 } 325