Java Getriebe

Java und NetBeans

ImportantFiles 4 Jar

Vor einiger Zeit schon habe ich ein kleines NetBeans Plugin entwickelt, um einen „ImportantFiles“ Node für normale Java Projekte anzuzeigen.
Screenshot_ImpFiles
Das Plugin ist auch über das UpdateCenter erhältlich und wurde schon einige male heruntergeladen. Jens wies mich dann darauf hin, dass es ‚ne ganz coole Sache wäre dieses Tool so zu erweitern, dass man noch weitere, individuell einstellbare, Dateien registrieren kann. Diese Änderung ist nun in der aktuellsten Version (voraussichtlich ab 27.07.2015 im UpdateCenter, ab 21.07.2015 im Plugin Portal) verfügbar. Aus diesem Anlass möchte ich hier nun ein kleines Tutorial schreiben, welches die Erweiterung der ImportantFiles erklärt.

Vorraussetzung

Vorrausgesetzt wird, dass die Plugins ImportantFiles4Jar und „NetBeans Plugin Developement“ heruntergeladen, installiert und aktiviert sind.

Anlegen des Entwicklungsmodul

Zuerst wird ein neues NetBeans Module Projekt erstellt. Dieses Projekt bekommt dann einen Namen und eine entsprechende Code Name Base.

NewProjekt

Im Anschluss daran, fügt man eine neue layer.xml in das Projekt ein. (Rechtsklick > New > Other > Module Developement > XML Layer).

NewLayer

Erweitern der XML Layer

Zunächst sollten wir das Grundgerüst der layer.xml Datei aufbauen, sodass die Datei folgendermaßen aussieht:

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE filesystem PUBLIC
       "-//NetBeans//DTD Filesystem 1.2//EN"
       "http://www.netbeans.org/dtds/filesystem-1_2.dtd">
<filesystem>
  <folder name="de-nigjo-kll-important">
    <folder name="Files">
    </folder>
    <folder name="FileListener">
    </folder>
  </folder>
</filesystem>

Zur Erklärung:

In dem Ordner Files werden alle Dateien eingetragen, die als „Important File“ später angezeigt werden sollen, sofern sie denn vorhanden sind. Zusätzlich kann man im Ordner FileListener Listener definieren, die auf rename, remove und add Events horchen. Dabei kann ein Listener auf einer Datei oder einem Ordner angemeldet werden, und bei einem Ordner können auch noch alle Kindelemente dieses Ordners mit einem Listener versehen werden. (Dies geht theoretisch auch bei Dateien, macht aber so ziemlich überhaupt keinen Sinn 😉 ).

Registrieren einer Datei

Wir werden zunächst einmal auf das Registrieren von Dateien eingehen. Dazu nehmen wir an, dass wir die Datei Wichtige Datei.wichtich registrieren wollen. Diese Datei soll im Wurzelverzeichnis der Quellcodedateien liegen, d.h. im Ordner src eines Projektes. Um das zu erreichen muss ein neuer Eintrag im Ordner Files erstellt werden.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.2//EN" "http://www.netbeans.org/dtds/filesystem-1_2.dtd">
<filesystem>
  <folder name="de-nigjo-kll-important">
    <folder name="Files">
      <file name="de-nigjo-kll-important-test-wichtich">
        <attr name="displayName" stringvalue="Wichtige Datei"/>
        <attr name="position" intvalue="99"/>
        <attr name="projectFile" stringvalue="src/Wichtige Datei.wichtich"/>
      </file>
    </folder>
    <folder name="FileListener">
    </folder>
  </folder>
</filesystem>

Wenn wir uns nun die NBM Datei erzeugen (Rechtsklick auf das Projekt > Create NBM) können wir unser Modul in der IDE installieren (Tools > Plugins > Downloaded > Add Plugins > Unsere erzeugte NBM wählen > Install). Um den Effekt dann zu sehen, müssen wir unser Java Projekt einmal schließen und wieder öffnen, oder die IDE neu starten. Anschließend sollten wir dann in etwa sowas erhalten:
Screenshot_Wichtige_Datei

Erklärungen

Mit dem file-Tag wird eine neue Datei registriert. Der Name dieser Datei sollte immer eineindeutig sein. Da auch die Code Name Base des Moduls eineindeutig ist empfiehlt es sich diese auch als Teil des Namen zu verwenden, allerdings nicht mit „.“ sondern „-“ separiert.

Die registrierte Datei muss das Attribut Namens projectFile besitzen, welches als stringvalue dann den Pfad zur registrierten Datei übergeben bekommt. Dabei ist der Pfad relativ zum Projektordner.

Das Positionsattribut ist optional. Wird es aber angegeben ist darauf zu achten, dass die Werte 100, 200, 300, 400, 500 und 600 bereits belegt sind. Der Wert kann aber im Intervall [1; MAX_INT] liegen, daher ist genug Platz.

Wenn das Attribut displayName angegeben ist, so wird der dort eingetragene Name zur Anzeige verwendet. Ist das Attribut nicht angegeben, so wird einfach der Name der Datei angezeigt. Der displayName kann natürlich auch ein lokalisierter Text sein, dazu muss in dem Modul eine Bundle.properties Datei (entsprechende Lokalisierungen könnten dann sein Bundle_de.properties, Bundle_es.properties, usw.) vorhanden sein.
In unserem Beispielmodul wird die schon vorhandene Bundle.properties, in der der DisplayName des Projekts gespeichert ist, dafür verwendet. Hier wird ein neuer Eintrag hinzugefügt, der sich vom bisherigen Namen (Wichtige Datei) unterscheidet:

1
2
OpenIDE-Module-Name=MyImportantFiles
wichtige_datei=VIF (Very Important File)

Nun müssen wir den Eintrag in der layer ein wenig abändern, sodass dort auch der lokalisierte Text verwendet wird.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.2//EN" "http://www.netbeans.org/dtds/filesystem-1_2.dtd">
<filesystem>
  <folder name="de-nigjo-kll-important">
    <folder name="Files">
      <file name="de-nigjo-kll-important-test-wichtich">
        <attr name="displayName" bundlevalue="de.nigjo.kll.important.test.Bundle#wichtige_datei"/>
        <attr name="position" intvalue="99"/>
        <attr name="projectFile" stringvalue="src/Wichtige Datei.wichtich"/>
      </file>
    </folder>
    <folder name="FileListener">
    </folder>
  </folder>
</filesystem>

Das Zeichen # trennt dabei die Datei vom Schlüssel ab. Die Datei wird als vollständiger Klassenpfad zur Hauptdatei (ohne „.properties“) angegeben. Diese Datei wird immer als Fallback verwendet, wenn für die aktuelle Sprache keine lokalisierte Bundle Datei enthalten ist. Sprich: Haben wir ne deutsche IDE, so ist das zu suchende Bundle Bundle_de. Ist das nicht da wird Bundle verwendet. Für jede andere Sprache läuft das ganze genauso.
Nach diesen Änderungen wird erneut die NBM erzeugt und in der IDE installiert. Das Ergebnis ist dann folgendermaßen:
Screenshot_VIF

Registrieren von FileListenern

Die Möglichkeit neben Dateien auch noch FileListener zu registrieren bieten einem eine erhöhte Flexibilität. Die Standard Listener sind auf dem Ordner „nbproject“ (rekursiv) und auf den Dateien „manifest.mf“ und „build.xml“ registriert. Der Listener sorgt dafür, dass beim hinzufügen oder löschen einer Datei, die Liste der Dateien in der IDE aktualisiert wird.
Nehmen wir also für unser Beispiel an, dass die Datei Wichtige Datei.wichtich erst während der Bearbeitung des Projekts hinzukommt. Das bedeutet, dass wir einen FileListener auf dem Ordner „src“ anmelden müssen um die Änderung mitzukriegen.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.2//EN" "http://www.netbeans.org/dtds/filesystem-1_2.dtd">
<filesystem>
  <folder name="de-nigjo-kll-important">
    <folder name="Files">
      <file name="de-nigjo-kll-important-test-wichtich">
        <attr name="displayName" bundlevalue="de.nigjo.kll.important.test.Bundle#wichtige_datei"/>
        <attr name="position" intvalue="99"/>
        <attr name="projectFile" stringvalue="src/Wichtige Datei.wichtich"/>
      </file>
    </folder>
    <folder name="FileListener">
      <file name="de-nigjo-kll-important-test-srcListener">
        <attr name="recursive" boolvalue="true"/>
        <attr name="relativePath" boolvalue="true"/>
        <attr name="path" stringvalue="src"/>
      </file>
    </folder>
  </folder>
</filesystem>

Über das Attribut relativePath lässt sich steuern, ob der pathrelativ zum Projektpfad ist (true), oder absolut angegeben wird (false)(Diese Möglichkeit wird demnächst auch bei Dateien eingebaut). Mit dem Attribut recursive kann entschieden werden, ob der Listener nur auf dem definierten Objekt angemeldet wird (false) oder aber ob der Listener auf dem Objekt und allen Kindelementen und Kindeskindelementen (und … ) angemeldet wird (true). Der „srcListener“ ist rekursiv, damit wir auch das Löschen der Datei mitbekommen können. Das kann man allerdings auch mit einem nicht rekursiven Listener erreichen, denn man muss dazu lediglich einen zweiten Listener registrieren, der auf unsere wichtige Datei hört.
Wenn wir nun die NBM erzeugen und installieren können wir die Datei Wichtige Datei.wichtich in den entsprechenden Ordner einfügen nachdem alle „Important Files“ bereits angezeigt werden und wir sehen ziemlich zeitnah die Änderung im Nodebaum.

Das war’s dann auch eigentlich was es aktuell zu dem Thema zu sagen gibt. Das Modul ist natürlich noch nicht zu 100% ausgereift und wird bestimmt noch das ein oder andere Update erfahren. Für Anregungen bin ich auch jeder Zeit offen und für diese Sachen verweise ich an dieser Stelle auf die Sourceforge Seite des Projekts, wo ich über weitere Updates zum Thema der hier angesprochenen eigenen Erweiterung informieren werde, und Tickets eingereicht werden können.

Schöne Grüße
Daniel Koll

Java Namespaces

Ich merke bei meinen Azubis immer mal wieder, dass ihnen der Sinn oder Unsinn der Paket-Anweisung (package) nicht ganz bewusst ist. Die Klassen werden zwar in irgendein Paket abgelegt, aber warum unsere Paket alle ausgerechnet mit de.rwthaachen.wzl.gt wird nicht hinterfragt. So kommt es gerade bei den ersten eigenen Projekten regelmäßig vor, dass als Paket de.nachname.projekt verwendet wird. Meist blicke ich dann ich weit aufgerissene Augen wenn ich Frage „gehört dir die Domain ‚nachname.de‘ überhaupt?“

Read More

TopComponentGroup mit Annotation

Für eins meiner Projekte hier in der WZL Getriebeabteilung wollte ich 2 TopComponents öffnen. Das geht am schönsten mit TopComponentGroups. Wer allerdings schon einmal eine TopComponentGroup erstellt hat, der wird mir sicherlich zustimmen, dass das Eintragen in die layer.xml eine sehr fehleranfällige Methode ist, da man sich relativ leicht vertippen kann.

Read More

NetBeans Training 2014 in Leipzig

Wir, die Matse-Azubis der Getriebeabteilung des WZL, Tobias Moers, Daniel Koll und Patrick Plum inklusive unserer Ausbilderin Annette Glindmeyer absolvierten vom 14-16. April 2014 das NetBeans Training in Leipzig. Unsere Trainer waren Geertjan Wielenga, Anton (Toni) Epple mit Unterstützung des Veranstalters Benno Markiewicz.

Read More

Aufgabe: Zeige alle .properties eines Projekts an

Aufgabe: Erstelle ein NetBeans Modul mit dem alle .properties Dateien des aktuell ausgewählten Projekts in einem eigenen Fenster angezeigen werden können.

Ich finde, dass diese Aufgabe sich ganz gut als Einstieg in die NetBeans Platform Programmierung eignen kann. Sie erfüllt einen Zweck und all zu schwer sollte sie nicht sein, zumindest wenn man sich in die Grundlagen von Node, Lookup & Co eingearbeitet hat. Es werden in diesem Modul diverse dieser Grundlagenbereiche von NetBeans angesprochen aber der Aufwand hält sich dennoch in Grenzen. Read More

Auslandspraktikum als MaTSE – Woche 3: Server hin, Server her

This entry is part 5 of 6 in the series Auslandspraktikum als MaTSE

Nach meinem bis dahin zweiwöchigen Aufenthalt im spanischen Valdepeñas kam letzten Freitag auch mein Kommilitone David im Ort an, mit dem ich mir hier eine Wohnung teile und in der gleichen Firma arbeite.

Read More

Auslandspraktikum als MaTSE – Dann ging doch alles sehr schnell

This entry is part 2 of 6 in the series Auslandspraktikum als MaTSE

Nachdem die Bewerbung zum Förderungsprogramm im Projekt „lift“ zur Finanzierung und Organisation eines Auslandspraktikums für Auszubildende in Dezember stattfand hatte ich nun – 2 Monate später – schon fast die Hoffnung aufgegeben, noch einen Praktikumsplatz zu finden. Beim Förderungsprogramm wurde ich ja bereits angenommen, das Problem bestand in der erfolgreichen Suche eines Platzes in einem spanischen Betrieb. Read More

Auslandspraktikum als MaTSE – Es ist möglich!

This entry is part 1 of 6 in the series Auslandspraktikum als MaTSE

Hi, mein Name ist Oliver Trinnes und ich kam im Jahre 2009 aus dem hohen Norden (Hamburg) nach Aachen, um hier den dualen Studiengang Scientific Programming zusammen mit der Ausbildung zum mathematisch-technischen Softwareentwickler zu absolvieren. Seitdem arbeite ich zusammen mit weiteren Azubis und Jens Hofschröer in der Getriebeabteilung des Werkzeugmaschinenlabors der RWTH Aachen.

Während meiner Ausbildungszeit baute ich meine Fähigkeiten in der Java-Programmierung aus und setzte mich insbesondere mit der NetBeans IDE und RCP auseinander. Die neusten Entwicklungen meiner Kompetenzen bewegen sich buchstäblich im dreidimensionalen Raum. Für die Darstellungen unserer Simulationssoftware und nun auch für meine eigene Bachelorarbeit beschäftige ich mich intensiv mit Java OpenGL 3D-Programmierung.

Ein Auslandspraktikum als MaTSE-Azubi? Noch nie gehört!

Bis zum November 2011 hielt ich es für ausgeschlossen, während der MaTSE-Ausbildung bzw. des Studiums überhaupt ein Praktikum absolvieren zu können. Schließlich ist das ja das Besondere an dieser Ausbildung: Praxis und Theorie in Einem. Was will ich also noch mit einem Praktikum, wenn ich so sehr an meinen Betrieb gebunden bin? Darum kam ich auch nie auf die Idee, mich damit weiter zu beschäftigen. Bis ich von einem Kommilitonen gehört habe, dass jemand aus unserem Jahrgang nicht nur ein Praktikum, sondern sogar ein Auslandspraktikum absolviert hat. Read More