Archive for the ‘rap’ Category

Auftakt zur Vortragsreihe Leipzig

Thursday, February 26th, 2009

Am letzten Dienstag war es nun endlich soweit. Am Standort Leipzig sind wir mit der Vortragsreihe gestartet. Was sich an anderen Standorten bereits zu einer verlässlichen Institution etabliert hat, wollen wir mit dem Leipziger Team hier fortsetzen.

Das Auftaktthema bildete Eclipse RAP: Rich Clients im Web, bei dem wir gemeinsam mit unserem Partner und Kunden IBYKUS AG von den gemachten Erfahrungen beim Einsatz dieses AJAX Frameworks berichtet haben. Mit rund 20 Teilnehmern empfinde ich den Auftakt als gelungen.

Für alle Interessierten, die nicht an der Veranstaltung teilnehmen konnten hier die Vortragsunterlagen:

Das nächste Event ist für Mitte/Ende April geplant. Aller Voraussicht nach wird es sich dann um das Thema OSGi drehen.

Modellieren allein macht noch nicht glücklich…

Friday, February 6th, 2009

Wer ein neues modellbasiertes Projekt anfängt, steht u.a. vor folgenden Aufgaben:

  1. Referenzimplementierung inkl. Systemarchitektur realisieren
  2. Modellierungssprache ausdenken
  3. Codeschablone schreiben
  4. manuellen Code ergänzen

Wer das öfters macht kommt schnell auf die Idee, vielleicht aus dem letzten Projekt die Modellierungssprache oder Teile der Codeschablone o.ä. wiederzuverwenden. Konsequent weitergedacht macht es so natürlich Sinn, vielleicht genau für die Wiederverwendung auf Werkzeugebene ein eigenes Framework aufzubauen. Dieses hätte den Vorteil eine erprobte Systemarchitektur zu generieren und jede Menge geteste Codeschablonen zu beinhalten.

Und genau das ist die Fornax Plattform. Dort gibt es verschiedene Cartridges, u.a. auch Sculptor. Just von diesem wurde Anfang dieser Woche die Version 1.5.0 veröffentlicht.

Konkret benutzen wir Sculptor momentan in einem Projekt, in dem wir das JEE-Backend, ablaufend im JBoss, zu großen Teilen generieren. Das Frontend basiert auf eclipse RAP und läuft im OSGi-Container equinox. Dort haben wir die Infrastruktur generiert und die UI noch teilweise per Hand ergänzt. Die Kommunikation zwischen beiden Containern wurde auf Basis Spring Dynamic Modules und JEE Stateless Session Beans generiert. Automatisch gebaut wird das Ganze natürlich mit Apache Maven.

Wer also gern mal das typische Helloworld Projekt modellbasiert realisieren möchte, ist eingeladen einfach Sculptor auszuprobieren. Das gesamte Framework ist Open Source und lebt natürlich vom Mitmachen.

/Steffen…

Co-operation: Eclipse JAAS + Eclipse RAP

Monday, January 5th, 2009

Java Authentication and Authorization Service, kurz JAAS, ist in der Java-Welt das Standardvorgehen zur Authentifizierung und Autorisierung in Java-Anwendungen. Das Eclipse JAAS – noch ein Incubator Projekt – will die Lücke zwischen JAAS Standard und Eclipse PDE schliessen.

Zur Authentifizierung bietet Eclipse JAAS verschiedene Extensionpoints, die es ermöglichen, die Bestandteile von JAAS in der plugin.xml vorzunehmen. Bestandteil dieses Beitrags ist aber zunächst die Authentifizierung in einer Eclipse RAP Anwendung mittels JAAS.

org.eclipse.equinox.security.loginModule

Der loginModule Extensionpoint ermöglicht die Registrierung eines JAAS LoginModule.

<extension id="myLoginModule"
           name="My Login Module"
           point="org.eclipse.equinox.security.loginModule">
   <loginModule
       class="org.foo.bar.MyLoginModule"
       description="My Login Module">
   </loginModule>
</extension>

<extension id="unixLoginModule"
           name="Unix Login Module"
           point="org.eclipse.equinox.security.loginModule">
   <loginModule
       <!-- part of standard jdk -->
       class="com.sun.security.auth.module.UnixLoginModule"
       description="Unix Login Module">
   </loginModule>
</extension>

org.eclipse.equinox.security.callbackHandlerMapping

Mit diesem Extensionpoint wird das Mapping zwischen eine JAAS Loginkonfiguration und einem konkreten CallbackHandler definitiert.

<extension point="org.eclipse.equinox.security.callbackHandlerMapping">
  <callbackHandlerMapping
     callbackHandlerId="org.foo.bar.basicAuthDialog"
     configName="MyLogin">
  </callbackHandlerMapping>
</extension>

org.eclipse.equinox.security.loginConfigurationProvider

<extension id="myLoginConfigurationProvider"
        point="org.eclipse.equinox.security.loginConfigurationProvider">
      <loginConfigurationProvider
          class="org.foo.bar.MyLoginConfigProvider"/>
</extension>

org.eclipse.equinox.security.callbackHandler

Der CallbackHandler ermöglicht Nutzerinteraktionen, zb. zur Eingabe des Logins und Passworts im Dialog oder auf der Kommandozeile.

<extension id="basicAuthDialog"
           name="Basic Authentication Dialog"
           point="org.eclipse.equinox.security.callbackHandler">
   <callbackHandler
      class="org.foo.bar.BasicAuthHandler">
   </callbackHandler>
</extension>

Im Eclipse RAP Projekt können die meisten Ansätze aus RCP übernommen werden. Das CVS (dev.eclipse.org) liefert auch eine RCP-Beispielanwendung mit, die als Basis für das RAP-Projekt dienen kann.

public class BasicAuthHandler extends AbstractLoginDialog {
 
  private String username;
  private char[] password;
 
  protected Control createDialogArea(Composite parent) {
    // implement user interface
  }
 
  public void internalHandle() {
    Callback[] callbacks = getCallbacks();
    for (int i = 0; i &lt; callbacks.length; i++) {
      if (callbacks[i] instanceof NameCallback) {
        ((NameCallback) callbacks[i]).setName(username);
      } else if (callbacks[i] instanceof PasswordCallback) {
        ((PasswordCallback) callbacks[i]).setPassword(password);
      }
    }
  }
}

Die wichtigsten Ausschnitte des abstrakten Logindialogs mit Implementierung des CallbackHandler Interface:

public abstract class AbstractLoginDialog extends TitleAreaDialog
  implements CallbackHandler {
 
  Callback[] callbackArray;
 
  protected final Callback[] getCallbacks() {
    return this.callbackArray;
  }
 
  public abstract void internalHandle();
 
  public void handle(final Callback[] callbacks) throws IOException {
    this.callbackArray = callbacks;
    final Display display = Display.getDefault();
    display.syncExec(new Runnable() {
      public void run() {
        isCancelled = false;
        setBlockOnOpen(false);
        open();
 
        final Button okButton = getButton(IDialogConstants.OK_ID);
        okButton.setText("Login");
        okButton.addSelectionListener(new SelectionListener() {
 
          public void widgetSelected(final SelectionEvent event) {
            processCallbacks = true;
          }
 
          public void widgetDefaultSelected(final SelectionEvent event) {
            // nothing to do
          }
        });
 
        final Button cancel = getButton(IDialogConstants.CANCEL_ID);
        cancel.addSelectionListener(new SelectionListener() {
 
          public void widgetSelected(final SelectionEvent event) {
            isCancelled = true;
            processCallbacks = true;
          }
 
          public void widgetDefaultSelected(final SelectionEvent event) {
            // nothing to do
          }
        });
      }
    });
 
    try {
      ModalContext.setAllowReadAndDispatch(true);
      ModalContext.run(new IRunnableWithProgress() {
 
      public void run(final IProgressMonitor monitor) {
        // Wait here until OK or cancel is pressed, then let it rip.
        // The event listener is responsible for closing the dialog
        // (in the loginSucceeded event).
        while (!processCallbacks) {
          try {
            Thread.sleep(100);
          } catch (final Exception e) {
            // do nothing
          }
        }
        processCallbacks = false;
        // Call the adapter to handle the callbacks
        if (!isCancelled()) {
          internalHandle();
 
        }
      }, true, new NullProgressMonitor(), Display.getDefault());
    } catch (final Exception e) {
      final IOException ioe = new IOException();
      ioe.initCause(e);
      throw ioe;
    }
  }
  ...
}

Beispielanwendung

Eine Beispielanwendung, die vor dem Laden und Starten der Workbench ein Login sicher stellt, könnte zb. so aussehen:

package org.foo.bar;
 
public class Application implements IEntryPoint {
 
  public int createUI() {
    Display display = PlatformUI.createDisplay();
    if (login(display)) {
      WorkbenchAdvisor advisor = new ApplicationWorkbenchAdvisor();
      return PlatformUI.createAndRunWorkbench(display, advisor);
    }
    return 0;
  }
 
  private boolean login(final Display display) {
    String configName = "MyLogin";
    URL configUrl = Activator.getDefault().getBundle()
                     .getEntry("data/jaas_config.txt");
    ILoginContext secureContext = LoginContextFactory
                     .createContext(configName, configUrl);
 
    Subject s = null;
    do {
      try {
        s = secureContext.getSubject();
      } catch (LoginException e) {
        // handle login exception
      }
    } while (s == null);
    return true;
  }
}

Und schliesslich die zugehörige JAAS Loginkonfiguration in data/jaas_config.txt.

MyLogin {
    org.eclipse.equinox.security.auth.module.ExtensionLoginModule required
        extensionId="org.foo.bar.unixLoginModule";

    org.eclipse.equinox.security.auth.module.ExtensionLoginModule required
        extensionId="org.foo.bar.myLoginModule"
};

Erstes Buch zu Eclipse RAP erhältlich

Sunday, December 14th, 2008

Eclipse Rich Ajax PlatformWie heute in der Eclipse RAP Mailingliste zu lesen ist, ist vor wenigen Tagen das erste Buch zur Eclipse Rich Ajax Platform (kurz RAP) vom Autor Fabian Lange erschienen.

Ein Auszug aus der Inhaltsbeschreibung:

  • Understand what the purpose of RAP is.
  • Learn what is required to deploy RAP applications.
  • Get to know how to utilize RAP features.
  • Develop single sourced RCP and web applications.
  • Solve issues when migrating a RCP application to RAP.
  • Determine when to use RAP or when to choose a different framework.

Das Buch ist sowohl bei Amazon wie auch als PDF eBook erhältlich.