JPA-Tage mit Oracle Deutschland im April 2010

Oracle Deutschland in Kooperation mit der buschmais GbR möchten Sie gerne zu einer kostenlosen eintägigen
Veranstaltung einladen, um Sie mit den zahlreichen Fähigkeiten von JPA 2.0, EclipseLink und dessen
JPA-Implementierung vertraut zu machen. Außerdem möchten wir Ihnen darstellen, wie EclipseLink JPA
innerhalb eines konkreten Projektes benutzt wurde, um eine JDO basierte Anwendung zu modernisieren.

Dabei beleuchten wir folgende Fragestellungen:
* Was ist das Java Persistence API und wie ergänzt die Version 2.0 die bestehende Version 1.0?
* Was verbirgt sich hinter EclipseLink? Welche Funktionalitäten bietet EclipseLink, EclipseLink JPA und dessen Erweiterungen?
* Wie wurde in einem konkreten Projekt vorgegangen, um eine JDO basierte Anwendung durch JPA mittels EclipseLink JPA und dessen Erweiterungen abzulösen?

Termine:
20.04.2010 Düsseldorf
21.04.2010 Frankfurt Dreieich
22.04.2010 München

Weitere Informationen zur Agenda, Anfahrt und Anmeldung finden Sie auf der Oracle Homepage unter:

http://www.oracle.com/global/de/community/adf/einladung_ELJPATage.html

sowie auf den Seiten von buschmais:

http://www.buschmais.de/jpatage/

Keine Kommentare

see you at devoxx 2009

Auch die JUGSaar wird dieses Jahr bei der Devoxx Konferenz in Antwerpen vertreten sein und per Twitter berichten.

Wir sind vom 17.-20.11.2009 dabei und hoffen auf spannende und informative Vorträge.

Devoxx 2009

Keine Kommentare

he will entertain you

An alle Dozent da draußen. Nehmt euch ein Beispiel ;)

YouTube Preview Image

Keine Kommentare

Scala Code dynamisch von Java aus aufrufen.

Hier mal ein kleines Beispiel wie man von Java aus Scala “scripts” dynamisch kompiliert und mit Argumenten ausführt. (Testumgebung ist Ubuntu Linux 8.10 / Eclipse IDE mit Scala Plugin). Das “Script” wird hierbei von dem in dem Scala Interpreter integrierten Compiler kompiliert und nicht etwa über eine IDE Erweiterung wie das Scala Eclipse Plugin.

Das wird u.a. dadurch forciert, dass die scala Files in einem separaten Ordner src-scripts liegen, der sich nicht im Build-Path befindet. Dadurch vermeiden wir, dass das .scala File vom
Scala Builder kompiliert wird.

scala-ide-structure

Um das Beispiel ausführen zu können braucht man die aktuelle Scala Version 2.7.3

Sinn der Übung ist zu zeigen, wie man scala als Scriptsprache in eine Java Anwendung einbetten kann. Die nächste Aufgabe ist nun, den über diesen Weg aufgerufenen Scala Code auch debuggen zu können. Stay tuned :)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package de.tutorials;
package de.tutorials;
 
import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.HashMap;
 
import scala.List;
import scala.tools.nsc.Interpreter;
import scala.tools.nsc.Settings;
import scala.tools.nsc.util.SourceFile;
 
public class Main {
	public static void main(String[] args) throws Exception {
		executeScript(new File("src-script/scripts/Script.scala"),new HashMap<String, String>(){{put("a","1"); put("b","2");put("c","3");}},"scripts.Script.run(args)");
	}
 
	private static void executeScript(File scriptFile,Object args,String command) throws Exception {
		Settings settings = new Settings();
		File classFileCacheDirectory = new File("/tmp/scala/");
		if (!classFileCacheDirectory.exists()) {
			classFileCacheDirectory.mkdir();
		}
 
		Interpreter interpreter = new ExtendedInterpreter(settings,	classFileCacheDirectory);
		addToClassPath((URLClassLoader) Thread.currentThread().getContextClassLoader(), classFileCacheDirectory);
 
		Object[] context = { scriptFile, null };
		interpreter.bind("context", "Array[Object]", context);
		interpreter.interpret("context(1)=List(new scala.tools.nsc.util.BatchSourceFile(new scala.tools.nsc.io.PlainFile(context(0).asInstanceOf[java.io.File])))");
		interpreter.compileSources((List<SourceFile>) context[1]);
		interpreter.setContextClassLoader();
 
		interpreter.bind("args", "Object", args);
 
		interpreter.interpret(command);
	}
 
	private static Method addURLMethod;
	static {
		try {
			addURLMethod = URLClassLoader.class.getDeclaredMethod("addURL",	URL.class);
			addURLMethod.setAccessible(true);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
 
	private static void addToClassPath(URLClassLoader classLoader, File classFileCacheDirectory) {
		try {
			addURLMethod.invoke(classLoader, classFileCacheDirectory.toURI().toURL());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

Unser erweiterter Scala Interpreter, der die on-the-fly generierten .class Files auf dem Filesystem ablegt.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package de.tutorials
import scala.tools.nsc._
import scala.tools.nsc.reporters._
import io.PlainFile
import java.io.File
 
class ExtendedInterpreter(override val settings: Settings, val classFileCacheDirectory: File) extends Interpreter(settings) {
 
  override protected def newCompiler(settings: Settings, reporter: Reporter) = {
    val comp = new scala.tools.nsc.Global(settings, reporter)
    comp.genJVM.outputDir = new PlainFile(classFileCacheDirectory);
    comp
  }
}

Hier unser Beispiel-Script

1
2
3
4
5
6
7
8
9
package scripts
 
object Script{
    def run(args:Object){
    	println("Hello World!")
    	println("got args: " + args)
    	println("Bye Bye")
    }
}

Ausgabe:

context: Array[java.lang.Object] = Array(src-script/scripts/Script.scala, null)
args: java.lang.Object = {b=2, c=3, a=1}
Hello World!
got args: {b=2, c=3, a=1}
Bye Bye

Dabei werden von Scala eine ganze Menge von "zwischen-Klassen" erzeugt:
tom@ubuntu:/tmp/scala$ tree
.
|-- RequestResult$line0$object$.class
|-- RequestResult$line0$object.class
|-- RequestResult$line1$object$.class
|-- RequestResult$line1$object.class
|-- RequestResult$line2$object$.class
|-- RequestResult$line2$object.class
|-- RequestResult$line3$object$.class
|-- RequestResult$line3$object.class
|-- binder0$.class
|-- binder0.class
|-- binder1$.class
|-- binder1.class
|-- line0$object$$iw$$iw$.class
|-- line0$object$$iw$.class
|-- line0$object$.class
|-- line0$object.class
|-- line1$object$$iw$$iw$.class
|-- line1$object$$iw$.class
|-- line1$object$.class
|-- line1$object.class
|-- line2$object$$iw$$iw$.class
|-- line2$object$$iw$.class
|-- line2$object$.class
|-- line2$object.class
|-- line3$object$$iw$$iw$.class
|-- line3$object$$iw$.class
|-- line3$object$.class
|-- line3$object.class
`-- scripts
    |-- Script$.class
    `-- Script.class

1 directory, 30 files

Beispielcode: detutorialsscalainterpreter

1 Kommentar

Screencast Demonstriert VisualVM

http://weblogs.java.net/blog/mandychung/archive/2009/03/java_visualvm_s.html

Keine Kommentare

Verschiedene Talks der Devoxx Conference Online verfügbar

Viele werden das schon kennen, aber ich denke es sollte an dieser Stelle doch nochmal erwähnt werden ;-)

Auf Parleys.com: http://parleys.com/display/PARLEYS/Home findet man eine ganze Reihe aufgezeichneter Konferenz-Talks der Devoxx Conference. Hier kann man sich rundum über Best Practices und neue Java Technologien informieren.

Keine Kommentare

Java 7 – Verzeichnisse auf Änderungen überwachen mit dem WatchService

Hier mal ein Beispiel zur Überwachung eines Verzeichnisses mit dem neuen WatchService des Filesystem APIs unter Java 7

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package de.tutorials.training;
 
import static java.nio.file.StandardWatchEventKind.ENTRY_CREATE;
import static java.nio.file.StandardWatchEventKind.ENTRY_DELETE;
import static java.nio.file.StandardWatchEventKind.ENTRY_MODIFY;
 
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.nio.file.WatchEvent.Kind;
 
public class FileSystemWatcherExample {
 
    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        WatchService watchService = FileSystems.getDefault().newWatchService();
        System.out.println(watchService);
        WatchKey watchKey = Paths.get("/tmp").register(watchService,new Kind[] { ENTRY_CREATE, ENTRY_MODIFY, ENTRY_DELETE });
 
        while (true) {
            watchKey = watchService.take();
 
            for (WatchEvent watchEvent : watchKey.pollEvents()) {
                System.out.println(watchEvent.kind() + " "
                        + ((Path) watchEvent.context()));
            }
 
            watchKey.reset();
        }
    }
}

Wenn ich nun in der shell in /tmp/ ein
echo xxx>test1.data
absetze bekomme ich die Ausgabe:
Code:

ENTRY_CREATE test1.data
ENTRY_MODIFY test1.data

Mehr dazu gibts hier:
http://openjdk.java.net/projects/nio…chService.html
http://openjdk.java.net/projects/nio…ns/TS-5686.pdf

Ich weis aber noch nicht wie man den absoluten Pfad der geänderten Datei herausbekommt…

Keine Kommentare

Struktureller Vergleich der rt.jar’s zwischen Java 6 und Java 7 aus dem OpenJDK

hier mal eine Übersicht zu den (public/private) API Änderungen zwischen dem rt.jar von Java 6 und der aktuellen Version von Java 7 (beide aus dem Open JDK).
Hier sieht man welche Klassen, Interfaces, Annoations, Methoden und Felder entfernt, hinzugefügt oder geändert wurden. Den Report gibts in einem sehr übersichtlichen HTML Format.

Damit sieht man sehr schnell, welche API Neuerungen sich im Detail ergeben :)

Erstellt mit:

http://depfind.sourceforge.net/

JarJarDiff

DiffToHTML

…unter 64-Bit Ubuntu Linux.

Das Diff im HTML Format findet man hier: http://www.jugsaar.de/?attachment_id=112

Keine Kommentare

Die Zukunft des Ubiquitous Computing

http://www.ted.com/talks/pattie_maes_demos_the_sixth_sense.html

Wahnsinn… da bekommt man glatt lust das Teil nachzubauen :)

Keine Kommentare

Parallax Scrolling Effekt mit Javascript und JQuery

Schicker Parallax Scrolling Effekt mit JavaScript und JQuery :)
http://webdev.stephband.info/parallax.html

Keine Kommentare