Improve Growl exception handling, remove System.out and a few fixes from audit

git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@1048 3d1905a2-6b24-0410-a738-b14d5a86fcbd
This commit is contained in:
mguessan 2010-05-13 12:48:10 +00:00
parent 437837e21c
commit a7c218857b
3 changed files with 204 additions and 229 deletions

View File

@ -37,175 +37,144 @@ import javax.imageio.ImageIO;
/**
* Growl notification implementation. This uses JNI to send messages to Growl.
*
*
* @author Michael Stringer
* @version 0.1
*/
class GrowlNative implements Growl {
private String appName;
private List<NotificationType> notifications;
private List<GrowlCallbackListener> callbackListeners;
private final String appName;
private final List<NotificationType> notifications;
private final List<GrowlCallbackListener> callbackListeners;
private byte[] imageData;
private native void sendNotification(String appName, String name,
String title, String message, String callbackContext, byte[] icon);
String title, String message, String callbackContext, byte[] icon);
private native void registerApp(String appName, byte[] image,
List<NotificationType> notifications);
List<NotificationType> notifications);
/**
* Creates a new <code>GrowlNative</code> instance for the specified
* application name.
*
* @param appName
* The name of the application sending notifications.
*
* @param appName The name of the application sending notifications.
*/
GrowlNative(String appName) {
notifications = new ArrayList<NotificationType>();
callbackListeners = new ArrayList<GrowlCallbackListener>();
this.appName = appName;
notifications = new ArrayList<NotificationType>();
callbackListeners = new ArrayList<GrowlCallbackListener>();
this.appName = appName;
}
@SuppressWarnings({"UnusedDeclaration"})
void fireCallbacks(String callbackContext) {
for (GrowlCallbackListener listener : callbackListeners) {
listener.notificationWasClicked(callbackContext);
}
for (GrowlCallbackListener listener : callbackListeners) {
listener.notificationWasClicked(callbackContext);
}
}
/**
* {@inheritDoc}
*/
public void register() throws GrowlException {
registerApp(appName, imageData, notifications);
registerApp(appName, imageData, notifications);
}
/**
* {@inheritDoc}
*/
public void addNotification(String name, boolean enabledByDefault) {
notifications.add(new NotificationType(name, enabledByDefault));
notifications.add(new NotificationType(name, enabledByDefault));
}
/**
* {@inheritDoc}
*/
public void addCallbackListener(GrowlCallbackListener listener) {
callbackListeners.add(listener);
callbackListeners.add(listener);
}
/**
* {@inheritDoc}
*/
public void setIcon(RenderedImage icon) throws GrowlException {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(icon, "png", baos);
imageData = convertImage(icon);
}
imageData = baos.toByteArray();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
protected byte[] convertImage(RenderedImage icon) throws GrowlException {
if (icon == null) {
return null;
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
ImageIO.write(icon, "png", baos);
} catch (IOException ioe) {
throw new GrowlException("Failed to convert Image", ioe);
}
return baos.toByteArray();
}
/**
* {@inheritDoc}
*/
public void sendNotification(String name, String title, String body)
throws GrowlException {
if (!notifications.contains(new NotificationType(name, false))) {
System.out.println("contains: " + notifications);
throw new GrowlException("Unregistered notification name [" + name
+ "]");
}
sendNotification(appName, name, title, body, null, null);
throws GrowlException {
sendNotification(name, title, body, null, null);
}
/**
* {@inheritDoc}
*/
public void sendNotification(String name, String title, String body,
RenderedImage icon) throws GrowlException {
if (!notifications.contains(new NotificationType(name, false))) {
System.out.println("contains: " + notifications);
throw new GrowlException("Unregistered notification name [" + name
+ "]");
}
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(icon, "png", baos);
byte[] image = baos.toByteArray();
sendNotification(appName, name, title, body, null, image);
} catch (IOException ioe) {
throw new GrowlException("Failed to convert Image", ioe);
}
public void sendNotification(String name, String title, String body, RenderedImage icon) throws GrowlException {
sendNotification(name, title, body, null, icon);
}
/**
* {@inheritDoc}
*/
public void sendNotification(String name, String title, String body,
String callbackContext) throws GrowlException {
if (!notifications.contains(new NotificationType(name, false))) {
System.out.println("contains: " + notifications);
throw new GrowlException("Unregistered notification name [" + name
+ "]");
}
sendNotification(appName, name, title, body, callbackContext, null);
public void sendNotification(String name, String title, String body, String callbackContext) throws GrowlException {
sendNotification(name, title, body, callbackContext, null);
}
/**
* {@inheritDoc}
*/
public void sendNotification(String name, String title, String body,
String callbackContext, RenderedImage icon) throws GrowlException {
if (!notifications.contains(new NotificationType(name, false))) {
System.out.println("contains: " + notifications);
throw new GrowlException("Unregistered notification name [" + name
+ "]");
}
public void sendNotification(String name, String title, String body, String callbackContext, RenderedImage icon)
throws GrowlException {
if (!notifications.contains(new NotificationType(name, false))) {
throw new GrowlException("Unregistered notification name [" + name + ']');
}
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(icon, "png", baos);
byte[] image = baos.toByteArray();
sendNotification(appName, name, title, body, callbackContext, image);
} catch (IOException ioe) {
throw new GrowlException("Failed to convert Image", ioe);
}
sendNotification(appName, name, title, body, callbackContext, convertImage(icon));
}
private class NotificationType {
private String name;
private boolean enabledByDefault;
private final String name;
private final boolean enabledByDefault;
public NotificationType(String name, boolean enabledByDefault) {
this.name = name;
this.enabledByDefault = enabledByDefault;
}
private NotificationType(String name, boolean enabledByDefault) {
this.name = name;
this.enabledByDefault = enabledByDefault;
}
public String getName() {
return name;
}
@SuppressWarnings({"UnusedDeclaration"})
public String getName() {
return name;
}
public boolean isEnabledByDefault() {
return enabledByDefault;
}
@SuppressWarnings({"UnusedDeclaration"})
public boolean isEnabledByDefault() {
return enabledByDefault;
}
public boolean equals(Object other) {
if (!(other instanceof NotificationType)) {
return false;
}
@Override
public boolean equals(Object other) {
return (other instanceof NotificationType) &&
name.equals(((NotificationType) other).name);
}
NotificationType otherType = (NotificationType) other;
return name.equals(otherType.name);
}
@Override
public int hashCode() {
return name.hashCode();
}
}
}

View File

@ -32,65 +32,65 @@ import java.util.Map;
/**
* Utility class for sending notifications using Growl.
*
*
* @author Michael Stringer
* @version 0.1
*/
public final class GrowlUtils {
private static final boolean GROWL_LOADED;
private static Map<String, Growl> instances = new HashMap<String, Growl>();
private static final Map<String, Growl> instances = new HashMap<String, Growl>();
static {
boolean loaded = false;
try {
System.loadLibrary("growl");
loaded = true;
} catch (UnsatisfiedLinkError ule) {
System.out.println("Failed to load Growl library");
}
boolean loaded = false;
try {
System.loadLibrary("growl");
loaded = true;
} catch (UnsatisfiedLinkError ule) {
// ignore: growl not available
}
GROWL_LOADED = loaded;
GROWL_LOADED = loaded;
}
/**
* Utility method - should not be instantiated.
*/
private GrowlUtils() {
}
/**
* Gets a <code>Growl</code> instance to use for the specified application
* name. Multiple calls to this method will return the same instance.
*
* @param appName
* The name of the application.
*
* @param appName The name of the application.
* @return The <code>Growl</code> instance to use.
*/
public static Growl getGrowlInstance(String appName) {
Growl instance = instances.get(appName);
synchronized (instances) {
Growl instance = instances.get(appName);
if (instance == null) {
if (GROWL_LOADED) {
instance = new GrowlNative(appName);
} else {
instance = new DummyGrowl();
}
if (instance == null) {
if (GROWL_LOADED) {
instance = new GrowlNative(appName);
} else {
instance = new DummyGrowl();
}
instances.put(appName, instance);
}
instances.put(appName, instance);
}
return instance;
return instance;
}
}
/**
* Gets whether messages can be sent to Growl. If this returns
* <code>false</code> then {@link #getGrowlInstance(String)} will return a
* dummy object.
*
*
* @return <code>true</code> if messages can be sent to Growl.
*/
public static boolean isGrowlLoaded() {
return GROWL_LOADED;
return GROWL_LOADED;
}
}

View File

@ -47,7 +47,7 @@ import javax.swing.SwingUtilities;
/**
* Simple test class for Growl.
*
*
* @author Michael Stringer
* @version 0.1
*/
@ -55,132 +55,138 @@ public class TestGrowl extends JFrame {
private static final String APP_NAME = "Test Java App";
private static final String NOTIF_3_CALLBACK = "Notif3";
/**
* Test Growl.
*/
public TestGrowl() {
super("Growl for Java");
setSize(320, 290);
super("Growl for Java");
setSize(320, 290);
buildComponents();
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
buildComponents();
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
private void buildComponents() {
getContentPane().setLayout(new GridLayout(6, 1));
getContentPane().setLayout(new GridLayout(6, 1));
Action action = new AbstractAction("Register") {
public void actionPerformed(ActionEvent ae) {
try {
Growl growl = GrowlUtils.getGrowlInstance(APP_NAME);
Action action = new AbstractAction("Register") {
public void actionPerformed(ActionEvent ae) {
try {
Growl growl = GrowlUtils.getGrowlInstance(APP_NAME);
growl.addNotification("Test Notification 1", true);
growl.addNotification("Test Notification 2", false);
growl.addNotification("Test Notification 3", true);
growl.addNotification("Test Notification 1", true);
growl.addNotification("Test Notification 2", false);
growl.addNotification("Test Notification 3", true);
GrowlCallbackListener listener = new GrowlCallbackListener() {
public void notificationWasClicked(
final String clickContext) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
if (NOTIF_3_CALLBACK.equals(clickContext)) {
JOptionPane
.showMessageDialog(
TestGrowl.this,
"User clicked on 'Test Notification 3'");
}
}
});
}
};
GrowlCallbackListener listener = new GrowlCallbackListener() {
public void notificationWasClicked(
final String clickContext) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
if (NOTIF_3_CALLBACK.equals(clickContext)) {
JOptionPane
.showMessageDialog(
TestGrowl.this,
"User clicked on 'Test Notification 3'");
}
}
});
}
};
growl.addCallbackListener(listener);
growl.register();
} catch (GrowlException ge) {
ge.printStackTrace();
}
}
};
growl.addCallbackListener(listener);
growl.register();
} catch (GrowlException ge) {
ge.printStackTrace();
}
}
};
getContentPane().add(new JButton(action));
getContentPane().add(new JButton(action));
action = new AbstractAction("Send 'Test Notification 1'") {
public void actionPerformed(ActionEvent ae) {
try {
Growl growl = GrowlUtils.getGrowlInstance(APP_NAME);
action = new AbstractAction("Send 'Test Notification 1'") {
public void actionPerformed(ActionEvent ae) {
try {
Growl growl = GrowlUtils.getGrowlInstance(APP_NAME);
growl.sendNotification("Test Notification 1",
"Test Notif 1", "This is a test");
} catch (GrowlException ge) {
ge.printStackTrace();
}
}
};
getContentPane().add(new JButton(action));
growl.sendNotification("Test Notification 1",
"Test Notif 1", "This is a test");
} catch (GrowlException ge) {
ge.printStackTrace();
}
}
};
getContentPane().add(new JButton(action));
action = new AbstractAction("Send 'Test Notification 2'") {
public void actionPerformed(ActionEvent ae) {
try {
Growl growl = GrowlUtils.getGrowlInstance(APP_NAME);
BufferedImage image = ImageIO.read(TestGrowl.class
.getResource("/images/duke.gif"));
growl.sendNotification("Test Notification 2",
"Test Notif 2", "This is another test", image);
} catch (GrowlException ge) {
ge.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
getContentPane().add(new JButton(action));
action = new AbstractAction("Send 'Test Notification 2'") {
public void actionPerformed(ActionEvent ae) {
try {
Growl growl = GrowlUtils.getGrowlInstance(APP_NAME);
BufferedImage image = ImageIO.read(TestGrowl.class
.getResource("/images/duke.gif"));
growl.sendNotification("Test Notification 2",
"Test Notif 2", "This is another test", image);
} catch (GrowlException ge) {
ge.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
};
getContentPane().add(new JButton(action));
action = new AbstractAction("Test Callback 'Notification 3'") {
public void actionPerformed(ActionEvent ae) {
try {
Growl growl = GrowlUtils.getGrowlInstance(APP_NAME);
action = new AbstractAction("Test Callback 'Notification 3'") {
public void actionPerformed(ActionEvent ae) {
try {
Growl growl = GrowlUtils.getGrowlInstance(APP_NAME);
growl.sendNotification("Test Notification 3",
"Callback Test", "Click me - I dares you!", NOTIF_3_CALLBACK);
} catch (GrowlException ge) {
ge.printStackTrace();
}
}
};
getContentPane().add(new JButton(action));
growl.sendNotification("Test Notification 3",
"Callback Test", "Click me - I dares you!", NOTIF_3_CALLBACK);
} catch (GrowlException ge) {
ge.printStackTrace();
}
}
};
getContentPane().add(new JButton(action));
action = new AbstractAction("Reg & Test App 2") {
public void actionPerformed(ActionEvent ae) {
try {
Growl growl = GrowlUtils.getGrowlInstance("Other App");
action = new AbstractAction("Reg & Test App 2") {
public void actionPerformed(ActionEvent ae) {
try {
Growl growl = GrowlUtils.getGrowlInstance("Other App");
growl.addNotification("A Notification", true);
growl.addNotification("A Notification", true);
BufferedImage image = ImageIO.read(TestGrowl.class
.getResource("/images/duke.gif"));
growl.setIcon(image);
BufferedImage image = ImageIO.read(TestGrowl.class
.getResource("/images/duke.gif"));
growl.setIcon(image);
growl.register();
growl.sendNotification("A Notification", "Testin",
"Blah de blah blah");
} catch (GrowlException ge) {
ge.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
getContentPane().add(new JButton(action));
growl.register();
growl.sendNotification("A Notification", "Testin",
"Blah de blah blah");
} catch (GrowlException ge) {
ge.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
};
getContentPane().add(new JButton(action));
action = new AbstractAction("Exit") {
public void actionPerformed(ActionEvent ae) {
System.exit(0);
}
};
getContentPane().add(new JButton(action));
action = new AbstractAction("Exit") {
public void actionPerformed(ActionEvent ae) {
System.exit(0);
}
};
getContentPane().add(new JButton(action));
}
public static final void main(String[] args) {
new TestGrowl();
/**
* Test growl.
* @param args args
*/
public static void main(String[] args) {
//noinspection ResultOfObjectAllocationIgnored
new TestGrowl();
}
}