Posts tagged: .NET

JVx mit Windows Phone

Post to Twitter

Nachdem die JVx .NET AddOns bereits wunderbar mit Silverlight harmonieren, haben wir einen ersten Versuch mit dem Windows Phone SDK gewagt. In erster Linie wollten wir prüfen ob die AddOns auch mit Windows Phone funktionieren. In der Spezifikation waren keine Stolpersteine zu fnden, daher sollte eine Integration problemlos möglich sein.

In der Praxis sieht die Sache natürlich etwas anders aus. Das SDK enthält (noch) nicht alle Klassen die in den AddOns verwendet wurden. Daher musste für unseren Test auf etwas Komfort verzichtet werden. Nach der Anpassung der AddOns war die Integration jedoch ohne Probleme möglich.

Wir setzten uns ein sehr bescheidenes Ziel für die Entwicklung der ersten App:
Darstellung einer Liste mit den Ländern aus unserer Showcase Anwendung.

Unsere App war überraschend schnell umgesetzt. Hierbei ist jedoch anzumerken, daß das Windows Phone SDK im Moment nicht mit der Konkurrenz mithalten kann. Dazu müssen noch wesentliche Details verbessert werden.
 
Unsere App, gestartet mit dem Windows Phone Emulator:

Windows Phone App

Windows Phone App

 
Der Source Code für den Zugriff auf die Daten ist in üblicher Manier zu schreiben:

private JVxDataAdapter dataSource;
private MasterConnection Connection;

public MainPage()
{
    InitializeComponent();

    SupportedOrientations = SupportedPageOrientation.Portrait
                            | SupportedPageOrientation.Landscape;

    // init connection
    HttpConnection conn = new HttpConnection(new UniversalSerializer(),
                              "http://demo.sibvisions.org/showcase/services/Server");
    MasterConnection master = new MasterConnection(conn);
    master.ApplicationName = "showcase";
    master.LifeCycleName = "com.sibvisions.apps.showcase.frames.Contacts";
    master.UserName = "admin";
    master.Password = "admin";

    // init data adapter
    dataSource = new JVxDataAdapter(master);
    dataSource.OpenComplete += new OpenCompleteEventHandler(OpenComplete);

    // open connection
    dataSource.Open();
}

void OpenComplete(OpenCloseCompleteEventArgs pEvent)
{
    // fetch data
    CommunicationCallback callback = new CommunicationCallback(
                                         new AsyncCallback(EndFetch));

    dataSource.Connection.call("countries", "fetch", callback,
               new object[] {null, new SortDefinition(new String[] {"COUNTRY"}), 0, -1});
}

void EndFetch(IAsyncResult pResult)
{
    CommunicationCallback requestCallback = (CommunicationCallback)pResult.AsyncState;

    ArrayList result = (ArrayList)requestCallback.CallResult[0];

    // fill list
    Deployment.Current.Dispatcher.BeginInvoke(() =>
    {
        foreach (object[] item in result)
        {
            if (item != null)
            {
                ListBox.Items.Add(item[1]);
            }
        }
    });
}

 

Das XAML ist im Vergleich zum Datenzugriff weit komplexer:

<phoneNavigation:PhoneApplicationPage
   x:Class="WindowsPhoneApp.MainPage"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   xmlns:phoneNavigation="clr-namespace:Microsoft.Phone.Controls;
         assembly=Microsoft.Phone.Controls.Navigation"

   xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
   xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
   mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="800"
   FontFamily="{StaticResource PhoneFontFamilyNormal}"
   FontSize="{StaticResource PhoneFontSizeNormal}"
   Foreground="{StaticResource PhoneForegroundBrush}">

    <Grid x:Name="LayoutRoot" Background="{StaticResource PhoneBackgroundBrush}">
        <Grid.RowDefinitions>
            <RowDefinition Height="162"/>
            <RowDefinition Height="44"/>
            <RowDefinition Height="514*"/>
            <RowDefinition Height="80"/>
        </Grid.RowDefinitions>

        <Border BorderBrush="Silver" BorderThickness="5" Name="border0"
               CornerRadius="20" Background="#18A2E7" Margin="12,0,12,20">
            <Grid x:Name="TitleGrid" Height="147" >
                <TextBlock Text="Windows Phone App" Foreground="Black"
                          x:Name="textBlockPageTitle"
                          Style="{StaticResource PhoneTextPageTitle1Style}"
                          Margin="7,6,12,100" />
                <TextBlock Text="JVx showcase" Foreground="Black"
                          x:Name="textBlockAppTitle"
                          Style="{StaticResource PhoneTextPageTitle2Style}"
                          Margin="-3,26,-3,16" TextAlignment="Center" />
            </Grid>
        </Border>
       
        <TextBlock Text="Countries" x:Name="textBlockListTitle" FontSize="30"
                  HorizontalAlignment="Right" Width="456" Margin="0,148,12,6"
                  VerticalAlignment="Stretch" Padding="0,5,0,0" Grid.RowSpan="2" />
       
        <Border BorderBrush="Silver" BorderThickness="5" Name="border1"
               Grid.Row="1" CornerRadius="20" Margin="12,35,12,0" Grid.RowSpan="2">
            <ListBox Name="ListBox" HorizontalAlignment="Left"
                    VerticalAlignment="Top" Width="480" Margin="5,5,5,5" />
        </Border>
       
        <Image Grid.Row="3" Height="74" Margin="0,6,0,0" Name="image1"
              Stretch="Uniform" VerticalAlignment="Top"
              Source="/WindowsPhoneApp;component/Images/sib_visions.png"/>
    </Grid>
   
</phoneNavigation:PhoneApplicationPage>

Der Silverlight Showcase ist online

Post to Twitter

Wir haben vor wenigen Wochen unseren Silverlight Showcase vorgestellt. Nun steht die Anwendung offiziell zur Verfügung.

Der Silverlight Showcase ist eine in C# entwickelte Anwendung die mit den JVx AddOns für .NET entwickelt wurde. Dabei wird die komplette Business Logik von der Java Implementierung wiederverwendet. Der Silverlight Client kommuniziert durch den UniversalSerializer direkt mit dem Java Applikationsserver.

Die Anwendung ist zusammen mit dem Java Showcase hier zu finden.

Die JVx AddOns für .NET unterliegen der Apache Lizenz 2.0 und der Source Code wird in den nächsten Wochen offiziell freigegeben.

JVx Kommunikation im Vergleich

Post to Twitter

Die in JVx integrierte Kommunikation hätte durchaus potential für ein eigenständiges Open Source Projekt. Wir sind jedoch bemüht die Entwicklung immer so einfach als möglich zu halten. Das bedeutet nicht, daß in JVx alle möglichen Frameworks zusammengeführt werden und somit ein nicht überschaubares "etwas" entsteht, sondern JVx enthält alles was nötig ist um Business Anwendungen in einer 3 Schichten Architektur zu erstellen. Und dazu gehört nun mal eine effiziente Client/Server Kommunikation.

Es gibt natürlich Frameworks für die Kommunikation zwischen Client und Server, wie z.B. Netty. Doch unabhängig von den vielen Möglichkeiten des Frameworks ist die Bibliothek mit knapp 700KB ein großer Brocken (nur für die Kommunikation!). Weiters ist ein Kommunikationsframework alleine noch nicht ausreichend, denn die Objekte müssen zwischen Client und Server auch noch serialisiert bzw. deserialisiert werden.

Für die Serialisierung könnten wiederum vorhandene Frameworks wie z.B.: Google Protocol Buffers oder Hessian eingesetzt werden. Doch die Google Protocol Buffers erfordern die Definition der zu übertragenden Objekte und ist daher für ein generisches Framework wie JVx nicht geeignet. Und Hessian unterstützt leider nicht alle Objekttypen und ist nicht out-of-the-box mit z.B. Android einsatzfähig.

Der in JVx integrierte Kommunikationsmechanismus erlaubt ohne weiteres die Integration von den bisher genannten Frameworks, da weder das Transportprotokoll noch die Serialisierung ausschlaggebend sind für eine Business Anwendung. Außerdem definiert JVx mit Interfaces, was die Kommunikation bieten muss. Üblicherweise ist eine eigene Implementierung durch die Ableitung von AbstractSerializedConnection bzw. die Implementierung von ISerializer rasch durchgeführt.

Mit dem UniversalSerializer wird außerdem eine Lösung bereitgestellt mit der Objekte, zwischen unterschiedlichsten Technologien, ausgetauscht werden können. Und das ohne sich Gedanken über die Konfiguration zu machen bzw. Mappings zu erstellen. Der Einsatz des UniversalSerializer in Verbindung mit Netty ist ebenfalls ohne Probleme möglich, nur um hier auf den flexiblen Einsatz der JVx Kommunikation hinzuweisen!

Die Kommunikation wird im Moment mit Java und .NET erfolgreich eingesetzt. Weiters funktioniert die Kommunikation auch ohne jegliche Anpassung mit Android.

Ein erster Blick auf unseren Silverlight Showcase

Post to Twitter

Unsere .NET bzw. MONO Anbindungen an JVx befindet sich bereits auf der Zielgeraden. Und frei nach dem Motto "ein Bild sagt mehr als tausend Worte" präsentieren wir Ihnen die ersten Screenshots von unserem Silverlight Showcase.

Die Anwendung befindet sich zwar noch in der Entwicklung, sowohl am Design als auch Funktional wird sich noch das eine oder andere Detail ändern, aber sehen Sie selbst:

Silverlight Login

Silverlight Login

Die Anmeldung

Die Anmeldung an die Applikation erfolgt durch die Eingabe von Benutzername und Passwort. Selbstverständlich können die gleichen Benutzerdaten wie auch in der Java Applikation verwendet werden.

Der Silverlight Client unterscheidet sich zwar optisch vom Java Client, doch die Business Logik wird ohne Souce Code oder Konfigurations- Anpassungen wiederverwendet.

Ein wesentliches Ziel bei der Entwicklung ist, die Vorteile der jeweiligen Technologie ideal zu nutzen!

 
Die Kontaktverwaltung

Das Foto kann bequem per Drag and Drop vom Desktop in die Anwendung gezogen werden. Und weiters ermöglichen wir die Adress Auswahl über das Map Control (siehe nachfolgenden Screenshot).

Ein nicht gleich auf den ersten Blick ersichtlicher Knüller ist das Data Binding. Die Daten werden nämlich nicht via Webservice oder JSON geladen, sondern direkt von der JVx Business Logik. Und für sämtliche CRUD Anweisungen werden die selben Server Objekte verwendet wie auch für den Java Client.

Silverlight Contacts

Silverlight Contacts

 
Silverlight Map

Silverlight Map

Die Adressauswahl

Eine Adresse einzugeben ist nur halb so viel Spaß wie die Adresse auf einer Karte zu suchen. Aus diesem Grunde haben wir das komfortable Map Control integriert.

Da macht das ganze doch gleich viel mehr Spaß!

 

Den Silverlight Showcase werden wir demnächst veröffentlichen. Bleiben Sie also am laufenden!

.NET und MONO kommunizieren mit JVx

Post to Twitter

Schon seit wir mit der Definition des ISerializer Interface begonnen haben, war der Wunsch nach Technologie unabhängiger Kommunikation vorhanden. Das Thema hat uns immer wieder gestreift, doch die Notwendigkeit einer Java unabhängigen Implementierung war nicht gegeben.

Vor einigen Wochen war es dann so weit. Wir entschieden uns für die Portierung der JVx Objekt Serialisierung nach C#. Natürlich gab es einige Herausforderungen und Probleme, die jedoch keinen Einfluß auf die Funktionswiese hatten. Und im Unterschied zu CORBA, Hessian & Co unterstützen wir ein sehr breites Spektrum an Objekten.

Nun ist endlich so weit und wir können eine funktionierende Kommunikation zwischen JVx und C# vermelden. Sämtliche Objekte werden mit dem UniversalSerializer ausgetauscht. Der C# Serializer arbeitet wie sein Java pendant und ist ebenso mächtig. Die Serialisierung von Objekten unterliegt allerdings den gleichen Einschränkungen wie es auch in Java der Fall ist, allerdings verzichten wir bei unserer Lösung auf das im Normalfall verpflichtende ISerializable Interface.

Um dem ganzen den notwendigen Schliff zu verpassen haben wir auch gleich die Kommunikationsklassen AbstractSerializedConnection, Master- und SubConnection sowie alle abhänigen Klassen portiert. Dadurch ist der Zugriff auf die JVx Business Logik zu 100% gegeben. Wir können nun die komplette Business Logik und alle Server seitigen Actions, auch mit C#, einsetzen und zwar ohne Mehraufwand.

Ein kleines C# Beispiel an dieser Stelle muss natürlich sein:

public void testMetaData()
{
    HttpConnection conDemo = new HttpConnection(new UniversalSerializer(),
                                                "http://localhost/jvx/services/Server")

    MasterConnection appconDemo = new MasterConnection(conDemo);

    appconDemo.ApplicationName = "demo";
    appconDemo.UserName = "demo";
    appconDemo.Password = "demo";
    appconDemo.open();
       
    SubConnection sub = appconDemo.createSubConnection("demo.Company");
    sub.open();
       
    MetaData md = (MetaData)sub.call("company", "getMetaData");
}

Im nächsten Schritt erstellen wir einen Showcase basierend auf Silverlight 4. Demnächst hier mehr dazu.