Command expression language allows you to alternate method name and parameter for even number of argument
e.g.
foo a1 a2 a3 a4 a5. Foo(a1).a2(a3).a4(a5)
You can find more example and explanation on GEP-3 page.
Revisiting JMX example so that I can simplify the language as
server.url "service:jmx:rmi://localhost/jndi/rmi://localhost:1090/jmxconnector" query "jboss.web:*" filter "j2eeType=WebModule"
def filteredModules = server.filteredModules
chart.type "Bar" modules filteredModules title "Module Processing Time" width 1200 height 700 refresh 500 attributes params labels graphLabels
chart.show()
Let's look at the supporting code.
import org.jfree.chart.ChartFactory
import groovy.swing.SwingBuilder
import org.jfree.data.category.DefaultCategoryDataset
import org.jfree.chart.plot.PlotOrientation as Orientation
import javax.swing.WindowConstants as WC
import javax.management.ObjectName
import javax.management.remote.JMXConnectorFactory
import javax.management.remote.JMXServiceURL as JmxUrl
import javax.naming.Context
class Chart {
def chartModules
def chartType
def chartAttributes = {m -> [m.processingTime, m.path]}
def chartLabels =["Time per Webapp", "Webapp", "Time"]
def chartOptions = [false, true, true]
def windowTitle
def w
def h
def refreshRate
def orientation = "VERTICAL"
def dataset
def modules(m) {
chartModules = m
this
}
def type(type) {
chartType = type
this
}
def attributes(attr) {
chartAttributes = attr
this
}
def labels (lbls) {
chartLabels = lbls
this
}
def options (opts) {
chartOptions = opts
this
}
def title (title) {
windowTitle = title
this
}
def width(width) {
w = width
this
}
def height(height) {
h = height
this
}
def refresh(r) {
refreshRate = r
this
}
void show(){
switch(chartType){
case "Bar": drawBarChart(); break;
default: break;
}
}
void drawBarChart(){
calculateData()
def chart = ChartFactory.createBarChart(*chartLabels, dataset, Orientation."${orientation}", *chartOptions)
def swing = new SwingBuilder()
def frame = swing.frame(title:windowTitle, defaultCloseOperation:WC.EXIT_ON_CLOSE){
panel(id:'canvas') {rigidArea(width:w, height:h)}
}
while(true){
calculateData()
chart.fireChartChanged()
frame.pack()
frame.show()
chart.draw(swing.canvas.graphics, swing.canvas.bounds)
sleep(refreshRate)
}
}
void calculateData(){
def newDataset = new DefaultCategoryDataset()
chartModules.each{ m ->
def dsCall = chartAttributes.call(m)
newDataset.addValue dsCall[0], 0, dsCall[1]
}
this.dataset = newDataset
}
}
class Server {
def server
def queryObjects
def moduleFilter
def filteredModules
def url(serverName){
server = JMXConnectorFactory.connect(new JmxUrl(serverName)).MBeanServerConnection
this
}
def query (queryString) {
queryObjects = new ObjectName(queryString)
this
}
def filter (filterString) {
String[] allNames = server.queryNames(queryObjects, null)
filteredModules = allNames.findAll { name -> name.contains(filterString)}.collect { new GroovyMBean(server, it)}
}
}
server = new Server()
chart = new Chart()
params = {m -> [m.processingTime, m.path]}
graphLabels = ["Time per Webapp", "Webapp", "Time"]
server.url "service:jmx:rmi://localhost/jndi/rmi://localhost:1090/jmxconnector" query "jboss.web:*" filter "j2eeType=WebModule"
def filteredModules = server.filteredModules
chart.type "Bar" modules filteredModules title "Module Processing Time" width 1200 height 700 refresh 500 attributes params labels graphLabels
chart.show()
Problems faced
For some reason with the current beta build I couldn't do arrays or closures inline. so I had to put them as separate variables. I do not think it is by design and as 1.8.X comes close to release these wrinkles will be worked out.
Blogged with the Flock Browser
1 comment:
I really loved your work and specially with jfreechart
the only problem with JFreechart is that it is GPL licence
Post a Comment