Browsing the archives for the Groovy category.


Netbeans 6.5: con più Groovy e meno cacao

Groovy, Java

Netbeans sta dirigendosi rapidamente verso la release 6.5 ed ora include un supporto a Groovy degno di nota.

Groovy si è sviluppata molto in quest’ultimo anno fedele al suo motto imperativo “prima le funzionalità, poi la velocità“. Ed infatti, puntuale come un orologio svizzero, appena gli utenti avevano finito di assaporarne la sintassi “agiail” e cominciavano a lamentarsi delle sue prestazioni (fino a 60 volte più lente di java) ecco arrivare la versione 1.6 che risolveva anche i principali problemi di velocità. Groovy, ed il suo fratello Grails (una suite per lo sviluppo di web application), è un linguaggio dalle enorme potenzialità visto che già nella versione 1.0 aveva dimostrato di saper colmare il gap esistente tra java e c#, proponendo anche nuove idee come i builder. Inoltre la sua capacità di integrarsi con la standard library del Java, ne fa un linguaggio particolarmente performante, se confrontato con gli altri linguaggi che girano sulla JVM, come ad esempio JRuby.

Speriamo di vedere presto anche l’estensione Matisse, di Netbeans, supportare a pieno il linguaggio Groovy.

Zac

No Comments

Groovy: chiamare i metodi per nome…

Groovy

…e come se no? Questa volta vi mostro un piccolo esempio di come è possibile invocare dinamicamente un metodo di una classe chiamandola “per nome”, ossia utilizzando una variabile di tipo “String” che contenga il nome del metodo. Benché l’esempio sia al solito parco di linee di codice comprenderete che fare una cosa del genere con un linguaggio tradizionale ne richiederebbe molte di più.

Ma procediamo con ordine; costruiamoci una classe che faccia al nostro scopo:

class Fagiolo{
    def parla(){
        "Sono un fagiolo, lasciatemi solo"
    }
    def parlaForbito(){
        "Sono un fagiuolo, alcun vorrei meco su questo suolo"
    }
}

Questa volta ho utilizzato qualche trucchetto in più del post precedente, giusto per mostrarvi la massima compattezza (e illeggibilità, dirà giustamente qualcuno) con cui si possono scrivere i metodi in Groovy: in questo i due metodi fanno cose molto simili ossia restituiscono una stringa; non avendo specificato la visibilità essi saranno pubblici e non avendo specificato lo statement “return” un metodo Groovy restituirà sempre l’ultimo dato elaborato; inoltre le stringhe, così come i numeri sono considerati instanze di relativi oggetti. Quindi quello che abbiamo scritto sono due metodi pubblici che restuiscono due stringhe.

Adesso completiamo lo script con le seguenti righe (incollate i due pezzi in GroovyConsole e testate con i vostri occhi l’imprevedibile risultato di questo codice):

metodi = ["parla","parlaForbito"]
fagiolo = new Fagiolo()
metodi.each{metodo -> println fagiolo."$metodo"()}

In questo caso ci siamo creati un array di stringhe che contiene i nomi dei metodi, abbiamo creato un’istanza della classe Fagiolo ed abbiamo richiamato i metodi della classe come

fagiolo."$metodo"()

ossia abbiamo chiamato il metodo “per nome”. Notate che metodi.each{} presuppone, all’interno delle parentesi la definizione di un closure, ossia un metodo anonimo definito in linea che ha come parametro la variabile metodo che, ad ogni iterazione assume il valore di uno degli elementi dell’array “metodi” e viene passato ad un metodo, creato dinamicamente che invoca il metodo relativo dell’oggetto “fagiolo”.

Aldilà dell’esempio limitato e facile immaginare come potremmo scriptare una sequenza arbitraria di chiamate ai metodi di una classe ed ottenere dinamicamente il comportamento desiderato.

Zac

No Comments

Persistenza e Modelli in Groovy e Java

Groovy, Java

Continuo il diario della mia esperienza Java e Groovy parlando di una libreria per la persistenza dei dati e di una scappatoia per realizzare derivati di AbstractTableModel in modo rapido: ovviamente sfruttando la capacità di Groovy di essere compilato in byte code e quindi di integrarsi con il resto dell’applicazione sviluppato in Java.

Per la persistenza dei dati sto utilizzando la libreria JPersist (di cui ignoro ancora le performance) che consente di accedere ai dati secondo il paradigma Object Oriented. A differenza dei framework di persistenza classici (compresi quelli integrati di Java) JPersist non ha bisogno di troppi file xml (a parte uno in cui scriviamo i parametri di connessione al DB.

Per accedere ai dati abbiamo bisogno di una classe che abbia lo stesso nome della tabella (o quasi uguale) e (per la scrittura dei dati) sia derivata da jpersist.PersistentObject; impostiamo come attributi della classe, i campi della tabella relativa e, fatto questo, avremmo bisogno di sbobinarci la solita pippa sulle proprietà di una classe Java ossia scrivere i metodi getter e setter dei relativi attributi. Oggigiorno questo non è più un problema ma (chissà se mai lo capiranno alla Sun) si perde in leggibilità. Molto meglio rivolgersi a Groovy per la realizzazione di una classe persistente; al solito, non meravigliatevi della brevità del codice:

import jpersist.*
	
public class Customer extends PersistentObject{
    Integer id
    String firstName
    String lastName
	
}

Niente virgole, niente getter e setter…nient’altro. Mi aspetto che nel DB esista una tabella Customer o customer o customers o qualsiasi nome *customer* con i campi id, firstname e lastname.

Vi rimando alla documentazione di JPersist per ulteriori dettagli su come fare le query, gli update, etc.

Vi parlo invece di come visualizzare i dati: per farlo abbiamo bisogno di una JTable o, meglio, di una JXTable, e di un TableModel. Per fare un TableModel ci vuole il legn…ehm…i dati e un modo per accedervi. Dobbiamo definire le colonne ecc, ecc.
Preleviamo i dati. Io ho realizzato un metodo per prelevare un’arraylist di clienti:

public ArrayList getCustomers() {
 try {
       DatabaseManager dbm = DatabaseManager.getXmlDefinedDatabaseManager("mio_db_definito_nel_file_xml");
       ArrayList result = (ArrayList) dbm.loadObjects(new ArrayList(), Customer.class);
       dbm.close();
       return result;
 } catch (Exception ex) {  }
 return null;
}

Ora mi serve il TableModel che costruirò sulla base di questo ArrayList; siccome a me piace molto il codice generico e poco lungo, l’ho scritto in Groovy usando la reflection:

import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;
import groovy.swing.SwingBuilder
import java.lang.reflect.Field;
	
class GModel{
    private static Class getFieldType(Object o, fieldName){
        Field f = o.getClass().getDeclaredField(fieldName);
        return f.getType();
    }
	
    public static AbstractTableModel getModel(ArrayList dataList,
                                        String[] fieldNames,
                                        String[] fieldLabels){
        def swing = new SwingBuilder()
        def i=0;
        def gModel
        if (dataList.size()>0){
          Object o = dataList[0];
          gModel = swing.tableModel(list:dataList) {
            fieldNames.each{
              propertyColumn(header:fieldLabels[i], propertyName:it, type:getFieldType(o,it))
              i++
            }
          }
        }
        else
        {
          gModel = swing.tableModel(list:dataList) {
            fieldNames.each{
              propertyColumn(header:fieldLabels[i], propertyName:it)
              i++
            }
          }  
	
        }
        return gModel
    }
}

Il metodo statico getModel consente di fornire una lista di oggetti, un elenco di campi da visualizzare e le label delle relative colonne (ok avrei potuto utilizzare anche una Map). Tale metodo usa il SwingBuilder di Groovy per creare il table model in modo davvere eccezionale: provate a confrontare la routine con i table model scritti in java; ve lo ripropongo per maggiore dettaglio:

def swing = new SwingBuilder()
def i=0;
def gModel = swing.tableModel(list:dataList) {
    fieldNames.each{
         propertyColumn(header:fieldLabels[i], propertyName:it, type:getFieldType(o,it))
         i++
    }
}

Quindi i dati li passo con l’attributo list di swing.tableModel ed al table model aggiungo (per ogni campo scelto) una propertycolumn che presenta una label, il nome dell’attributo (della classe Customer) ed il tipo del campo. A sua volta il tipo del campo lo recuperiamo genericamente usando la reflection.

private static Class getFieldType(Object o, fieldName){
    Field f = o.getClass().getDeclaredField(fieldName);
    return f.getType();
}

Penso che non serva passare un’istanza dell’oggetto ma sinceramente non ho avuto molto tempo per le ottimizzazione (volevo usare i generics ma non ci sono riuscito). Ad ogni modo il metodo recupera la classe ed il campo relativo al nome dell’attributo e ne restituisce il type.

Il table model così creato presenterà, una volta compilato, tutti i metodi, getter e setter di un table model classico. Stessa qualità, stesse performance meno codice!

Se avete suggerimenti e migliorie commentate pure

Zac

P.S.: In entrambi i metodi della classe lo statement “return” è superfluo dato che ogni metodo Groovy capisce dinamicamente quale delle sue variabili deve restituire.

No Comments

GroovyWS…web service con groovy e Java

Groovy, Java

Vi spiego con un semplice esempio come è semplice invocare i webservice utilizzando Groovy e la libreria GroovyWS, diretta discendente della obsoleta GroovySoap, di cui mantiene l’incredibile semplicità di approccio.

I Web Service sono un modo per consentire di invocare oggetti remoti attraverso un semplice protocollo basato su HTTP (SOAP). Per far ciò normalmente si invoca il WSDL dell’oggetto remoto (una sorta di interfaccia scritta in XML) e la si da in pasto ad una qualche utility che crea delle classi fittizie (stub) a cui accedere localmente per richiamare gli oggetti remoti. Quindi, in soldoni, un oggetto remoto HelloWorld, sarà importato tramite WSDL e ci consentirà di ottenere un HelloWorld.java più eventuali classi accessorie. Nel nostro codice Java importeremo la classe e la potremo utilizzare al pari delle altre. Fin qui tutto semplice.

Ma cosa succede se non vogliamo mettere mani al codice ma vogliamo ugualmente essere in grado di richiamare un Web Service attraverso la sola URL? In questo caso abbiamo bisogno di un sistema che automaticamente faccia i passaggi di sopra. Ma anche così il codice dovrebbe incorporare automaticamente la classe generata.

Ecco allora scoprire (per me almeno) la potenza dei linguaggi dinamici di nuova generazione (di cui Groovy, Ruby, Python sono solo alcuni degli esempi più celebri). Un linguaggio dinamico contiene meccanismi di very late binding, ossia meccanismi che consentono la compilazione senza conoscere molto delle variabili in gioco. Solo a runtime è possibile conoscere cosa una variabile rappresenta, di che classe è e quali metodi e attributi incorpora.

Volendo richiamare un web service in groovy abbiamo bisogno di utilizzare la libreria groovyws che andrà posta nella cartella lib di groovy oppure del nostro progetto java: ecco un esempio formidabile (copiate ed incollate nella vostra GroovyConsole dopo aver installato la libreria)

import groovyx.net.ws.WSClient
def proxy = new WSClient("http://saintbook.org/MightyMaxims/MightyMaxims.asmx?WSDL", this.getClass().getClassLoader())
print proxy.ForToday() //il metodo ForToday() del webservice che solo con la riga precedente si scopre esistere

La seconda riga di codice inizializza un WSClient, che attualmente non presenta nessun altro metodo ma, magia, dopo l’inizializzazione vediamo, nella terza riga, che la variabile definita presenta il metodo ForToday() che, per inciso, restituisce una stringa con la massima del giorno.

Mi sarebbe piaciuto scrivere qualcosa in più ma è davvero tutto qui.

Ovviamente possiamo incorporare il tutto in una classe, compilare lo script groovy in un .class ed utilizzarlo nei nostri progetti Java in modo del tutto analogo. L’importante è aggiungere le reference a groovy, groovyws e ant 1.7 (che serve a compilare lo stub scaricato automaticamente).

Il prossimo step sarà quello di fare un po di reflection sulla classe proxy per vedere le proprietà esposte.

Maggiori informazioni qui.

Zac

19 Comments

JAVA + Groovy: first encounter

Groovy, Java

Sto lentamente passando da C++/C# a Java e devo dire che le cose vanno abbastanza bene. Per me che bazzico sempre l’area del “Cutting Edge” le soluzioni attuali sono sempre sorpassate e raramente trovo i tutorial e la documentazione che mi interessa. Per questo motivo vi scrivo la mia esperienza con Java e Groovy insieme. Non è niente di rivoluzionario (e per ora lontano da quell’edge), beninteso, ma solo il racconto dei miei “passi di bimbo” in questo settore.

Groovy è linguaggio che si poggia sulla JVM e in quanto tale può essere utilizzato sia per produrre bytecode Java che per essere incluso come scripting in applicazioni scritte in Java. L’applicazione che sto scrivendo dovrà essere estensibile e quindi ho pensato bene che scrivere un’estensione deve essere un compito facile. Un linguaggio come Groovy permette di scrivere codice in modo molto agile come vedremo. Partiamo da Java. Scriviamo una classe che creiamo una finestra MDI:

package it.keepintech;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
public class DesktopFrame extends  JFrame
{
   private JDesktopPane theDesktop;
   // set up GUI
   public DesktopFrame()
   {
      super( "Using a JDesktopPane" );
      configureMainMenu();
      theDesktop = new JDesktopPane(); // create desktop pane
      add( theDesktop ); // add desktop pane to frame
   } // end constructor DesktopFrame
   void configureMainMenu()
   {
	JMenuBar bar = new JMenuBar(); // create menu bar
	JMenu addMenu = new JMenu("File"); // create Add menu
        JMenuItem newItem = new JMenuItem("New Groovy Window");
	newItem.addActionListener(
		new ActionListener()
			{
				// display new internal window
				public void actionPerformed(ActionEvent event)
                                {
					// create a Gform written in Groovy
					GForm g = new GForm();
					theDesktop.add(g);
				} // end method actionPerformed
			}
		);
                addMenu.add(newItem); // add new frame item to Add menu
		JMenuItem exitItem = new JMenuItem("Quit");
		exitItem.addActionListener(
			new ActionListener()
			{
				public void actionPerformed(ActionEvent event)
				{
					setVisible(false);
					dispose();
				}
			}
		);
		addMenu.add(exitItem); // add new frame item to Add menu
		bar.add(addMenu); // add Add menu to menu bar
		setJMenuBar(bar); // set menu bar for this application
	}
}

ovvero una classe per la realizzazione di una finestra in grado di accettare altre finestre e che dispone di un menu che richiama una finestra specificata in un file Groovy (che in questo caso verrà compilato). Per far funzionare il tutto abbiamo anche bisogno di una classe che avvii il tutto:

package it.keepintech;
import javax.swing.JFrame;
public class MainClass {
	public static void main(String[] args) {
  	    DesktopFrame desktopFrame = new DesktopFrame();
	    desktopFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
	    desktopFrame.setSize( 600, 480 ); // set frame size
	    desktopFrame.setVisible( true ); // display frame
	}
}

Infine il codice della finestra GForm scritta in Groovy:

package it.keepintech;
import groovy.swing.SwingBuilder
import javax.swing.JInternalFrame;
public class GForm extends JInternalFrame
{
	public GForm()
	{
		super("zac window");
		def swing = new SwingBuilder();
		def panel = swing.panel()
		{
			label("Hello world!")
			button("Press Me")
		}
		add(panel)
		setSize(300,300)
		pack()
		show()
	}
}

Per la realizzazione della finestra possiamo utilizzare le solite classi Swing (sfruttando la comoda sintassi di Groovy) oppure le classi SwingBuilder, che consentono di generare componenti swing con una notazione ancora più compatta (come si può vedere nell’esempio). Questa classe la possiamo compilare col groovyc (il compilatore groovy) che ci darà il file .class relativo. Nelle precedenti classi dobbiamo includere, nel classpath la libreria groovy. Quindi abbiamo ottenuto con poco una form personalizzata. Adesso è un pò pochino ma col tempo migliorerà.

Zac

No Comments

Prove tecniche di Groovy

Groovy, Java

Stasera mi volevo dilettare un pò a studiare Groovy, un progetto di un linguaggio di scripting moderno ed in grado di integrarsi a perfezione nel mondo di Java. Groovy, infatti, è sia un linguaggio interpretato che compilabile in Java byte code, rendendo pertanto molto snella la scrittura di nuove classi all’interno dei nostri progetti.

Groovy è un linguaggio dinamicamente tipizzato quindi un espressione del tipo:

def x = 5
def y = "Ciao Mondo"

sarà correttamente interpretata attribuendo alle variabili x ed y i giusti tipi, deducendoli dal valore assegnato. Altre caratteristiche rendono molto appetibile Groovy anche rispetto allo stesso Java. Ad esempio la presenza dei closures:

alquadrato = { it * it }

rappresenta la definizione di una funzione che moltiplica per se stesso un valore passato come parametro (di default “it” è un nome riservato al parametro). Quindi la chiamata:

[ 1, 2, 3, 4 ].collect(alquadrato)

restituirà l’array [1, 4, 9, 16]. Ciò che si può fare con i closures è limitato solo dalla nostra capacità di rendere incomprensibile un codice ò_ò.

Iniziamo con un semplice esempio:

package it.unile;
	
public class GClasse {
	def k =99
	def s = "Ciao Mondo! Chissà perché ma ho in mente il numero"
	public void Print()
	{
		println(s+" "+k)
	}
	
}

Una classetina semplice che salveremo in un file GClasse.groovy all’interno della cartella src/it/unile. Il codice si distingue per la mancanza (opzionale) di “;” alla fine delle righe. Inoltre il comando di stampa su Standard Output è semplicemente “println”. In realtà Groovy è un linguaggio compatibile con la sintassi di Java; pertanto se non ricordate il costrutto per un ciclo for o un nome di tipo sappiate che la sintassi Java è ben accetta. Adesso supponiamo di voler integrare il codice Groovy in una applicazione Java.

Possiamo pensare di scrivere una classe java (src/it/unile/MainClass.java) nel seguente modo:

package it.unile;
	
import java.io.File;
import java.io.IOException;
	
import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyObject;
	
import org.codehaus.groovy.*;
import org.codehaus.groovy.control.CompilationFailedException;
	
public class MainClass {
	public static void main(String[] args) {
		GroovyClassLoader loader = new GroovyClassLoader();
		Class groovyClass;
		try
		{
			groovyClass = loader.parseClass(new File("src/it/unile/GClasse.groovy"));
			GroovyObject groovyObject;
			groovyObject = (GroovyObject) groovyClass.newInstance();
			Object[] argos = {};
			groovyObject.invokeMethod("Print", argos);
	
		} catch (CompilationFailedException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
	}
}

Il codice è stato scritto con l’aiuto del plugin Groovy per Eclipse, disponibile presso il sito di Groovy. Il resto lo ha fatto Eclipse ed i suoi “Quick Fix” una volta importato il jar di Groovy nel Build Path.
Per poter compilare questa classe dovrete inserire nel classpath la libreria groovy-all-1.0.jar disponibile nella distribuzione di Groovy. Questa classe inizializza un Class Loader che ci consente, dinamicamente, di poter istanziare una classe di tipo GClasse a partire dallo script GClasse.groovy. Ad ogni cambiamento che faremo sullo script, senza ricompilare, un nuovo run della classe MainClass (in realtà ogni volta che leggeremo ed istanzieremo il file GClasse.groovy) produrrà come risultato l’esecuzione del codice aggiornato! Il sistema è ottimo per poter estendere con facilità le funzionalità delle nostre applicazioni con dei plugin scriptabili. Si potrebbe pensare anche di generare dinamicamente codice Groovy in base alle scelte dell’utente.

Avete visto quante cose si possono fare con Groovy? Ci rivediamo la prossima volta per nuovi ed emozionanti attacchi d’arte….ehm…vabbè.

Bye

2 Comments


  • Google Adsense

  • MiniBlog

    Banner Javaday Roma III Edizione >>

    Adobe ha appena sfornato il Flash player nella versione 10, stavolta anche per Linux da subito! Incredibile >>

    When the source code to Quake was leaked and circulated among the Quake community underground in 1996, a programmer unaffiliated with id Software used it to port Quake to Linux, and subsequently sent the patches to Carmack. Instead of pursuing legal action, id Software, at Carmack’s behest, used the patches as the foundation for a company-sanctioned Linux port. id Software has since publicly released the source code to Quake, Quake 2 and most recently Quake 3, all under the GNU General Public License (GPL). >>

    Ganymede Donate, please ;) >>

    Download Day 2008 >>

    Scusa Ameri, Sun s’è comprata MySQL e Oracle s’è pappata BEA. >>

    Chi ha bisogno di un Mac quando con Linux abbiamo Compiz, Open Office, Inkscape, Scribus, Eclipse, Tracker, ed ora anche una Time Machine per recuperare al volo vecchi backup? Per ora manca lo sberluccichio di casa Apple ma il funzionamento è analogo: si chiama FlyBack! >>

    Giusto per ricordarvi che una delle distribuzioni Linux più diffuse sta per raggiungere le nostre scrivanie :D

    >>

    Anche se me ne vergogno come un ladro non posso esimermi dal pubblico ludibrio consentendovi di ritrovare tracce di me nella storia di Internet: era il 6 Ottobre 1995 ed il 4 Novembre 1995. E come non ricordare la mia prima Home Page>>

    Assegnati gli Ig Nobel per la ricerca improbabile qui e, appena possibile, qui. >>

  • Categories