1 19 20 package taskblocks.io; 21 22 import java.awt.BorderLayout ; 23 import java.awt.Component ; 24 import java.awt.Dimension ; 25 import java.awt.GridBagConstraints ; 26 import java.awt.GridBagLayout ; 27 import java.awt.event.ActionEvent ; 28 import java.awt.event.KeyEvent ; 29 import java.awt.event.WindowAdapter ; 30 import java.awt.event.WindowEvent ; 31 import java.io.IOException ; 32 import java.io.StringReader ; 33 import java.lang.reflect.InvocationTargetException ; 34 import java.net.InetAddress ; 35 import java.net.UnknownHostException ; 36 import java.text.SimpleDateFormat ; 37 import java.util.Date ; 38 import java.util.HashMap ; 39 import java.util.Map ; 40 import java.util.prefs.Preferences ; 41 42 import javax.swing.AbstractAction ; 43 import javax.swing.BorderFactory ; 44 import javax.swing.Box ; 45 import javax.swing.Icon ; 46 import javax.swing.InputMap ; 47 import javax.swing.JButton ; 48 import javax.swing.JComponent ; 49 import javax.swing.JDialog ; 50 import javax.swing.JFrame ; 51 import javax.swing.JLabel ; 52 import javax.swing.JPanel ; 53 import javax.swing.JPasswordField ; 54 import javax.swing.JRootPane ; 55 import javax.swing.JScrollPane ; 56 import javax.swing.JSeparator ; 57 import javax.swing.JTable ; 58 import javax.swing.JTextField ; 59 import javax.swing.JTextPane ; 60 import javax.swing.KeyStroke ; 61 import javax.swing.SwingUtilities ; 62 import javax.swing.table.AbstractTableModel ; 63 import javax.swing.table.TableCellRenderer ; 64 import javax.swing.text.BadLocationException ; 65 import javax.swing.text.Document ; 66 import javax.swing.text.html.HTMLEditorKit ; 67 68 import taskblocks.Utils; 69 import taskblocks.bugzilla.BugzillaSubmitter; 70 import taskblocks.modelimpl.ColorLabel; 71 import taskblocks.modelimpl.TaskImpl; 72 73 public class BugzillaExportDialog extends JDialog { 74 75 TaskImpl[] _tasks; 76 77 JTable _tasksTable; 78 79 Object [][] _tasksData; 80 81 JButton okB; 82 83 JButton cancelB; 84 85 private AbstractAction _okAction; 86 87 private AbstractAction _cancelAction; 88 89 JTextField _baseUrlTF; 90 91 JTextField _userTF; 92 93 JTextField _passwdTF; 94 95 JTextField _productTF; 96 97 JTextField _versionTF; 98 99 JTextField _componentTF; 100 101 JTextField _blocksTF; 102 103 JTextField _hardwareTF; 104 105 JTextField _osTF; 106 107 JTextField _priorTF; 108 109 JTextField _severTF; 110 111 JTextPane _logArea; 112 113 JTextField _keywordsTF; 114 115 Preferences _prefs = Preferences.userNodeForPackage(this.getClass()); 116 117 public BugzillaExportDialog(JFrame owner, TaskImpl[] tasks) { 118 super(owner, "Bugzilla export", true); 119 120 _tasks = tasks; 121 constructData(); 122 createActions(); 123 124 JPanel mainP = new JPanel (new BorderLayout (0, 12)); 125 okB = new JButton (_okAction); 126 cancelB = new JButton (_cancelAction); 127 Box butP = Box.createHorizontalBox(); 128 butP.add(Box.createHorizontalGlue()); 129 butP.add(okB); 130 butP.add(Box.createHorizontalStrut(10)); 131 butP.add(cancelB); 132 mainP.add(butP, BorderLayout.SOUTH); 133 getContentPane().add(mainP); 134 JPanel mainPanel = createMainPanel(); 135 mainP.add(mainPanel, BorderLayout.CENTER); 136 137 mainP.setBorder(BorderFactory.createEmptyBorder(12, 12, 12, 12)); 138 139 setDefaultActions(getRootPane()); 140 this.addWindowListener(new WindowAdapter (){ 141 public void windowClosed(WindowEvent e) { 142 saveTextFields(); 143 } 144 }); 145 } 146 147 private void saveTextFields() { 148 _prefs.put("baseUrl", _baseUrlTF.getText()); 149 _prefs.put("user", _userTF.getText()); 150 _prefs.put("product", _productTF.getText()); 151 _prefs.put("version", _versionTF.getText()); 152 _prefs.put("component", _componentTF.getText()); 153 _prefs.put("blocks", _blocksTF.getText()); 154 _prefs.put("hardware", _hardwareTF.getText()); 155 _prefs.put("os", _osTF.getText()); 156 _prefs.put("priority", _priorTF.getText()); 157 _prefs.put("severity", _severTF.getText()); 158 _prefs.put("keywords", _keywordsTF.getText()); 159 } 160 161 private void setDefaultActions(JRootPane rootPane) { 162 KeyStroke strokeEsc = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0); 163 165 InputMap inputMap = rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); 166 inputMap.put(strokeEsc, "ESCAPE"); 167 rootPane.getActionMap().put("ESCAPE", _cancelAction); 169 } 171 172 173 174 private JPanel createMainPanel() { 175 JPanel p = new JPanel (new BorderLayout (0, 12)); 176 _tasksTable = new JTable (new TasksModel()) { 177 public Component prepareRenderer(TableCellRenderer renderer, int row, 178 int column) { 179 Component c = super.prepareRenderer(renderer, row, column); 180 return c; 181 } 182 }; 183 _tasksTable.getColumnModel().getColumn(0).setMaxWidth(25); 185 _tasksTable.getColumnModel().getColumn(0).setMinWidth(25); 186 _tasksTable.getColumnModel().getColumn(1).setMaxWidth(50); 187 JScrollPane sp = new JScrollPane (_tasksTable); 188 sp.setPreferredSize(new Dimension (700,200)); 189 JPanel contentP = new JPanel (); 190 p.add(sp, BorderLayout.CENTER); 191 192 _logArea = new JTextPane (); 193 ((JTextPane )_logArea).setContentType("text/html"); 194 _logArea.setEditable(false); 195 _logArea.setText("<html>Log:"); 196 197 String domain=""; 198 try { 199 domain = InetAddress.getLocalHost().getCanonicalHostName(); 200 } catch (UnknownHostException e) { 201 e.printStackTrace(); 202 } 203 _baseUrlTF = new JTextField (_prefs.get("baseUrl", "http://")); 204 _userTF = new JTextField (_prefs.get("user", System.getProperty("user.name") + "@" + domain)); 205 _passwdTF = new JPasswordField (""); 206 _productTF = new JTextField (_prefs.get("product", "")); 207 _versionTF = new JTextField (_prefs.get("version", "")); 208 _componentTF = new JTextField (_prefs.get("component", "")); 209 _blocksTF = new JTextField (_prefs.get("blocks", "")); 210 _hardwareTF = new JTextField (_prefs.get("hardware", "All")); 211 _osTF = new JTextField (_prefs.get("os", "All")); 212 _priorTF = new JTextField (_prefs.get("priority", "P2")); 213 _severTF = new JTextField (_prefs.get("severity", "enhancement")); 214 _keywordsTF = new JTextField (_prefs.get("keywords", "")); 215 216 contentP.setLayout(new GridBagLayout ()); 218 GridBagConstraints gc = new GridBagConstraints (); 219 220 gc.gridx = 0; 222 gc.gridy = -1; 223 gc.fill = GridBagConstraints.NONE; 224 gc.insets.bottom = 5; 225 gc.anchor = GridBagConstraints.EAST; 226 gc.gridy++; 228 contentP.add(new JLabel ("Bugzilla URL:"), gc); 229 gc.gridy++; 230 contentP.add(new JLabel ("User:"), gc); 231 gc.gridy++; 232 contentP.add(new JLabel ("Password:"), gc); 233 234 gc.gridy++; 235 gc.gridwidth = 4; 236 gc.insets.top = 8; 237 gc.insets.bottom = 8; 238 gc.fill = GridBagConstraints.HORIZONTAL; 239 contentP.add(new JSeparator (JSeparator.HORIZONTAL), gc); 240 gc.insets.top = 0; 241 gc.insets.bottom = 4; 242 gc.gridwidth = 1; 243 gc.fill = GridBagConstraints.NONE; 244 245 gc.gridy++; 246 contentP.add(new JLabel ("Product:"), gc); 247 gc.gridy++; 248 contentP.add(new JLabel ("Version:"), gc); 249 gc.gridy++; 250 contentP.add(new JLabel ("Component:"), gc); 251 gc.gridy++; 252 contentP.add(new JLabel ("Blocks:"), gc); 253 gc.gridx += 2; 254 gc.gridy = 3; 255 gc.insets.left = 10; 256 gc.gridy++; 257 contentP.add(new JLabel ("Hardware:"), gc); 258 gc.gridy++; 259 contentP.add(new JLabel ("OS:"), gc); 260 gc.gridy++; 261 contentP.add(new JLabel ("Priority:"), gc); 262 gc.gridy++; 263 contentP.add(new JLabel ("Severity:"), gc); 264 gc.gridy++; 265 contentP.add(new JLabel ("Keywords:"), gc); 266 267 gc.gridx = 1; 269 gc.gridy = -1; 270 gc.fill = GridBagConstraints.HORIZONTAL; 271 gc.weightx = 1; 272 gc.insets.left = 8; 273 gc.gridwidth = 3; 275 gc.gridy++; 276 contentP.add(_baseUrlTF, gc); 277 gc.gridy++; 278 contentP.add(_userTF, gc); 279 gc.gridy++; 280 contentP.add(_passwdTF, gc); 281 gc.gridwidth = 1; 282 gc.gridy++; 283 gc.gridy++; 284 contentP.add(_productTF, gc); 285 gc.gridy++; 286 contentP.add(_versionTF, gc); 287 gc.gridy++; 288 contentP.add(_componentTF, gc); 289 gc.gridy++; 290 contentP.add(_blocksTF, gc); 291 gc.gridx += 2; 292 gc.gridy = 3; 293 gc.gridy++; 294 contentP.add(_hardwareTF, gc); 295 gc.gridy++; 296 contentP.add(_osTF, gc); 297 gc.gridy++; 298 contentP.add(_priorTF, gc); 299 gc.gridy++; 300 contentP.add(_severTF, gc); 301 gc.gridy++; 302 contentP.add(_keywordsTF, gc); 303 304 p.add(contentP, BorderLayout.NORTH); 305 JScrollPane logSP = new JScrollPane (_logArea); 306 logSP.setPreferredSize(new Dimension (100,100)); 307 logSP.setMaximumSize(new Dimension (100,100)); 308 p.add(logSP, BorderLayout.SOUTH); 309 return p; 310 } 311 312 private void createActions() { 313 _cancelAction = new AbstractAction ("Cancel") { 314 public void actionPerformed(ActionEvent e) { 315 dispose(); 316 } 317 }; 318 319 _okAction = new AbstractAction ("Submit") { 320 public void actionPerformed(ActionEvent e) { 321 submit(); 322 } 323 }; 324 } 325 326 private void constructData() { 327 328 SimpleDateFormat statusWhiteboardFormat = new SimpleDateFormat ("ddMMyy"); 329 330 _tasksData = new Object [_tasks.length][]; 331 for (int i = 0; i < _tasks.length; i++) { 332 TaskImpl task = _tasks[i]; 333 long startTime = task.getStartTime() * Utils.MILLISECONDS_PER_DAY; 334 long endTime = Utils.countFinishTime(task.getStartTime(), task 335 .getDuration()) 336 * Utils.MILLISECONDS_PER_DAY; 337 _tasksData[i] = new Object [6]; 338 _tasksData[i][0] = new Boolean (true); 339 ColorLabel taskColLabel = _tasks[i].getColorLabel(); 340 if(taskColLabel == null) { 341 _tasksData[i][1] = ColorLabel.COLOR_LABELS[0]._icon; 342 } else { 343 _tasksData[i][1] = taskColLabel._icon; 344 } 345 _tasksData[i][2] = task.getName(); 346 _tasksData[i][3] = task.getMan().getName(); 347 _tasksData[i][4] = new Integer ( 348 (int) ((double) task.getDuration() * 8d * 0.8)); 349 _tasksData[i][5] = statusWhiteboardFormat.format(new Date (startTime)) 350 + "-" + statusWhiteboardFormat.format(new Date (endTime)); 351 } 352 } 353 354 class TasksModel extends AbstractTableModel { 355 356 String [] COL_NAMES = new String [] { "", "Color", "Summary", "Assignee", 357 "Estimated Time", "Status Whiteboard" }; 358 359 Class [] COL_CLASSES = new Class [] { Boolean .class, Icon .class, String .class, 360 String .class, String .class, String .class }; 361 362 public String getColumnName(int column) { 363 return COL_NAMES[column]; 364 } 365 366 public Class getColumnClass(int col) { 367 return COL_CLASSES[col]; 368 } 369 370 public int getColumnCount() { 371 return COL_NAMES.length; 372 } 373 374 public int getRowCount() { 375 return _tasksData.length; 376 } 377 378 public boolean isCellEditable(int rowIndex, int columnIndex) { 379 return true; 380 } 381 382 public Object getValueAt(int rowIndex, int columnIndex) { 383 return _tasksData[rowIndex][columnIndex]; 384 } 385 386 public void setValueAt(Object aValue, int rowIndex, int columnIndex) { 387 _tasksData[rowIndex][columnIndex] = aValue; 388 } 389 390 } 391 392 private void submit() { 393 _okAction.setEnabled(false); 394 new Thread () { 395 public void run() { 396 try { 397 int success = 0; 398 int fails = 0; 399 for (int i = 0; BugzillaExportDialog.this.isShowing() && i < _tasks.length; i++) { 400 if (((Boolean ) _tasksData[i][0]).booleanValue()) { 401 402 final int row = i; 403 SwingUtilities.invokeAndWait(new Runnable (){ 404 public void run() { 405 _tasksTable.getSelectionModel().setSelectionInterval(row, row); 406 _tasksTable.scrollRectToVisible(_tasksTable.getCellRect(row, 0, true)); 407 } 408 }); 409 410 if(submitTask(_tasksData[i], _tasks[i])) { 411 success++; 412 SwingUtilities.invokeAndWait(new Runnable (){ 413 public void run() { 414 _tasksData[row][0] = Boolean.FALSE; 415 ((TasksModel)_tasksTable.getModel()).fireTableDataChanged(); 416 } 417 }); 418 } else { 419 fails++; 420 } 421 } 422 } 423 if(success > 0) { 424 logMsg("Submitted " + success + " tasks"); 425 } 426 if(fails > 0) { 427 logMsg("Failed to submit " + fails + " tasks"); 428 } 429 } catch(InterruptedException e) { 430 e.printStackTrace(); 431 } catch (InvocationTargetException e) { 432 e.printStackTrace(); 433 } finally { 434 _okAction.setEnabled(true); 435 } 436 } 437 }.start(); 438 } 439 440 private boolean submitTask(Object [] taskData, TaskImpl task) { 441 BugzillaSubmitter bs = new BugzillaSubmitter(); 442 Map <String , String > taskProps = new HashMap <String , String >(); 443 taskProps.put(BugzillaSubmitter.SUMMARY, (String ) taskData[2]); 444 taskProps.put(BugzillaSubmitter.ASSIGNED_TO, (String ) taskData[3]); 445 taskProps.put(BugzillaSubmitter.ESTIMATED_TIME, String.valueOf((Integer ) taskData[4])); 446 taskProps.put(BugzillaSubmitter.STATUS_WHITEBOARD, (String ) taskData[5]); 447 448 taskProps.put(BugzillaSubmitter.PRODUCT, _productTF.getText()); 449 taskProps.put(BugzillaSubmitter.VERSION, _versionTF.getText()); 450 taskProps.put(BugzillaSubmitter.COMPONENT, _componentTF.getText()); 451 taskProps.put(BugzillaSubmitter.BLOCKS, _blocksTF.getText()); 452 taskProps.put(BugzillaSubmitter.HARDWARE, _hardwareTF.getText()); 453 taskProps.put(BugzillaSubmitter.OS, _osTF.getText()); 454 taskProps.put(BugzillaSubmitter.PRIORITY, _priorTF.getText()); 455 taskProps.put(BugzillaSubmitter.SEVERITY, _severTF.getText()); 456 taskProps.put(BugzillaSubmitter.DESCRIPTION, ""); taskProps.put(BugzillaSubmitter.KEYWORDS, _keywordsTF.getText()); 458 459 try { 460 String bugId = bs.submit(_baseUrlTF.getText(), _userTF.getText(), 462 _passwdTF.getText(), taskProps); 463 logMsg("- Submitted bug #" + bugId + " for task '" + task.getName() + "'\n"); 464 return true; 465 } catch (Exception e) { 466 String msg; 467 if(e instanceof IOException || e.getMessage() == null) { 468 msg = e.toString(); 469 } else { 470 msg = e.getMessage(); 471 } 472 logMsg("<font color=\"#ff0000\"><b>- Error submitting task '" + task.getName() 473 + "'</b><br>\n " + msg 474 + "</font>\n"); 475 return false; 476 } 477 } 478 479 private void logMsg(String msg) { 480 HTMLEditorKit kit = 481 (HTMLEditorKit ) _logArea.getEditorKit(); 482 Document doc = _logArea.getDocument(); 483 StringReader reader = new StringReader (msg); 484 try { 485 kit.read(reader, doc, doc.getLength()); 486 } catch (IOException e) { 487 } catch (BadLocationException e) { 488 } 489 int len = doc.getLength(); 490 _logArea.setSelectionStart(len); 491 _logArea.setSelectionEnd(len); 492 _logArea.setPreferredSize(new Dimension (100,100)); 493 _logArea.setMaximumSize(new Dimension (100,100)); 494 } 495 496 public static void openDialog(JFrame owner, TaskImpl[] tasks) { 497 BugzillaExportDialog d = new BugzillaExportDialog(owner, tasks); 498 d.pack(); 499 d.setLocationRelativeTo(owner); 500 d.setVisible(true); 501 } 502 503 } 504 | Popular Tags |