<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>PINC-Blog &#187; Webentwicklung</title>
	<atom:link href="http://www.pincservices.de/wordpress/category/webentwicklung/feed" rel="self" type="application/rss+xml" />
	<link>http://www.pincservices.de/wordpress</link>
	<description>yet another developer blog</description>
	<lastBuildDate>Sat, 10 Sep 2011 07:53:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Quelle aller Worte: Internationalisierung mit GWT UIBinder</title>
		<link>http://www.pincservices.de/wordpress/quelle-aller-worte-internationlisierung-mit-gwt-uibinder</link>
		<comments>http://www.pincservices.de/wordpress/quelle-aller-worte-internationlisierung-mit-gwt-uibinder#comments</comments>
		<pubDate>Sat, 10 Sep 2011 07:49:49 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Softwaredesign]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[gwt]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[internationalization]]></category>
		<category><![CDATA[LocalizableResource]]></category>
		<category><![CDATA[UIBinder]]></category>

		<guid isPermaLink="false">http://www.pincservices.de/wordpress/?p=581</guid>
		<description><![CDATA[Als Gott sah was beim Turmbau zu Babel passierte, entschied er sich die Sprache der Menschen zu teilen, so dass der Eine den Anderen nicht mehr verstehen möge. Ähnlich scheinen sich die Designer von GWT gefühlt haben, als sie die Internationalisierung von GWT 2.x entworfen haben. Das Internationalisierungsprinzip von GWT ist an sich sehr einfach. [...]]]></description>
			<content:encoded><![CDATA[<p>Als Gott sah was beim Turmbau zu Babel passierte, entschied er sich die Sprache der Menschen zu teilen, so dass der Eine den Anderen nicht mehr verstehen möge. Ähnlich scheinen sich die Designer von GWT gefühlt haben, als sie die Internationalisierung von GWT 2.x entworfen haben.</p>
<p>Das Internationalisierungsprinzip von GWT ist an sich sehr einfach. Man nehme ein paar <code>properties</code>-Dateien, inkludiere das I18N-Modul und lasse sich die entsprechende Java-Datei generieren. Soweit so gut. Leider nicht so, wenn man den UIBinder verwenden möchte. Hier haben sich bereits diverse verzweifelte Entwickler einen &#8220;abgebrochen&#8221; um herauszufinden, welche Dateien an welcher Stelle liegen müssen, damit man in den jeweiligen <code>ui.xml</code>-Dateien eine vernünftige Übersetzung erhält. </p>
<p>Grundsätzlich gilt, dass Übersetzungs-Keys aus <code>ui.xml</code>-Dateien immer im Package <code>com.google.gwt.i18n.client</code> mit dem Namen <code>LocalizableResource_[locale].properties</code> liegen müssen. Diesen Umstand verdanken wir dem <code>MessagesWriter</code>, der vom <code>UiBinderGenerator</code> herangezogen wird. Dieser generiert zwar die Messages-Dateien für alle Keys, die sich in einer <code>ui.xml</code>-Datei befinden in eine eigene <code>Messages</code>-Klasse, importiert aber mittels</p>
<pre class="brush: plain;">
writer.write(&quot;import static com.google.gwt.i18n.client.LocalizableResource.*;&quot;);
</pre>
<p>ausschließlich die Übersetzungen aus <code>LocalizableResource</code>. Soweit so gut, möchte man meinen. Problematisch wird es dann, wenn man Übersetzungen sowohl im Java-Code, als auch im in den ui-Dateien haben will. Typisches Beispiel sind hier Tabellen vom Typ <code>CellTable</code>, deren Spalten normalerweise in den View-Klassen definiert werden. Will man hier nun sprachlich angepasste Spaltenköpfe haben, muss man diese mittels einer <code>Messages</code>-Klasse übersetzen.<br />
In diesem Moment steht man vor der Frage: Möchte ich zwei Übersetzungsdateien verwalten, in denen ggf. Keys doppelt auftreten, oder möchte ich nur Eine für beide Mechanismen haben?</p>
<p>Ohne auf die unsäglichen und teilweise unpraktikablen Varianten einzugehen, die sich im Netz bereits befinden bzw. die kryptisch auf der GWT-Dokumentation vorgestellt wurde, stelle ich hier meine zwei Lösungen vor, die ich für sinnvoll erachte.</p>
<h3>Variante 1: <code>ui:with</code></h3>
<p>Die klassische Variante. Man nehme einfach die existierenden Messages und importiere sie wie folgt in die <code>ui.xml</code>-Datei.</p>
<pre class="brush: plain;">
 &lt;ui:with field='messages' type='com.my.app.MyMessages'/&gt;
 &lt;g:Label text=&quot;{messages.hello}&quot; /&gt;
</pre>
<p>Diese Variante hat den Vorteil, dass man auf die komplette Bandbreite der Erweiterungen, die für <code>Messages</code>-Klassen bereitgestellt wurde zugreifen kann. </p>
<h3>Variante 2: Customized <code>Messages</code>-Interface</h3>
<p>In Variante 1 nutzen wir den Mechanismus, der eigentlich für den Java-Code gedacht war für den UiBinder. Natürlich geht es auch anders herum. Wir &#8220;kopieren&#8221; einfach den Mechanismus der <code>MessagesWriter</code>-Klasse. Wir bauen uns ein Interface und importieren die LocalizableResources.</p>
<pre class="brush: plain;">
package com.mypackage;

import static com.google.gwt.i18n.client.LocalizableResource.*;

public interface MyAppMessages extends Messages {
  @DefaultMessage(&quot;Example&quot;)
  String example();
}
</pre>
<p>Der GWT-Compiler greift hier einfach das Interface und verknüpft die Methoden mit den Keys aus der jeweiligen LocalizableResource-Datei. Damit lassen sich auch innerhalb von Java-Dateien die Keys aus LocalizableResource verwenden.</p>
<p><b>Achtung:</b><br />
<i>Leider gibt es nicht die Möglichkeit LocalizableResource-Dateien über den i18n-Aufruf in eine Klasse übersetzen zu lassen, da <code>LocalizableResource</code> bereits ein existierendes Interface ist und die Übersetzung zu einer sogenannten zyklischen Vererbung führt.</i></p>
<h3>Fazit</h3>
<p>Mit beiden Varianten lässt sich das bestehende Problem lösen, dass man nur einen Mechanismus zur Internationalisierung innerhalb von GWT-Projekten nutzen möchte. Welche der beiden zum Einsatz kommt hängt stark von der bestehenden Struktur und &#8211; was nicht zur vernachlässigen ist &#8211; von der Motivation des Entwicklers, welche Schritte für ihn in seinem Arbeitsprozess besser integriert werden können, ab. Während Variante 1 den Aufruf des i18n-Creators erfordert, muss in Variante 2 das Interface immer manuell angepasst werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pincservices.de/wordpress/quelle-aller-worte-internationlisierung-mit-gwt-uibinder/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Erster Blick auf GWT 2.1.1 Requestfactory</title>
		<link>http://www.pincservices.de/wordpress/erster-blick-auf-gwt-2-1-1-requestfactory</link>
		<comments>http://www.pincservices.de/wordpress/erster-blick-auf-gwt-2-1-1-requestfactory#comments</comments>
		<pubDate>Thu, 16 Dec 2010 06:11:43 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[gwt]]></category>
		<category><![CDATA[RequestFactory]]></category>
		<category><![CDATA[servicelocator]]></category>

		<guid isPermaLink="false">http://www.pincservices.de/wordpress/?p=532</guid>
		<description><![CDATA[Vor einigen Tagen wurde der erste Release-Kandidat for GWT 2.1.1 veröffentlicht. Was dieser enthält kann man hier nachlesen. Nachdem ich bereits über einen Workaround für GWT 2.1 bezüglich des RequestFactory-Einsatzes mit Spring gesprochen habe war für mich vor allem das neue RequestFactory-API interessant. Dieses hat jetzt in u.a. in der Service-Annotation einen locator mit dem [...]]]></description>
			<content:encoded><![CDATA[<p>Vor einigen Tagen wurde der erste Release-Kandidat for GWT 2.1.1 veröffentlicht. Was dieser enthält kann man <a href="http://groups.google.com/group/google-web-toolkit/browse_thread/thread/6f2418947d7efeb9">hier</a> nachlesen.</p>
<p>Nachdem ich <a href="http://www.pincservices.de/wordpress/statische-schl…ory-mit-spring">bereits</a> über einen Workaround für GWT 2.1 bezüglich des RequestFactory-Einsatzes mit Spring gesprochen habe war für mich vor allem das neue RequestFactory-API interessant. Dieses hat jetzt in u.a. in der Service-Annotation einen <code>locator</code> mit dem man auf Klassen referenzieren kann, die keine statischen Methoden enthalten. Ein schönes Beispiel für den Einsatz findet sich in der GWT Google Group (<a href="https://groups.google.com/group/google-web-toolkit/browse_thread/thread/20ea2aea53aa29d3">zugehöriger Thread</a>).</p>
<p>Der folgende Auszug ist aus dem eben genannten Thread.</p>
<pre class="brush: java;">
public class SpringServiceLocator implements ServiceLocator {
        @Override
        public Object getInstance(Class&lt;?&gt; clazz) {
                HttpServletRequest request = RequestFactoryServlet.getThreadLocalRequest();
                ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(request.getSession().ge tServletContext());
                return context.getBean(clazz);
        }
}
</pre>
<p>&#8220;I annotate my RequestContext with the GWT @Service annotation (not the<br />
Spring one). Example below:&#8221;</p>
<pre class="brush: java;">
@Service(locator = SpringServiceLocator.class, value =
AddressService.class)
public interface AddressRequest extends RequestContext {
        // Get address by id
        Request&lt;AddressProxy&gt; get(Long id);
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.pincservices.de/wordpress/erster-blick-auf-gwt-2-1-1-requestfactory/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Statische Schleusen &#8211; GWT 2.1 RequestFactory mit Spring</title>
		<link>http://www.pincservices.de/wordpress/statische-schleusen-gwt-2-1-requestfactory-mit-spring</link>
		<comments>http://www.pincservices.de/wordpress/statische-schleusen-gwt-2-1-requestfactory-mit-spring#comments</comments>
		<pubDate>Fri, 26 Nov 2010 15:01:48 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[gwt]]></category>
		<category><![CDATA[RequestFactory]]></category>
		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://www.pincservices.de/wordpress/?p=456</guid>
		<description><![CDATA[Manchmal ist Vorfreude die schönste Freude, aber wenn die Vorfreude die einzige Freude ist, dann stimmt etwas nicht. So auch bei den heißersehnten RequestFactories von GWT 2.1. In Erwartung, dass damit der Zugriff auf Domain-Objekte/Entities stark vereinfacht werden soll, kam es &#8211; zumindest bei mir &#8211; zu einem jähen Erwachen, nachdem ich versuchte die RequestFactory [...]]]></description>
			<content:encoded><![CDATA[<p>Manchmal ist Vorfreude die schönste Freude, aber wenn die Vorfreude die einzige Freude ist, dann stimmt etwas nicht. So auch bei den heißersehnten RequestFactories von GWT 2.1. In Erwartung, dass damit der Zugriff auf Domain-Objekte/Entities stark vereinfacht werden soll, kam es &#8211; zumindest bei mir &#8211; zu einem jähen Erwachen, nachdem ich versuchte die RequestFactory auf ein Service-Klasse verweisen zu lassen, die von Spring verwaltet wird.</p>
<p>Die Entwickler der RequestFactory haben sich nämlich ein schönes Konstrukt in der Klasse <code>ReflectionBasedOperationRegistry</code> ausgedacht, welches es nur gestattet entweder statische Methode oder eine Methode der Entity selbst aufzurufen.</p>
<pre class="brush: java; wrap-lines: false;">
boolean isInstance = InstanceRequest.class.isAssignableFrom(requestMethod.getReturnType());
if (isInstance == Modifier.isStatic(domainMethod.getModifiers())) {
  throw new IllegalArgumentException(&quot;domain method &quot; + domainMethod
          + &quot; and interface method &quot; + requestMethod
          + &quot; don't match wrt instance/static&quot;);
}
</pre>
<p>Zur allgemeinen Verteidigung: in der kommenden Version GWT 2.1.1 wurde diese Einschränkung angeblich schon ausgebaut. Da zum aktuellen Zeitpunkt allerdings nicht klar ist, wann diese Version veröffentlicht wird, muss man sich mit anderen Mitteln behelfen. Eines dieser Mittel möchte ich kurz vorstellen.</p>
<p>Die Idee hinter dem ganzen ist es einen Adapter zu schreiben, der die notwendigen statischen Methoden für die RequestFactory bereitstellt und diese an den eigentlichen Service delegiert.<br />
Ich gehe davon aus, dass der Leser mit dem Grundprinzip der GWT RequestFactory vertraut ist. Falls nicht, empfehle ich einen Blick auf <a href="http://code.google.com/intl/de-DE/webtoolkit/doc/latest/DevGuideRequestFactory.html">diese Seite</a>.</p>
<p>Als Erstes möchte ich die RequestFactory vorstellen:</p>
<pre class="brush: java; wrap-lines: false;">
public interface SampleRequestFactory extends RequestFactory {

    @Service(SampleRequestAdapter.class)
    interface SampleRequestContext extends RequestContext {
        Request&lt;List&lt;SampleEntityProxy&gt;&gt; findAll();
    }

    SampleRequestContext sampleRequestContext();
}
</pre>
<p>Für diejenigen, die sich mit Spring auskennen sei darauf hingewiesen, dass die obige <code>Service</code>-Annotation nicht die von Spring, sondern die von GWT ist.</p>
<p>Weiter im Text &#8230;</p>
<p>Der entsprechende Adapter könnte in etwa so aussehen.</p>
<pre class="brush: java; wrap-lines: false;">
public class SampleRequestAdapter {

    private static SampleService _sampleService;

    public static void setApplicationContext(ApplicationContext applicationContext) {
        _sampleService = applicationContext.getBean(SampleService.class);
    }

    public static List&lt;SampleEntity&gt; findAll() {
        return _sampleService.findAll();
    }
}
</pre>
<p>Soweit, sogut. Bisher ist noch nichts Spannendes passiert. Dennoch ist die Luft bereits erfüllt mit &#8220;Entwickler-Magie&#8221;. Die offene Frage ist nämlich: Wie wird die Methode <code>setApplicationContext()</code> aufgerufen?</p>
<p>Die Lösung ist zwar nicht zwingend schön, aber wirkungsvoll:</p>
<ul>
<li>Man nehme eine Klasse, die von Spring verwaltet wird.</li>
<li>Mache diese Klasse <code>ApplicationContextAware</code>.</li>
<li>Gebe dieser Klasse die Adapter als Parameter und rufe für alle die Setter-Methode auf.</li>
</ul>
<p>Im Code-Gewand sähe dies so aus:</p>
<pre class="brush: java; wrap-lines: false;">
public class ApplicationContextProvider implements ApplicationContextAware {
    private List&lt;Class&gt; _requestAdapters;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if (_requestAdapters != null) {
            for (Class requestAdapter : _requestAdapters) {
                try {
                    final Method setter = requestAdapter.getDeclaredMethod(&quot;setApplicationContext&quot;, ApplicationContext.class);
                    if (Modifier.isStatic(setter.getModifiers())) {
                        setter.invoke(requestAdapter, applicationContext);
                    }
                // ... exception handling code
            }
        }
    }

    public List&lt;Class&gt; getRequestAdapters() {
        return _requestAdapters;
    }

    public void setRequestAdapters(List&lt;Class&gt; requestAdapters) {
        _requestAdapters = requestAdapters;
    }
}
</pre>
<p>Abschließend muss der Provider selbstverständlich noch für Spring verfügbar gemacht werden.</p>
<pre class="brush: xml;">
&lt;bean class=&quot;de.sampleproject.ApplicationContextProvider&quot;&gt;
  &lt;property name=&quot;requestAdapters&quot;&gt;
    &lt;list&gt;
      &lt;value&gt;de.sampleproject.SampleRequestAdapter&lt;/value&gt;
    &lt;/list&gt;
  &lt;/property&gt;
&lt;/bean&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.pincservices.de/wordpress/statische-schleusen-gwt-2-1-requestfactory-mit-spring/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Webapps become wicket &#8230;</title>
		<link>http://www.pincservices.de/wordpress/webapps-become-wicket</link>
		<comments>http://www.pincservices.de/wordpress/webapps-become-wicket#comments</comments>
		<pubDate>Sat, 26 Sep 2009 00:59:55 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[wicket]]></category>

		<guid isPermaLink="false">http://www.pincservices.de/wordpress/?p=247</guid>
		<description><![CDATA[Im Allgemeinen sprießen Webframeworks wie Pilze aus dem Boden. Mal mehr und mal weniger erfolgreich. Allerdings haben die meisten immer den gleichen MVC-Ansatz. Daten werden im Model vorgehalten, der Controller kümmert sich um die Bereitstellung der Objekte und der Navigation und das View &#8220;holt&#8221; sich alles was es braucht aus dem Kontext. D.h. man hat [...]]]></description>
			<content:encoded><![CDATA[<p>Im Allgemeinen sprießen Webframeworks wie Pilze aus dem Boden. Mal mehr und mal weniger erfolgreich. Allerdings haben die meisten immer den gleichen MVC-Ansatz. Daten werden im Model vorgehalten, der Controller kümmert sich um die Bereitstellung der Objekte und der Navigation und das View &#8220;holt&#8221; sich alles was es braucht aus dem Kontext. D.h. man hat häufig eine Mischung aus HTML und einer expliziten Expression Language im View (z.B. JSTL).<br />
Der große Nachteil bei dieser Form von Aufteilung ist, dass man beim Testen häufig auf verschiedene Frameworks zurückgreifen muss um die Korrektheit der Anzeige zu gewährleisten bzw. stark auf manuelles Testen angewiesen ist. Im Speziellen sei hier die Problematik von Text-Lokalisierung erwähnt, die jedem Entwickler im Laufe seiner Arbeit schonmal &#8220;auf die Füße gefallen&#8221; sein wird.</p>
<p>Einen etwas anderen Ansatz verfolgt an dieser Stelle das Framework <a href="http://wicket.apache.org">Wicket</a>. Hier wird bewusst auf eine explizite Expression Language verzichtet &#8211; soweit ich sehen kann. Alle Referenzen zwischen Controller und View werden über eine Wicket-Id-Tag (<code>&lt;span wicket:id="myMessage"&gt;&lt;/span&gt;</code>) aufgelöst. Damit steht zwar der Controller in der Pflicht alle Inhalte entsprechend umfangreicher aufzubereiten (z.B. explizite Änderungs-Propagierung), aber diese Vorgehensweise hat den elementaren Vorteil, dass Seiten wesentlich einfacher auch mit z.B. Junit-Tests geprüft werden können.</p>
<p>Es wäre alles zu schön um wahr zu sein, wenn es nicht schon auf den/meinen ersten Blick ein kleines Problem gäbe. Natürlich geht Wicket von einem MVC-Ansatz aus und benötigt damit HTML-Dateien zum Rendern. Leider wird standardmäßig davon ausgegangen, dass die HTML-Dateien im gleichen Verzeichnis liegen wie die entsprechende Klasse.<br />
<b-quote><i><br />
&#8220;First we need to create a web page. Wicket has a WebPage class suited for this task. All webpages need to be subclasses of WebPage. Another requirement is that the actual HTML file and the class name are equal: Index.html and Index, IndexPage.html and IndexPage or HelloWorld.html and HelloWorld. They also need to be in the same place on the classpath. The best way to develop is to put them in the same directory. This might seem strange in the beginning, especially when you are accustomed to separate html files and java files. However, since all pages are actually just components, it makes perfect sense in terms of reusability.&#8221;<br />
</i><br />
(siehe hierzu <a href="http://cwiki.apache.org/WICKET/newuserguide.html#Newuserguide-TheHTML">http://cwiki.apache.org/WICKET/newuserguide.html#Newuserguide-TheHTML</a>)<br />
</b-quote></p>
<p>Für jeden Webentwickler, der es gewohnt ist, dass HTML- respektive JSP(X)-Dateien gefälligst weit weg von den Klassen zu liegen haben, eine Umstellung die nur leidlich zu ertragen ist.<br />
Zum Glück haben die Wicket-Entwickler hier aber ein Einsehen und bieten in der Referenz-Dokumentation auch gleich mehrere <a href="http://cwiki.apache.org/WICKET/control-where-html-files-are-loaded-from.html">Lösungen</a> an, wobei aus meiner Sicht, die Maven-Lösung zu empfehlen ist, da sie versionsunabhängig ist.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pincservices.de/wordpress/webapps-become-wicket/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PINC-SOOW published</title>
		<link>http://www.pincservices.de/wordpress/pinc-soow-published</link>
		<comments>http://www.pincservices.de/wordpress/pinc-soow-published#comments</comments>
		<pubDate>Sun, 22 Feb 2009 21:41:24 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[Werkzeuge]]></category>

		<guid isPermaLink="false">http://www.pincservices.de/wordpress/?p=153</guid>
		<description><![CDATA[PINC-SOOW ist ein kleiner Wrapper für Savant3, einer PHP-Templating-Engine. Da ich bereits einige Seiten mit Savant erstellt habe &#8211; inklusive pincservices.de &#8211; dachte ich, es wäre interessant einen Aufsatz dafür zu schreiben. SOOW steht dabei für Savant-Object-Oriented-Wrapper. Die Idee dahinter ist, die Erstellung für Laien etwas intuitiver zu gestalten und leichter erweiterbar. Der Wrapper basiert [...]]]></description>
			<content:encoded><![CDATA[<p>PINC-SOOW ist ein kleiner Wrapper für <a href="http://www.phpsavant.com" target="_blank">Savant3</a>, einer PHP-Templating-Engine. Da ich bereits einige Seiten mit Savant erstellt habe &#8211; inklusive <a href="http://www.pincservices.de">pincservices.de</a> &#8211; dachte ich, es wäre interessant einen Aufsatz dafür zu schreiben. SOOW steht dabei für Savant-Object-Oriented-Wrapper. Die Idee dahinter ist, die Erstellung für Laien etwas intuitiver zu gestalten und leichter erweiterbar.</p>
<p>Der Wrapper basiert auf dem Widget-Prinzip. D.h. alles ist ein Widget. Von der Seite bis zum Formular. Aktuell stehen folgende Widgets zur Verfügung:</p>
<ul>
<li>Page: Eine normale Seite</li>
<li>Section: Seitenbereich, kann auch eine komplette Unterseite darstellen</li>
<li>Form: normales Formular</li>
<li>Menu: diverse Ausprägungen eines Menüs</li>
</ul>
<p>Jedes Widget kann mit einem Template individualisiert werden. Diese können unter <em>custom/templates</em> erstellt werden, da sich unter <em>widgets</em> die Standardtemplates befinden und diese auch nicht geändert werden sollten. Beispiele befinden sich in dem Verzeichnis <em>samples</em>.</p>
<p>Download: <a href="http://www.pincservices.de/downloads/pinc-soow.zip">pinc-soow.zip</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.pincservices.de/wordpress/pinc-soow-published/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenSocial &#8211; weder offen noch sozial</title>
		<link>http://www.pincservices.de/wordpress/opensocial-weder-offen-noch-sozial</link>
		<comments>http://www.pincservices.de/wordpress/opensocial-weder-offen-noch-sozial#comments</comments>
		<pubDate>Sun, 23 Nov 2008 23:45:57 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[opensocial]]></category>
		<category><![CDATA[social network]]></category>

		<guid isPermaLink="false">http://www.pincservices.de/wordpress/?p=54</guid>
		<description><![CDATA[Ich habe in den letzten zwei Wochen das erste Mal tiefer in Googles &#8220;tolle&#8221; API fÃ¼r soziale Netzwerke OpenSocial geschaut und muss sagen: &#8220;schÃ¶n ist was anderes&#8221;. Vor allem die Behandlung der OpenSocial-Mitgliedsplattformen gegenÃ¼ber Entwicklern empfinde ich bis jetzt als extrem unhÃ¶flich. Bei MySpace muss man sich als Entwickler bewerben bekommt aber ggf. nie eine [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe in den letzten zwei Wochen das erste Mal tiefer in Googles &#8220;tolle&#8221; API fÃ¼r soziale Netzwerke <a href="http://code.google.com/apis/opensocial/" target="_blank">OpenSocial</a> geschaut und muss sagen: &#8220;schÃ¶n ist was anderes&#8221;.</p>
<p>Vor allem die Behandlung der OpenSocial-Mitgliedsplattformen gegenÃ¼ber Entwicklern empfinde ich bis jetzt als extrem unhÃ¶flich. Bei MySpace muss man sich als Entwickler bewerben bekommt aber ggf. nie eine Antwort zurÃ¼ck, sondern darf sich irgendwann wieder neu bewerben. Bei den meisten Plattformen bietet die Sandbox nichtmal UnterstÃ¼tzung fÃ¼r den opensocial-Namensraum an, was allein die Entwicklung von sogenannten Gadgets mit dem entsprechenden Namensraum erlaubt.<br />
Hinzu kommt, dass bestimmte Kernelemente nur optional sind und z.B. die ID des eingeloggten Benutzers Ã¼ber manuelle Requests nachgefragt werden muss. Dies erschwert die Kommunikation mit einer externen Applikation, welche fÃ¼r komplexere Anwendungen notwendig scheint und eigentlich durch eine simple URL-Referenz im Content-Tag mÃ¶glich sein sollte.<br />
Der dritte Punkt, der mich an OpenSocial stÃ¶rt ist die mangelhafte Dokumentation. Zwar wird im Einleitungsvideo auf der OpenSocial-Seite auf die groÃŸartige Dokumentation hingewiesen. Bei spezifischen Problemen lÃ¤sst diese aber sehr zu wÃ¼nschen Ã¼brig. So springt man permanent zwischen vielen gleichaussehenden Seiten hin und her um dann nach einigen Stunden endlich den notwendigen Link in einen Bereich zu finden, der aus dem MenÃ¼ nichtmal zu erahnen ist. So findet man z.B. kaum oder gar nicht eine Ãœbersicht Ã¼ber die mÃ¶glichen Features, wie dynamic-heights, die man einbinden kann bzw. muss.</p>
<p>FÃ¼r eine API, die &#8211; aus meiner Sicht &#8211; nur dafÃ¼r geeignet ist kleine Funapplikationen zu entwickeln haben sich die OpenSocial-Betreiber bis jetzt nicht mit Ruhm bekleckert. Als Alternative zu Facebooks API ist es bis jetzt (immer) noch nicht zu sehen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pincservices.de/wordpress/opensocial-weder-offen-noch-sozial/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

