TOP

Xpand and tagged value interpretation

I’m currently developing a Java source generator based on UML and UML Profiles. In my profile I created a tagged value with the name „type“ and metaclass „Attribute“. After applying the stereotype to an attribute I had a lot of errors during the code generation. The error message was: „Couldn’t find operation ‚getTypeName(Common::TaggedValueType)‘ for uml::Class.Occured in: EXPAND expand:: … ::Root FOR model“ for „«getTypeName(att.type)»“. I debugged the interpreter and it seems that tagged values can override default visible attributes of the element. There should realy be a warning in the Xpand documentation.

Read More
TOP

CQTP Release 0.0.5

Fixed bugs in import conflict handling and context menu integration. The context menu entry is now also visible in the context menu of the editor.

Read More
TOP

Extend the ‚Source‘ context menu of the JDT

In this post I describe how you can contribute a context menu entry to the ‚Source‘ menu of the JDT.

  • First of all you have to create a new command. Therefore you must use the extension point org.eclipse.ui.commands. See the following example from the CQTP plugin:

    <extension
    point="org.eclipse.ui.commands">
    <command
    	id="de.dainel.cleanqualifiedtypes.command"
    	name="%action.label">
    </command>
    </extension>
  • In the next step you must add a menu contribution to integrate your command into the context menu. Use the extension point org.eclipse.ui.menus as in the following example. As you can see, it is visible when the ‚Source‘ context menu is visible and one of the registred types is selected. It is also visible within the editor of a Java file.

    <extension
    point="org.eclipse.ui.menus">
    <menuContribution
    	allPopups="true"
    	locationURI="popup:org.eclipse.jdt.ui.source.menu?after=additions">
    	<separator
    		name="cleanQualifiedTypes"
    		visible="true">
    	</separator>
    	<command
    		commandId="de.dainel.cleanqualifiedtypes.command"
    		style="push">
    		<visibleWhen>
    		<or>
    		<with variable="activeMenuSelection">
    		<iterate>
    		<or>
    		<adapt type="org.eclipse.jdt.core.IJavaProject"/>
    		<adapt type="org.eclipse.jdt.core.IPackageFragment"/>
    		<adapt type="org.eclipse.jdt.core.IPackageFragmentRoot"/>
    		<adapt type="org.eclipse.jdt.core.ICompilationUnit"/>
    		</or>
    		</iterate>
    		</with>
    		<with variable="activeEditorId">
    		<equals value="org.eclipse.jdt.ui.CompilationUnitEditor" />
    		</with>
    		</or>
    		</visibleWhen>
    	</command>
    	<separator
    		name="additions"
    		visible="false">
    	</separator>
    </menuContribution>
    </extension>
  • Last but not least you must add a handler which is responsible for the behaviour of your command. Use the extension point org.eclipse.ui.handlers and see the following example:

    <extension
    point="org.eclipse.ui.handlers">
    <handler
    	commandId="de.dainel.cleanqualifiedtypes.command"
    	class="de.dainel.cleanqualifiedtypes.handlers.
    		CleanQualifiedTypesHandler">
    </handler>
    </extension>
Read More
TOP

Release 0.0.4 von CQTP

I created a new release of CQTP. It contains a bugfix for an bug in the import grouping. The fully qualified type detector collects more possible import candidates.

Read More
TOP

Release 0.0.3 von CQTP

This release contains a bugfix to filter also imports from the same package and the root package. The Xpand integration provides a configurable sorting functionality for imports now.

Read More
TOP

Release 0.0.2 von CQTP

Heute gab es ein paar Bug-Fixes. Außerdem lässt sich das Plugin jetzt auch außerhalb der Eclipse Runtime nutzen. Aufgund der Änderungen kann ich jetzt ein zuätzliches Plugin für Xpand anbieten. Xpand ist ein Generator-Framework zur Erstellung eigener Code Generatoren.

Xpand basierte Generatoren nutzen oft keine import-Statements, da sie nur sehr komplex erzeugt werden können und sich Importkonflikte nur durch Modeling by Convention vermeiden lassen. Es wird daher oftmals gegen vollqualifizierte Klassen generiert, was den generierten Quellcode nicht schöner macht. Das Plugin lässt sich daher verwenden, um die import-Statements nachträglich zu erzeugen. Daher bietet das Plugin eine postprocessor-Komponente an, die sich in innerhalb einer Generator-Konfiguration einbinden lässt.

Hier geht es zu den Plugins.

Read More
TOP

Release 0.0.1 von CQTP

Heute veröffentliche ich mein erstes Eclipse Plugin. Es erweitert das JDT und dient dem Auflösen von vollqualifizierten Typen zu Import Statements. Hierbei manipuliert das Plugin den Abstrakt Syntax Tree von Kompilaten. Mehr Informationen findet ihr unter folgendem Link.

Read More
TOP

Attachment-Pattern

Das Attachment-Pattern (Attachment-Entwurfsmuster) wurde von mir im Rahmen meiner Master-Thesis entwickelt und fand relativ viel Anklang bei anderen Entwicklern, daher stelle ich es heute der Allgemeinheit vor.

Das Attachment-Entwurfsmuster gehört zu den Strukturmustern und verwendet die Komposition um eine Basisklasse um Eigenschaften und Assoziationen zur Laufzeit zu erweitern. Die folgende Abbildung zeigt das Muster und wird nachfolgend erläutert.

Das Attachment-Pattern (Attachment Entwurfsmuster)

Das Attachment-Pattern (Attachment Entwurfsmuster)

Bestandteile
  • Das AttachableObject kann um Attachment-Objekte erweitert werden und kann selbst über ein ReferenceAttachment-Object referenziert werden.
  • Das Attachment ist abstrakt und muss mindestens ein Attribut beinhalten der die Art des Attachments identifiziert.
  • Das PropertyAttachment wird benutzt um ein AttachableObject um ein Attribut (Property) zu erweitern. Das Attribut value vom Typ T beinhaltet den Wert des Attributes
  • Das ReferenceAttachment wird benutzt um ein AttachableObject um eine Assoziation zu erweitern.
Vorteile
  • Dynamische Erweiterungen zur Laufzeit. Attribute und Assoziationen die zur Designzeit noch nicht bekannt waren, können nachträglich realisiert werden, ohne eine Änderung am Code vornehmen zu müssen.
Nachteile
  • Gefahr des Wildwuchses von Attachments. Dem kann entgegen gewirkt werden durch eine Komponente, welche die erlaubten Attachments verwaltet.
  • Nachträgliche Integration in das Domänenmodell. Attachments sollten spätestens bei einem Major-Release der Software aufgelöst werden und in das Domänenmodell integriert werden. Dies wirkt ebenfalls der Gefahr von Wildwuchs entgegen.
Read More
TOP

XML Schema Assertions

Heute habe ich ein wirklich cooles Feature von XML Schema 1.1 entdeckt von dem ich bisher noch nie was gehört oder gesehen hatte. Bei der Definition von XML-Schemas bin ich schon öfters an einen Punkt gestoßen, an dem man ein Constraint für einen komplexen Datentype gerne in einem Schema unterbringen möchte, XML Schema 1.0 jedoch nicht die sprachlichen Mittel bereitstellt. Ein Beispiel für ein solches Constraint wäre:
Attribut X muss den Wert "Foobar" einnehmen, wenn Attribut Y im Wertebereich >= 20 und <= 50 liegt.

Gelöst wird dies meist entweder in dem man das Constraint in ausführbaren Code gießt oder man zusätzlich mittels einem XSLT/XPath oder Schematron Dokument validiert. Dies hat jedoch den Nachteil, dass man ein zweites Dokument erstellen muss, dass dann auch immer synchron gehalten werden müssen.

Wie ich heute gelernt habe gibt es seit XML Schema 1.1. eine Lösung für dieses Problem, das assert-Tag. Man kann mittels diesem Tags ein Constraint direkt auf einem komplexen Datentyp definieren. Hierzu benutzt man das test-Attribut. Es beinhaltet einen nach Boolean evaluierenden XPath Ausdruck. Nur wenn sowohl das Schema valide ist als auch alle Constraints nach True evaluieren, ist das Dokument valide. Um möglichst nützliche Fehlermeldungen bei einem nach False evaluierten Constraint zu erzeugen kann man z. B. das assert-Tag um das message-Attribut aus dem Xerces-Namespace anreichern.

Folgendes ungetestete Beispiel zeigt ein Schema für oben genanntes Beispiel mit passender Fehlermeldung. Wie man am Beispiel sieht wird die Evaluierung auf Basis des Eltern-Elements realisiert.

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
   xmlns:xerces="http://xerces.apache.org">
 <xs:element name="example">
  <xs:complexType>
   <xs:attribute name="X" type="xs:string" />
   <xs:attribute name="Y" type="xs:int" />
   <xs:assert test="@X eq 'Foobar' and @Y >= 20 and @Y <= 50"
     xerces:message="X muss den Wert 'Foobar' einnehmen, wenn ..." />
  </xs:complexType>
 </xs:element>
</xs:schema>
Links
Hinweis

Aktuell befindet sich die Spezifikation zu XML Schema 1.1 noch im Status „Last Call Working Draft“. Es ist also sehr wahrscheinlich, dass die Spezifikation ohne große nennenswerte Änderungen als Standard übernommen wird. Der aktuell Status kann man auf der W3 Seite erfahren.

Read More
TOP

Garmin Edge 705

Garmin Edge 705 Frontal

Garmin Edge 705 Frontal

Letzte Woche war es endlich soweit, ich habe mir ein Garmin Edge 705 zugelegt. Garmin bietet selbst haufenweise kommerzielle Karten an. Bevor ich mir die zulege, habe ich mir die Open Street Map (OSM) Karten angeschaut und die funktionieren bis dato wunderbar und ich glaube nicht, dass ich mir noch eine orginal Garmin Karte holen werde. Ausprobiert habe ich bis dato die Karten:

Es werden noch wesentlich mehr Karten speziell für Garmin Geräte angeboten. Die Karten bieten teilweise eine direkte Integration in MapSource. Über MapSource lassen sich Routen, Tracks, Waypoints erstellen und die Daten sowie die Karten auf das Garmin laden. Sind die Karten erstmals auf dem Gerät lassen sich auch andere Webseiten benutzen um Routen etc. zu erzeugen, herunterladen und anschließend auf das Gerät laden. Gute Seiten die ich bis dato gefunden habe sind:

Weitere Links:

Bilder:

Routing (Folge der Linie)

Routing (Folge der Linie)

Bitte Abbiegen

Bitte Abbiegen

Empfang im Haus

Satelliten Empfang im Haus

Read More