# Java mit Groovy



## Schwarzeradler1903 (30. Aug 2007)

Hallo,

ich möchte von meiner Java-Application aus eine groovy-datei lesen, die irgendwelche Berechnungen macht, es ausführen und die Ergebnisse wieder in meiner Java-Application benutzen. Also ein ganz einfaches Bespiel:

Sagen wir mal ich habe eine Java-Objekt, der 2 Atribute hat, x und y. Und die habe ich so definiert x=2, y=3.
Nun soll es eine groovy datei geben, das diese beiden Werte addiert , wie zum Beispiel :

def wert1 = ! hier kommt die x von meiner Java-Objekt
def wert2 = ! hier kommt die y !
def ergebnis = wert1+wert2

Nun soll das Ergebnis , was meine Groovy-Code liefert wieder in meiner Java-Application (zum Beispiel in einer Variable) benutzt werden können. 

Nun wenn ich jetzt andere Berechnungen mit den Attributen x und y machen will, so muss ich nur die groovy datei ändern und nicht meine java-code, meine java-code soll die nötigen attribute übergeben und das grovvy datei übernimmt die Berechnungen und liefert ein Ergebnis zurück ,was ich dann wieder in meiner Java-code weiterbenutzen kann.

Nun das obige war nur ein einfaches Beispiel. Ich möchte eigentlich ein ganzes Java-Objekt zum Groovy übergeben und mit einer groovy-code darin Berechnungen durchführen, in denen zum Beispiel die einige Attribute von meiner dem Groovy übergebenen Objekt geändert werden und wenn die Ausführung der Groovy-code zu Ende ist, so sollen die Änderungen auf Attributen wirksam sein.

Gibt es so was wie ein Groovy-Parser für Java, die zum Beispiel eine txt oder groovy-datei übernimmt und es ausführt?


```
meinObjekt = new MeinObjekt();

Groovy meinGroovy = new Groovy(groovyDateiAlsString, meinObjekt);

meinGroovy.führeAus;

//->und jetzt soll ab hier die Änderungen die in meinObejkt vorgenommen sind, wirksam sein.
```


Ist sowas mit Java und Groovy möglich? Wenn nicht was kann ich dafür hernehmen um das zu realiesieren ?

Viele Grüße

Taha


----------



## sparrow (30. Aug 2007)

Ich habe zwar keine Ahnung was genau groovy ist, aber anscheinend geht es dir ja nur darum berechnungen ausserhalb des Klasse durchführen zu lassen.
Theoretisch bietet sich dafür jegliche Scriptsprache an die du aus Java heraus aufrufen kannst, ich empfehle dir jedoch Beanshell, damit habe ich sehr gute Erfahrung gemacht.

Gruß
Sparrow


----------



## schalentier (30. Aug 2007)

Klar geht das:

http://groovy.codehaus.org/Embedding+Groovy

fuer die lesefaulen:

hello.groovy

```
output = "Hello, ${input}!"
```

java:

```
import groovy.lang.Binding;
import groovy.util.GroovyScriptEngine;

String[] roots = new String[] { "/my/groovy/script/path" };
GroovyScriptEngine gse = new GroovyScriptEngine(roots);
Binding binding = new Binding();
binding.setVariable("input", "world");
gse.run("hello.groovy", binding);
System.out.println(binding.getVariable("output"));
```


----------



## Schwarzeradler1903 (30. Aug 2007)

schalentier hat gesagt.:
			
		

> Klar geht das:
> 
> Hallo Schalentier. Vielen Dank für die Antwort. War genau das, was ich suche!


----------



## Guest (2. Sep 2007)

Ich habe es ausprobiert und es funktioniert.

Ich hätte noch eine Frage:

Sagen wir , ich habe eine Java Klasse mit einem HashMap Attribute und mit setter und getter Methoden für dieses Attribute. Und ich habe zwei Objekte von dieser Klasse erzeugt, sagen wir Objekt1 und Objekt2.
Nun möchte ich eine Groovy-Datei schreiben die folgendes macht:



```
objekt1.set("Intelligenz",  objekt2.get("Aktivität")*Math.sqrt(objekt2.get("Gedächtnis")) )
```

und wenn die Ausführung dieser Groovydatei zu Ende ist, so sollen die Änderungen in objekt1 schon wirksam sein.
Ich möchte diese Berechnungen also nicht in meiner Java code schreiben, sondern nur in Groovy und wenn ich mir andere Berechnungen wünsche, so möcht ich nur die groovy-datei ändern. Ist also sowas möglich , dass ich der Groovy-Datei 2 Java-Objekte übergebe und in Groovy-Datei auf diesen Java-Obejkten Änderungen durchführe wie die obige Berechnung ?

Viele Grüße

Taha


----------



## schalentier (2. Sep 2007)

probiers doch einfach ;-)

das waere, was ich jetzt machen wuerde, wenn ich jetzt nich grad kein bock haette :-D

achso, und die antwort wuerde mich auch interessieren.


----------



## Guest (2. Sep 2007)

Das ist meine Groovy-Code:


```
input_x.set("Intelligenz",  input_y.get("Aktivität")*Math.sqrt(input_y.get("Gedächtnis"))
```


und das ist meine Java-Code:


```
import groovy.lang.Binding;
import groovy.util.GroovyScriptEngine;
import groovy.util.ResourceException;
import groovy.util.ScriptException;

import java.io.IOException;
import java.util.HashMap;


public class GroovyTest_3 {
		
	HashMap<String, Float> hashMap;
	
	public GroovyTest_3()
	{
		hashMap = new HashMap<String, Float>();
	}
	
	public float getParameter(String key)
	{
	        return hashMap.get(key);
	}
	
	public void setParameter(String key, float value)
	{
		hashMap.put(key, value);
	}
	
	public static void main(String [] args)
	{
		
		GroovyTest_3 metaParams = new GroovyTest_3();		
		metaParams.setParameter("Intelligenz", 0.0f);
		
		GroovyTest_3 basicParams = new GroovyTest_3();
		basicParams.setParameter("Aktiwität", 5.0f);
		basicParams.setParameter("Gedächtnis", 3.0f);		
		String[] roots = new String[] { "/workspace/TestGroovy/src" };
		GroovyScriptEngine gse;
		try {
			
			gse = new GroovyScriptEngine(roots);
			Binding binding = new Binding();
			binding.setVariable("input_x", metaParams);
			binding.setVariable("input_y", basicParams);
			gse.run("Groovy_3.groovy", binding);
			System.out.println(metaParams.getParameter("Intelligenz"));
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		catch (ResourceException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ScriptException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		
		
	}
}
}
```


Und ich krieg Exception


----------



## Guest (2. Sep 2007)

Hey es geht tatsächlich  , hab mich echt gefreugt. Es fehlte in meiner groovy-datei die typ-casting


```
input_x.setParameter("Intelligenz", (float) (input_y.getParameter("Aktivität")* Math.sqrt(input_y.getParameter("Gedächtnis"))))
```

dann geht alles 


Hmm erhtlich gesagt, ich hätt mir nie gedacht dass groovy sowas großes leisten kann. Ein excellentes Produkt, respekt! ;o)


----------

