3. August 2011 von Jan Lolling in Java, Mac Fan Club
Apple hat leider bei Java JDK in Lion ein etwas eigenwilliges Deployment angewendet. Wenn mein sein System von Snow Leopard auf Lion aktualisiert wird man erstmal damit konfrontiert, dass Java verschwunden ist. Man muss es – am besten aus der DeveloperConnection – nach installieren.
Der neue Ablageort ist:
/Library/Java/JavaVirtualMachines/
Darunter liegen aber leider nun keine simplen Verzeichnisse mehr sondern bundles. In diese kann man mit normalen Dateiauswahldialogen (z.B. von Eclipse) nicht eintauchen. Bundels sind aber trotzdem nicht wirklich viel mehr als Verzeichnisse mit besonderen Attributen.
Deshalb macht es Sinn – auch unter dem Aspekt der Kompatibilität symbolische Links zu setzen:
Im Verzeichnis /System/Library/Frameworks/JavaVM.framework legt man einen Link:
sudo ln -s /Library/Java/JavaVirtualMachines/1.6.0_26-b03-383.jdk/Contents/Home/ CurrentJDK
Und nun kann man mit in Eclipse dieses verlinkte Verzeichnis auswählen und man hat sein JDK am Start.
11. April 2011 von Jan Lolling in Java
Die ANT Tasks und der SQLRunner sind nun unter dieser URL zu erreichen:
http://www.jan-lolling.de/
Alle Komponenten stehen nach wie vor unter der LGPL zur freien Verwendung.
Der Code der ANT-Task liegt im download Bereich.
Der Code des SQLRunners ist verfügbar auf Github.
20. Oktober 2010 von Jan Lolling in Java, Mac Fan Club
Seit heute ist die Version 1.6.0_22 für OSX verfügbar. Soweit nichts spektakuläres aber….
Die API für die Integration von Java Apps in OSX hat sich auch geändert und zeigt deutlich die Vorboten des neuen Betriebssystems Lion (10.7).
Insbesondere die neuen Interfaces (alles SubClasses von com.apple.eawt.AppEventListener) zeigen wo es hin geht:
- AppHiddenListener,
- AppReOpenedListener,
- ScreenSleepListener,
- UserSessionListener,
- SystemSleepListener
sind ganz auf die Bedürfnisse der neuen Funktionen von OSX ausgerichtet und zeigen, dass Apple Java nicht links liegen lässt sondern weiter entwickelt.
[Update] Apple überträgt seinen Java-VM Code und die Komponenten zur Kopplung mit dem OS an das OpenJDK-Projekt. Damit wird sicher gestellt dass diese Komponenten auch zeitnah Aktualisierungen erfahren – anders als jetzt wo auf OSX doch erheblich später die Updates kamen.
9. Juni 2010 von Jan Lolling in Java, Java Code Beispiele
Ant ist ein überaus mächtiges Werkzeug für die Automatisierung und Sicherstellung des build-Prozesses in immer gleicher Qualität. Zudem ist es sehr leicht anpassbar und erweiterbar.
Hier ein paar Beispiele aus der Java User Group:
Diese Task sind als Binaries und Source code verfügbar und stehen unter der GPL. Da diese Libs nicht in Produkte integriert werden stellt die GPL auch kein Problem für den kommerziellen Einsatz dieser Task dar.
Diese Task sind bereits im produktiven Einsatz in aktuell 3 Projekten (1 Open Source Projekt und 2 Individual Projekte für kommerzielle Zwecke).
Viel Spass beim Ausprobieren.
Wir freuen uns über Anregungen und Kommetare: jan dot lolling at googlemail dot com.
5. April 2010 von Jan Lolling in Java, Java Code Beispiele
Schlagwörter: Oracle JDBC Meta data
Das Konstrukt der Packages wird durch JDBC nicht wirklich gut unterstützt. JDBC geht leider auch von eindeutigen Namen für functions und procedures aus. Somit hat man ein Problem mit überladenen procedures. Diese unterscheiden sich nicht im Namen sondern in der Anzahl und Typen der Parameter.
Der Oracle-JDBC-Treiber gibt alle Informationen raus, es erfordert nur etwas Geschick diese Informationen einzusammeln.
1. Die Name der packages werden als CATALOG ausgegeben.
2. Die Parameter kennen ihren Index. Wenn ein Parameter für scheinbar die selbe procedure erscheint mit dem gleichen Index, dann ist das ein Zeichen für eine überladene procedure.
Der folgende Beispielcode geht davon aus, dass die procedures und functions in speziellen Objekten gehalten werden und die Parameter besitzen auch ihre eigene Transferklasse.
/**
* load procedure and functions
*
* @param schema
* object that represent a schema
* @return true if everything went well
*/
public boolean loadProcedures(SQLSchema schema) {
if (logger.isDebugEnabled()) {
logger.debug("loadProcedures schema=" + schema);
}
// makes this thread save
inRefreshCycle = true;
boolean ok = false;
// don' worry about that, we use our own database pool
final DatabaseSession session = DatabaseSessionPool.getDatabaseSession(cd.getUniqueId());
if (session == null) {
// return if no connection to database avialable
return false;
}
try {
Connection conn = session.getConnection();
DatabaseMetaData dbmd = conn.getMetaData();
schema.clearProcedures(); // remove any previously loaded procedures
ResultSet rs = dbmd.getProcedures(null, schema.getName(), null);
if (rs != null) {
// loading all procedures and functions
while (rs.next()) {
// PROCEDURE_CAT contains the package name
String catalogName = rs.getString("PROCEDURE_CAT");
String name = rs.getString("PROCEDURE_NAME");
if (catalogName != null && catalogName.length() > 0) {
name = catalogName + "." + name;
}
// create an new one
SQLProcedure procedure = new SQLProcedure(this, schema, name);
// decide if it is a function
short pType = rs.getShort("PROCEDURE_TYPE");
procedure.setFunction(pType == DatabaseMetaData.procedureReturnsResult);
schema.addProcedure(procedure);
objectMap.put(name, procedure);
}
rs.close();
}
// loading procedure/function parameters
rs = dbmd.getProcedureColumns(null, schema.getName(), null, null);
if (rs != null) {
// an index for overloaded procedures
int procedureIndex = 0;
String prevProcedureName = "noprocedurehere_xx";
while (rs.next()) {
// PROCEDURE_CAT contains the package name
String catalogName = rs.getString("PROCEDURE_CAT");
String name = rs.getString("PROCEDURE_NAME");
if (catalogName != null && catalogName.length() > 0) {
// add the catalog name as package name
name = catalogName + "." + name;
}
int pos = 0;
try {
// position of this parameter in the procedure parameter
// list
pos = rs.getInt("ORDINAL_POSITION");
} catch (Exception e) {
// perhaps this column is not defined in every database
// type
pos = -1;
}
if (prevProcedureName.equals(name)) {
if (pos == 0) {
// if we get the same procedure name and a parameter
// with position zero increase the procedure index
// that means point to the next procedure with the
// same name
procedureIndex++;
}
} else {
procedureIndex = 0;
}
String columnName = rs.getString("COLUMN_NAME");
List list = schema.getProcedures(name);
SQLProcedure procedure = list.get(procedureIndex);
if (procedure != null) {
procedure.addParameter(columnName, // parameter name
rs.getShort("DATA_TYPE"), // parameter type as
// integer defined
// in class
// java.sql.Type
rs.getString("TYPE_NAME"), // parameter type as
// string
rs.getInt("LENGTH"), // length of the parameter
// if parameter is
// string or number type
rs.getInt("PRECISION"), // precision of the
// parameter if the
// parameter is a number
// type
rs.getShort("COLUMN_TYPE")); // input or output
// parameter as
// integer:
// refer
// DatabaseMetaData.procedureColumnReturn
}
// keep the name of the last procedure to detect overloaded
// procedures
prevProcedureName = name;
}
rs.close();
}
schema.setProcedureLoaded();
ok = true;
} catch (SQLException sqle) {
// creates a error message to show it in GUI
errorMessage = "loadProcedures schema=" + schema + " failed: "
+ sqle.getMessage();
} finally {
// put the session back in the pool
DatabaseSessionPool.release(session);
}
inRefreshCycle = false;
return ok;
}