Fork us on GitHub

Runtime Debugging with Groovy Console

Now you can interact with the runtime environment of your app...
Runtime Debugging with Groovy Console

Runtime Debugging with Groovy Console

We recently added a new tool to the Codename One simulator that will allow you to run arbitrary code snippets in your app’s runtime environment.   You can access it from “File” > “Groovy Console”, while your app is running in the simulator.

This will open the following dialog that will allow you to execute arbitrary Groovy code:

As you may suspect, you should use the Groovy programming language in this console.  If you’re not familiar with Groovy, don’t worry.  The language is basically just Java with some nice short-cuts.  In fact, in many cases, you can probably just write Java code, and it will still work.  Personally, I like the way that Groovy lets you refer to object properties via their property name, so you don’t need to use the getter or setter methods explicitly.  E.g. You can do “form.title”, instead of “form.getTitle()”, to get the form’s title.   The former is converted into the latter automatically for you.

First Example: Getting the Current form’s title

As a simple first example, let’s get the current form’s title and print the value in the console.   The default content in the console already has a reference to the current form via the “form=CN.currentForm” line.  So all we need to do is add:

Then press “Command-Enter” (or Ctrl-Enter on Windows/Linux”), to see the output.  You should see something like the following in the bottom-half of the console:

Second Example: Showing a Dialog:

You can also interact with the UI.  Create forms, components, dialogs - or essentially create entire apps.  Below, you can see us displaying a simple dialog directly in the console.

Using the ComponentSelector

My most frequent uses of the console is to find out the properties on some component in the UI.  For this sort of thing, the ComponentSelector class is an invaluable tool.  It makes it easy to find the components that you’re interested in, and to inspect its state.

For example, we might want to look at the font height of all instances of the Label class on the current form:

The above example demonstrates some fundamentals of both Groovy, and of the ComponentSelector class.

  1. `$(‘*’, form)` - This creates a set of all components in the current form.  “*” matches all.
  2. `.filter{ ..}` - This method filters the set so that only the components for which the closure returns `true` are included.    Notice the convenient notation for a closure in Groovy:  `{ .. }`.  And it provides you with the implicit variable “it” which refers to the parameter in a single-parameter method closure.
  3. `.each{...}` - Allow you to execute code on “each” element in the set.  Again, we use the convenient closure notation and implicit “it” object provided by Groovy.

Useful for Troubleshooting Requests

One potential area where the console may have some powerful uses, is in the area of trouble-shooting and bug reporting.  If a developer asks the community for help in debugging a problem in their app it is now possible for community members to share snippets that might help to diagnose the problem.  It was already possible to share snippets, but the console makes it easier to provide advice like:  “When you get to the part of your app that is having the problem, try running this snippet of code inside the console, and let me know what the output is”.

Versus Debugging in the IDE

It is worth noting that you could already inspect the runtime state of your app using your IDE debugger.  You can pause the app, then evaluate arbitrary Java expressions to see their output.  You can Add break-points, and even make source code changes that are applied seamlessly at runtime.  The console is not meant to replace this functionality.  It is meant to provide a slightly lighter-weight approach to achieve many of the same things.  

You’ll have to find your own usage patterns, but I have found that it is handy to be able to just open up a console, whether or not my app is being run in “Debug” mode, and start tinkering with some code to get a clearer picture of what is going on inside my app.

Share Your Snippets

I’ve only posted a couple of simple examples of how you might use the console, but the sky is the limit.  Please share your own snippets and tips if you discover any tricks that might be helpful to other users.  You can share them below in the comments.

Share this Post:

Posted by Steve Hannah

Steve writes software for Codename One. He is an open source enthusiast who loves to tinker with new technologies.