Java ist auch eine Insel

Freitag, August 31, 2007

Java-Tipp: MIME-Type einer Datei (einfacher Weg)

public static String getMIMEType( File file )
{
 if ( !file.exists() )
  throw new IllegalArgumentException( "File does not exit!" );
 if ( file.isDirectory() )
  return "directory"
 try
 {
  return file.toURI().toURL().openConnection().getContentType();
 }
 catch ( IOException e )
 {
  throw new IllegalArgumentException( e.getMessage() );
 }
}

AddThis Social Bookmark Button

Java-Tipp: Wie viel Speicher hat die Grafikkarte?

public static int getAvailableAcceleratedMemory()
{
  int bytes = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getAvailableAcceleratedMemory();

  return bytes / (1024 * 1024);
}

AddThis Social Bookmark Button

Mittwoch, August 29, 2007

Use JavaMail API to reveive all Google mails

package com.tutego.insel.mail;

import java.util.*;
import javax.mail.*;
import javax.mail.internet.ContentType;
import javax.swing.JOptionPane;

public class GetEMails
{
public static void getMail( final Properties props ) throws Exception
{
Session session = Session.getInstance( props, new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication( props.getProperty( "mail.pop3.user" ),
props.getProperty( "mail.pop3.password" ) );
}
} );
session.setDebug( true );

Store store = session.getStore( "pop3" );
store.connect();

Folder folder = store.getFolder( "INBOX" );
folder.open( Folder.READ_ONLY );

Message message[] = folder.getMessages();

for ( int i = 0; i < message.length; i++ )
{
Message m = message[i];

System.out.println( "-------------------------\nNachricht: " + i );
System.out.println( "Von: " + Arrays.toString(m.getFrom()) );
System.out.println( "Betreff: " + m.getSubject() );
System.out.println( "Gesendet am: " + m.getSentDate() );
System.out.println( "Content-Type: " + new ContentType(m.getContentType()) );

if ( m.isMimeType("text/plain") )
System.out.println( m.getContent() );
}
folder.close( false );
store.close();
}

public static void main( String[] args ) throws Exception
{
Properties props = new Properties();
props.setProperty( "mail.pop3.host", "pop.gmail.com" );
props.setProperty( "mail.pop3.user", JOptionPane.showInputDialog( "user" ) );
props.setProperty( "mail.pop3.password", JOptionPane.showInputDialog( "pass" ) );
props.setProperty( "mail.pop3.port", "995" );
props.setProperty( "mail.pop3.auth", "true" );
props.setProperty( "mail.pop3.socketFactory.class", "javax.net.ssl.SSLSocketFactory" );

getMail( props );
}
}

Labels:

AddThis Social Bookmark Button

Dienstag, August 28, 2007

Inselupdate: Passwort-geschützte Seiten mit Basic Authentication/Proxy-Authentifizierung

URL-Verbindungen können durch die Basic Authentication, also durch ein Passwort, geschützt sein. Anwender bemerken dies, wenn sich ein Eingabedialog öffnet, der die Eingabe eines Namens und eines Passworts erzwingt. Die Webseite http://www.rahul.net/joeuser/ demonstriert diesen Eingabedialog. Der Benutzername »joeuser« und das Passwort »a.b.C.D« zeigen eine Webseite erst nach der Identifizierung.

Ohne das Login kommt auch ein Java-Programm nicht an die Seite. Daher muss der Java-Client der Authentifizierungsbitte nachkommen, und Benutzername und Passwort schicken. Glücklicherweise geht das in Java mit der Klasse java.net.Authenticator ganz einfach:



Authenticator.setDefault( new Authenticator()
{
protected PasswordAuthentication getPasswordAuthentication()
{
System.out.printf( "url=%s, host=%s, ip=%s, port=%s%n",
getRequestingURL(), getRequestingHost(),
getRequestingSite(), getRequestingPort() );

return new PasswordAuthentication( "joeuser", "a.b.C.D".toCharArray() );
}
} );

URL url = new URL( "http://www.rahul.net/joeuser/" );
System.out.println( new Scanner( url.openStream() ).useDelimiter( "\\Z" ).next() );

Die Anweisung Authenticator.setDefault() setzt einen neuen Authenticator, den die URL-Klasse immer dann nutzt, wenn eine Verbindung aufgebaut wird. Dann ruft die Java-Bibliothek unsere überschriebene Funktion getPasswordAuthentication() auf, in der wir ein PasswordAuthentication-Objekt liefert, welches die Benutzernamen und Passwort kodiert. Da getPasswordAuthentication() eine überschriebene Methode ist, kann sie über diverse getXXX()-Methoden auf Zustände zurückgreifen, und das sind die Verbindungsdaten wie Host, usw. Diese Daten sind nicht unwichtig, denn wir wollen ja mitunter für unterschiedliche Webseiten unterschiedliche Benutzer und Passwörter verwenden wollen.

Proxy-Authorization

Um nicht nur eine Benutzer-Authentifizierung, sondern auch eine Authentifizierung für den Proxy zu realisieren gibt es zwei Möglichkeiten.

System.setProperty( "http.proxyUserName", proxyUser );
System.setProperty( "http.proxyPassword", proxyPass );

Eine andere Variante ist, die Header-Variable „Proxy-Authorization“ zu setzen:

URLConnection conn = url.openConnection();
String base64 = "Basic " + new sun.misc.BASE64Encoder().encode((user + ":" + passwd).getBytes() );
conn.setRequestProperty( "Proxy-Authorization", "Basic " +
new sun.misc.BASE64Encoder().encode((proxyUser + ":" + proxyPass).getBytes()) );
conn.connect();
InputStream in = conn.getInputStream();

Labels:

AddThis Social Bookmark Button

Inselupdate: JMX mit RMI-Adaptor

Für die Anbildung an den JMX-Server dient nicht nur die JConsole, sondern verschiedene andere Wege sind denkbar, etwa über HTTP oder über einen eigenen Client, der über RMI kommuniziert.

JMXConnectorServer für den Server

Zur Veröffentlichung der MBeans über RMI ist der JMXConnectorServer verantwortlich. Damit die MBeans an die RMI-Registry gebunden werden, wird eine besondere URL verwendet, die den Service genau beschreibt. Die JMXServiceURL hat den allgemeinen Aufbau:

service:jmx:<protocol>://[[[<host>]:<port>]/<path>]

Vor dem Start des Programms muss die RMI-Registry für Anmeldungen bereit sein; da unser Programm auf dem gleichen Rechner arbeitet, starten wir den RMI-Namensdienst selbst.

LocateRegistry.createRegistry( 1099 );
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
String url = "service:jmx:rmi:///jndi/rmi://localhost/maze"
JMXConnectorServer connectorServer = JMXConnectorServerFactory.newJMXConnectorServer(
new JMXServiceURL( url ), null, server );
connectorServer.start();

ObjectName name = new ObjectName( "com.tutego.insel.jmx:type=Maze" );
MazeMBean maze = new Maze();
server.registerMBean( maze, name );

JOptionPane.showMessageDialog( null, "Ende" );
System.exit( 0 );

JConsole mit Remote-Connection

Mit der JConsole könnten wir nun Verbindung aufnehmen, in dem unter Remote Connection die URL service:jmx:rmi:///jndi/rmi://localhost/maze Einsatz findet.

JMXConnector für den Client

Auf der Clientseite gibt es mit JMXConnector den Gegenspieler zum JMXConnectorServer. Das Objekt liefert uns mit getMBeanServerConnection() ein MBeanServerConnection-Objekt, was sozusagen die Repräsentation des MBean-Servers MBeanServer auf der anderen Seite entspricht (genauso genommen gilt für die Schnittstellen: MBeanServer extends MBeanServerConnection). Über getAttribute() lassen sich dann zum Beispiel Properties erfragen.

JMXServiceURL u = new JMXServiceURL( "service:jmx:rmi:///jndi/rmi://localhost/maze" );
JMXConnector c = JMXConnectorFactory.connect( u );
MBeanServerConnection mbsc = c.getMBeanServerConnection();
ObjectName name = new ObjectName( "com.tutego.insel.jmx:type=Maze" );
System.out.println( mbsc.getAttribute( name, "MaxNumberOfPlayers" ) );

Schnittstelle und Klasse für die MBean

package com.tutego.insel.jmx;

public interface MazeMBean
{
void setMaxNumberOfPlayers( int numberOfPlayers );
int getMaxNumberOfPlayers();
void dragonAlarm();
}

package com.tutego.insel.jmx;

public class Maze implements MazeMBean
{
private int numberOfPersons;

public void setMaxNumberOfPlayers( int numberOfPersons )
{
this.numberOfPersons = numberOfPersons;
}

public int getMaxNumberOfPlayers()
{
return numberOfPersons;
}

public void dragonAlarm()
{
System.out.println( "Heul. Huhuhuhu." );
}
}

AddThis Social Bookmark Button

Montag, August 27, 2007

Eclipse 3.4 M1 - und weiter dreht es sich

Die Reise nach 3.4 hat begonnen und der erste Milestone ist draußen. Zwei interessante Neuerungen sind m. E:

Extract Class refactoring:

Extract Class Position

->

Extract Class Position result

Rearrange content of files per drag and drop:

Outline view showing a drag and drop interaction.

Das Download ist hier. der Release-Plan da. Die Releases sind zeitleich so geplant:

  • Friday Aug. 10, 2007 - Milestone 1 (3.4 M1) - stable build
  • Friday Sep. 21, 2007 - Milestone 2 (3.4 M2) - stable build
  • Friday Nov. 2, 2007 - Milestone 3 (3.4 M3) - stable build
  • Friday Dec. 14, 2007 - Milestone 4 (3.4 M4) - stable build
  • Friday Feb. 8, 2008 - Milestone 5 (3.4 M5) - stable build

Aufgefallen ist mir die neue Version wegen dem WTP 3.0M1, was diverse Fehler korrigiert, aber sonst nichts neues zu bieten hat, bis auf "Downloadable Jetty support":

Jetty Server Adapter

AddThis Social Bookmark Button

Freitag, August 03, 2007

JIDE Common Layer - Frische Swing-Komponenten

Form the homepage:"JIDE Common Layer has nearly 100k lines of code and over 30 components and utilities. It has been part of JIDE commercial products since 2002 so the quality and stability are quite high. You can run a webstart demo from the link below to see it in action."

JIDE is dual-licensed: GPL and free commercial license.

AddThis Social Bookmark Button

Donnerstag, August 02, 2007

TeX-Formulate in Webseiten mit jsMath

http://www.math.union.edu/~dpvc/jsMath/ ist eine Layout-Engine, die TeX-Formulare in Webseiten rendert. Dabei werden nicht, wie bei anderen Ansätzen, Grafiken generiert, sondern die Ausdrücke mit CSS positioniert. Damit skaliert das Ganze schön. Das Ergebnis ist beeindruckend und die Engine wird auch von einigen Wiki-Systemen verwendet. Einige Beispiele: Examples of jsMath. Im Interactive jsMath lab kann man Formen eingeben und es kommt HTML raus, was man nur noch zusammen mit dem CSS auf die eigene Webseite setzen muss. Aus x_i^2 wird etwa:

<SPAN CLASS="typeset"><nobr><span class="scale"><span class="icmmi10">x</span><span style="position: relative; top:0.372em;"><span class="size2"><span class="icmmi10">i</span></span><span class="spacer" style="margin-left:0.05em"></span></span><span style="position: relative; margin-left:-0.260em; top:-0.362em;"><span class="size2"><span class="icmr10">2</span></span><span class="spacer" style="margin-left:0.05em"></span></span><span class="blank" style="height:1.331em;vertical-align:0.908em"></span></span></nobr></SPAN>

Jetzt fehlen nur noch jsMath.js und, falls etwa Summen-Zeichen oder sonstiges Sonderzeichen verwendet werden, im fonts-Ordner die TeX-Fonts.

AddThis Social Bookmark Button