Q&A: JDBC ResultSet aus Text-Datei oder Excel füllen

Frage: Ich möchte ein ResultSet mit Daten aus einem Excel oder einem Textfile laden.

Antwort: Die Möglichkeit besteht. Dazu nutzt man einen JDBC-Treiber, der auf Textdateien arbeitet. http://csvjdbc.sourceforge.net/ (CsvJdbc Home) bietet das für Textdateien (CSV), für Excel gibt es so was auch, http://sourceforge.net/projects/xlsql/ (Excel JDBC Driver | Free Development software downloads at SourceForge.net).

Q&A: Optimiert der Java-Compiler die Multiplikation konstanter Faktoren?

Wenn ich in mein Quellcode schreibe:

int i = 60 * 1000;

Wie kompiliert javac das? Wird die Rechenoperation schon zur Compile-Zeit ausgeführt, oder erst zur Laufzeit?

Antwort: Diese "compile-time constant expression" optimiert der Compiler. Im Bytecode steht dann nur 60000. Siehe dazu auch http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.28.

Q&A: Wie kann man eine XML-Datei aus einer bz2-Datei mit StAX ablaufen?

Zunächst liefert org.apache.commons.compress.compressors.bzip2.BZip2InputStream aus dem Apache Commons Compress (https://commons.apache.org/proper/commons-compress/) einen InputStream. Diesen übergibt man dann StAX:

InputStream fis = new FileInputStream( file ); // vielleich noch puffern 
InputStream bz2is = new BZip2InputStream( fis ); 
XMLInputFactory factory = XMLInputFactory.newInstance(); 
XMLStreamReader parser = factory.createXMLStreamReader( bz2is );

Q&A: Wie kann man die Foreign Keys einer Tabelle rausfinden

Die Metadaten können direkt erfragt werden. Quelle: https://svn.apache.org/repos/asf/db/ddlutils/trunk/src/main/java/org/apache/ddlutils/platform/DatabaseMetaDataWrapper.java.

/**
* Convenience method to return the foreign key meta data using the configured catalog and
* schema pattern.
*
* @param tableNamePattern The pattern identifying for which tables to return info
* @return The foreign key meta data
* @throws SQLException If an error occurred retrieving the meta data
* @see DatabaseMetaData#getImportedKeys(java.lang.String, java.lang.String, java.lang.String)
*/
public ResultSet getForeignKeys(String tableNamePattern) throws SQLException
{
  return getMetaData().getImportedKeys(getCatalog(), getSchemaPattern(), tableNamePattern);
}

Dahinter steckt also http://docs.oracle.com/javase/7/docs/api/java/sql/DatabaseMetaData.html#getImportedKeys(java.lang.String,%20java.lang.String,%20java.lang.String)

__________________

Q&A: Wie kann man einem Thread eine bestimmte Zeit zur Ausführung geben?

Eine Idee ist, nicht einen eigenen Thread selbst zu starten — was man sowieso nicht so oft macht — sondern einen ThreadPool aus Java 5 mit einzusetzen (Executors#newCachedThreadPool() ), der einen Executer (ExecutorService) implementiert. Der ExecutorService hat eine Funktion submit(Runnable task), die ein Future liefert. Mit diesem Future arbeitest du dann mit get(long timeout, TimeUnit unit).

Code:

package com.tutego;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class ExitAfterATime
{
  public static void main( String[] args )
  {
      ExecutorService es = Executors.newCachedThreadPool();
      Future<?> submit = es.submit( new Runnable() {
        @Override public void run()
        {
          try { Thread.sleep( 2000 ); } catch ( InterruptedException e ) { System.out.println("InterruptedException"); }
        } } );

      try
      {
        submit.get( 500, TimeUnit.MILLISECONDS );
      }
      catch ( InterruptedException e )
      {
      }
      catch ( ExecutionException e )
      {
      }
      catch ( TimeoutException e )
      {
        System.out.println( "Canceling" );
        submit.cancel( true );
        System.out.println( "Canceling Done" );
      }

      es.shutdownNow();
  }
}

Es gibt noch andere Lösungen und das concurrent Paket bietet viele Möglichkeiten. Der Programmcode muss aber mitspielen und auch beendet werden können, also cancel(…) unterstützen.

java-forum.org und Burger King

Gestern kam auf ZDFinfo ein "schöner" Beitrag, der mich absolut an den Vorfall hier erinnert — zum Nachschauen: http://www.zdf.de/ZDFmediathek/kanaluebersicht/aktuellste/398#/beitrag/video/1951570/ZDFzoom:-Gewinn-ist-King.

2010 kaufte der New Yorker Finanzinvestor 3G Capital für 4 Milliarden US-Dollar den Burgerbrater und will das Investment nun zu Geld machen. An der Börse zahlt sich das aus, aber auf Kosten der Mitarbeiter und Franchise-Unternehmer. Das ist im Grunde das gleiche wie beim JFO; auch hier kommt ein "Investor" und versucht über Werbung schnell seine Ausgaben wieder reinzuholen. An ein langfristiges Investment geht es den Venture Capitalist gar nicht, denn nach einer kurzen Gewinnphase (die nur die Aktionäre freut) wird ein Unternehmen nach guten Gewinnen in der Regel wieder weiterverkauft, und dann ist es meist kaputt. Beim JFO befürchte ich das gleiche: Wenn das JFO wieder geöffnet ist, und voll von Google Werbung ist, wird Geld reinkommen — dass die Community kaputt geht, ist dem Investor egal, der kann wohl auch nichts mit Java anfangen weiß vermutlich auch gar nicht was das ist. Daher glaube ich auch nicht, dass man dem jetzigen Inhaber die Domain wieder abkaufen kann, denn mit Google Werbung wird auf Jahre hinaus wohl einiges zu verdienen sein, auch wenn das Forum passiv bleibt. Hier geht’s ums Geld, das ist alles, es ist ein Geschäftsmodell. Mit moralischen Appellen kommt man hier nicht weiter.

Siehe auch http://forum.byte-welt.net/showthread.php?t=4636.

Auf Wiedersehen javainsel.blogspot.de

Von November 2005 bis März 2010 betrieb ich meinen Java-Blog bei Google unter der Domain javainsel.blogspot.de. In der Zeit hatte ich an die 300 Posts geschrieben und fast 40.000 Seitenaufrufe gehabt. Im Jahr 2010 habe ich dann eine WordPress-Installation auf meinem Server gesetzt und dort weitergebloggt. Nach einer Migration der alten Artikel in das aktuelle WP-System wurde es nun Zeit, bei Google den alten Blog zu löschen. Bye-Bye Google Blogger, die Daten gehören jetzt wieder mir.

www.java-forum.org ist kaputt

Das Forum wurde geschlossen, zu den Gründen hier: http://forum.byte-welt.net/showthread.php?t=4538 (lange Diskussion) oder kürzer http://www.c-plusplus.de/forum/318939 und https://www.sourceprojects.org/default/2013/08/01/1375340100000.html. Schnell gesagt: Schnelles Geld und Gier ruiniert Communities.

So ein Vorgang macht wieder klar, dass man immer Herr seiner Daten sein sollte. Alle meine Beiträge (>100?) sind nun futsch, die alten Antworten werden keinen mehr erreichen. Meine Konsequenz daraus? Ich werde auf kein Forum mehr Texte stellen, nichts mehr direkt beantworten, nur noch ausschließlich hier im Blog und dann eventuell von Foren aus hier zum Blog verlinken. Mein Server, meine Daten, meine Sicherheit.

Thema der Woche: Collections-Update in Java 7

Transformation von Java nach C# (Java2Cs Translator)

ILOG ist ein Teil von IBM und hat für ein Projekt einen Übersetzer von Java nach C# entwickelt und bei SourceForge gehostet. Eingebunden ist es über Eclipse und dann macht man einfach nur ein File > Export > Other > ILOG Java to CSharp Translator. Es unterstützt alle Java 5 Features wie Generics, Enums, foreach, aber nicht Java 7. Ein paar Dinge können natürlich nicht übertragen werden und auch natürlich wird nicht alles von den Java-Bibliotheken übertragen. Seit einiger Zeit gab es kein Update mehr beim Projekt.

JOpenDocument API

Zum Zugriff auf Dokumente und Spreadsheets von OpenOffice (for OASIS Open Document ) ist JOpenDocument (http://www.jopendocument.org/) eine GPL-Bibliothek, die das mit einer einfachen API unterstützt.

Etwa das Laden und Verändern von Spreadsheets:

File file = new File( "c:/in.ods" );
SpreadSheet createFromFile = SpreadSheet.createFromFile( file );
Sheet sheet = createFromFile.getSheet( 0 );
sheet.setValueAt( "Filling test", 1, 1 );
sheet.getCellAt( "A1" ).setValue( "On site support" );
sheet.getCellAt( "I10" ).setValue( new Date() );
sheet.getCellAt( "F24" ).setValue( 3 );
File outputFile = new File( "c:/out.ods" );
sheet.getSpreadSheet().saveAs( outputFile );

Weitere Beispiele gibt http://www.jopendocument.org/documentation.html.

Interessant ein ein purer Java-Viewer, und damit die Möglichkeit in PDF zu exportieren, ohne dass man OO dazu fernsteuern muss.

Beim Testen der SpreadSheet-API sind mir leider einige Nachteile aufgefallen:

  • Es gibt keine Named References
  • Die API ist sehr Datei-orientiert. Nur im Speicher Dokumente anzulesen und zu verarbeiten ist nicht möglich. Ich sehe erst einmal keine Methode, wie ein Servlet z.B. sich den InputStream auf ein OO-Dokuments holen und als OutputStream an den Client verschicken kann, ohne dass man vorher das OO-Dokument in eine Datei schreibt.
  • Soll der eingebauter Viewer verwendet werden, können TIFF-Bilder nicht angezeigt werden.
  • GPL könnte für einige Bereiche ein Problem sein. Es werden aber kommerzielle Lizenzen verkauft.
  • Nur das Anzeigen von einfachen Dokumenten ist möglich.

Community-Aufruf: Testet eure Software mit Java 8

Das OpenJDK 8-Team spielt gerade das Release mit unterschiedlichen OS-Produkten durch, um Inkompatibilitäten festzustellen. Bitte testet eure Software mit aktuellen Builds von Java 8 und meldet Fehler, etwa hier im Blog oder noch besser auf https://groups.google.com/forum/#!forum/adopt-openjdk. Falls eure Software über ein CI-System bebaut und getestet wird, nehmt Java 8 jetzt schon mit auf.

Die aktuelle Matrix gibt es hier: https://java.net/projects/adoptopenjdk/pages/TestingJava8. Man sieht, dass die wichtigen Projekte, wie GlassFish/Groovvy noch nicht funktionieren.

 

Project

Open Issue(s)?

Closed Issue(s)?

Testing Status
None / CI / Manual / Unknown

Adopt OpenJDK Volunteer

Project Contact Details

ActiveMQ

Test failed under Java 8

 

Manual

Greg Bakos

Greg Bakos

Camel

   

None

   

Glassfish 4.0

Error on startup

 

Unknown

   

Guava-libraries

Build error

 

Manual

Helio Frota

Mailing list

Gudeg7

Prototype phase

 

Manual

Yosi Pramajaya

Yosi Pramajaya

gs-collections

Java 8 Support

 

Manual

Mani Sarkar

Contacts on Wiki Communicate via the github issue tracker

Hawkshaw

 

Test failed under Java 8 (race condition)

CI

Martijn Verburg

Martijn Verburg

Jackrabbit

Test failed under Java 8

 

Manual

Greg Bakos

Greg Bakos

Jacoco

ASM5 support
static line nos.

ASM5 fix

CI

 

Mailing List

Java-Chronicle

 

Java 8 support

Manual

Mani Sarkar

Mailing list

JBehave

See UISpec4j

 

Manual

Helio Frota

Quick Subscribe using dev team

JSR-353

Javadoc compilation

 

Manual

Helio Frota

Mailing list

JUnit

   

Manual

Mani Sarkar

dev team

Maven

   

CI

Helio Frota

Mailing list

MongoDB Java driver

   

CI

Trisha Gee

Trisha Gee

MutabilityDetector
ClientOfMutabilityDetector
MutabilityDetector4FindBugs

 

All three projects support Java 8

Manual

Graham Allan
Mani Sarkar

Mailing list

Play Framework

See Scala

 

Manual

Helio Frota

Mailing List

RESTAPIUnifier

   

Manual

Mani Sarkar

Neomatrix

Scala

build does not support JDK 8 yet

 

Manual

Helio Frota

Scala Project

TestNG

   

Manual

Mani Sarkar

Mailing list

UISpec4j

UISPEC4J #5

 

CI

Helio Frota

Uispec4j

Yougi

 

Java 8 support

CI

Hildeberto

Hildeberto

Groovy

GROOVY-6279
GROOVY-6246
GROOVY-6156

 

Manual

Andres Almiray

Andres Almiray

Griffon

 

GRIFFON-642

Manual

Andres Almiray

Andres Almiray

Thema der Woche: Werte und Operatoren erkennen

Bean-Bean Mapping mit Dozer

Dozer ist eine kleine Open-Source Bibliothek (Apache-Lizenz) zum Mappen von JavaBeans auf JavaBeans. Motivationen gibt es genug — die Webseite zählt gleich einige Argumente auf:

  • A mapping framework is useful in a layered architecture where you are creating layers of abstraction by encapsulating changes to particular data objects vs. propagating these objects to other layers (i.e. external service data objects, domain objects, data transfer objects, internal service data objects). A mapping framework is ideal for using within Assembler type classes that are responsible for mapping from one data object to another.
  • For SOA/ESB systems, a side effect is the passing of domain objects between different systems. Typically, you won’t want internal domain objects exposed externally and won’t allow for external domain objects to bleed into your system.
  • Mapping between data objects has been traditionally addressed by hand coding value object assemblers (or converters) that copy data between the objects. Most programmers will develop some sort of custom mapping framework and spend countless hours and thousands of lines of code mapping to and from their many transfer objects.
  • A generic mapping framework solves these problems. Dozer is an open source mapping framework that is robust, generic, flexible, reusable, and configurable.
  • Data object mapping is an important part of layered service oriented architectures. Pick and choose the layers you use mapping carefully. Do not go overboard as there is maintenance and performance costs associated with mapping data objects between layers.

Basis des Mappings sind XML-Dokumente; im einfachsten Fall:

<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://dozer.sourceforge.net http://dozer.sourceforge.net/schema/beanmapping.xsd">
  <mapping>
<class-a>d.e.i.n.p.a.k.e.t.TestObject</class-a>
<class-b>d.e.i.n.p.a.k.e.t.TestObjectPrime</class-b>
<field> <A>yourSourceFieldName</A> <B>yourDestinationFieldName</B> </field>
</mapping>
</mappings>

Angestoßen wird er über ein Mapping-Objekt, welches auch leicht von Spring injiziert werden kann:

Mapper mapper = new DozerBeanMapper();

DestinationObject destObject = mapper.map(sourceObject, DestinationObject.class);

oder

DestinationObject destObject = new DestinationObject();
mapper.map(sourceObject, destObject);

Interessant finde ich die JMX-Integration. Der Mapper gibt Statistik-Informationen etwa über die Anzahl gemappter Objekte.

Mikroformate mit JAXB in XML abbilden

Die Informationen von Mikroformaten lassen sich mit JAXB relativ leicht in XML konvertieren:

import java.util.*;
import javax.xml.bind.*;
import javax.xml.bind.annotation.*;

public class MicroformatViaJaxb
{
  public static void main( String[] args ) throws JAXBException
  {
    Microformat mf = new Microformat();
    mf.elements.add( new Element( "name", "Christian Ullenboom" ) );
    mf.elements.add( new Element( "address", "tutego Allee" ) );
    mf.elements.add( new Element( "phone", "2873568956928" ) );

    JAXBContext context = JAXBContext.newInstance( Microformat.class );
    Marshaller m = context.createMarshaller();
    m.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE );
    m.marshal( mf, System.out );
  }
}
@XmlRootElement( name = "div" )
class Microformat
{
  @XmlAttribute( name = "class" )
  public String key = "person";
  @XmlElement( name = "span" )
  public List<Element> elements = new ArrayList<Element>();
}
class Element
{
  @XmlAttribute( name = "class" )
  public String key;
  @XmlValue
  public String value;
  public Element() { }
  public Element( String key, String value )
  {
    this.key = key;
    this.value = value;
  }
}

Got all these abbreviations?

XML HK2 WSIT ESB JMS SSO SAO JSR JAX-RS JCP DOJO AJAX WSDP jBMP RIFE RAILS MC4J CAPS SAML WS-* WSRP SAW JXTA HTTP URL IIOP ORB JMX TCP/IP WSDL MEX XWSS MTOM XSD SMTP WSA SOAP JBI JCA CMT LDAP BMT CMPI VJM CDDL GPL BSD API JAX-B StAX JSP JSTL EJB JPA TCK JDBC JDK JRE JAXP XOP REST POJO SQL GUI URI XMLDSig JAAS GSSAPI META-INF NIO ACL JNL CORBA CDC CLDC MIDP ACID SSL DRDA UML SAX DOM XOM XML-RPC MVC XSLT DAO SVG COM FTP PDF JNA ANTLR SLF4J WiX

Alles klar?

Thema der Woche: N+1 SELECT Problem

Bei SQL-Anfragen über mehrere Tabellen trifft man schnell über das N+1 SELECT Problem.

  • Finde mehr zu dem Problem und entwerfe ein Szenario, was das Problem deutlich macht.
  • Welche Lösung gibt es für das Problem in SQL?
  • Wie löst man das Problem in einer Anfragesprache wie JPAQL?
  • Lässt sich das Problem durch geschickte Modellierung entschärfen? Warum ist das insbesondere für NoSQL-Datenbanken essenziell? Welchen Ansatz verfolgt man?

Meine Freundinnen

Mit 10 oder so hatte ich meine erste, ich erinnere mich noch genau, ich hatte sie in einem Buch kennengelernt. Basic war ihr Name. Immer was verträumt, aber eine treue Seele. Ich war jung, sie auch, wir stellen keine wilden Sachen an. Ein Jahr später lerne ich Assembline kennen, WOW, das war eine zackige Braut, der war ich lange treu. Ganz schmutzige Sachen haben wir gemacht, sie war auch ein bisschen devot. Bin dann umgezogen nach Amiga-City und hatte mich in die ältere Schwerster von Assembline verguckt, die war auch heiß und ging ganz schön ran. Da war ich um die 14. Aber ich wurde älter und mit Assembline war es immer so anstrengend, sie war total nachtragend, jeden kleinen Fehler nahm sie mir übel und wollte dann erst mal nicht mehr mit mir sprechen. Also habe ich Schluss gemacht. Zu der Zeit hatte ich auch Pascaline und Zee kennengelernt und viel erlebt, was man eben zu Dritt so macht. Das ging dann so ein paar Jahre, aber jetzt habe ich fast seit 20 Jahren nur noch eine: mein Java-Mäuschen. Die hat mir auch den g-Punkt und fillRect gezeigt, hui. Manches Mal zeigt sie mir den roten Kringel, aber mit ihr kann ich fast alles machen. Und was mich früher an Assembline scharf machte (ich sage nur „bare metal“), interessiert mich heute überhaupt mehr. Passt also, eine glückliche Beziehung.