001package com.dev9.mvnwatcher; 002 003import javax.swing.*; 004import java.awt.*; 005import java.net.URL; 006 007public class MvnSystemNotifications { 008 009 private boolean gui; 010 011 MvnMonitor monitor; 012 013 SystemTray tray; 014 private TrayIcon trayIcon; 015 016 PopupMenu popup = new PopupMenu(); 017 MenuItem messageMenu = new MenuItem("Starting..."); 018 MenuItem exceptionMenu = new MenuItem("Last Exception"); 019 020 private Image IMAGE_OK; 021 private Image IMAGE_FAIL; 022 private Image IMAGE_WORKING; 023 024 private String lastUpdate = "-"; 025 026 public String status() { 027 return lastUpdate; 028 } 029 030 public MvnSystemNotifications(MvnMonitor monitor) { 031 this.monitor = monitor; 032 } 033 034 public enum Status { 035 OK, FAIL, WORKING 036 } 037 038 private Image statusToImage(Status status) { 039 switch (status) { 040 case OK: 041 return IMAGE_OK; 042 case FAIL: 043 return IMAGE_FAIL; 044 case WORKING: 045 return IMAGE_WORKING; 046 } 047 return IMAGE_FAIL; 048 } 049 050 private void setupImages() { 051 IMAGE_OK = createImage("/images/OK.png", "Running Normally"); 052 IMAGE_FAIL = createImage("/images/FAIL.png", "Build Failing"); 053 IMAGE_WORKING = createImage("/images/WORKING.png", "Building..."); 054 } 055 056 public void init(boolean useGui) { 057 gui = java.awt.SystemTray.isSupported(); 058 059 if (!useGui && gui) 060 gui = false; 061 062 if (gui) { 063 064 tray = SystemTray.getSystemTray(); 065 066 setupImages(); 067 068 trayIcon = new TrayIcon(IMAGE_WORKING); 069 070 try { 071 tray.add(trayIcon); 072 073 messageMenu.setEnabled(false); 074 075 popup.add(messageMenu); 076 077 MenuItem quitMenu = new MenuItem(); 078 quitMenu.setLabel("Quit"); 079 quitMenu.addActionListener(e -> monitor.shutdown = true); 080 081 popup.add(quitMenu); 082 083 trayIcon.setPopupMenu(popup); 084 } catch (AWTException e) { 085 System.err.println("Unable to start system tray integration."); 086 e.printStackTrace(); 087 gui = false; 088 } 089 } 090 } 091 092 public void update(String message, Status status) { 093 update(message, status, null); 094 } 095 096 public void update(String message, Status status, Exception e) { 097 098 if (message == null) 099 return; 100 if (status == null) 101 return; 102 103 String newMessage; 104 105 if (e == null) 106 newMessage = message + ":" + status.toString(); 107 else 108 newMessage = message + ":" + status.toString() + ":" + e.getMessage(); 109 110 if (lastUpdate.compareTo(newMessage) == 0) { 111 return; 112 } 113 114 lastUpdate = newMessage; 115 116 if (gui) { 117 trayIcon.setImage(statusToImage(status)); 118 trayIcon.setToolTip(message); 119 messageMenu.setLabel(message); 120 121 if (e == null) { 122 if (exceptionMenu.getParent() != null) 123 popup.remove(exceptionMenu); 124 } else { 125 if (exceptionMenu.getParent() == null) 126 popup.add(exceptionMenu); 127 exceptionMenu.setLabel(e.getLocalizedMessage()); 128 } 129 } 130 131 System.out.println(message); 132 if (e != null) 133 e.printStackTrace(); 134 } 135 136 137 //Obtain the image URL 138 private Image createImage(String path, String description) { 139 URL imageURL = MvnSystemNotifications.class.getResource(path); 140 141 if (imageURL == null) { 142 gui = false; 143 System.err.println("Can't boot system tray, resource not found: " + path); 144 return null; 145 } else { 146 return (new ImageIcon(imageURL, description)).getImage(); 147 } 148 } 149 150}